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

    +115

    1. 1
    2. 2
    3. 3
    #define TEN    10
    #define TEEN   100
    #define TEEEN  1000

    glook, 15 Ноября 2013

    Комментарии (9)
  2. Си / Говнокод #14097

    +137

    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
    int memcmp (const void* v1, const void* v2, size_t n)
    {
       uint32_t *s1;
       uint32_t *s2;
       size_t  i;
    
       s1 = (uint32_t*) v1;
       s2 = (uint32_t*) v2;
    
       for (i = 0; i < n; i++) {
                    if (*s1 != *s2) {
                            return *(const uint32_t *)s1 >
                                   *(const uint32_t *)s2 ? 1 : -1;
                    }
                    s1++;
                    s2++;
            }
       return 0;
    }

    Реализация memcmp в библиотеке одной малоизвестной "учебной" ОС реального времени. Учебной в том смысле, что по этой системе разве что доклады, презентации и статьи делали, где-то реально она вряд ли использовалась.
    Для интересующихся http://pok.safety-critical.net/

    WGH, 14 Ноября 2013

    Комментарии (14)
  3. Си / Говнокод #14091

    +143

    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
    VariableValue *locVars;
    locVars = new VariableValue;
    locVars->variable = "r";
    locVars->value = mTaskParameters.rNodes[0]; //x_low;
    locVars->link = new VariableValue;
    locVars->link->variable = "theta";
    locVars->link->value = mTaskParameters.thetaNodes[0]; //y_low;
    locVars->link->link = new VariableValue;
    locVars->link->link->variable = "r_min";
    locVars->link->link->value = mTaskParameters.rNodes[0]; //this->x_low;
    locVars->link->link->link = new VariableValue;
    locVars->link->link->link->variable = "r_max";
    locVars->link->link->link->value = mTaskParameters.rNodes[mTaskParameters.rNodes.size()-1]; //this->x_high;
    locVars->link->link->link->link = NULL;

    Построение связного списка

    xredor, 12 Ноября 2013

    Комментарии (6)
  4. Си / Говнокод #14087

    +108

    1. 1
    assert(buf=malloc(BUF_SIZ));

    А в релизе мы сэкономим памяти

    crastinus, 10 Ноября 2013

    Комментарии (94)
  5. Си / Говнокод #14082

    +134

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    int t, max, x;
    scanf("%d", &x);
    for(t=x%10; max!=t; max=t);
    for(t=x%100/10; max<t; max=t);
    for(t=x%1000/100; max<t; max=t);
    for(t=x/1000; max<t; max=t);
    printf("Max: %d\n", max);

    Нахождение максимальной цифры в 4-значном числе. Одна из первых лаб по Си. Предполагалось использование if, но студенты не ищут лёгких путей. (Сдвиги они пока не учили, так что на вычисление цифры не обращайте внимания.)

    proDOOMman, 07 Ноября 2013

    Комментарии (8)
  6. Си / Говнокод #13960

    +139

    1. 1
    out[0] = str[0] > str[1] && str[0] > str[2] ? (out[1] = str[1] > str[2] ? (out[2] = str[2],str[1]) : (out[2] = str[1],str[2]) ,str[0]) : (str[1] > str[2] ? (out[1] = str[0] > str[2] ? (out[2] = str[2],str[0]): (out[2] = str[0],str[2]),str[1]) :(out[1] = str[0] > str[1] ? (out[2] = str[1],str[0]): (out[2] = str[0],str[1]),str[2]) );

    Сортируем 3 символа.

    Abbath, 16 Октября 2013

    Комментарии (12)
  7. Си / Говнокод #13918

    +128

    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
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    #include "unpacker.h"
    
    Unpacker::Unpacker(char *name) {
        _splitString = new char*[16];
        _ctx = SDL_RWFromFile(name, "rb");
    }
    
    Unpacker::~Unpacker() {
        delete _splitString;
        SDL_RWclose(_ctx);
        SDL_FreeRW(_ctx);
    }
    
    Dir *Unpacker::getDir(char *path) {;
        int index = 1;
        char pth[256];
        char name[80];
        char *str = "";
        if (!path)
            return NULL;
        _split(path);
        SDL_RWseek(_ctx, 2, SEEK_SET);
        pth[0] = '/'; pth[1] = '\0';
        while (_splitString[index]) {    
            Uint16 count;
            Uint32 hash;
            str = _splitString[index];
            hash = _hash(str);
            count = SDL_ReadLE16(_ctx);
            for (int i=0; i<count; i++) {
                Uint32 h;
                Uint32 offset;
                h = SDL_ReadLE32(_ctx);
                offset = SDL_ReadLE32(_ctx);
                if (hash == h) {
                    Uint8 size;
                    Uint32 curPos = SDL_RWtell(_ctx);
                    SDL_RWseek(_ctx, offset, SEEK_SET);
                    SDL_RWread(_ctx, &size, 1, 1);
                    SDL_RWread(_ctx, name, size, 1);
                    name[size] = '\0';
                    if (!strcmp(str, name)) {
                        if (_splitString[index+1]) {
                             strcat(pth, str);
                             strcat(pth, "/");
                        }
                        break;
                    } else {
                        if (i == count-1)
                            return NULL;
                        SDL_RWseek(_ctx, curPos, SEEK_SET);
                    }
                }
            }
            index++;
        }
        Dir *dir = new Dir;
        strcpy(dir->name,  str);
        strcpy(dir->path, pth);
        dir->dirsCount = SDL_ReadLE16(_ctx);
        dir->dirsOffset = SDL_RWtell(_ctx);
        SDL_RWseek(_ctx, dir->dirsCount*8, SEEK_CUR);
        dir->filesCount = SDL_ReadLE16(_ctx);;
        dir->filesOffset = SDL_RWtell(_ctx);
        return dir;
    }
    
    File *Unpacker::getFile(char *path) {
        char pth[256];
        char nm[80];
        int index = 2;
        _split(path);
        if (!_splitString[1])
            return NULL;
        if (_splitString[2]) {
            strcpy(pth, "/");
            strcpy(pth, _splitString[1]);
            strcat(pth, "/");
        } else {
            Dir *dir = getDir("/");
            return getFile(dir, _splitString[1]);
        }
        while (1) {
            if (_splitString[index+1]) {;
                strcat(pth, _splitString[index]);
                strcat(pth, "/");
            } else {
                strcpy(nm, _splitString[index]);
                break;
            }
            index++;
        }

    Нашел у себя на диске - старое творенье, когда я был мал и глуп... Распаковщик архива на своего формата на основе zlib.

    Pythoner, 09 Октября 2013

    Комментарии (32)
  8. Си / Говнокод #13875

    +139

    1. 1
    for (normalize(); n > 0; scanf("%d", &temp, n--)){...}

    Но ведь работает!

    Nex, 30 Сентября 2013

    Комментарии (21)
  9. Си / Говнокод #13768

    +129

    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
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    #include <stdio.h>
    #include <dlfcn.h>
    #include <getopt.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define int64 long long
    
    const char* help =
    "       -h,--help  это сообщение\
            -f,--func  имя функции\
            -n,--num   количество аргументов функции\
            -a,--arg1  первый аргумент\
            -b,--arg2  второй аргумент";
    
    struct option longopts[] ={
            {"func",1,NULL,'f'},
            {"help",1,NULL,'h'},
            {"num", 1,NULL,'n'},
            {"arg1",1,NULL,'a'},
            {"arg2",1,NULL,'b'},
            {0,0,0,0}
    };
    
    void strtoa(void** arg, char* optarg){
        int tmp;
        char* e;
        tmp = strtol(optarg,&e,10);
        if (e != optarg + strlen(optarg)){
            *arg = malloc(strlen(optarg));
            strcpy((char*)*arg,optarg);
        } else *arg = (void*)tmp;
    
    }
            
    int64 main(int argc, char** argv){
      
      int opt, num = 0;
      void *a,*b;
      char* e;
    
      void* (*func2)(void*,void*), 
            (*func1)(void*), 
            (*func0)(), *func = 0;
      
      while((opt = getopt_long(argc,argv,"f:h:n:a:b:",longopts,NULL)) != -1){
          switch (opt){
              case 'h':
                  fprintf(stderr,"%s",help);
                  exit(0);
              case 'f':
                  func = dlsym(NULL,optarg);
                  break;
              case 'n':
                  num = atoi(optarg);
                  if (num > 2) exit(1);
                  break;
              case 'a':
                  strtoa(&a,optarg);
                  break;
              case 'b':
                  strtoa(&b,optarg);
                  break;
          }
      }
      
      if(func != 0){
          switch (num){
              case 0: 
                func0 = func;
                (*func0)();
                break;
              case 1:
                func1 = func;
                (*func1)(a);
                break;
              case 2:
                func2 = func;
                (*func2)(a,b);
          }
      }
      
      return 0;
    }

    Запускает любую функцию линукс, содержащую до 2-х аргументов. В хелпе все написано. Собирать так c флагом -dl.
    Использовать так:
    a.out -f sleep -n 1 -a 1 - sleep на 1 секунду
    a.out -f printf -n 1 -a OK - выводит без конца строки
    вдохновлен этим:
    http://govnokod.ru/13763

    Я, crastinus97, говорю вам: этого способа нет в man. Я его сам открыл.

    crastinus, 11 Сентября 2013

    Комментарии (27)
  10. Си / Говнокод #13712

    +135

    1. 1
    return ((((num & ~(0xFFFFFFFF << n)) >> (n - 0x1)) & 0x1) == 0x1) ? ((num & ~(0xFFFFFFFF << n)) ^ ~(0xFFFFFFFF << n)) + 0x1 : (num & ~(0xFFFFFFFF << n));

    EON8ight, 01 Сентября 2013

    Комментарии (21)