/** * Selecciona un conjunto de campos de un fichero DBF */ void seleccionar(FICHERODBF *ficheroDBF, char **camposArray, int numCamposArray) { CABEC_DBF5 *cabecera = _pmalloc(CABEC_DBF5, 1); TABLA_LOCALIZ *tablaLocaliz = ficheroDBF->tablaLocaliz; FILA_LOCALIZ *campoActualDBF = NULL; char *bufferSalida = _pmalloc(char, 40); char *campoActualArray = NULL; int numCamposDBF = tablaLocaliz->numCampos; int numFilasDBF = cabecera->numRegistros; int *arrDesplazam = _pmalloc(int, numCamposArray); int *arrLongit = _pmalloc(int, numCamposArray); int i, j; int desplazActual = cabecera->bytePrimerRegistro + 1; int longRegistro = cabecera->numBytesRegistro; numFilasDBF = 5; /* printf("Desplazamiento inicial: %i\n", desplazActual); */ /*memset(arrDesplazam, 0, longArrNum); memset(arrLongit, 0, longArrNum);*/ /* Localiza las posiciones de los campos que hay que buscar */ for(i = 0; i < numCamposArray; i++) { campoActualArray = camposArray[i]; for(j = 0; j < numCamposDBF; j++) { campoActualDBF = tablaLocaliz->filas + j; if(!strcmp(campoActualDBF->nombre, campoActualArray)) { arrDesplazam[i] = campoActualDBF->direcRel; arrLongit[i] = campoActualDBF->longitud; } } } /* Selecciona los campos que quiere buscar el usuario */ for(i = 0; i < numFilasDBF; i++) { for(j = 0; j < numCamposArray; j++) { memcpy(bufferSalida, ficheroDBF->fichero->content + desplazActual + arrDesplazam[j], arrLongit[j]); *(bufferSalida + arrLongit[j]) = 0x00; printf("%s\t", bufferSalida); } printf("\n"); desplazActual += longRegistro; } pfree(bufferSalida); }
sort_info *sort_alloc(long size) { sort_info *ret = _pcalloc(1, sizeof (sort_info)); ret->vector = NULL; ret->sortbegin = -1; ret->size = -1; ret->maxsize = size; ret->head = _pcalloc(65536, sizeof (sort_link *)); ret->bucketusage = _pmalloc(65536 * sizeof (long)); ret->revindex = _pcalloc(size, sizeof (sort_link)); ret->lastbucket = 0; return (ret); }
/** * Carga de un dbf en memoria y las estructuras necesarias * para gestionarlo */ FICHERODBF *abrirDBF(char *ruta) { FICHERODBF *ficheroDBF = _pmalloc(FICHERODBF, 1); char tipoDBF = 0x00; ficheroDBF->fichero = BF_open(ruta, READING); tipoDBF = *(ficheroDBF->fichero->content); /* Carga la cabecera en función del tipo de DBF */ switch(tipoDBF) { case 0x03: ficheroDBF->cabecera = (unsigned char *) malloc(sizeof(CABEC_DBF5)); memcpy(ficheroDBF->cabecera, ficheroDBF->fichero->content, sizeof(CABEC_DBF5)); ficheroDBF->tablaLocaliz = componerTablaLocaliz(ficheroDBF); break; default: printf("[Error] Archivo DBF no reconocido (%x)\n", tipoDBF); BF_close(ficheroDBF->fichero); pfree(ficheroDBF); break; } return ficheroDBF; }