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

    +139

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

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

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

    Комментарии (21)
  2. Си / Говнокод #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)
  3. Си / Говнокод #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)
  4. Си / Говнокод #13700

    +135

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    char* getID(){
      uint32_t id = calcuate_id(); // Непринципиально, сложные какие то вычисления
      static char str[16] = {0};
      sprintf(str, "%ud", id);
      return str;
    }

    На самом деле кусок модуля к nginx. Вычисляетися целое число, преобразуется в десятичное представление....

    klavdiev, 29 Августа 2013

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

    +133

    1. 1
    hq->rd_period = (i = hq->rd_period+1) != 0 ? i : 1;

    что именно хотел сказать автор, неизвестно. предполагаю что `while (!++hq->rd_period);`

    Dummy00001, 28 Августа 2013

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

    +124

    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
    bool getDimensionForKey( const char *key, unsigned int *value, config_file_t *config, unsigned int dimension_max, unsigned int object_size )
    {
    	const char *val;
    	
        int size = 0;
    	int sum = 0;
        
    	bool negative = false;
    	bool percentage = false;
    	
        if (getValueForKey(key, &val, &size, config))
    	{
    		if ( size )
    		{
    			if (*val == '-')
    			{
    				negative = true;
    				val++;
    				size--;
    			}
    			
    			if (val[size-1] == '%')
    			{
    				percentage = true;
    				size--;
    			}
    			
    			// convert string to integer
    			for (sum = 0; size > 0; size--)
    			{
    				if (*val < '0' || *val > '9')
    					return false;
    				
    				sum = (sum * 10) + (*val++ - '0');
    			}
    			
    			if (percentage)
    				sum = ( dimension_max * sum ) / 100;
    			
    			// calculate offset from opposite origin
    			if (negative)
    				sum =  ( ( dimension_max - object_size ) - sum );
    			
    		} else {
    			
    			// null value calculate center
    			sum = ( dimension_max - object_size ) / 2;
    			
    		}
    		
    		*value = (uint16_t) sum;
    		return true;
    	}
    	
    	// key not found
        return false;
    }

    Cтригозаврус функодавус ...

    Stealth, 09 Августа 2013

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

    +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
    static U64 mulU64byU64(U64 a, U64 b, U64 * high)
    {
        U64 b_high = 0;
        U64 r_high = 0, r_low = 0;
        U64 bit;
    	
        for (bit = 1; bit; bit <<= 1) {
            if (a & bit) {
                if (r_low + b < r_low)
                    r_high++;
                r_low += b;
                r_high += b_high;
            }
            b_high <<= 1;
            b_high |= (b & (1ULL << 63)) >> 63;
            b <<= 1;
        }
    	
        if (high)
            *high = r_high;
        return r_low;
    }

    Угадай зачем %D

    Stealth, 09 Августа 2013

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

    +140

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    #include <stdio.h>
    
    int main()
    {
      printf("test\n");
      
      __asm volatile (".rept 10\n");
      printf("test\n");
      __asm volatile (".endr");
      
      return 0;
    }

    Еще немного поиздевался над GCC. Через ассемблерные вставки, точнее через вставку директивы .rept иногда можно повторить некоторый кусок кода несколько раз. Работает это далеко не всегда
    http://sourceware.org/binutils/docs/as/Rept.html
    Этот .rept по сути просто копипастит кусок кода

    j123123, 04 Августа 2013

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

    +141

    1. 1
    2. 2
    3. 3
    4. 4
    int i = 10;
    while(i --> 0){
        print(i);
    }

    zlob.jc, 31 Июля 2013

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

    +130

    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
    #include <stdio.h>
    
    int main()
    {
        int a = 5, b = 6;
        void* go;
        go = ( a > b )? &&true1: &&false1;
        goto *go;
    
          true1:
          {
            printf("%i > %i\n", a, b);
            goto next1;
          }
    
          false1:
          {
            printf("%i <= %i\n", a, b);
          }
    
        next1:
    
    
        a = 7;
        go = ( a > b )? &&true2: &&false2;
        goto *go;
        
          true2:
          {
            printf("%i > %i\n", a, b);
            goto next2;
          }
    
          false2:
          {
            printf("%i <= %i\n", a, b);
          }
    
        next2:
        return 0;
    }

    В GCC есть такой экстеншен http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
    Можно в goto передавать переменную и можно работать с адресами меток. В сочетании с тернарной условной операцией, этим можно заменить if

    j123123, 30 Июля 2013

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