экстремальная краткость
От: uncommon Ниоткуда  
Дата: 15.04.18 05:48
Оценка: :)))
Дано: вот такой хедер: https://raw.githubusercontent.com/KxSystems/kdb/master/c/c/k.h

Требуется: использовать его в своем проекте и (самое главное) ничего при этом не сломать. В хедере — преступное злоупотребление одно- и две-буквенными макросами и typedef-ами, функции из трех букв, типонебезопасная линковка и прочие прелести. Кому приходилось с таким иметь дело, делитесь мыслями. У меня есть пара идей, и я их опишу после.

Но как бы то ни было, мне не дает покоя один вопрос: зачем? Какое можно найти объяснение такому стилю программирования? Ведь кроме как говном, это назвать никак нельзя.
Re: экстремальная краткость
От: lpd Черногория  
Дата: 15.04.18 08:27
Оценка:
Здравствуйте, uncommon, Вы писали:

U>Но как бы то ни было, мне не дает покоя один вопрос: зачем? Какое можно найти объяснение такому стилю программирования? Ведь кроме как говном, это назвать никак нельзя.

Этот код
// remove more clutter
#define O printf
#define R return
#define Z static
#define P(x,y) {if(x)R(y);}
#define U(x) P(!(x),0)
#define SW switch
#define CS(n,x)    case n:x;break;
#define CD default

не может иметь иного объяснения, кроме такого
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Re: экстремальная краткость
От: XOOIOOX  
Дата: 15.04.18 08:49
Оценка: :)))
Здравствуйте, uncommon, Вы писали:

U>Кому приходилось с таким иметь дело, делитесь мыслями.


К счастью, не приходилось, но я бы сделал "фильтрующую прокладку", некое "прокси".

U>Какое можно найти объяснение такому стилю программирования?


Re: экстремальная краткость
От: Pzz Россия https://github.com/alexpevzner
Дата: 15.04.18 10:14
Оценка: +3
Здравствуйте, uncommon, Вы писали:

U>Дано: вот такой хедер: https://raw.githubusercontent.com/KxSystems/kdb/master/c/c/k.h


U>Требуется: использовать его в своем проекте и (самое главное) ничего при этом не сломать.


А нельзя его выкинуть на помойку завернуть в отдельный сишник, и проэкспортировать оттуда в виде вызовов функций и/или методов каких-нибудь классов?

U>Но как бы то ни было, мне не дает покоя один вопрос: зачем? Какое можно найти объяснение такому стилю программирования? Ведь кроме как говном, это назвать никак нельзя.


Должно быть, математик писал...
Re: экстремальная краткость
От: kov_serg Россия  
Дата: 15.04.18 22:02
Оценка:
Здравствуйте, uncommon, Вы писали:

U>Дано: вот такой хедер: https://raw.githubusercontent.com/KxSystems/kdb/master/c/c/k.h


U>Требуется: использовать его в своем проекте и (самое главное) ничего при этом не сломать. В хедере — преступное злоупотребление одно- и две-буквенными макросами и typedef-ами, функции из трех букв, типонебезопасная линковка и прочие прелести. Кому приходилось с таким иметь дело, делитесь мыслями. У меня есть пара идей, и я их опишу после.

Тут же есть разъяснения
https://github.com/KxSystems/kdb/blob/master/c/c/readme.txt

U>Но как бы то ни было, мне не дает покоя один вопрос: зачем?

