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

    −49

    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
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    bool decode_hex(void *p, size_t max_len, const char *hexstr, size_t *out_len_)
    {
    static const unsigned char hexdigit_val[256] = {
            ['0'] = 0,
            ['1'] = 1,
            ['2'] = 2,
            ['3'] = 3,
            ['4'] = 4,
            ['5'] = 5,
            ['6'] = 6,
            ['7'] = 7,
            ['8'] = 8,
            ['9'] = 9,
            ['a'] = 0xa,
            ['b'] = 0xb,
            ['c'] = 0xc,
            ['d'] = 0xd,
            ['e'] = 0xe,
            ['f'] = 0xf,
            ['A'] = 0xa,
            ['B'] = 0xb,
            ['C'] = 0xc,
            ['D'] = 0xd,
            ['E'] = 0xe,
            ['F'] = 0xf,};
    
            if (!p || !hexstr)
                    return false;
            if (!strncmp(hexstr, "0x", 2))
                    hexstr += 2;
            if (strlen(hexstr) > (max_len * 2))
                    return false;
    
            unsigned char *buf = p;
            size_t out_len = 0;
    
            while (*hexstr) {
                    unsigned char c1 = (unsigned char) hexstr[0];
                    unsigned char c2 = (unsigned char) hexstr[1];
    
                    unsigned char v1 = hexdigit_val[c1];
                    unsigned char v2 = hexdigit_val[c2];
    
                    if (!v1 && (c1 != '0'))
                            return false;
                    if (!v2 && (c2 != '0'))
                            return false;
    
                    *buf = (v1 << 4) | v2;
    
                    out_len++;
                    buf++;
                    hexstr += 2;
            }
    
            if (out_len_)
                    *out_len_ = out_len;
            return true;
    }

    https://gist.github.com/aido/9490244#file-der_test-L16 оптимизция!

    Запостил: j123123, 09 Июня 2016

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

    • if (out_len_)
              *out_len_ = out_len;
      return true;

      Питушня, из-за которой "" или "0x" будет способствовать неопределённому поведению в вызывающем коде?
      Ответить
    • #define hexdigit_val(a) (((a)-'0') < 10) ? (a)-'0' : ((a) & ~(1 << 5))-'A'

      как-то так.
      Ответить
      • скобки забыл.
        b = hexdigit_val(a)*2; //счастливой отладки
        Ответить
        • Когда дело доходит до макроебства, скобок редко когда бывает достаточно
          Ответить
          • Макропроцессор придумали лисперы!
            Ответить
            • Вообще-то да.
              Ответить
              • я уверен что макропроцессор придумали ассемблерщики. макро-извраты с инструкциями - синонимы и альтернативные мнемоники - примитивнее и древнее я ничего не знаю.

                лисперы привнесли главным образом то что макропроцессор может быть полноценной частью высокоуровнего языка. я бы им за это памятник поставил, но они к сожалению в конце решили язык программирования все таки не далать. "lisp is not a programming language - lisp is an environment!"
                Ответить
                • Ну тут стоит вспомнить, что CAR и CDR - это вообще названия регистров. В безумных шестидесятых каждый лиспер был ассемблерщиком.
                  Ответить
                  • мне всегда говорили что первыми "ассемблерщиками" были фортранщики. и наоборот.
                    Ответить
          • #define PITUH(x) KURITCA((x))

            Fixed
            Ответить
      • ((a) & ~(1 << 5))

        зачем это?
        Ответить
        • А как ешё занулить пятый бит?
          Ответить
          • std::bitset<128> b(a);
            b[5] = false;
            a = b.to_ullong();
            Ответить
            • Шёл бы ты отсюда, крестушок. Где здесь Си?
              Ответить
              • Си не нужно.
                Ответить
                • А С++ не нужен.
                  Ответить
                  • C++ - нужен! Не на расте же писать.
                    Ответить
                    • На ассемблере. Компиляторы для анскиллябр
                      Ответить
                      • асм тоже компилируется, анскиллябра
                        Ответить
                        • Хекс-коды тоже компилируются в мозгах программиста(который ебнулся достаточно сильно, чтоб писать прям в хекскодах (или в Wct например) ) из его мыслей. А, ну да, и в процессоре есть микрокод, который компилирует опкоды во что-то еще.

                          Компиляторы повсюду

                          А если серьезно, то программа, которая из мнемоник делает двоичные инструкции проца это скорее транслятор, чем компилятор. В компиляторе куча какой-то ебнутой херни например парсим код на си, строим AST, потом переводим из AST в какое-то говно, потом из этого говна еще в какое-то SSA говно, пойди исходники GCC читни
                          Ответить
                          • > пойди исходники GCC читни
                            это как напитон, только хуже?
                            Ответить
                            • > только хуже
                              Не, тогда тебя бы послали читать реализацию STL в libstdc++. Я не утверждаю, что она плохая. Просто нечитабельная.
                              Ответить
                              • знаю, но с исходниками J всё равно не сравнится
                                Ответить
                              • Советую исходник printf из glibc почитать, там макросов на тыщу строк наберется например
                                https://sourceware.org/git/?p=glibc.git;a=blob;f=stdio-common/vfprintf.c;hb=07eb4b716ea5041bceb47b38ac8ab989a10b3afd

                                И там используется эта хрень с goto через метки в массиве
                                Ответить
                    • Капитан Питух спешит на помощь!
                      Ответить
      • Тут бага кстати (странно что никто не заметил). Починил
        #include <stdio.h>
        #define hexdigit_val(a) ((((a)-'0') < 10) ? (a)-'0' : ((a) & ~(1 << 5))-'A'+10)
        int main(void)
        {
            printf("%i ", hexdigit_val('0'));
            printf("%i ", hexdigit_val('1'));
            printf("%i ", hexdigit_val('2'));
            printf("%i ", hexdigit_val('3'));
            printf("%i ", hexdigit_val('4'));
            printf("%i ", hexdigit_val('5'));
            printf("%i ", hexdigit_val('6'));
            printf("%i ", hexdigit_val('7'));
            printf("%i ", hexdigit_val('8'));
            printf("%i ", hexdigit_val('9'));
            printf("\n");
            printf("%i ", hexdigit_val('A'));
            printf("%i ", hexdigit_val('B'));
            printf("%i ", hexdigit_val('C'));
            printf("%i ", hexdigit_val('D'));
            printf("%i ", hexdigit_val('E'));
            printf("%i ", hexdigit_val('F'));
            printf("\n");
            printf("%i ", hexdigit_val('a'));
            printf("%i ", hexdigit_val('b'));
            printf("%i ", hexdigit_val('c'));
            printf("%i ", hexdigit_val('d'));
            printf("%i ", hexdigit_val('e'));
            printf("%i ", hexdigit_val('f'));
            printf("\n");
            return 0;
        }
        Ответить
      • слабо на pyth или брэйнфаке?
        Ответить
    • Это что за новый синтаксис инициализации массивов?
      Ответить
      • гццизм.
        Ответить
        • Давно уже есть в стандарте C99. Привыкли пользоваться всякими говновизуальными студиями, которые нихера не умеют новых стандартов
          Ответить
          • Точно, извиняюсь. Это ['a'...'e'] = 12 гццизм, а без многоточия по стандарту. Но в целом какая разница, все равно гцц самый нормальный компилятор.
            Ответить
            • Действительно, гцц — самый вменяемый конпелятор. Остальные для анскилябр заедушных.
              Ответить
              • особенно под арм он хороший код генерит
                ага
                Ответить
                • ARM не нужен. Есть только одна вменяемая архитектура, и под неё гцц генерит нормальный код.
                  Ответить
                • А ты знаешь компилятор, который бы под arm хороший код генерил? По-моему они все говно.
                  Ответить
                  • все компиляторы говно. настоящие пацаны пишут только на асме.
                    Ответить
    • Я просто оставлю это здесь: http://govnokod.ru/12822
      Ответить

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