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

    +132

    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
    struct 
    {
    	unsigned char * low;  //младшая часть адреса
      	unsigned char * high; //страшая часть адреса(только младших 3 бита)
    } padr;
    
    void filladdr(unsigned int * addr) //подготовка адресных ног МК
    {
    	padr.low = (unsigned char *)addr;
    	padr.high = padr.low + 1;
    	PORTB = *padr.low;
    	PORTE &= 0x8;
    	PORTE |= *padr.high;
    
    }
    
    unsigned char readFromSRAM(unsigned int * adrss)
    {
    	char outD;
    	TRISD = 0xFF;
    	filladdr(adrss);
    	PORTA &= 0xFC;
    	NOP(); // задержка на время доступа
    	outD = PORTD;
    	PORTA |= 0x7;
    	return outD;
    }
    
    void writeToSRAM(unsigned int * adrss, unsigned char * data)
    {
    	TRISD = 0x0;
    	filladdr(adrss);
    	PORTD = *data;
    	PORTA &= 0xF8;
    	NOP();  // задержка на время доступа
    	PORTA |= 0x7;
    	PORTD = 0x0;
    }

    говнокод для работы с 2кб внешней SRAM памяти для микроконтролеров pic

    nice_penguin, 02 Января 2011

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

    +141

    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
    char *nvram_get(int index, char *name)
    {
            /* Initial value should be NULL */
            char *recv = NULL;
    
            //LIBNV_PRINT("--> nvram_get\n");
            nvram_init(index);
    
            recv = nvram_bufget(index, name);
    
            //btw, we don't return NULL anymore!
            if (!recv)
                recv = "";
    
            //Always need close nvram
            nvram_close(index);
    
        return recv;
    }
    
    char *nvram_bufget(int index, char *name)
    {
            int idx;
            /* Initial value should be NULL */
            static char *ret = NULL;
    
            //LIBNV_PRINT("--> nvram_bufget %d\n", index);
            LIBNV_CHECK_INDEX("");
            LIBNV_CHECK_VALID();
            idx = cache_idx(index, name);
    
            if (-1 != idx) {
                    if (fb[index].cache[idx].value) {
                            //duplicate the value in case caller modify it
                            //Tom.Hung 2010-5-7, strdup() will cause memory leakage
                            //but if we return value directly, it will cause many other crash or delete value to nvram error.
                            ret = strdup(fb[index].cache[idx].value);
                            LIBNV_PRINT("bufget %d '%s'->'%s'\n", index, name, ret);
    
                            //btw, we don't return NULL anymore!
                            if (!ret)
                                ret = "";
    
                        return ret;
                    }
            }
    
            //no default value set?
            //btw, we don't return NULL anymore!
            LIBNV_PRINT("bufget %d '%s'->''(empty) Warning!\n", index, name);
            return "";
    }

    Кусочек кода из библиотеки работы с nvram для железок на SoC Ralink. Китайцы плакали, кололись о утечки памяти, но продолжали настойчиво мешать указатели на статические строки с указателями на динамически выделенные в куче...

    NiTr0man, 27 Декабря 2010

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

    +162

    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
    // © Код Арсения
    #include <stdio.h>
    #include <conio.h>
    #define N 100
    int n,kol=1;  //одекватен до 6!
     
    void SAW(int *a,int *b)
    {
        *a-=*b;
        *b+=*a;
        *a=*b-*a;
         kol=kol+1;
    }
    
    void deduction(int A[])
    {
        int i;
        printf(" %5d : ",kol);
        for (i=0;i<n;i++)
            printf(" %d ",A[i]);
        printf("\n");
        if (kol%290==0)
            getch();
    }
    
    void Shift(int A[], int k)
    {
        int i;
        if(k<2)return;
        for (i=0;i<k-1;i++)
        {
             Shift(A, k-1);
             if (!(i>=2 && k%2==0))SAW(&A[k-1],&A[0]);
             else SAW(&A[k-1],&A[i-1]);
             deduction(A);
        } 
        Shift(A, k-1);
    }
    
    void main()
    {
        int A[N],i;
        printf("vvedite n\n");
        scanf("%d",&n);
        for (i=0;i<n;i++)
            A[i]=i+1;
        deduction(A);
        Shift(A,n);
        printf("\n %d \n",kol);
    }

    Классический вариант быдлокода в программе, которая печатает всевозможные комбинации перестановок цифр заданной длины. Для того чтобы поменять два значения местами используется отдельная функция SAW, которой передаются указатели на переменные (автор думает, что это круто), в самой же функции производится обмен значений, на которые указывают указатели без помощи дополнительной переменной (опять же автор считает, что это круто), причем, стоит обратить внимание, каким образом это делается (видимо операция XOR этому кодеру пока не известна). Далее классический стиль написания быдлокодера прослеживается буквально в каждой строчке, включая названия функций. Стоит также обратить внимание на оригинальную реализацию рекурсивной процедуры, проницательный читатель сразу же поймет смысл комментария в строке: int n,kol=1;//одекватен до 6!

    jkoff, 25 Декабря 2010

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

    +134

    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
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <time.h>
    #include <sys/types.h>
    
    int main(int argc, char ** argv)
    {
    //...
    time_t time0=time(NULL);
    //...
    if ((f=fopen(argv[1],"r"))==NULL)
    {
    	//...
    }
    while ((fscanf(f,"%i %s",&tim[i],buffer[i]))!=EOF)
    {
    	i++;
    	if (i>=n)
    	{
    		n=i+10;
    		tim=(int*)realloc(tim,n*sizeof(int));
    		buffer=(char**)realloc(buffer,n*sizeof(char*));
    		for (k=k; k<n; k++)
    		{
    			buffer[k]=(char*)realloc(buffer[k],256*sizeof(char));
    		}
    	}
    }
    if (fclose(f)==-1)
    {
    	//...
    }
    //------------finished reading input file-------------------
    //------------sorting (bubble =) )--------------------------
    while (flag)
    	{
    		flag=0;
    		for (j=0; j<=i-2; j++)
    		{
    			if (tim[j]>tim[j+1])
    			{
    				tmpi=tim[j];
    				tim[j]=tim[j+1];
    				tim[j+1]=tmpi;
    				tmpc=buffer[j];
    				buffer[j]=buffer[j+1];
    				buffer[j+1]=tmpc;
    				flag=1;
    			}
    		}
    	}
    //-----------executing------------------------------
    k=0;
    while(k<=i-1)
    {
    	if (tim[k]==(int)(time(NULL)-time0))
    	{
            if(!(pid=fork()))
            {
            	execv(buffer[k],NULL);
            }
            else
            {
            	k++;
            }
    	}
    }
    //...
    return 0;
    }

    Читает из файла таймер до запуска и имя программы. Я плакалъ...

    krems, 25 Декабря 2010

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

    +141

    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
    void array_random_input(int *array, unsigned int *array_size)
    {
    	unsigned register int i, j;
    	for(i=0; i<(*array_size); i++)
    		for(j=0; j<(*array_size); j++)
    			*(array + (*array_size) * i + j) = rand()%100;
    }
    
    void array_recombination(int *array, unsigned int *array_size)
    {
    	unsigned register int i, j, tmp;
    	for(i=0; i<(*array_size)/2; i++)
    		for(j=0; j<(*array_size)/2; j++)
    			{
    				tmp = *(array + (*array_size) * i + j);
    				*(array + (*array_size) * i + j) = *(array + (*array_size) * ((*array_size)/2 + i) + ((*array_size)/2 + j));
    				*(array + (*array_size) * ((*array_size)/2 + i) + ((*array_size)/2 + j)) = tmp;
    			}
    			
    	for(i=0; i<(*array_size)/2; i++)
    		for(j=(*array_size)/2; j<(*array_size); j++)
    			{
    				tmp = *(array + (*array_size) * i + j);
    				*(array + (*array_size) * i + j) = *(array + (*array_size) * ((*array_size)/2 + i) + (j - (*array_size)/2));
    				*(array + (*array_size) * ((*array_size)/2 + i) + (j - (*array_size)/2)) = tmp;
    			}
    }
    
    //ardent greetings to my teacher F.S.V.! :)

    Условие задачи: необходимо создать динамический двумерный массив размерностью 2n и сделать перестановку крест накрест его четвертей. В качестве параметров все функции принимают указатели. Для пущего brainfuck'а доступ к элементам массива осуществлялся с использованием одномерной адресации (по другому никак не получалось :)
    Для сокращения привожу только функции наполнения массива случайными значениями и перестановки элементов.

    mr_visor, 23 Декабря 2010

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

    +144

    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
    for (i=0; i<n1; i++)
            for (j=0; j<n; j++)
                for (l=0; l<m; l++)
                {
                    printf ("Введите в матрицу № %d строку №[%d][%d] \n", i+1,j+1,l+1);
                    while((h<k) && (*(*(*(*(mt+i)+j)+l)+h-1)!='\n'))                        //цикл для последовательного ввода всех элементов символьной строки;
                    {
                        fflush(stdin);
                        *(*(*(*(mt+i)+j)+l)+(h++)) = getchar();                                //ввод элемента символьной строки;
                    }
                        if (*(*(*(*(mt+i)+j)+l)+h-1)='\n')                                    //удаление из конца введённой строки символа переноса \n;
                        { *(*(*(*(mt+i)+j)+l)+h-1)='\0';}
                        else
                        { *(*(*(*(mt+i)+j)+l)+h)='\0';}
                        h = 0;
                }

    heil pure c

    stasoft, 15 Декабря 2010

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

    +145

    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
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    99. 99
    case 90:
            if (w!=2) {
                ptr_step[ptr_loop]=91;
                if (Set_Play(90)==-1) {
                    Result=-1;
                    delta_time=1;
                    break;
                }
                break;
            }
        case 91:
            if (w!=2) {
                ptr_step[ptr_loop]=92;
                if (Set_Play(91)==-1) {
                    Result=-1;
                    delta_time=1;
                    break;
                }
                break;
            }
        case 92:
            if (w!=2) {
                ptr_step[ptr_loop]=93;
                if (Set_Play(92)==-1) {
                    Result=-1;
                    delta_time=1;
                    break;
                }
                break;
            }
        case 93:
            if (w!=2) {
                ptr_step[ptr_loop]=94;
                if (Set_Play(93)==-1) {
                    Result=-1;
                    delta_time=1;
                    break;
                }
                break;
            }
        case 94:
            if (w!=2) {
                ptr_step[ptr_loop]=95;
                if (Set_Play(94)==-1) {
                    Result=-1;
                    delta_time=1;
                    break;
                }
                break;
            }
        case 95:
            if (w!=2) {
                ptr_step[ptr_loop]=96;
                if (Set_Play(95)==-1) {
                    Result=-1;
                    delta_time=1;
                    break;
                }
                break;
            }
        case 96:
            if (w!=2) {
                ptr_step[ptr_loop]=97;
                if (Set_Play(96)==-1) {
                    Result=-1;
                    delta_time=1;
                    break;
                }
                break;
            }
        case 97:
            if (w!=2) {
                ptr_step[ptr_loop]=98;
                if (Set_Play(97)==-1) {
                    Result=-1;
                    delta_time=1;
                    break;
                }
                break;
            }
        case 98:
            if (w!=2) {
                ptr_step[ptr_loop]=99;
                if (Set_Play(98)==-1) {
                    Result=-1;
                    delta_time=1;
                    break;
                }
                break;
            }
        case 99:
            if (w!=2) {
                ptr_step[ptr_loop]=191;
                if (Set_Play(31)==-1) {
                    Result=-1;
                    delta_time=1;
                    break;
                }
                break;

    программа управления редкими ISDN платами, обработчик встроенного скриптового языка.
    case делается по ptr_step[ptr_loop]
    delta_time = 1 скорее всего означает "ты переключись на другую задачу, но вернись ко мне поскорее"
    пока ещё до конца не разобрался

    funny_falcon, 13 Декабря 2010

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

    +137

    1. 1
    2. 2
    3. 3
    4. 4
    if (MACaddress == 0)
    		MACaddress = pAdapterInfo->Address [5] + pAdapterInfo->Address [4] * 256 + 
    					pAdapterInfo->Address [3] * 256 * 256 + 
    					pAdapterInfo->Address [2] * 256 * 256 * 256;

    xynta, 12 Декабря 2010

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

    +141

    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
    static int16_t have_upper_dot(cell *c)
    {
     cell *cc;
     int16_t H;
     H=my_bases.ps;
     cc=c->prev;
     if ((cc->flg & c_f_dust) &&
          (c->w>4 && cc->h>=2 && cc->w>=2 &&
    	(abs(cc->h-cc->w)<=H/6 || cc->h<cc->w && cc->w-cc->h<=H/4) &&
    	cc->col+1>=c->col && cc->col+cc->w-5<=c->col+c->w ||
           c->w<=4 && abs(c->col-cc->col+(c->w-cc->w)/2)<=2) &&
          cc->row+cc->h-2<=my_bases.b2)
       return 1;
     cc=c->next;
     if ((cc->flg & c_f_dust) &&
          (c->w>4 && cc->h>=2 && cc->w>=2 &&
    	(abs(cc->h-cc->w)<=H/6 || cc->h<cc->w && cc->w-cc->h<=H/4) &&
    	cc->col+1>=c->col && cc->col+cc->w-5<=c->col+c->w ||
           c->w<=4 && abs(c->col-cc->col+(c->w-cc->w)/2)<=2) &&
          cc->row+cc->h-2<=my_bases.b2)
       return 1;
     return 0;
    }

    Из одной OCR программы.

    f0ma, 12 Декабря 2010

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

    +146

    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
    #include <fcntl.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    
    // man sendfile
    
    int main (int argc, char **argv, char **envp) {
      while(
    	  (
    	    argc < 0 // true if all ok, false on first iter
    	    ||  
    	    (
    	      argc != 2 // true if error
    	      && 
    	      (printf("usage %s filename\n", argv[0]) && 0 == (argc = 0))// show error (true)
    	    ) // true if error, and argc == 0
    	    ||
    	    (
    	      ((argc = open(argv[1], O_RDONLY) * -1) < 0) // false if error
    	      ||
    	      (printf("cannot open %m\n") && 0 == (argc = 0))// show error (true)
    	    ) 
    	  ) // true if all ok, also argc != 0
    	  && 
    	  (
    	    argc < 0 // if open success this is true
    	    &&
    	    (read(argc * -1, memset(envp[1], 0, 1025), 1024) > 0 && printf("%s", envp[1])) || (close(argc * -1))
    	  )
           ) ;
    }

    работает и под linux и под cygwin (gcc какие были под рукой)

    затрудняюсь определить парадигму :)

    Anonimous, 09 Декабря 2010

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