/* Programme qui ‚mule la commande dir de DOS avec r‚pertoire virtuel */ #include #include #include #include #include "ostool.h" #include "commun.h" unsigned int _stklen = 20000; static void near usage(void) { fprintf (stderr ,"pdir version 1.09\n" "pdir [-c] [-l] [-p] [-w] path [path ...]\n" "Pr‚sente le contenu d'un r‚pertoire virtuel.\n" "-c : Convertit un path logique en path r‚el.\n" "+c : Convertit un path logique en path r‚el.\n" " Affiche mˆme si le fichier est absent.\n" " Toutes les autres options sont ignor‚s.\n" " (Vrai ou -c et +c).\n" "-d : N'affiche pas les sous-r‚pertoires.\n" "-h : Cet ‚cran.\n" "-l : Affiche le path r‚el au bout des lignes.\n" "-n : Affiche les noms de fichier seulement.\n" "=p : Ne fait pas de pause … la fin des pages.\n" "-w : Affichage en colonne.\n" ); } static int near pdir_do ( const char *fwild, /* Wildcard + path */ int wide, /* Affichage en colonne ? */ int pause, /* Arrˆte … chaque page ? */ int infomode, /* 0 : nom seulement */ /* 1 : nom plus taille, date */ /* 2 : le path au complet dans kit\ombre */ int showdir) /* Affiche les sous-r‚pertoires */ { int ret = 0; char *tb[400]; int nbfile = vdir_getlistp (fwild,tb,400); int nb = showdir ? nbfile + vdir_getlistdp (fwild,tb+nbfile,400-nbfile) : nbfile; if (wide){ int i; int nbline = nb / 4 + 1; int nblpage = nbline >= 22 ? 22 : nbline; int total = nbline * 4; int itempage = nblpage * 4; for (i=0; i= nb ? "" : tb[select]; char name[MAXSIZ_NAME]; path_splitlex (fname,NULL,name); if (select >= nbfile && select < nb){ path_addback(name,name); } if (pause && inpage == 0 && i != 0){ char buf[100]; printf ("\n---- enter ----"); gets(buf); } printf ("%-19s",name); if (i!=0 && colonne == 3) printf ("\n"); } }else{ int i; int nblpage = 22; for (i=0; i= nbfile){ path_addback(name,name); printf ("%-15s\n",name); }else if (infomode == 0){ printf ("%s\n",name); }else{ char datestr[9]; char timestr[9]; int info = vdir_infodos (fname,reel,&date,&size); if (info != -1){ date_u2a ((unsigned short)(date >> 16),datestr); time_u2a ((unsigned short)(date & 0xffff),timestr); printf ("%-15s %7ld %s %s ",name,size,datestr,timestr); if (strcmp(reel,fname)!=0){ if (infomode == 2){ printf ("-> %s",reel); }else{ printf ("->"); } } }else{ fprintf (stderr,"**** Corruption entr‚e %s\n",fname); } printf ("\n"); } } } tbstr_free (tb,nb); return ret; } /* Affiche le path r‚el d'un fichier */ static int near pdir_convert (const char *arg, int force) { int ret = -1; char path[MAXSIZ_PATH]; if (vdir_exist(arg,path)){ printf ("%s\n",path); ret = 0; }else if (force){ printf ("%s\n",arg); ret = 0; } return ret; } static void near pdir_optionc (int argc, char *argv[], int force) { int i; int ret = 0; for (i=2; i 0){ int j; for (j=0; j 1 && strcmp(argv[1],"-c")==0){ pdir_optionc(argc,argv,0); }else if (argc > 1 && strcmp(argv[1],"+c")==0){ pdir_optionc(argc,argv,1); }else{ ARGP argp[26]; argc = anlparm (argc,argv,argp,"dhlnpw"); if (argp['h' - 'a'].ptr != NULL || argc == 0){ usage (); }else{ int longptr = argp['l' - 'a'].ptr != NULL; int nomseul = argp['n' - 'a'].ptr != NULL; int showdir = argp['d' - 'a'].ptr == NULL; int pause = argp['p' - 'a'].ptr == NULL; int wide = argp['w' - 'a'].ptr != NULL; int infomode = 1; if (longptr && nomseul){ fprintf (stderr ,"**** Option -l et -n ne peuvent pas ˆtre\n" " utilis‚e en mˆme temps\n"); exit (-1); }else if (longptr){ infomode = 2; }else if (nomseul){ infomode = 0; } if (argc == 1){ ret = pdir_do (WILD_ALLFILE,wide,pause,infomode,showdir); }else{ int i; ret = 0; for (i=1; i