Чтоб потом так писать:
BOOL INSTAPI ConfigDSN(HWND h,WORD j,LPCSTR d,LPCSTR s){SW(j){CS(ODBC_REMOVE_DSN,R SQLRemoveDSNFromIni(s+4))CS(ODBC_ADD_DSN,if(dlg(111))SQLWriteDSNToIni(b,d))}R 0;}
ZS g1(S s,S a,S v){L n;U(s=strstr(s,a))R s+=4,strncpy(v,s,n=(S)strchr(s,';')-s),v[n]=0,v;}ZV av(S s,S a,S v){s+=strlen(strcat(s,a)),*s++='=',s+=strlen(strcpy(s,v)),*s++=';',*s=0;}
#define N 10 //1env,2dbc,3stmt,4desc  -1(fail) 0(success)1(successwithinfo) 0-noprompt 1-complete 2-prompt 3-required
ZI c[N];A SQLDisconnect(D d){I h=(I)(L)d;R kclose(c[h]),c[h]=0;}ZI sj(S s,I j){R j<0?strlen(s):j;}ZS ssj(S s,S t,I j){R!t||j<0?t:(strncpy(s,t,j)[j]=0,s);}
ZA dq(D d,S q,S u,S p){S s=strchr(q,':');I a;Q(!s,"host:port")*s=0,a=khpu(q,atoi(s+1),u&&*u?strcat(strcat(strcpy(b,u),":"),p):(S)""),*s=':';Q(a<0,q)Q(!a,"access")R c[(I)(L)d]=a,0;}
A SQLConnect(D d,S s,H j,S a,H aj,S b,H bj){R dq(d,ssj(q,s,j),ssj(u,a,aj),ssj(p,b,bj));}
A SQLDriverConnect(D d,HWND w,S s,H j0,S r,H j,H*j2,UH f){Q(!g1(s,"DBQ",q)&&!g1(s,"DSN",q),"DBQ")if(g1(s,"UID",u))g1(s,"PWD",p);else*u=0;if(r){if(strcpy(r,"DRIVER=kdb+;"),av(r,"DBQ",q),*u)av(r,"UID",u),av(r,"PWD",p);av(r,"DSN","default"),qj2(j2,strlen(r));}R dq(d,q,u,p);}
ZK*td[N],tk[N];ZS*tf[N],*tb[N];Z L*tw[N],**tn[N];ZI tc[N],*tu[N],ti[N],tj[N],bi[N],s[N],s0[N],s3[N],s5[N],s6[N],s9[N],s11[N],sb[13]={0,0,0,0,0,0,0,SQL_CONCUR_READ_ONLY};
A SQLAllocHandle(H j,D d,D*h1){I*p,h=0;Q(j>3,"desc")if(j>1){for(p=j>2?s:c;p[h];++h)Q(h==N,"limit")if(j>2)tc[h]=c[(I)(L)d],s[h]=s9[h]=1,s11[h]=SQL_RD_ON;}R*h1=(D)(L)h,0;}
ZV b1(I h){I j=tj[h];tb[h]=(S*)malloc(j*SZ),tu[h]=(I*)malloc(j*4),tw[h]=(L*)malloc(j*SZ),tn[h]=(L**)malloc(j*SZ);DO(j,tb[h][i]=0)}
ZV b0(I h){if(tb[h])free(tb[h]),tb[h]=0,free(tu[h]),free(tw[h]),free(tn[h]);}ZV ch(I h){if(tk[h])r0(tk[h]),tk[h]=0,ti[h]=tj[h]=0;}ZV fh(I h){ch(h),b0(h),s[h]=s5[h]=s6[h]=0;}
A SQLFreeStmt(D d,UH j){SW(j){CS(SQL_CLOSE,ch((I)(L)d))CS(SQL_UNBIND,b0((I)(L)d))CS(SQL_DROP,fh((I)(L)d))CS(SQL_RESET_PARAMS,0)}R 0;}
A SQLFreeHandle(H j,D d){U(j==3)R fh((I)(L)d),0;}A SQLCancel(D d){R SQLFreeStmt(d,SQL_CLOSE);}
ZA k1(D d,S f,S s,I n){I h=(I)(L)d;C b[99]=".o.";K x=k(tc[h],strcat(b,f),s?kpn(s,sj(s,n)):0,(K)0);P(!x,QS("08S01","k1",-1))
 Q(xt==-128,xs)P(xt!=XT,(r0(x),0))R bi[h]=-s9[h],tk[h]=x,x=xk,tf[h]=kS(xx),x=xy,tj[h]=xn,td[h]=xK,x=*xK,ti[h]=xn,0;}
ZI nu(K x,I i){I t=xt;R t<KH?0:t==KH?xH[i]==nh:t==KJ?xJ[i]==nj:t==KE?isnan(xE[i]):t==KF||t==KZ?isnan(xF[i]):t==KC?xG[i]==' ':t==KS?!*xS[i]:xI[i]==ni;}
ZI Td(I f,S b,I d){H*j=(H*)b;R d=dj(d),*j=d/10000,j[1]=(d/100)%100,j[2]=d%100,f?sprintf(b,"%d-%02d-%02d",j[0],j[1],j[2]):6;}
ZI Tv(I f,S b,I v){H*j=(H*)b;R*j=v/3600,j[1]=(v/60)%60,j[2]=v%60,f?sprintf(b,"%02d:%02d:%02d",j[0],j[1],j[2]):6;}

Если интересно то используйте препроцессор он развернёт макросы.
U>Какое можно найти объяснение такому стилю программирования?
Чтоб туда руками туда не лазили. Или автор раньше на фортране много писал
U>Ведь кроме как говном, это назвать никак нельзя.
Можно: минификация и обфускация.
Re[2]: экстремальная краткость
От: uncommon Ниоткуда  
Дата: 16.04.18 01:42
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Тут же есть разъяснения

_>https://github.com/KxSystems/kdb/blob/master/c/c/readme.txt

Разъяснения, как использовать эти макросы, но не почему они такие кривые. Кстати, этот readme напоминает разве что заметки на полях, а не осмысленную документацию.

U>>Но как бы то ни было, мне не дает покоя один вопрос: зачем?

