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

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
  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 j123123, (Updated )

Комментарии (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 - это вообще названия регистров. В безумных шестидесятых каждый лиспер был ассемблерщиком.
                Ответить
                • мне всегда говорили что первыми "ассемблерщиками" были фортранщики. и наоборот.
                  Ответить
                      • Хекс-коды тоже компилируются в мозгах программиста(который ебнулся достаточно сильно, чтоб писать прям в хекскодах (или в Wct например) ) из его мыслей. А, ну да, и в процессоре есть микрокод, который компилирует опкоды во что-то еще.

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

                        А если серьезно, то программа, которая из мнемоник делает двоичные инструкции проца это скорее транслятор, чем компилятор. В компиляторе куча какой-то ебнутой херни например парсим код на си, строим AST, потом переводим из AST в какое-то говно, потом из этого говна еще в какое-то SSA говно, пойди исходники GCC читни
                        Ответить
    • Тут бага кстати (странно что никто не заметил). Починил
      #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;
      }
      Ответить
  • Это что за новый синтаксис инициализации массивов?
    Ответить
      • Давно уже есть в стандарте C99. Привыкли пользоваться всякими говновизуальными студиями, которые нихера не умеют новых стандартов
        Ответить
        • Точно, извиняюсь. Это ['a'...'e'] = 12 гццизм, а без многоточия по стандарту. Но в целом какая разница, все равно гцц самый нормальный компилятор.
          Ответить

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

Переведи на "PHP", guest!

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


    8