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

    +135

    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
    /*
        * Now do an in-place copy.
        * Map (R) to (r) and (TM) to (tm).
        * The era of teletypes is long gone, and there's
        * -really- no need to shout.
        */
    while (*src != '\0') {
        if (src[0] == '(') {
            if (strncmp(src + 1, "R)", 2) == 0) {
                (void) strncpy(dst, "(r)", 3);
                src += 3;
                dst += 3;
                continue;
            }
            if (strncmp(src + 1, "TM)", 3) == 0) {
                (void) strncpy(dst, "(tm)", 4);
                src += 4;
                dst += 4;
                continue;
            }
        }
        *dst++ = *src++;
    }
    *dst = '\0';

    Не говнокод, но забавно.
    Инициализация процессоров (и сбор cpuid) в Solaris
    http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/i86pc/os/cpuid.c#2488

    Запостил: myaut, 03 Мая 2013

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

    • Не оптимально в данном случае использовать
      strncmp. Я б записал это по другому.
      [code=C]
      while (*src != '\0')
      {
      if (*src == '(')
      {
      if (*(src + 1)=='R')&&(*(src + 2)==')'))
      {
      *(src + 1)+=32;
      src += 3;
      dst += 3;
      }
      else
      {
      if (*(src + 1)=='T')&&(*(src + 2)=='M')&&(*(src + 3)==')')
      {
      *(src + 1)+=32;
      *(src + 2)+=32;
      src += 4;
      dst += 4;
      }
      }
      }
      *dst++ = *src++;
      }
      [\code]
      Ответить
      • strncmp в Solaris вполне себе может для n <= 4 раскрываться в банальное сравнение двух 32-битных чисел, так что не факт, что ваш способ оптимальнее.

        Зато он точно говнокодистей ;)
        Ответить

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