00001 /**********************************************************/ 00002 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00003 /* 00004 Copyright: 1995 - Grupo de Voz (DET) ETSII/IT-Bilbao 00005 00006 Nombre fuente................ wrkbuff.c 00007 Nombre paquete............... - 00008 Lenguaje fuente.............. C (Borland C/C++ 3.1) 00009 Estado....................... en desarrollo 00010 Dependencia Hard/OS.......... - 00011 Codigo condicional........... NDEBUG, NOWRKBUFF 00012 00013 Codificacion................. Borja Etxebarria 00014 00015 Version dd/mm/aa Autor Comentario 00016 ------- -------- -------- ---------- 00017 1.0.0 07/06/95 Borja Codificacion inicial. 00018 00019 ======================== Contenido ======================== 00020 <DOC> 00021 Para usar un buffer de trabajo global y no tener que 00022 andar haciendo mallocs/free, ni chupando mucha pila. 00023 00024 En este modulo simplemente se define una variable global 00025 que se llama {_wrkbuff} y que es un array de CHARs de 00026 longitud WRKBUFFLEN. 00027 00028 Cuando una funcion quiere usar un buffer temporal, como 00029 suele ser normal al hacer operaciones con cadenas de 00030 texto, podemos usar este buffer {_wrkbuff}, siempre que sea 00031 suficientemente grande para las necesidades de la funcion. 00032 Nos ahorramos asi el overhead de malloc/free y el chupar 00033 demasiado espacio de pila con variables automaticas. 00034 00035 Conviene que la funcion haga WRKBUFF(n) justo despues de 00036 definir las variables automaticas (es decir, ponerlo como 00037 primera sentencia a ejecutar dentro de la funcion). 00038 WRKBUFF(n) va a asegurarse de que el buffer global {_wrkbuff} 00039 tenga por lo menos {n} elementos. De no ser asi, el programa 00040 se interrumpe (se utiliza assert()). La longitud del 00041 buffer {_wrkbuff} se selecciona a la hora de compilar, en el 00042 fichero WRKBUFF.H, definido como WRKBUFFLEN. 00043 00044 Si se define NDEBUG, la sentencia assert() desaparece, por 00045 lo que no se comprueba que {_wrkbuff} sea suficientemente 00046 grande para las necesidades de la funcion!!! Conviene definir 00047 NDEBUG solo al final del desarrollo, cuando estamos seguros de 00048 que todo nuestro codigo es estable. 00049 00050 Si se define NOWRKBUFF, la variable global {_wrkbuff} no se 00051 define, y la sentencia WRKBUFF(n) se sustituye por una 00052 definicion automatica de la variable {_wrkbuff} en la pila: 00053 00054 CHAR _wrkbuff[n] 00055 00056 es decir, se usa una cadena local a la funcion en vez de 00057 un buffer global al programa. 00058 00059 IMPORTANTE: no modificar NUNCA el puntero {_wrkbuff}, por 00060 ejemplo, no hacer _wrkbuff++ ni cosas de esas!!. 00061 </DOC> 00062 =========================================================== 00063 */ 00064 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00065 /**********************************************************/ 00066 00067 #define __WRKBUFF_C__ 00068 00069 #include "wrkbuff.h" 00070 00071 /**********************************************************/ 00072 /* Define el buffer de trabajo, excepto si NOWRKBUFF esta 00073 definido, en cuyo caso no se usa un buffer global, sino que 00074 se usaran variables locales automaticas (en pila). */ 00075 00076 #ifndef NOWRKBUFF 00077 00078 PUBLIC CHAR __wrkbuff[WRKBUFFLEN]; 00079 #ifdef __OS_MSDOS__ 00080 PUBLIC CHAR _far *_wrkbuff=__wrkbuff; 00081 #else 00082 PUBLIC CHAR *_wrkbuff=__wrkbuff; 00083 #endif 00084 00085 #ifndef NDEBUG 00086 PUBLIC BOOL _wrkbuff_used=FALSE; 00087 #endif 00088 00089 #endif 00090 00091 /**********************************************************/