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

    −148.5

    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
    switch (c)
    		{
    		case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
    		case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
    		case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
    		case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
    		case 'Y': case 'Z':
    		case '_':
    		case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
    		case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
    		case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
    		case 's': case 't': case 'u': case 'v': case 'w': case 'x':
    		case 'y': case 'z':
    		case '0': case '1': case '2': case '3': case '4':
    		case '5': case '6': case '7': case '8': case '9':
    		case 127: case 128: case 129: case 130: case 131: case 132:
    		case 133: case 134: case 135: case 136: case 137: case 138:
    		case 139: case 140: case 141: case 142: case 143: case 144:
    		case 145: case 146: case 147: case 148: case 149: case 150:
    		case 151: case 152: case 153: case 154: case 155: case 156:
    		case 157: case 158: case 159: case 160: case 161: case 162:
    		case 163: case 164: case 165: case 166: case 167: case 168:
    		case 169: case 170: case 171: case 172: case 173: case 174:
    		case 175: case 176: case 177: case 178: case 179: case 180:
    		case 181: case 182: case 183: case 184: case 185: case 186:
    		case 187: case 188: case 189: case 190: case 191: case 192:
    		case 193: case 194: case 195: case 196: case 197: case 198:
    		case 199: case 200: case 201: case 202: case 203: case 204:
    		case 205: case 206: case 207: case 208: case 209: case 210:
    		case 211: case 212: case 213: case 214: case 215: case 216:
    		case 217: case 218: case 219: case 220: case 221: case 222:
    		case 223: case 224: case 225: case 226: case 227: case 228:
    		case 229: case 230: case 231: case 232: case 233: case 234:
    		case 235: case 236: case 237: case 238: case 239: case 240:
    		case 241: case 242: case 243: case 244: case 245: case 246:
    		case 247: case 248: case 249: case 250: case 251: case 252:
    		case 253: case 254: case 255: 
    		  continue;
    
    		default:
    		  phase1_ungetc (c);
    		  break;
    		}

    нашел в недрах gettext

    Запостил: aleo, 24 Августа 2009

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

    • вау! скока букв
      Ответить
      • показать все, что скрытоА как ты иначе напишешь? Вообще это самый быстрый вариант как бы, да и вполне читается. Где тут говнокод?
        Ответить
        • что курил ?
          Ответить
        • Я всегда думал, что самый быстрый вариант через таблицу.
          Ответить
          • Через таблицу нужно проверять на допустимые значения, иначе старый добрый Access Violation всплывёт.
            Ответить
            • А это сложно?
              Для char таблицу на все 256 значений сделать не проблема.
              Ответить
              • Ты уверен, что там не WideChar? Не Unicode?
                Ответить
                • Я ж говорю, добавь проверку. Одна операция.
                  if (c <= 255 && table[(char)c])
                  continue;
                  else
                  phase1_ungetc (c);
                  Ответить
                  • Зачем тут какая-то таблица?
                    if(c>=127&&c<=255)
                    continue;
                    Также сделать и с диапазонами цифр и букв. :)
                    Ответить
                    • А, ну, если там все подряд идут, то таблица и не обязательна.
                      Ответить
                  • А ну как c окажется знаковым?
                    Ответить
                    • Скорее всего, "c" типа unsigned char или short или что-нибудь побольше. Если это не так, то тип привести труда не составит
                      Ответить
                • вот поэтому надо юзать utf8
                  Ответить
                  • Да, как это дело можно реализовать для юникода, недавно тут было:)
                    Ответить
    • Офигеть
      Ответить
    • о_О
      Ответить
    • А что, нормально, не самый ужасный вариант.
      В сях нельзя сделать индексирование на этапе задания данных типа bool isChar[]={'A'=true,'B'=true..} поэтому придется делать bool isChar[]={false,false,false...,true,true,false.. .} и следить за тем, на каком индексе стоят какие значение, либо делать на этапе инициализации bool isChar[256]; memset(isChar,0,sizeof isChar); isChar['a']=true;isChar['b']=true;...
      В первом случае жуткий гемор, во втором куча лишнего кода (и столько же ручной копипасты).

      Этот же вариант компилятор оптимизирует конструкцию в jmp-table или сравнения максимально эффективно, причем в зависимости от настроек оптимизации по размеру или по скорости сделает это по-разному.
      Ответить
      • в С99 можно... по моему так
        char array[10] = { [2] = 'a', [5] = 'b' };
        Ответить
      • Можно сделать что-то типа Map'a, хоть и не так удобно, как в С++
        Ответить
    • видел уже, тут всё правильно
      Ответить
    • не учили людей операторам if else ))
      Ответить

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