Sin memorian en C

Javi
01 de Mayo del 2008
No corrijan las pequenieces que puede haber, pero el GRAN problema, es que al usar este código en un directorio con pocos archivos o directorios, corre joya, pero si lo uso en algun directorio muy grande, me termina diciendo que no hay memoria, ya que la función al ser recursiva, va consumiendo y consumiendo más memoria. Para hacer esto, uso el Turbo C 3.1, Estaba trabajando con el modelo SMALL de memoria, asique pense en hacer los punteros lejanos para poder acceder al MB, y seleccione el modelo HUGE y declare AUX_FICHEROS como char huge *AUX_FICHEROS, pero sigue sin funcionar =(.
La variable CONT es ver cuantas veces se pidio memoria a malloc, solo para control personal.
Si alguien pudiese decirme como mejorar esto se lo agradecería.


#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dir.h>
#include <dirent.h>
#include <string.h>
#include <sysstat.h>
#include <systypes.h>

unsigned long Calcula_Tamanio(char *, unsigned long);
void Falta_Mem();
int CONT=0;

void main()
{
char *DR="d:\tc";
FILE *F;
int TAM=0;
clrscr();
printf("%ld",Calcula_Tamanio(DR,0));
getch();
}

unsigned long Calcula_Tamanio(char *FICHERO, unsigned long TAMANIO)
{
FILE *FP_FICHERO;
char *AUX_FICHERO;
DIR *PS_DIR;
struct dirent *DIRECTORIOS;
struct stat INFO_FICHERO, INFO_AUX_FICHERO;
stat(FICHERO,&INFO_FICHERO);

if(!(PS_DIR=opendir(FICHERO)))
{
printf("No se ha podido calcular el tama¤o de %s",FICHERO);
return -1;
}

DIRECTORIOS=readdir(PS_DIR);
while(DIRECTORIOS!=NULL)
{
//Genero AUX_ORIGEN de acuerdo al largo del directorio
if(!(AUX_FICHERO=(char*)malloc(sizeof(char)*(strlen(FICHERO)+strlen(DIRECTORIOS->d_name)+2))))
Falta_Mem();
//El nuevo directorio o archivo se carga en AUX_ORIGEN para chequear que es?
strcpy(AUX_FICHERO,FICHERO);
strcat(AUX_FICHERO, "\");
strcat(AUX_FICHERO,DIRECTORIOS->d_name);

//Cargo una estructura del nuevo archivo o directorio
stat(AUX_FICHERO,&INFO_AUX_FICHERO);
//Verifico si es un directorio. Si es un directorio,,,entro
if(INFO_AUX_FICHERO.st_mode==ES_DIR)
if(strcmpi(DIRECTORIOS->d_name, ".")!=0 && strcmpi(DIRECTORIOS->d_name, "..")!=0)
//Si hay otro directorio dentro entro /*RECURSIVIDAD*/
TAMANIO=Calcula_Tamanio(AUX_FICHERO, TAMANIO);
else;
else
TAMANIO=TAMANIO+INFO_AUX_FICHERO.st_size;
DIRECTORIOS=readdir(PS_DIR);
}
closedir(PS_DIR);
free(AUX_FICHERO);
free(DIRECTORIOS);
return TAMANIO;
}

void Falta_Mem()
{
printf("nMemoria insuficiente, no se podr continuar. %d",CONT);
getch();
exit(1);
}