|
|
ru.unix- RU.UNIX ---------------------------------------------------------------------- From : Dennis Chikin 2:5054/4.2 13 Dec 2003 00:58:10 To : Valentin Nechayev Subject : ДАВАЙТЕ УТОЧHИМ! -------------------------------------------------------------------------------- Thursday December 11 2003 22:48, you wrote to me: DC>> Это не левая библиотека, а полтора десятка макросов, которые DC>> один раз пишутся под себя, немножко подумав головой на предмет DC>> "а как бы это было лично мне удобно" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ VN> Даже если это один макрос - это левая библиотека. VN> Или публикуй, что в них и почему они такие, или не морочь голову. Было бы там чего показывать... Основная идея - данные куда угодно, только не в стек, malloc() и free() руками не трогать, пересылки - только из меньшего куска в больший, аргументы и возврат проверять на осмысленность, fread/fwrite( {}, 3, {}, {}) не делать. Примерно так: === Cut === typedef struct { int grp; int num; } t0000s_fnum; typedef struct { int page; int offs; } t0001s_data; typedef struct { t0000s_fnum f_num; union { t0001s_data block; void *pointer; char data; } data; } t0002s_farg; #define F_NUM f_num.num #define F_GRP f_num.grp #define D_PTR data.pointer #define D_NUM data.block.offs #define D_GRP data.block.page #define D_DAT data.data #define SRC_PTR t0002s_farg *dst, t0002s_farg *src #define DST_PTR t0002s_farg *dst, t0002s_farg *src #define SRC_ADR dst, src #define DST_ADR dst, src #define F_ARG t0002s_farg #define F_DECL F_ARG * #define D_DECL(vname) F_ARG vname /* obsolete ! */ #define D_INIT(vptr, sample) (*vptr).F_NUM = sizeof(sample);\ (*vptr).F_GRP = 0; (*vptr).D_PTR = sample extern F_DECL f_call ( int idgrp, int idnum, DST_PTR ); /* I1MDISP - allocate the memory block /* (*src).F_NUM - size; if src == NULL - max. possible size /* if dst != NULL - insert into a chain after (*dst).D_PTR) /* dst must be already packed or will be lost; /* I1MFREE - free the memory block /* src - unpacked memory block /* dst - a descriptor of the memory block; /* I1MPACK - pack the memory block /* src - unpacked memory block; /* if dst != NULL - pack into the chain (don't create new descriptor); /* I1MUNPK - unpack the memory block /* src - packed memory block; /* if dst != NULL - a descriptor (block must be free or packed); === Cut === И так далее. Hу и таки да, есть 200 строк примерно в таком духе: === Cut === extern int coreerr( void ); extern int f_callog( SRC_PTR ); extern FILE *v0005f_errfp; extern F_DECL f1end( SRC_PTR ); struct fn_head { F_DECL ( *addr )( SRC_PTR ); char *name; }; #include<bureau\f1ptr.lst> #include<bureau\f2ptr.lst> ... struct fn_head (*f_ptr[])[] = { NULL, &f1ptr, &f2ptr, ... }; F_DECL f_call( int idgrp, int idnum, DST_PTR ) { static F_ARG *result, *sptr; t0000s_fnum old; #ifdef INTERNAL_LOG if ( ( v0003w_logmode & LMODE_C ) ) { LOGBLANK; fprintf( v0004f_logfp, "%s%06d%c%06d%s%06d%c%06d%s%s%s", "call ", idgrp, ':', idnum, " from ", v0000s_pdiag.fnum.now.grp, ':', v0000s_pdiag.fnum.now.num, " (", (*(f_ptr[idgrp]))[idnum].name, ")\n"); f_callog( SRC_ADR ); }; #endif if ( ( !( idgrp ) ) && (src != NULL ) ) { idgrp = (*src).F_GRP; idnum = (*src).F_NUM; sptr = src++; } else sptr = src; if ( !( idgrp ) ) return ( NULL ); /* много проверок повырезано нафиг */ ... #ifdef INTERNAL_LOG v0002w_clevel++; #endif result = (*(f_ptr[idgrp]))[idnum].addr( dst, sptr ); if ( v0000s_pdiag.error.level ) coreerr(); /* немножко логов отправилось туда же*/ ... return ( result ); } === Cut === Да, я знаю, что по этому поводу сказал бы Луговский, но как на заре юности было написано, с тех пор и работает. Для обнаружить забытые скобочки в char s = ""; хватает, переполняться нечему. P.S. А массивы и циклы, прописанные явным образом, таки все равно лучше. Вишен и прочих кактусов. --- глаза брата келаря 3.0.1 шт. * Origin: И ныне, и присно, и до инструкции HLT ! Reset... (2:5054/4.2) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix/22443fda5c14.html, оценка из 5, голосов 10
|