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

    +133

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    // for cdio:
    #include <cdio.h>
    #include <cdio_unconfig.h> # remove *all* symbols libcdio defines
    
    // Add back in the ones you want your program
    #include <config.h>

    But now what about the problem that there are common preprocessor symbols in config_cdio.h that an application may want to define in a different manner, like PACKAGE_NAME?
    For this, there is yet another header, <cdio/cdio_unconfig.h>.

    rat4, 20 Марта 2012

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

    +127

    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
    typedef struct _xjmp_stru {
        unsigned long Ebp;
        unsigned long Ebx;
        unsigned long Edi;
        unsigned long Esi;
        unsigned long Esp;
        unsigned long Eip;
    } xjmp_stru;
    
    typedef int xjmp_buf[6];
    
    __declspec(naked)
    int __cdecl xsetjmp(xjmp_buf)
    {
    	__asm
    	{
    		mov     edx, [esp+4]
    		mov     [edx], ebp
    		mov     [edx+4], ebx
    		mov     [edx+8], edi
    		mov     [edx+12], esi
    		mov     [edx+16], esp
    		mov     eax, [esp]
    		mov     [edx+20], eax
    		xor     eax, eax
    		ret
    	}
    } 
    
    
    __declspec(naked, noreturn)
    void __cdecl xlongjmp(xjmp_buf, int)
    {
    	__asm
    	{
    		mov     edx, [esp+4]
    		mov     ebp, [edx]
    		mov     ebx, [edx+4]
    		mov     edi, [edx+8]
    		mov     esi, [edx+12]
    		mov     eax, [esp+8]
    		test    eax, eax
    		jne     __
    		inc     eax
    __:      
    		mov     esp, [edx+16]
    		add     esp, 4
    		mov     edx, [edx+20]
    		jmp     edx
    	}
    } 
    
    int dummy(xjmp_buf jbuf)
    {
    	volatile int jk = 8;
    	if (jk)
    		xlongjmp(jbuf, 2);
    	else
    		return 7;
    }
    
    int main()
    {
    	xjmp_buf jbuf;
    	if (xsetjmp(jbuf))
    	{
    		puts("excpt");
    		return -1;
    	}
    	dummy(jbuf);
    	puts("great work");
    	return 0;
    }

    экая хренотень

    63F45EF45RB65R6VR, 13 Марта 2012

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

    +125

    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
    #include <stdio.h>
    
    #define MAXLINE 1000 /* максимальная длина строки в потоке */
    
    int getline(char line[], int maxline);
    
    main()
    {
        int len; /* длина текущей строки */
        char line[MAXLINE]; /* текущая введённая строка */
    
        while((len = getline(line, MAXLINE)) != (-1))
            printf("%s", line);
            
        system("PAUSE");
        return 0;
    }
    
    /* getline: считывает строку в s, удаляет пробелы и знаки табуляции в конце строки, возвращает её длину. Удаляет полностью пустые строки */
    getline(char s[], int lim)
    {
                 int c, i;
                 
                 for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
                       s[i] = c;
                 if (c == EOF)
                    return (-1); /* конец ввода */
                 else if (c == '\n') {
                      while(s[i-1] == ' ' || s[i-1] == '\t') /* "удаление" пробелов и знаков табуляции в конце строки */
                         --i;
                      if (i > 0) { /* если строка непустая */
                         s[i] = '\n';
                         ++i;
                      }
                      s[i] = '\0';
                      return i;
                 }
    }

    Задача: убирать в конце каждой строки лишние пробелы и знаки табуляции, удалять полностью пустые строки.
    Решение: при считывании строки вида "abc_____\n" на выходе получаем массив символов "abc\n\0___" (пробелы в конце). Печатаем строки по мере поступления, профит.

    Говнокод или нормально?

    justanothernickname, 12 Марта 2012

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

    +137

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    if (p)
      free(p);
    
    /* ... */
    
    if (p)
      q = realloc(p, size);
    else
      q = malloc(size);

    немного классики.

    из сырцов pdftohtml.

    Dummy00001, 01 Марта 2012

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

    +142

    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
    #include <dos.h>
    #include <conio.h>
    #include <graphics.h>
    
    
    void pix(unsigned int x, unsigned int  y, unsigned char c){
        unsigned char nb, ms, bt;                     //nomerbit maska bite
        unsigned int ofs;                      //sdvig
        unsigned char *pb;                //ukazatel na bit
    
        ofs= x/8 + y*80;
        nb=7-(x % 8);
        pb=(unsigned char *)MK_FP(0xA000, ofs);
        bt=*pb;
        ms=1<<nb;
    
        if( c !=0  ){
            bt=bt |  ms;
        }else{
            bt=bt&(~ms);
        };
    
        *pb=bt;
    };
    
    void main(){
        int drDriver, grMode;
        drDriver=VGA;
        grMode=VGAHI;
        initgraph(&drDriver, &grMode, "C:\\BORLANDC\\BGI");
        pix(60,30,15);
        getch();
    };

    13: где взял адрес
    28,29: с чего ты решил, что для паскалевского драйвера подходят определения сишного драйвера?
    30: почему драйвер паскалевский?

    all: ебанный пиздец, кто ж так пишет...

    d4rw1n1s7, 17 Февраля 2012

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

    +125

    1. 1
    #define DV_ERR_13               (DV_ERR_BASE + 15)

    There, i fixed it!
    Нашел в зловонных недрах Video for Windows. Если кому интересно, значение ни разу не 13, а 16.

    bugmenot, 16 Февраля 2012

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

    +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
    for (int i=0;i<16;i++)
    {
    	if ((rbuf[i+1]>>16)!=(1<<i))
    	{
    		break;
    		res=SOME_ERROR;
    	}
    };
    
    /* in another function */
    DWORD * rbuf =new DWORD[Size];
    ...
    if (rbuf!=NULL) free(rbuf);

    Вот такими библиотеками пользуются клиенты некоторых фирм ;)

    klaks, 15 Февраля 2012

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

    +104

    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
    #ifdef _DEBUG
                if ( !
    #endif
                    dt_time_sprintf_current( tbuf, sizeof(tbuf), false )
    #ifdef _RELEASE
                    ;
    #else
                    )
                {
                    fprintf( stderr, "-- unable to get current time\n" );
                }
    #endif
            }
    #ifdef _DEBUG

    ;(

    ilardm, 09 Февраля 2012

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

    +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
    #define COMMAND_MARKER		'\x1B'
    #define COMMAND_SET			'='
    #define COMMAND_XOR			'^'
    #define COMMAND_OR			'|'
    #define COMMAND_AND			'&'
    
    void usbWriteOut(uchar *data, int len)
    {
    	while(len--) {
    		uchar c = *data;
    		buf[0] = buf[1];
    		buf[1] = buf[2];
    		buf[2] = buf[3];
    		buf[3] = c;
    		
    		if(buf[0] == COMMAND_MARKER) {
    			uint8_t val = (hex2u(buf[2]) << 4) | hex2u(buf[3]);
    			if(buf[1] == COMMAND_SET) {
    				colorData = val;
    			}
    			else if(buf[1] == COMMAND_XOR) {
    				colorData ^= val;
    			}
    			else if(buf[1] == COMMAND_OR) {
    				colorData |= val;
    			}
    			else if(buf[1] == COMMAND_AND) {
    				colorData &= ~val;
    			}
    		}
    	}
    }

    Простой баг оказался крайне подлым!
    При тестировании девайса терминалкой и чепятании команды ручками, каждый символ уходил в отдельном пакете и создавалось впечатление, что всё работает.
    После чего девайс был собран с применением большого количества термоклея, так что исправление бага оказалось совершенно непростым занятием >_<

    odmin, 09 Февраля 2012

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

    +131

    1. 1
    2. 2
    3. 3
    4. 4
    struct tm lpstTimeRecordRet;
    struct tm lpstTimeRecord;
    
    lpstTimeRecordRet = *localtime_r ( &potiUnixTime, &lpstTimeRecord);

    *фейс палм*

    Dummy00001, 02 Февраля 2012

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