1. Си / Говнокод #26975

    +4

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    static int parse_num(const char *s, size_t *out) {
        if (s == NULL || *s == '\0')
            return -1;
    
        char *end = 0;
        errno = 0;
        uint64_t num = strtoull(s, &end, 0);
        if (errno != 0)
            return -1;
    
        if (*end != '\0')
            return -1;
    
        if (num > SIZE_MAX)
            return -1;
    
        *out = (size_t)num;
        return 0;
    }

    Какие же всё-таки удобные функции в стандартной няшколибе.

    Запостил: bormand, 24 Сентября 2020

    Комментарии (76) RSS

    • На правах рекламы: https://github.com/bormand/blankvm

      Кто там хотел посоставлять 64 битный код из ascii символов?
      Ответить
      • > seg->type = is_code ? 0x0B : 0x03;
        А нету констант чтоли?

        > fprintf(stderr, "RAX=%016llx RBX=%016llx RCX=%016llx RDX=%016llx\n", regs.rax, regs.rbx, regs.rcx, regs.rdx);
        fprintf(stderr, "RSI=%016llx RDI=%016llx RSP=%016llx RBP=%016llx\n", regs.rsi, regs.rdi, regs.rsp, regs.rbp);
        fprintf(stderr, "R8 =%016llx R9 =%016llx R10=%016llx R11=%016llx\n", regs.r8, regs.r9, regs.r10, regs.r11);
        fprintf(stderr, "R12=%016llx R13=%016llx R14=%016llx R15=%016llx\n", regs.r12, regs.r13, regs.r14, regs.r15);

        блядь, ну и регистров там у вас

        именно по этому я за real mode
        Ответить
        • > констант

          Дык очевидно же: 0x0B код, 0х03 данные.

          Это ещё не все регистры кста. Там же ещё от сопроцессора и SSE'шные. Я на них тупо забил.

          З.Ы. Завтра добавлю генерецию пейджтейбла, а то руками указывать как-то некрасиво.
          Ответить
          • скоро у тебя templeOS получится.

            Что вообще самое сложное в написании самой простой ос? шедулер? драйверы для всякого современного говна типа pci-e и usb 3?
            Ответить
            • В самой простой, имхо, сложнее всего со всем этим разобраться. Если на пирфоманс не дрочить, ничего особо сложного там нету.
              Ответить
        • Кстати забавно, что интел в своей доке пишет amd64 как IA-32e. Чтоб никто не догадался.
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • Ну в x86-64 таки 64 есть.

              А у интела походу реально подгорело после фейла итантума аля IA-64 и взлёта амд64.

              Настолько подгорело, что IA-32e там везде упоминается просто как костыль, прикрученный сбоку, а не как часть архитектуры. Во всех главах рассказывается сначала про 32 бита, а потом "ну а если IA-32e - то ещё вот это".

              amd'шная дока в этом плане на порядок приятнее читается.
              Ответить
              • я не понимаю, на что они расчитывали. Итаниум вроде вообще изначально не умел гонять x86, и его там эмулили софтварно (или умел, но медленно?). Разумеется, это было нужно никому.

                А вот от AMD и правда погорело, потому что софт стал называть режим AMD64, и до сих пор иногда называет. Как Интел мог такое вынести?
                А еще AMD первые допёрли унсети драм контроллер в die.

                А книжки и мануалы небось раньше писались, потом их просто апгрейтнули, не?
                Ответить
                • Рассчитывали, что народ не будет так держаться за сконпелированный софт. Прикладнуху то и пересобрать можно было бы. В теории.

                  А на практике народ в 2020 году юзает всякую 16-битную опердень.
                  Ответить
                  • >пересобрать можно было бы.

                    прикладушечку на няшной, написанную и проверенную под 32, пересобрать под другую арху и 64? Это же наверное нужно быть очень аккуратным парнем, не?

                    А если с астмавставками?

                    Вообще странная политика. Интел всякий там 16ти битный режим тянет же ровно потому, что не весь софт можно перекомпилировать
                    Ответить
                    • > под 64

                      Дык никто не заставляет юзать 64-битные типы. Сделай в конпеляторе режим, в котором все размеры как в оригинале. И никто не заметит подвоха.

                      Ну асмовставки - да. И проебанные исходники.
                      Ответить
                      • так ведь ты тогда не смогёшь и всю память юзать, поди? хотя наверное на время перехода пофиг.

                        32 же работает в 64, и ничего.

                        Ну ладно, а что делать с асмом-то? И со всякими тонкими оптимизациями?

                        А всякий ядреный софт? драва? Там же небось другой лейаут памяти, i/o нету, еще чонить
                        Ответить
                        • > не смогешь всю память юзать

                          А надо? Оно ж раньше как-то работало, памяти хватало.

                          > оптимизациями

                          Ну если новый проц мощнее - тупо забить. Не хуже чем раньше - и ладно. Для переезда сойдёт.
                          Ответить
                        • > дрова

                          А вот это вроде одна из причин, по которой в десктопную винду PAE не завезли. Все понахардкодили себе 32-битных адресов.

                          > i/o нету

                          Ты давно видел железку с i/o? Ну кроме легаси хуйни, которая не может на него забить и просто бахнуть MMIO регион.
                          Ответить
                        • да там небось еще real mode запускать можно (и всё же, какой долбоеб догадался адресовать тридцатью двумя битами один мегабайт с размером адреса только в двадцать бит?)
                          Ответить
                          • Блядь, как всё сложно. Почему мне в "PHP" никогда не приходилось запускать "real mode"?
                            Ответить
                            • потому что ты всего-навсего { Middle PHP Developer }
                              Ответить
                          • показать все, что скрытоvanished
                            Ответить
                          • Да всем похуй было, кто ж знал, что целых 640к мало окажется.
                            Ответить
                            • ну я понимаю если б там второй регистр например восьмибитным был. но какой смысл сдвигать на четыре бита? зачем? чтобы что?
                              Ответить
                              • Ну типа удобно, ты в любом месте памяти можешь сделать регион на 64к и пердолить его.
                                Ответить
                                • ну так это можно было сделать и без нахлёста адресов
                                  Ответить
                                  • интересно, как?

                                    уменьшать размер регистра сегмента и его двигать потом?
                                    Ответить
                                    • использовать из верхнего регистра только четыре бита в качестве самых старшихов битов адреса, чтобы зарезервировать еще двенадцать на будущее
                                      Ответить
                                      • Неудобно же. У тебя память развалится на 64кб блоки с каждым из которых надо работать по-отдельности.

                                        К примеру, чтобы работать с 40кб массивом который начинается на 0х8000 тебе постоянно придется дрочить сегментные регистры.

                                        Нахлёстом сегментов они эту проблему и пытались решить: ты ставишь ds на начало массива и течёшь.
                                        Ответить
                                        • нормальный код вообще писать неудобно
                                          Ответить
                                        • В сишке модель памяти «Huge» постоянно дрочит регистры, пирфоманс сливается как лалка, зато можно делать массивы больше 64к. Этим она отличается от модели «Large», которая «ставит ds на начало массива и течёт»: в «Large» пирфоманс не проседает, но и массивы больше 64к объявлять нельзя.
                                          Ответить
                                  • Можно. И в 286 так и сделали с защищённым режимом.
                                    Ответить
                              • показать все, что скрытоvanished
                                Ответить
      • #скрылветку
        Ответить
    • Переведи на "PHP".
      Ответить
    • Ответить
      • strtoull, вестимо. Причём, сука, не всегда.
        Ответить
        • Тупанул.
          Полная говнина.
          Сайт-эффектная питушатня errno, код разврата, ещё и кокозатель.
          Ответить
        • > Причём, сука, не всегда.
          Ахаха
          ERRORS
                 EINVAL (not in C99) The given base contains an unsupported value.
          
                 ERANGE The resulting value was out of range.
          
                 The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned).
          Ответить
          • У меня такое ощущение, что я сам бы снуля быстрее распарсил...

            Тот самый момент, когда распарсить аргумент сложнее, чем поднять виртуальную машину, которой он понадобился.
            Ответить
          • Кстати вишенка на торте: выходной указатель не конст.

            На входе const char*, на выходе просто char*.
            Ответить
            • >unsigned long long int strtoull(const char *nptr, char **endptr,
              С-с-с-ука.
              Зачем? Зачем?
              Ответить
              • Издержки сишной типизации. Иначе старый код конпеляться перестанет.
                Ответить
      • показать все, что скрытоvanished
        Ответить

    Добавить комментарий