_>Чтоб потом так писать:

И что сделает любой нормальный человек с таким кодом? Выбросит его на помойку и перепишет. Потому что разобраться в нём, даже если он и работает, это всё равно, что копаться в говне. Что я, кстати, и сделал с этим кодом перво-наперво. Единственно разумное решение.

_>Если интересно то используйте препроцессор он развернёт макросы.


Нет, мне не интересно. А что кому-то было интересно?

U>>Какое можно найти объяснение такому стилю программирования?

_>Чтоб туда руками туда не лазили.

Зачем обфуцировать код предлогаемый клиентам для линковки со своим продуктом? Чтобы все более-менее разумные клиенты поразбежались?
Re[2]: экстремальная краткость
От: uncommon Ниоткуда  
Дата: 16.04.18 01:54
Оценка:
Здравствуйте, Pzz, Вы писали:

U>>Требуется: использовать его в своем проекте и (самое главное) ничего при этом не сломать.


Pzz>А нельзя его выкинуть на помойку завернуть в отдельный сишник, и проэкспортировать оттуда в виде вызовов функций и/или методов каких-нибудь классов?


Правильно. Написать свой собственный хедер для их библиотеки, а их хедер никуда вообще не включать. Благодаря тому, что все функции там extern "C", всё слинкуется отлично, даже если поместить эти функции в namespace, а типы параметров не будут совпадать. Главное, чтобы в бинарном представлении они были идентичны.

Была ещё идея такая:

namespace crappy_library
{
#include "k.h"
}
#undef Z
//...undef all those crappy macros


Но всё равно прийдётся возиться с их структурами. Поэтому я решил переписать хедер. Благо мне нужны всего две функции и одна структура.
Re[2]: экстремальная краткость
От: chaotic-kotik  
Дата: 16.04.18 06:11
Оценка: 5 (1) :))
Здравствуйте, lpd, Вы писали:

lpd>Здравствуйте, uncommon, Вы писали:


U>>Но как бы то ни было, мне не дает покоя один вопрос: зачем? Какое можно найти объяснение такому стилю программирования? Ведь кроме как говном, это назвать никак нельзя.


Это у них культура такая просто. Авторы К считают что код должен быть максимально лаконичным. Люди, которые привыкли к такому стилю, якобы, могут читать/писать такой код намного быстрее. Это не какой-то дятел придумал, а сам Артур Уитни.
Вот тут у них логово — https://github.com/kevinlawler/kona
В вики есть coding style — https://github.com/kevinlawler/kona/wiki/Coding-Guidelines наслаждайтесь
Re: экстремальная краткость
От: chaotic-kotik  
Дата: 16.04.18 06:17
Оценка:
Здравствуйте, uncommon, Вы писали:

U>Дано: вот такой хедер: https://raw.githubusercontent.com/KxSystems/kdb/master/c/c/k.h


U>Требуется: использовать его в своем проекте и (самое главное) ничего при этом не сломать. В хедере — преступное злоупотребление одно- и две-буквенными макросами и typedef-ами, функции из трех букв, типонебезопасная линковка и прочие прелести. Кому приходилось с таким иметь дело, делитесь мыслями. У меня есть пара идей, и я их опишу после.


Не используй этот хэдер. Он нужен для того чтобы писать код в их стиле. Наверняка есть нормальный API для простых смертных.
Re[3]: экстремальная краткость
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.04.18 06:24
Оценка:
Здравствуйте, uncommon, Вы писали:

U>Была ещё идея такая:


U>
U>namespace crappy_library
U>{
U>#include "k.h"
U>}
U>#undef Z
U>//...undef all those crappy macros
U>


Там полно однобуквенных макросов. Слово namespace на них не влияет.
Re[3]: экстремальная краткость
От: kov_serg Россия  
Дата: 16.04.18 08:46
Оценка:
Здравствуйте, uncommon, Вы писали:

U>И что сделает любой нормальный человек с таким кодом? Выбросит его на помойку и перепишет. Потому что разобраться в нём, даже если он и работает, это всё равно, что копаться в говне. Что я, кстати, и сделал с этим кодом перво-наперво. Единственно разумное решение.

Бывает еще что решения принимает другой человек которого что там внутри не интересует.

U>>>Какое можно найти объяснение такому стилю программирования?

_>>Чтоб туда руками туда не лазили.

U>Зачем обфуцировать код предлогаемый клиентам для линковки со своим продуктом? Чтобы все более-менее разумные клиенты поразбежались?

Безнес, ничего личного. Вам то это зачем-то понадобилось.
Re[3]: экстремальная краткость
От: Ops Россия  
Дата: 16.04.18 11:06
Оценка:
Здравствуйте, uncommon, Вы писали:

_>>Если интересно то используйте препроцессор он развернёт макросы.


