home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 211_01 / stdlib3r.c < prev    next >
Text File  |  1979-12-31  |  4KB  |  189 lines

  1. /* STDLIB3R.C    VERS:- 01.00  DATE:- 09/26/86  TIME:- 09:36:48 PM */
  2. /*
  3. %CC1 $1.C -X 
  4. */
  5. /* 
  6. Description:
  7.  
  8. STDLIB3R has file-handling functions that allow use of du: in addition 
  9. to u/d: drive/user prefix.
  10. The functions have been added to DEFF.CRL
  11. They replace functions of same name in DEFF2.CRL, which must be 
  12. patched (DEFF2.CRL: open -> xpen, etc).
  13.  
  14. Functions:
  15.     open(), creat(), unlink(), rename(), execv(), exec(), du_ud().
  16.  
  17. In DEFF2.CRL:
  18.     patched header for routines (open...exec -> xpen...xxec);
  19.           patched body of routines open and unlink;
  20.     edfile or similar program used to make changes.
  21.  
  22. Execl is not patched and does not take du: form.
  23.  
  24. An alternate route, consuming less memory:
  25.     revise "setfcu" routine of ccc.asm,
  26.     then recompile: 
  27.            ccc.asm....c.ccc
  28.            bds.lib
  29.            deff2*.csm...deff2.crl
  30.            
  31. By J.A. Rupley, Tucson, Arizona
  32. Coded for BDS C compiler, version 1.50a
  33. */
  34.  
  35. #include "bdscio.h"
  36.  
  37. /* #include <ctrlcnst.h> */
  38.  
  39. int open(filename, mode)
  40. char *filename;
  41. int mode;
  42. {
  43.     char temp[20];
  44.     int dchk, fd;
  45.  
  46.     if ((dchk = du_ud(filename, temp)) < 0)
  47.         return ERROR;
  48.     if (dchk == 0)
  49.         fd = xpen(filename, mode);
  50.     else
  51.         fd = xpen(temp, mode);
  52.     return fd;
  53. }
  54.  
  55. int creat(filename)
  56. char *filename;
  57. {
  58.     char temp[20];
  59.     int dchk, fd;
  60.  
  61.     if ((dchk = du_ud(filename, temp)) < 0)
  62.         return ERROR;
  63.     if (dchk == 0)
  64.         fd = xreat(filename);
  65.     else
  66.         fd = xreat(temp);
  67.     return fd;
  68. }
  69.  
  70. int unlink(filename)
  71. char *filename;
  72. {
  73.     char temp[20];
  74.     int dchk, fd;
  75.  
  76.     if ((dchk = du_ud(filename, temp)) < 0)
  77.         return ERROR;
  78.     if (dchk == 0)
  79.         fd = xnlink(filename);
  80.     else
  81.         fd = xnlink(temp);
  82.     return fd;
  83. }
  84.  
  85. int rename(old, new)
  86. char *old, *new;
  87. {
  88.     char oldtemp[20];
  89.     char newtemp[20];
  90.     int oldchk, newchk, fd;
  91.  
  92.     if ((oldchk = du_ud(old, oldtemp)) < 0)
  93.         return ERROR;
  94.     if ((newchk = du_ud(new, newtemp)) < 0)
  95.         return ERROR;
  96.     if (oldchk == 0)
  97.         if (newchk == 0)
  98.             fd = xename(old, new);
  99.         else
  100.             fd = xename(old, newtemp);
  101.     else
  102.         if (newchk == 0)
  103.             fd = xename(oldtemp, new);
  104.         else
  105.             fd = xename(oldtemp, newtemp);
  106.     return fd;
  107. }
  108.  
  109. int execv(filename, argvector)
  110. char *filename;
  111. char *argvector;
  112. {
  113.     char temp[20];
  114.     int dchk, fd;
  115.  
  116.     if ((dchk = du_ud(filename, temp)) < 0)
  117.         return ERROR;
  118.     if (dchk == 0)
  119.         fd = xxecv(filename, argvector);
  120.     else
  121.         fd = xxecv(temp, argvector);
  122.     return fd;
  123. }
  124.  
  125. int exec(filename)
  126. char *filename;
  127. {
  128.     char temp[20];
  129.     int dchk, fd;
  130.  
  131.     if ((dchk = du_ud(filename, temp)) < 0)
  132.         return ERROR;
  133.     if (dchk == 0)
  134.         fd = xxec(filename);
  135.     else
  136.         fd = xxec(temp);
  137.     return fd;
  138. }
  139.  
  140. int du_ud(fname, temp)
  141. char *fname, *temp;
  142. {
  143.     int i, j, l;
  144.  
  145.     /* Set j = pointer to ':'        */
  146.     /* Exit if no du: or #/d: prefix    */
  147.     for (j = 0; fname[j] != ':'; j++)
  148.         if (fname[j] == NULL)
  149.             return 0;
  150.  
  151.     /* Exit if prefix already #/d:        */
  152.     for (i = 1; i < j; i++)
  153.         if (fname[i] == '/')
  154.             return 0;
  155.  
  156.     /* Set i = pointer to 1st user digit 
  157.                             or to '?'        */
  158.     for (i = 0; (isdigit(fname[i]) == FALSE) && (fname[i] != '?'); i++)
  159.         if (i == 0 && j == 1)        /* 'd:' only, no userno        */
  160.             return 0;
  161.     /* errors in du: designator:    */
  162.     /* 1st char not alpha or digit     */
  163.     /* neither 1st or 2nd char digit */
  164.     else
  165.         if (i == 1 && !isalpha(fname[0]))
  166.         return ERROR;
  167.     else
  168.         if (i > 1)
  169.         return ERROR;
  170.  
  171.     /* Now construct new file image in temp    */
  172.     /* First copy the user number        */
  173.     l = 0;
  174.     while (i < j)
  175.         temp[l++] = fname[i++];
  176.     temp[l++] = '/';
  177.     /* Then the drive designator if present    */
  178.     if (isalpha(fname[0]))
  179.     {
  180.         temp[l++] = fname[0];
  181.         temp[l++] = ':';
  182.     }
  183.     /* Then the filename            */
  184.     strcpy(&temp[l], &fname[j + 1]);
  185.  
  186.     return 1;
  187. }
  188. /* END OF DU_UD        */
  189.