- 1
#include "intel_glamor.h"
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+139
#include "intel_glamor.h"
Строка из драйвера видеокарты X11: intel_driver.c.
Гламур спасёт мир.
+136
int file_exist (char *filename)
{
char s[200];
sprintf(s, "test -e %s", filename);
if (system(s) == 0){
return 1;
}else{
return 0;
}
}
http://stackoverflow.com/questions/3828192/checking-if-a-directory-exists-in-unix-system-call
+135
Структура для хранения данных:
typedef struct rs_script_t {
int status; // on/off
int next_stage;
int next_time;
} rs_script_t;
Макросы:
#define SEQ(scr1,t) \
const int scr_zero = __COUNTER__; \
rs_script_t *scr = scr1; \
if ( (scr->status) && (t > scr->next_time) ) { \
switch(scr->next_stage) { \
#define END_SEQ } };
#define SEQ_FIRST \
case 0: \
scr->next_stage = scr_zero;
#define SEQ_DT(dt) \
scr->next_stage = __COUNTER__ + 1; \
scr->next_time += dt; \
break; \
case __COUNTER__: \
#define SEQ_DT_TAGGED(dt,tag) \
scr->next_stage = __COUNTER__ + 1; \
scr->next_time += dt; \
break; \
case __COUNTER__: \
case (100000+tag): \
#define SEQ_LAST_DEFAULT \
scr->status = 0; \
break; \
\
default: \
DEBUG10f(":: ERROR, unknown stage position: %d \n", scr->next_stage); \
break;
#define SEQ_GOTO(dt,tag) \
scr->next_stage = 100000+tag; \
scr->next_time += dt; \
break;
#define SEQ_GOTO_INSTANT(tag) \
scr->next_stage = 100000+tag; \
break;
Пользоваться примерно так:
void process() { // вызывать каждый кадр
SEQ(&scrtest, rs_app.app_time)
SEQ_FIRST
printf("Ноль\n");
SEQ_DT(1000)
printf("Один\n");
SEQ_DT(1000)
printf("Два\n");
SEQ_DT_TAGGED(1000, 555)
printf("Три (метка №555) \n");
SEQ_DT(1000)
printf("Четыре\n");
SEQ_DT(1000)
printf("Пять\n");
SEQ_DT(1000)
printf("Шесть, повторяем с метки №555, если нажат Шифт\n");
if (rs_keyboard_is_key_down(RS_KEY_SHIFT_L)) {
SEQ_GOTO(1000, 555);
};
printf("Завершаем. \n");
SEQ_LAST_DEFAULT
END_SEQ;
};
Страдания по yield
+143
string=(char*)malloc(N);
k=fread(string,sizeof(char),N,f);
while (k==N)
{
free(string);
N=N*2;
rewind(f);//возращает в начало файла
string =(char*)malloc(N);
k=fread(string,sizeof(char),N,f);
}
fclose (f);
Сегодня зачоты ставил...
студенты читают из файла. В буфер. Я придираюсь к тому, что размер файла может быть больше размера буфера....
Исправили...
+143
const int index64[64] = {
0, 1, 48, 2, 57, 49, 28, 3,
61, 58, 50, 42, 38, 29, 17, 4,
62, 55, 59, 36, 53, 51, 43, 22,
45, 39, 33, 30, 24, 18, 12, 5,
63, 47, 56, 27, 60, 41, 37, 16,
54, 35, 52, 21, 44, 32, 23, 11,
46, 26, 40, 15, 34, 20, 31, 10,
25, 14, 19, 9, 13, 8, 7, 6
};
/**
* bitScanForward
* @author Martin Läuter (1997)
* Charles E. Leiserson
* Harald Prokop
* Keith H. Randall
* "Using de Bruijn Sequences to Index a 1 in a Computer Word"
* @param bb bitboard to scan
* @precondition bb != 0
* @return index (0..63) of least significant one bit
*/
int bitScanForward(U64 bb) {
assert (bb != 0);
return index64[((bb & -bb) * 0x03f79d71b4cb0a89) >> 58];
}
нашёл на кывте
+141
if (connfailed) {
KSOCKET_CALLBACK(so, disconnected, error);
} else {
KSOCKET_CALLBACK(so, connectfailed, error);
}
https://github.com/joyent/illumos-joyent/blob/master/usr/src/uts/common/fs/sockfs/socknotify.c
+135
void permutate(int a[10], int n) {
// God bless mr. Donald E. Knuth;
// Tons of oil to English bell ringers!
// WARNING: It's dangerous to go alone, take this^H read this shit
int c[10], o[10], j, s, q;
for (j = 1; j <= n; j++) {
c[j] = 0;
o[j] = 1;
}
while (1) {
check(a, n);
j = n;
s = 0;
while (1) {
do {
q = c[j] + o[j];
if (q < 0) { o[j] = -o[j]; --j; }
} while (q < 0);
if (q == j) {
if (j == 1) return; else ++s;
o[j] = -o[j];
--j;
continue;
}
int t = a[j - c[j] + s];
a[j - c[j] + s] = a[j - q + s];
a[j - q + s] = t;
c[j] = q;
break;
}
}
}
Реализация алгоратма "простых изменений" по описанию из Кнута (т4. Комбинаторный поиск, генерация всех перестановок).
Напрашивающиеся goto раздражают, было бы приятно увидеть менее пахучие реализации. Не смог нагуглить, забугорного названия этого алгоритма не знаю, а про "простые изменения" тинай вики молчит.
+139
byteL = (length & (0x00ff));
byteH = (length - byteL)>>BITS_IN_BYTE;
Вдруг биты справа полезут прямо из компьютера, давайте вычтем!
Макрос BITS_IN_BYTE особенно радует!
+130
http://ithappens.ru/story/11670
+139
// drivers/usb/serial/cp210x.c
static void cp210x_close(struct usb_serial_port *port)
{
usb_serial_generic_close(port);
cp210x_set_config_single(port, CP210X_IFC_ENABLE, UART_DISABLE);
}
Дело было так.
На прошлой неделе, по просьбе одного знакомого, я сел писать прошивку для attiny2313, которая должна принять по RS-232 строчку и исполнить соответствующую команду. Потратив несколько минут на раскур даташита, а именно главы, посвященной USART, я набросал тупейший код на сях, залил его на чип, и затестил через миником. Все работало нормально, ничто не предвещало беды...
Но когда я попробовал послать команду через echo, меня ждал облом. Она не выполнилась. На 10 раз проверил код - все ок, в миникоме пашет идеально, через echo - куй. Под виндой та же ересь. Чем отличается echo от миникома? Правильно, тем, что оно отправляет символы подряд, без пауз. Контроллер тактировался от внутренного генератора, поэтому я подумал, что оный хреново откалиброван, и что надо бы его настроить... Вечер ушел на написание прошивки для калибровки... Оказалось, что частота действительно уплыла на 2% от расчетной, что некритично. Ну да пофиг, откалибровался до +-0.5%. Запустил echo - куй. Послал все нахрен, и пошел спать...
(Продолжение в комменте ниже)