Няшная / Говнокод #26975 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 bormand, (Updated )

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

    • > 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. Чтоб никто не догадался.
        Ответить
        • есть еще охуительное название x86-64


          на всяк случай напомню, что лежит в system32 и syswow64 в винде
          Ответить
          • Ну в 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 нету, еще чонить
                      Ответить
                      • > не смогешь всю память юзать

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

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

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

                          >И проебанные исходники.
                          или просто лень человечья.

                          Зачем мне вообще думать, и покупать за много денег какую-то новую архитектуру, которую я не знаю, и под которую еще хуй знает какой там софт есть, и мои админы её не знают итд, если я могу сидеть на старой, и течь?
                          Ответить
                            • В режиме IA-64 это был самый быстрый процессор для вычислений с плавающей запятой, имеющийся на рынке.

                              В то же время в целочисленных вычислениях он лишь немного превосходил процессоры равной частоты с системой команд x86.

                              При выполнении неоптимизированного под Itanium программного кода для x86-систем его производительность была в 8 раз меньше, чем у x86-процессоров на той же частоте.

                              дальше -- больше

                              Программная эмуляция системы команд x86 работает быстрее, что демонстрирует Itanium 2, который показывает производительность не оптимизированного под Itanium программного кода, сравнимую с x86-процессорами на той же частоте
                              Ответить
                              • Эм, т.е. он в родном режиме работал хуже чем в эмуляции?!
                                Ответить
                                • как я понял, хардварно гонял x86 он медленее, чем если под него написать нативный эмулятор.

                                  В первом итаниуеме делали хардварно, в 2 -- софтварно

                                  Но могли наврать в вики, надо искать источник
                                  Ответить
                                    • Понятия не маю.

                                      Я помню, что MMX вроде изначально запилили где-то в районе FPU, и он даже регистры его переиспользовал, так что высокая скорость плавучки может намекать нам на то, что SSE могли придумать и в нем.

                                      Помню, что появился SSE в районе третьего пня, и был еще большой прыг (sse 3 чтоли?) в районе прескотта (первый 775-й)

                                      а ну хотя третий пень (коппермайн какойнить?) же был раньше, чем итаниум

                                      но с другой стороны разрабатывали то его давно
                                      Ответить
                      • > дрова

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

                        > i/o нету

                        Ты давно видел железку с i/o? Ну кроме легаси хуйни, которая не может на него забить и просто бахнуть MMIO регион.
                        Ответить
                        • >А вот это вроде одна из причин, по которой в десктопную винду PAE не завезли.

                          AFAIK, логика была там такая:
                          * на десктопе часто ставят говно, и драйверы к нему пишут лалки
                          * на десктопе редко бывает потребность в больших объемах памяти

                          То есть включать PAE на десктопе во-первых опасно, во-вторых не нужно.

                          >Ты давно видел железку с i/o?
                          лол)
                          https://i.postimg.cc/1RksqMwq/lol.png
                          там еще и IRQ, хотя везде же уже MSI
                          Ответить
                      • да там небось еще real mode запускать можно (и всё же, какой долбоеб догадался адресовать тридцатью двумя битами один мегабайт с размером адреса только в двадцать бит?)
                        Ответить
                        • Блядь, как всё сложно. Почему мне в "PHP" никогда не приходилось запускать "real mode"?
                          Ответить
                        • > какой долбоеб догадался адресовать тридцатью двумя битами один мегабайт

                          ты имеешь ввиду систему сегмент:смещение с ее оверлапом и Gate A20?

                          Когда два 16-ти битных регистра в итоге превращаются в один адрес до мегабатйа?

                          А как бы ты сделал? Логарифм от 20 по основанию 2 чото какой-то не ровный
                          Ответить
                          • > гейт а20

                            Вот уж реально плевок в вечность. Одни долбоёбы поюзали недокументированнную фичу. Другие долбоебы ее узаконили, привернув костыль через клавиатурный порт. А теперь все страдают и эмулируют это говнище.
                            Ответить
                            • причем не осталось наверное уже софта, которому это реально нужно, в смысле который завязан на тот факт, что в один и тотже адрес можно попасть разными путями
                              Ответить
                              • Я думаю, этот софт через пару лет уже сдох или перестал юзать этот хак.
                                Ответить
                                • думаю, да: скорость покладания нового адреса в регистр не была боттлнеком уже в 286-м кажется (по сравнению с доступом к памяти-то), так что смысла в хаке не было
                                  Ответить
                        • Да всем похуй было, кто ж знал, что целых 640к мало окажется.
                          Ответить
                          • ну я понимаю если б там второй регистр например восьмибитным был. но какой смысл сдвигать на четыре бита? зачем? чтобы что?
                            Ответить
                            • Ну типа удобно, ты в любом месте памяти можешь сделать регион на 64к и пердолить его.
                              Ответить
                              • ну так это можно было сделать и без нахлёста адресов
                                Ответить
                                • интересно, как?

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

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

                                      Нахлёстом сегментов они эту проблему и пытались решить: ты ставишь ds на начало массива и течёшь.
                                      Ответить
                                        • дело не тока в неудобстве: дрочить ds не бесплатно на 8088
                                          Ответить
                                      • В сишке модель памяти «Huge» постоянно дрочит регистры, пирфоманс сливается как лалка, зато можно делать массивы больше 64к. Этим она отличается от модели «Large», которая «ставит ds на начало массива и течёт»: в «Large» пирфоманс не проседает, но и массивы больше 64к объявлять нельзя.
                                        Ответить
                                  • защищеный режим в 286 адресовал не метр, а 16 метров вроде, и в сегментном регистре у него был индекс в таблице сегментов, а не адрес в памяти, так что пример не совсем аналогичен)

                                    или я путаю?
                                    Ответить
                                    • Ну я о том, что они сделали "регион в любом месте" и "без нахлёста адресов" одновременно.

                                      Без дескрипторных табличек так не выйдет. Будет что-то одно из джвух.
                                      Ответить
                            • чуваг, ближние указатели в броланд сишечке и так не могли описать кусок памяти более одного сегмента (если я ничего не путаю), ты предлагаешь его еще меньше сделать?:)
                              Ответить
      • Тупанул.
        Полная говнина.
        Сайт-эффектная питушатня errno, код разврата, ещё и кокозатель.
        Ответить
        • Ещё и пустую строку как 0 парсит, поэтому проверка перед вызовом.

          > кокозатель

          Ну за это спасибо, кстати. Хоть допарсить можно или проверить что до конца разобрал. В atoi было хуже.
          Ответить
          • > В atoi было хуже.

            Так atoX это же по сути просто «удобные» обёртки над strtoX, без указателя и прибитой десятичкой.

            Если бы туда завезли гарантированный errno, были бы нормальные функции.
            Ответить
              • Хз, strtol вроде в 89 был.

                Edit: а длинные питухи действительно потом появились:
                long      strtol( const char          *str, char          **str_end, int base );
                (until C99)
                long      strtol( const char *restrict str, char **restrict str_end, int base );
                (since C99)
                long long strtoll( const char *restrict str, char **restrict str_end, int base );
                (since C99)
                Ответить
                  • intval() нельзя использовать с объектами, попытка это сделать вызовет ошибку уровня E_NOTICE и вернет значение 1.

                    Какая ошибка уровня E_NOTICE )))

                    Для строк функция скорее всего вернет 0, хотя это зависит от первого символа в строке.
                    Ответить
                    • да и возвращаемое значение тоже ок
                      Ответить
                      • Видимо потому что тру. Непустой массив тоже 1. А пустой 0.
                        Ответить
                        • >целое значение переменной
                          >тру
                          ок

                          а если Null или что там у них?
                          Ответить
                      • Нет смысла спрашивать о причинах чего либо в "ПХП".
                        Единственным ответом будет "почему нет?"
                        Ответить
                        • Обычно пустое значение - это null, undefined, Nil, NA, "", 0, [], {}, может быть NaN, но никак не 1.
                          Ответить
                          • а разве объект пустой?

                            >""
                            ну это где акак
                            Ответить
        • getopt() тоже та ещё ссанина с глобальным стейтом и мутацией argv. Но его хотя бы юзать удобно. Поэтому не стал сюда постить.
          Ответить
      • > Причём, сука, не всегда.
        Ахаха
        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,
            С-с-с-ука.
            Зачем? Зачем?
            Ответить
            • Издержки сишной типизации. Иначе старый код конпеляться перестанет.
              Ответить
                • В легаси коде везде char*. На входе это нормально кастуется в const char*. А вот на выходе char** в const char** не лезет.

                  Поэтому на выходе конста в стандартной либе нет.
                  Ответить
                  • конста вроде не было раньше в си, его туда завезли по аналогии с С++, не?
                    Ответить
                  • А. Я понял. Т.к. в K&R C не было const, они решили сделать так, чтобы не сломать старое говно.
                    Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8