#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <dir.h>
#include <dos.h>
 
#ifndef __cplusplus
typedef enum { false, true } bool;
#endif
 
typedef struct
{
  int max, count;
  char **str;
} TStrList;
 
// Cria lista de strings
TStrList *InitStrList()
{
  // Cria e inicializa a lista
  TStrList *strlist = (TStrList *)malloc(sizeof(TStrList));
  if(strlist)
  {
    strlist->count = 0;
    strlist->max = 0;
    strlist->str = 0;
  }
  
  return strlist;
}
 
// Adiciona strings em uma lista de strings
TStrList *AddStr(TStrList *strlist, char *str)
{
  char **temp;
  
  // Se estourou o limite máximo, expande a lista
  if(strlist->count >= strlist->max)
  {
    temp = (char **)realloc(strlist->str, sizeof(char *) * (strlist->max + 10));
    if(temp)
    {
      strlist->max += 10;
      strlist->str = temp;
    }
    else
      return strlist;
  }
  
  // Duplica a string e adiciona na lista
  strlist->str[strlist->count++] = strdup(str);
  
  return strlist;  
}
 
// Procura arquivos a partir de um diretorio base
void SearchFile(const char *path, const char *file)
{
  TStrList *dirlist = InitStrList();
  struct ffblk ffblk;
  bool found;
  char curpath[MAXPATH];
  
  printf("Diretorio: %s\n", path);
  
  fnmerge(curpath, 0, path, "*.*", 0);
  
  // Cria uma lista dos subdiretórios
  found = findfirst(curpath, &ffblk, FA_DIREC) == 0;
  while(found)
  {
    if((strcmp(ffblk.ff_name, ".") != 0) && (strcmp(ffblk.ff_name, "..") != 0)
       && (ffblk.ff_attrib == FA_DIREC))
      AddStr(dirlist, ffblk.ff_name);
  
    found = findnext(&ffblk) == 0;
  }
  
  fnmerge(curpath, 0, path, file, 0);
  
  // Procura os arquivos
  found = findfirst(curpath, &ffblk, FA_ARCH) == 0;
  while(found)
  {
    printf("  Arquivo:    %s\n", ffblk.ff_name);
    found = findnext(&ffblk) == 0;
  }
  
  // Se encontrou subdiretórios, varre a lista recursivamente
  if(dirlist->count)
  {
    int c;
    
    for(c = 0; c < dirlist->count; c++)
    {
      fnmerge(curpath, 0, path, dirlist->str[c], 0);
      SearchFile(curpath, file);
      
      free(dirlist->str[c]);
    }
    
    free(dirlist->str);
  }
  
  free(dirlist);
}
 
void main(int ArgC, char *ArgV[])
{
  printf("FindFile - Copyright (c) 1999 VIC\n"
         "  Programmed by Wenderson Teixeira\n");
  
  switch(ArgC)
  {
    case 3:
        SearchFile(ArgV[1], ArgV[2]);
    break;
    
    case 2:
        SearchFile("", ArgV[1]);
    break;
    
    default:
        printf("Usage: findfile [path] filename\n"
               "   path     - drive:\\directory\\, initial path, no wildcards allowed\n"
               "   filename - filename.ext, you may use wildcards\n");
  }
}
1