home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 2 / FreeSoftwareCollection2pd199x-jp.img / look / src / wc.c < prev    next >
Text File  |  1990-06-14  |  4KB  |  193 lines

  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3. #include    <ctype.h>
  4. #include    <strings.h>
  5. #include    <dos.h>
  6. #include    <msdos.cf>
  7.  
  8. #define SHORT   short int
  9. #define LONG    long int
  10. #define ULONG   unsigned long int
  11. #define BOOL    short int
  12.  
  13. #define TRUE    1
  14. #define FALSE   0
  15. #define ERR     (-1)
  16.  
  17. #define    MAXWCP    200
  18.  
  19. typedef struct {
  20.     SHORT    wb_dsp;
  21.     SHORT   wb_att;
  22.     SHORT   wb_time,wb_date;
  23.     ULONG   wb_size;
  24.     char    wb_name[14];
  25. } WCBUF;
  26.  
  27. int        wcmax=0;
  28. WCBUF    *topwcp=NULL;
  29.  
  30. char    *subname(char *name)
  31. {
  32.     static char tmp[14];
  33.     int        i;
  34.     char    *p;
  35.  
  36.     if ( *name == '.' ) {
  37.         for ( i = 0,p = tmp ; i < 9 ; i++ ) {
  38.             if ( *name == '\0' )
  39.                 *(p++) = ' ';
  40.             else
  41.                 *(p++) = *(name++);
  42.         }
  43.     } else {
  44.         for ( i = 0,p = tmp ; i < 9 ; i++ ) {
  45.             if ( *name == '.' || *name == '\0' )
  46.                 *(p++) = ' ';
  47.             else
  48.                 *(p++) = *(name++);
  49.         }
  50.         if ( *name == '.' ) name++;
  51.     }
  52.     for ( ; i < 12 ; i++ ) {
  53.         if ( *name == '\0' )
  54.             *(p++) = ' ';
  55.         else
  56.             *(p++) = *(name++);
  57.     }
  58.     *p = '\0';
  59.     return tmp;    
  60. }
  61. int        cmpname(char *arg,char *str)
  62. {
  63.     int        i;
  64.     char    *p,tmp[14];
  65.  
  66.     strcpy(tmp,subname(arg));
  67.     p = subname(str);
  68.     if ( (i = strcmp(tmp + 9,p + 9)) != 0 )
  69.         return i;
  70.     tmp[9] = p[9] = '\0';
  71.     return strcmp(tmp,p);
  72. }
  73. void    sort(int bs,int mx)
  74. {
  75.     int     i,j;
  76.     WCBUF    x,w;
  77.  
  78.     i=bs;
  79.     j=mx;
  80.     memcpy(&x,&(topwcp[bs + (mx - bs) / 2]),sizeof(WCBUF));
  81.     do {
  82.         while ( cmpname(topwcp[i].wb_name, x.wb_name) < 0 )
  83.             i++;
  84.         while ( cmpname(topwcp[j].wb_name, x.wb_name) > 0 )
  85.             j--;
  86.         if ( i <= j ) {
  87.             memcpy(&w,&(topwcp[i]),sizeof(WCBUF));
  88.             memcpy(&(topwcp[i]),&(topwcp[j]),sizeof(WCBUF));
  89.             memcpy(&(topwcp[j]),&w,sizeof(WCBUF));
  90.             i++; j--;
  91.         }
  92.     } while ( i <= j );
  93.     if ( bs < j )
  94.         sort(bs,j);
  95.     if ( i < mx )
  96.         sort(i,mx);
  97. }
  98. BOOL    subwc(char *arg,int mode,WCBUF *wcp)
  99. {
  100.     static BOOL opflg=FALSE;
  101.     static struct {
  102.         char    dd_dmy[22];
  103.         SHORT   dd_time,dd_date;
  104.         LONG    dd_size;
  105.         char    dd_name[13];
  106.     } dma;
  107.  
  108.     if ( opflg == FALSE ) {
  109.         Registers.AX.R = 0x1A00;
  110.         Registers.DX.R = (int)&dma;
  111.         Registers.DS.R = getds();
  112.         calldos(); 
  113.         Registers.AX.R = 0x4E00;
  114.         Registers.CX.R = mode;
  115.         Registers.DX.R = (int)arg;
  116.         Registers.DS.R = getds();
  117.         opflg = TRUE;
  118.     }
  119.     else
  120.         Registers.AX.R = 0x4F00;
  121.  
  122.     calldos();
  123.     if ( (Registers.Flags & 0x0001) != 0 ) {
  124.         opflg = FALSE;
  125.         return FALSE;
  126.     }
  127.  
  128.     wcp->wb_dsp = 0;
  129.     wcp->wb_att = dma.dd_dmy[21];
  130.     wcp->wb_date = dma.dd_date;
  131.     wcp->wb_time = dma.dd_time;
  132.     wcp->wb_size = dma.dd_size;
  133.     strcpy(wcp->wb_name,dma.dd_name);
  134.     return TRUE;
  135. }
  136. void    chdir(char *name)
  137. {
  138.     Registers.AX.R = 0x3B00;
  139.     Registers.DX.R = (int)name;
  140.     Registers.DS.R = getds();
  141.     calldos();
  142.     if ( name[1] == ':' ) {
  143.         Registers.AX.R = 0x0E00;
  144.         Registers.DX.R = (*name & 0xDF) - 'A';
  145.         calldos();
  146.     }
  147. }
  148. int        WC_open(char *dir,char *wild)
  149. {
  150.     int        i;
  151.  
  152.     if ( dir != NULL )
  153.         chdir(dir);
  154.     if ( topwcp == NULL &&
  155.         (topwcp = (WCBUF *)malloc(sizeof(WCBUF)*MAXWCP)) == NULL )
  156.         return 0;
  157.     wcmax = 0;
  158.     while ( wcmax < MAXWCP && subwc("*.*",0x10,&topwcp[wcmax]) != FALSE ) {
  159.         if ( (topwcp[wcmax].wb_att & 0x10) != 0 )
  160.             wcmax++;
  161.     }
  162.     if ( wcmax > 1 ) sort(0,wcmax - 1);
  163.     i = wcmax;
  164.     while ( wcmax < MAXWCP && subwc(wild,0x21,&topwcp[wcmax]) != FALSE )
  165.         wcmax++;
  166.     if ( (wcmax - 1) > i ) sort(i,wcmax - 1);
  167.     return wcmax;
  168. }
  169. int        drvsts(int no)
  170. {
  171.     Registers.AX.R = 0x4404;
  172.     Registers.BX.R = no + 1;
  173.     Registers.CX.R = 0x0000;
  174.     calldos();
  175.     return (Registers.AX.R & 0x0E);
  176. }
  177. int        retdir(char *name)
  178. {
  179.     Registers.AX.R = 0x4700;
  180.     Registers.DX.R = 0x0000;
  181.     Registers.SI.R = (int)name+3;
  182.     Registers.DS.R = getds();
  183.     calldos();
  184.  
  185.     Registers.AX.R = 0x1900;
  186.     calldos();
  187.  
  188.     *(name++) = 'A' + (Registers.AX.R & 0xFF);
  189.     *(name++) = ':';
  190.     *name = '\\';
  191.     return (Registers.AX.R & 0xFF);
  192. }
  193.