home *** CD-ROM | disk | FTP | other *** search
/ Inside Multimedia 1995 July / IMM0795.ISO / share / os2 / zoo21_32 / source / os2.c < prev    next >
C/C++ Source or Header  |  1993-12-17  |  6KB  |  211 lines

  1. /* os2.c */
  2.  
  3. /* Highly system-dependent routines go here */
  4.  
  5. #include "options.h"
  6. #include "zoo.h"
  7. #include "zooio.h"        /* to satisfy declarations in zoofns.h */
  8. #include "zoofns.h"
  9. #include "errors.i"
  10. #include <stdio.h>        /* to get fileno() */
  11. #include <stdlib.h>
  12.  
  13. #define INCL_NOPM
  14. #define INCL_DOS
  15. #define INCL_DOSERRORS
  16. #include <os2.h>
  17.  
  18. #include "assert.h"     /* macro definition:  assert() macro            */
  19.  
  20. /* settime() */
  21.  
  22. /* Accepts a date/time in DOS format and sets the file time. Returns 1
  23. if OK, 0 if error */
  24.  
  25. int settime (file,date,time)
  26. ZOOFILE file;
  27. unsigned date, time;
  28. {
  29.     FILESTATUS info;
  30.     HFILE handle = fileno(file);
  31.  
  32.     fflush(file);
  33.     DosQFileInfo(handle, 1, &info, sizeof(info));
  34.     *((unsigned *)&info.fdateLastWrite) = date;
  35.     *((unsigned *)&info.ftimeLastWrite) = time;
  36.     return DosSetFileInfo(handle, 1, (PBYTE) &info, sizeof(info)) == 0;
  37. } /* settime */
  38.  
  39. /* gets date and time of file */
  40.  
  41. gettime (file,date,time)
  42. ZOOFILE file;
  43. unsigned *date, *time;
  44. {
  45.     FILESTATUS info;
  46.     HFILE handle = fileno(file);
  47.     int ret;
  48.  
  49.     ret = DosQFileInfo(handle, 1, &info, sizeof(info));
  50.     *date = *((unsigned *) &info.fdateLastWrite);
  51.     *time = *((unsigned *) &info.ftimeLastWrite);
  52.     return ret == 0;
  53. } /* settime */
  54.  
  55.  
  56. /* space() */
  57.  
  58. /* Returns free space in bytes on disk n (0 = default, 1 = A, etc.).  Returns
  59.     0 if drive number is invalid.  Before getting disk space, the function
  60.     requests DOS to flush its internal buffers */
  61.  
  62. unsigned long space (drive, alloc_size)
  63. int drive;
  64. int *alloc_size;
  65. {
  66.     unsigned long free_space;
  67.     FSALLOCATE info;
  68.     int ret;
  69.  
  70.     DosBufReset(-1);
  71.     ret = DosQFSInfo(drive, 1, (BYTE FAR *)&info, sizeof(info));
  72.     *alloc_size = info.cbSector * (int) info.cSectorUnit;
  73.     return ret ? 0L : (unsigned long) (info.cUnitAvail * *alloc_size);
  74. }
  75.  
  76. int IsFileNameValid(char *name)
  77. {
  78.   HFILE hf;
  79.   UINT usAction;
  80.  
  81.   switch( DosOpen(name, &hf, &usAction, 0L, 0, FILE_OPEN,
  82.                   OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE, 0L) )
  83.   {
  84.   case ERROR_INVALID_NAME:
  85.   case ERROR_FILENAME_EXCED_RANGE:
  86.     return FALSE;
  87.   case NO_ERROR:
  88.     DosClose(hf);
  89.   default:
  90.     return TRUE;
  91.   }
  92. }
  93.  
  94.  
  95. int IsFileSystemDumb(char *dir)
  96. {                         
  97.   char drive[5], path[256], name[256];
  98.   
  99.   _splitpath(dir, drive, path, NULL, NULL);
  100.   strcpy(name, drive);
  101.   strcat(name, path);
  102.   strcat(name, ".DUMB.TEST.NAME");
  103.   
  104.   return !IsFileNameValid(name);
  105. }
  106.  
  107.  
  108. #ifdef __32BIT__
  109. typedef FILEFINDBUF3 FINDBUF;
  110. #else
  111. typedef FILEFINDBUF FINDBUF;
  112. #endif
  113.  
  114. #define  FMAX  3        /* Number of different filename patterns */
  115.  
  116. void fcbpath (FINDBUF *, char *, char *);
  117.  
  118. char *nextfile (what, filespec, fileset)
  119. int what;                        /* whether to initialize or match      */
  120. register char *filespec;         /* filespec to match if initializing   */
  121. register int fileset;            /* which set of files                  */
  122. {
  123.    static FINDBUF file_info [FMAX+1];     /* our own private dta        */
  124.    static HDIR handles [FMAX+1];
  125.    static int first_time [FMAX+1];
  126.    static char pathholder [FMAX+1][PATHSIZE]; /* holds a pathname to return */
  127.    static char saved_fspec [FMAX+1][PATHSIZE];/* our own copy of filespec   */
  128.    static int lower;
  129.    UINT count;
  130.    int ret;
  131.  
  132.    assert(fileset >= 0 && fileset <= FMAX);
  133.    if (what == 0) {
  134.       assert(filespec != NULL);
  135.       strcpy (saved_fspec[fileset], filespec);  /* save the filespec */
  136.       first_time[fileset] = 1;
  137.       return (NULL);
  138.    }
  139.  
  140.    assert(what == 1);
  141.    assert(filespec == NULL);
  142.    assert(first_time[fileset] == 0 || first_time[fileset] == 1);
  143.  
  144.    if (first_time[fileset]) {             /* first time -- initialize etc. */
  145.       /* find first matching file */
  146.       count = 1;
  147.       lower = IsFileSystemDumb(saved_fspec[fileset]);
  148.       handles[fileset] = HDIR_CREATE;      /* Get new handle */
  149.       ret = DosFindFirst(saved_fspec[fileset], &handles[fileset], 0,
  150.                  &file_info[fileset], sizeof(FINDBUF), &count, 1L);
  151.    } else {
  152.       /* find next matching file */
  153.       count = 1;
  154.       ret = DosFindNext(handles[fileset], &file_info[fileset], sizeof(FINDBUF),
  155.                 &count);
  156.    }
  157.  
  158.    if (ret != 0 || count != 1) {            /* if error status                  */
  159.       if (first_time[fileset]) {       /*   if file never matched then     */
  160.          first_time[fileset] = 0;
  161.          return (saved_fspec[fileset]);/*      return original filespec    */
  162.       } else {                         /*   else                           */
  163.      DosFindClose(handles[fileset]);
  164.          first_time[fileset] = 0;      /*                                  */
  165.          return (NULL);                /*      return (NULL) for no more   */
  166.       }
  167.    } else {                                        /* a file matched */
  168.       first_time[fileset] = 0;
  169.       /* add path info  */
  170.       if ( lower )
  171.         strlwr(file_info[fileset].achName);
  172.       fcbpath (&file_info[fileset], saved_fspec[fileset], pathholder[fileset]);
  173.       return (pathholder[fileset]);                /* matching path  */
  174.    }
  175. } /* nextfile */
  176.  
  177. /*
  178. fcbpath() accepts a pointer to the FINDBUF, a
  179. character pointer to a pathname that may contain wildcards, and a character
  180. pointer to a buffer.  Copies into buffer the path prefix from the pathname
  181. and the filename prefix from the DTA so that it forms a complete path
  182. */
  183.  
  184. void fcbpath (info, old_path, new_path)
  185. FINDBUF *info;
  186. char *old_path;
  187. register char *new_path;
  188. {
  189.    register int i;
  190.    int length, start_pos;
  191.  
  192.    strcpy(new_path, old_path);               /* copy the whole thing first */
  193.    length = strlen(new_path);
  194.    i = length - 1;                           /* i points to end of path */
  195.    while (i >= 0 && new_path[i] != '/' && new_path[i] != '\\' && new_path[i] != ':')
  196.       i--;
  197.    /* either we found a "/", "\", or ":", or we reached the beginning of
  198.       the name.  In any case, i points to the last character of the
  199.       path part. */
  200.    start_pos = i + 1;
  201.    for (i = 0; info->achName[i]; i++)
  202.       new_path[start_pos+i] = info->achName[i];
  203.    new_path[start_pos+i] = '\0';
  204. }
  205.  
  206.  
  207. int outchar(int c)
  208. {
  209.   putchar(c);
  210. }
  211.