U>Нет, мне не интересно. А что кому-то было интересно?


Это может помочь переписать.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: экстремальная краткость
От: StanislavK Великобритания  
Дата: 16.04.18 12:53
Оценка:
Здравствуйте, uncommon, Вы писали:

U>Дано: вот такой хедер: https://raw.githubusercontent.com/KxSystems/kdb/master/c/c/k.h

Это ж, kdb у них все такое. Посомотри, например, на java код. Стиль у них такой, сделали такое, чтобы можно было в q-стиле писать.

U>Но как бы то ни было, мне не дает покоя один вопрос: зачем? Какое можно найти объяснение такому стилю программирования? Ведь кроме как говном, это назвать никак нельзя.

просто считай, что это не "c", а "q", другой язык.
Re: экстремальная краткость
От: Слава  
Дата: 16.04.18 14:23
Оценка: :)
Здравствуйте, uncommon, Вы писали:

U>Но как бы то ни было, мне не дает покоя один вопрос: зачем? Какое можно найти объяснение такому стилю программирования? Ведь кроме как говном, это назвать никак нельзя.


Это Kx Database, она вся такая, полностью. Это вы еще их внутренний язык не видели.
Re: экстремальная краткость
От: Кодт Россия  
Дата: 16.04.18 20:47
Оценка: +2 :)
Здравствуйте, uncommon, Вы писали:

U>Дано: вот такой хедер: https://raw.githubusercontent.com/KxSystems/kdb/master/c/c/k.h


U>Требуется: использовать его в своем проекте и (самое главное) ничего при этом не сломать. В хедере — преступное злоупотребление одно- и две-буквенными макросами и typedef-ами, функции из трех букв, типонебезопасная линковка и прочие прелести. Кому приходилось с таким иметь дело, делитесь мыслями. У меня есть пара идей, и я их опишу после.


Макросной магии здесь нет, поэтому достаточно один раз поработать препроцессором и перепилить на более-менее чистый С++.
Вместо дефайнов констант — сделать constexpr'ы или даже в enum засунуть.
Вместо дефайнов с переменной x — сделать пачку инлайн-функций.

Оформить всё это в какое-нибудь namespace Kx и наслаждаться.

И выложить в public domain, чтобы у авторов Kdb немножко пригорело от счастья.

U>Но как бы то ни было, мне не дает покоя один вопрос: зачем? Какое можно найти объяснение такому стилю программирования? Ведь кроме как говном, это назвать никак нельзя.


Язык K, сэр. Помехи на телеграфной линии. Скажи спасибо, что авторы забросили иероглифику APL до того, как был создан юникод.
Перекуём баги на фичи!
Re[2]: экстремальная краткость
От: uncommon Ниоткуда  
Дата: 17.04.18 03:17
Оценка:
Здравствуйте, Кодт, Вы писали:

К>И выложить в public domain, чтобы у авторов Kdb немножко пригорело от счастья.


Я тоже об этом подумываю. Более менее уже переписал всё, что нужно для моих целей. Но думаю, kdb-шники не оценят
Re: экстремальная краткость
От: Molchalnik  
Дата: 21.04.18 16:50
Оценка: 4 (1) +1
Здравствуйте, uncommon, Вы писали:

U>Дано: вот такой хедер: https://raw.githubusercontent.com/KxSystems/kdb/master/c/c/k.h


U>Требуется: использовать его в своем проекте и (самое главное) ничего при этом не сломать. В хедере — преступное злоупотребление одно- и две-буквенными макросами и typedef-ами, функции из трех букв, типонебезопасная линковка и прочие прелести. Кому приходилось с таким иметь дело, делитесь мыслями. У меня есть пара идей, и я их опишу после.


делаешь длинный заголовок для включения заголовка
и ещё один — для зачистки гавна

вначале, проверяешь все макросы, включённые в код, если они определены — присваиваешь им очень длинные разборчивые имена, вроде MY_MACROS_IN_FILE_3DPARTY_INCLUDE_DKJR382R8_kG

Потом андефишь исходные макросы
Потом подключаешь код
делаешь макросам переопределения на нормальные имена
после использования, подключаешь хедер зачистки, где возвращаешь значения сохранённым макросам, а прочие просто андефишь

а вообще, лучше его переписать нахрен с помощью средств автозамены в IDE, заодно и проконтролируешь конфликты
Re[3]: экстремальная краткость
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 21.04.18 18:17
Оценка: +1 :)
Здравствуйте, uncommon, Вы писали:

К>>И выложить в public domain, чтобы у авторов Kdb немножко пригорело от счастья.


U>Я тоже об этом подумываю. Более менее уже переписал всё, что нужно для моих целей. Но думаю, kdb-шники не оценят


Думаю, будут плеваться от твоего "говнокода"
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.