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

    +136.8

    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
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    ...
    
    // TODO: remove this godless "switch()"!
                    switch(tuntype) { // TODO: Important: do as in documentation instead of reverse-ingeniering!
    #define PACKET_TRY {\
                    if(packet->ip_v == 4) {\
                            hl=packet->ip_hl<<2;\
                            if(hl>=sizeof(*packet))\
                                    break;\
                            /* TODO: Check in RFC something about of ICMP send-back in this case */\
                            fprintf(stderr, "Got too short IP-header (%i)...\n",hl);\
                    }\
                    if((packet->ip_v&IPV6_VERSION_MASK) == IPV6_VERSION) {\
                            break;\
                    }\
    }
    #define NEXT(a) tuntype=a;\
                    if(tuntry>=2)\
                            goto tun_process_switch_end;\
                    tuntry++;
    #define CASE(a) NEXT(a);\
            case a
    tun_process_switch:
    //              switch(tuntype) {
                            case TUNTYPE_NORM:              // NetBSD-like?
                                    packet=(typeof(packet))ptr;
                                    PACKET_TRY;
                            CASE(TUNTYPE_EXT):              // FreeBSD-like?
                                    packet=(typeof(packet))((char *)ptr + 4);
                                    if(s>4)
                                            if(*ptr==0x02)
                                                    PACKET_TRY;
                            CASE(TUNTYPE_ETH):              // Ethernet? TODO: Implement VLAN-tagging
                                    packet=(typeof(packet))((char *)ptr + sizeof(*eth));
                                    eth=(typeof(eth))ptr;
                                    if(!teth) {
                                            teth=alloca(sizeof(*teth));
                                            memcpy(&teth->ether_shost, &eth->ether_dhost, sizeof(teth->ether_shost));
                                            memcpy(&teth->ether_dhost, &eth->ether_shost, sizeof(teth->ether_dhost));
                                            teth->ether_type=ETHERTYPE_IP;
                                    }
                                    if(s>sizeof(*eth))
    //                                      if((*(char *)&eth->ether_type==0x08/* not IPv4? */)||(*(char *)&eth->ether_type==0x86/* not IPv6? */))  // TODO: Implement compatibility with all protocols over ethernet
                                                    PACKET_TRY;
                                    NEXT(TUNTYPE_NORM);
                                    goto tun_process_switch;
                            
                            default:                        
                                    tuntype=TUNTYPE_NORM;
                                    goto tun_process_switch;
    //              }
    tun_process_switch_end:
    #undef CASE
    #undef NEXT
    #undef PACKET_TRY
                                    if(tuntry<~0)
                                            tuntry=0;
                                    tuntype=oldtuntype;
                                    fprintf(stderr, "Got unknown packet. Flushing...\n");
                                    FLUSH;  // Flush all. We don't know the length of packet with unknown type.. So, we have to flush the buffer, to probably get new packets from the start.
                                    goto tun_process_while;
                    }
    
    ...

    "Ляпотааааа"... Очень "структурный" switch...

    Запостил: xaionaro, 11 Ноября 2009

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

    • Коменты рулят.
      Ответить
      • недавно у себя в коде в комментах написал "God bless gcc and c99 for its __thread" :)
        Ответить
    • Ппц...[code = c] goto [/code] ...в Си...убиться веником.....
      Ответить
      • как грится, счастливой отладки, камрад ;-)
        Ответить
    • Одни guest-ы... Не понятно даже разные это люди или всё - один человек. :)
      Ответить
      • Верните возможность вписывать ники в комментах или разрешите писать комменты только зарегистрированным пользователям. Пожалуйста. ;)
        И перебранок меньше будет из-за всяких школънегов, тк с ником будет хоть немного стыдно, некоторому проценту населения.
        А то все, как захотят сказать что-то гадкое и зловонное, так сразу разлогиниваються, переходя в гостя. И без угрызений совести матерьатца.
        Ответить
        • Да, а ещё не понятно, какой гость, кому и что сказал, и с каким гостем разговариваешь. Приходиться начинать коммент с предложения: "Ну хотя я и другой гость, но: ...".
          Ответить
    • Господа Властелины этого сайта. Я уже писал в вашей "системе тикетов" или в чём-то похожем о неверной работе подсветки в Сишном коде. Прошу обратить внимание, что игнорируется "\" в конце строки, а ведь должно "продолжать подсветку" и на следующую строку.
      Ответить
    • одно наличие в этом коде goto делает это говнокодом.
      Ответить
      • С тем, что давный код является говнокодом, никто не спорит. Вы лучше какие-нибудь умные мысли изложите... Например красивую альтернативу, такие комментарии читать хотя бы интересно.
        Ответить
    • один многострочный дефайн через другой) с ума сойти))
      Ответить

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