- 1
for (normalize(); n > 0; scanf("%d", &temp, n--)){...}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+139
for (normalize(); n > 0; scanf("%d", &temp, n--)){...}
Но ведь работает!
+129
#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. Я его сам открыл.
+135
return ((((num & ~(0xFFFFFFFF << n)) >> (n - 0x1)) & 0x1) == 0x1) ? ((num & ~(0xFFFFFFFF << n)) ^ ~(0xFFFFFFFF << n)) + 0x1 : (num & ~(0xFFFFFFFF << n));
+135
char* getID(){
uint32_t id = calcuate_id(); // Непринципиально, сложные какие то вычисления
static char str[16] = {0};
sprintf(str, "%ud", id);
return str;
}
На самом деле кусок модуля к nginx. Вычисляетися целое число, преобразуется в десятичное представление....
+133
hq->rd_period = (i = hq->rd_period+1) != 0 ? i : 1;
что именно хотел сказать автор, неизвестно. предполагаю что `while (!++hq->rd_period);`
+124
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тригозаврус функодавус ...
+125
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
+140
#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 по сути просто копипастит кусок кода
+141
int i = 10;
while(i --> 0){
print(i);
}
+130
#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