home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / CPM68K / XLU68K.LBR / LUADD.CQ / LUADD.C
Text File  |  2000-06-30  |  9KB  |  381 lines

  1. /* -*-c,save-*- */
  2. /*
  3.  * luadd.c - LU add file functions
  4.  * Robert Heller. Created: Sat Nov 8, 1986 20:38:41.92
  5.  * Last Mod: 
  6.  * 
  7.  * (c) Copyright 1986 by Robert Heller
  8.  *     All Rights Reserved
  9.  * 
  10.  * 
  11.  */
  12.  
  13. #include <stdio.h>        /* STD I/O defs */
  14. #include <ctype.h>        /* char type defs */
  15. #include <osif.h>        /* O/S defs */
  16.  
  17. #include "ludef.h"        /* ludefs */
  18.  
  19. #include "luvars.h"        /* lu variables */
  20.  
  21. /* linked list - for file name list */
  22. typedef struct names {
  23.     char *nm_name;
  24.     struct names *nm_next;
  25.     } NAMES,*NAMESP;
  26.  
  27. lu_add(argcc,argvv)
  28. FAST int *argcc;
  29. FAST char ***argvv;
  30. {
  31.     FAST int in_fd;
  32.     FAST char *p, *q;
  33.     FAST int i,j;
  34.     long int offset;
  35.     LOCAL char sectbuff[SECTSIZE];
  36.     FAST int nsect,isect;
  37. #ifdef CRCCHEKC
  38.     unsigned short int crc,calcrc();
  39. #endif
  40.     FAST NAMES *filenames,*fn;
  41.     NAMES *dirlook();
  42.     char *strchr();
  43.  
  44.     if (!lu_openp) {
  45.     fprintf(stderr,"lu: library file not open!\n");
  46.     while (*argcc > 0 && ***argvv != '-') {
  47.         *argcc -= 1;
  48.         *argvv += 1;
  49.         }
  50.     return;
  51.     }
  52.     while (*argcc > 0 && ***argvv != '-') {
  53.     p = **argvv;
  54.     filenames = dirlook(p);
  55.     *argcc -= 1;
  56.     *argvv += 1;
  57.     for (fn = filenames; fn != NULL; fn = fn->nm_next) {
  58.         p = strchr(fn->nm_name,':');
  59.         if (p == NULL) p = fn->nm_name;
  60.         else p++;
  61.         for (i=1; i<lu_slots && lu_dire[i].lu_stat != UNUSED; i++) 
  62.         if (lu_dire[i].lu_stat == ACTIVE &&
  63.             fmatch(p,lu_dire[i].lu_name)) break;
  64.         if (i >= lu_slots || lu_dire[i].lu_stat == UNUSED) 
  65.         for (i = 1; i<lu_slots && lu_dire[i].lu_stat == ACTIVE; i++) ;
  66.         if (i >= lu_slots) {
  67.         fprintf(stderr,"lu: directory full\n");
  68.         freenm(filenames);
  69.         return;
  70.         }
  71.         lseek(lu_fd,0L,2);
  72.         offset = tell(lu_fd);
  73.         q = fn->nm_name;
  74.         if (*(q+1) == ':') q += 2;
  75.         for (p = lu_dire[i].lu_name, j=0;
  76.          j<8 && *q != '.' && *q != '\0';
  77.          p++, q++, j++) *p = *q;
  78.         while (j++ < 8) *p++ = ' ';
  79.         if (*q == '.') q++;
  80.         for (j=0; j<3 && *q != '\0'; j++, q++, p++) *p = *q;
  81.         while (j++ < 3) *p++ = ' ';
  82.         lu_dire[i].lu_off = offset / SECTSIZE;
  83.         lu_dire[i].lu_len = 0;
  84.         lu_dire[i].lu_crc = 0;
  85.         for (j=0,p=lu_dire[i].lu_fill;j<14;j++,p++) *p = '\0';
  86. #ifdef CRCCHEKC
  87.         crc = 0;
  88. #endif
  89.         in_fd = xopen(fn->nm_name,OPEN_RO);
  90.         if (in_fd == FAILURE) {
  91.         perror("lu: add file open error");
  92.         fprintf(stderr,"lu: could not open %s\n",fn->nm_name);
  93.         goto next_file;
  94.         }
  95.         for (isect = 0;
  96.          (nsect = read(in_fd,sectbuff,SECTSIZE)) == SECTSIZE;
  97.          isect++) {
  98.         nsect = write(lu_fd,sectbuff,SECTSIZE);
  99.         if (nsect != SECTSIZE) {
  100.             perror("lu: library write error");
  101.             freenm(filenames);
  102.             close(in_fd);
  103.             return;
  104.             }
  105. #ifdef CRCCHEKC
  106.         crc = calcrc(crc,sectbuff,SECTSIZE);
  107. #endif
  108.         }
  109.         lu_dire[i].lu_stat = ACTIVE;
  110.         printf("%s added, %d sectors\n",fn->nm_name,isect);
  111.         lu_dire[i].lu_len = isect;
  112. #ifdef CRCCHEKC
  113.         lu_dire[i].lu_crc = crc;
  114. #endif
  115.         lu_modp = TRUE;
  116.         close(in_fd);
  117.         close(lu_fd);
  118.         lu_fd = lopen(lu_libr,OPEN_RW);
  119. next_file:
  120.         }
  121.     freenm(filenames);
  122.     }
  123. #ifdef CRCCHEKC
  124.     if (lu_modp) {
  125.     lu_dire[0].lu_crc = 0;
  126.     lu_dire[0].lu_crc = calcrc(0,&lu_dire[0],lu_slots * sizeof(LUDIR));
  127.     }
  128. #endif
  129.     }
  130. lu_asq(argcc,argvv)
  131. FAST int *argcc;
  132. FAST char ***argvv;
  133. {
  134.     FAST int in_fd;
  135.     FAST char *p, *q;
  136.     FAST int i,j;
  137.     long int offset;
  138.     LOCAL char sectbuff[SECTSIZE];
  139.     LOCAL char sqname[20];
  140.     char *strchr();
  141.     FAST int nsect,isect;
  142. #ifdef CRCCHEKC
  143.     unsigned short int crc,calcrc();
  144. #endif
  145.     FAST NAMES *filenames,*fn;
  146.     NAMES *dirlook();
  147.     char *strchr();
  148.  
  149.     if (!lu_openp) {
  150.     fprintf(stderr,"lu: library file not open!\n");
  151.     while (*argcc > 0 && ***argvv != '-') {
  152.         *argcc -= 1;
  153.         *argvv += 1;
  154.         }
  155.     return;
  156.     }
  157.     while (*argcc > 0 && ***argvv != '-') {
  158.     p = **argvv;
  159.     filenames = dirlook(p);
  160.     *argcc -= 1;
  161.     *argvv += 1;
  162.     for (fn = filenames; fn != NULL; fn = fn->nm_next) {
  163.         q = fn->nm_name;
  164.         if (*(q+1) == ':') q += 2;
  165.         strcpy(sqname,q);
  166.         p = strchr(sqname,'.');
  167.         if (p == NULL) {
  168.         strcat(sqname,".   ");
  169.         p = strchr(sqname,'.');
  170.         }
  171.         else strcat(p,"   ");
  172.         p++;
  173.         if (*p == ' ') *p='Q';
  174.         p++;
  175.         *p++ = 'Q';
  176.         if (*p == ' ') *p = '\0';
  177.         else *++p = '\0';
  178.         for (i=1; i<lu_slots && lu_dire[i].lu_stat != UNUSED; i++) 
  179.         if (lu_dire[i].lu_stat == ACTIVE &&
  180.             fmatch(sqname,lu_dire[i].lu_name)) break;
  181.         if (i >= lu_slots || lu_dire[i].lu_stat == UNUSED) 
  182.         for (i = 1; i<lu_slots && lu_dire[i].lu_stat == ACTIVE; i++) ;
  183.         if (i >= lu_slots) {
  184.         fprintf(stderr,"lu: directory fill\n");
  185.         freenm(filenames);
  186.         return;
  187.         }
  188.         lseek(lu_fd,0L,2);
  189.         offset = tell(lu_fd);
  190.         q = sqname;
  191.         for (p = lu_dire[i].lu_name, j=0;
  192.          j<8 && *q != '.' && *q != '\0';
  193.          p++, q++, j++) *p = *q;
  194.         while (j++ < 8) *p++ = ' ';
  195.         if (*q == '.') q++;
  196.         for (j=0; j<3 && *q != '\0'; j++, q++, p++) *p = *q;
  197.         while (j++ < 3) *p++ = ' ';
  198.         lu_dire[i].lu_off = offset / SECTSIZE;
  199.         lu_dire[i].lu_len = 0;
  200.         lu_dire[i].lu_crc = 0;
  201.         for (j=0,p=lu_dire[i].lu_fill;j<14;j++,p++) *p = '\0';
  202. #ifdef CRCCHEKC
  203.         crc = 0;
  204. #endif
  205.         p = mktemp("sqxxxxxx");
  206.         squeeze(fn->nm_name,p);
  207.         in_fd = xopen(p,OPEN_RO);
  208.         if (in_fd == FAILURE) {
  209.         perror("lu: add file open error");
  210.         fprintf(stderr,"lu: could not open temp file %s\n",p);
  211.         goto next_file;
  212.         }
  213.         for (isect = 0;
  214.          (nsect = read(in_fd,sectbuff,SECTSIZE)) == SECTSIZE;
  215.          isect++) {
  216.         nsect = write(lu_fd,sectbuff,SECTSIZE);
  217.         if (nsect != SECTSIZE) {
  218.             perror("lu: library write error");
  219.             freenm(filenames);
  220.             close(in_fd);
  221.             return;
  222.             }
  223. #ifdef CRCCHEKC
  224.         crc = calcrc(crc,sectbuff,SECTSIZE);
  225. #endif
  226.         }
  227.         lu_dire[i].lu_stat = ACTIVE;
  228.         printf("%s added, %d sectors\n",sqname,isect);
  229.         lu_dire[i].lu_len = isect;
  230. #ifdef CRCCHEKC
  231.         lu_dire[i].lu_crc = crc;
  232. #endif
  233.         lu_modp = TRUE;
  234.         close(in_fd);
  235.         close(lu_fd);
  236.         lu_fd = lopen(lu_libr,OPEN_RW);
  237.         unlink(p);
  238. next_file:
  239.         }
  240.     freenm(filenames);
  241.     }
  242. #ifdef CRCCHEKC
  243.     if (lu_modp) {
  244.     lu_dire[0].lu_crc = 0;
  245.     lu_dire[0].lu_crc = calcrc(0,&lu_dire[0],lu_slots * sizeof(LUDIR));
  246.     }
  247. #endif
  248.     }
  249. static NAMES *dirlook(wname)
  250. FAST char *wname;
  251. {
  252.     LOCAL struct {
  253.     char dr;
  254.     char xf[8];
  255.     char t[3];
  256.     char fill[20];
  257.     } searbk[4];
  258.     LOCAL struct fcbtab fcb;
  259.     FAST char *p, *q;
  260.     char *strchr();
  261.     LOCAL char nbuff[20];
  262.     FAST int status,i;
  263.     FAST int drv;
  264.     FAST int curuser,user;
  265.     FAST NAMES *list;
  266.     NAMES *orderin();
  267.  
  268.     user = curuser = __OSIF(USER, 0x00FF);
  269.     drv = 0;
  270.     list = NULL;
  271.     p = strchr(wname,':');
  272.     if (p != NULL) {
  273.     for (q=wname;isdigit(*q) && q < p; q++) ;
  274.     if (q == p) {
  275.         *p = '\0';
  276.         user = atoi(wname);
  277.         *p = ':';
  278.         if (user < 0 || user > 15) return(NULL);
  279.         }
  280.     else {
  281.         drv = toupper(*wname);
  282.         drv -= '@';
  283.         if (drv < 1 || drv > 16) return(NULL);
  284.         }
  285.     p++;
  286.     }
  287.     else p = wname;
  288.     fcb.drive = drv;
  289.     q = fcb.fname;
  290.     for (i=0;
  291.      i<8 && *p != '.' && *p != '\0' && *p != '*';
  292.      i++, q++, p++) *q = toupper(*p);
  293.     if (*p == '*') {
  294.     while(i++ < 8) *q++ =  '?';
  295.     p++;
  296.     }
  297.     else while (i++ < 8) *q++ = ' ';
  298.     if (*p == '.') p++;
  299.     q = fcb.ftype;
  300.     for (i=0;
  301.      i<3 && *p != '\0' && *p != '*';
  302.      i++, q++, p++) *q = toupper(*p);
  303.     if (*p == '*') {
  304.     while(i++ < 3) *q++ = '?';
  305.     p++;
  306.     }
  307.     else while (i++ < 3) *q++ = ' ';
  308.     if (user != curuser) __OSIF(USER,user);
  309.     __OSIF(SETDMA,&searbk[0]);
  310.     status = __OSIF(SEARCHF, &fcb);
  311.     while (status != 0x00FF) {
  312.     if (user != curuser) {
  313.         sprintf(nbuff,"%d:",user);
  314.         p = strchr(nbuff,':');
  315.         p++;
  316.         }
  317.     else if (drv != 0) {
  318.         nbuff[0] = drv+'@';
  319.         nbuff[1] = ':';
  320.         p = (&nbuff[2]);
  321.         }
  322.     else p = nbuff;
  323.     q = searbk[status].xf;
  324.     for (i=0; ((*q & 0x7F) != ' ' && i<8); i++, p++, q++) *p = *q & 0x7F;
  325.     *p++ = '.';
  326.     q = searbk[status].t;
  327.     for (i=0; ((*q & 0x7F) != ' ' && i<3); i++, p++, q++) *p = *q & 0x7F;
  328.     *p = '\0';
  329.     list = orderin(nbuff,list);
  330.     status = __OSIF(SEARCHN, 0L);
  331.     }
  332.     __OSIF(USER, curuser);
  333.     return(list);
  334.     }
  335. NAMESP cons(nm,nml)
  336. FAST char *nm;
  337. FAST NAMESP nml;
  338. {
  339.     FAST char *p;
  340.     FAST int len;
  341.     char *calloc();
  342.     FAST NAMESP newnl;
  343.  
  344.     p = calloc(strlen(nm)+1,sizeof(char));
  345.     if (p == NULL) {perror("xdir");abort(0);}
  346.     strcpy(p,nm);
  347.     newnl = (NAMESP) calloc(1,sizeof(NAMES));
  348.     if (newnl == NULL) {perror("xdir");abort(0);}
  349.     newnl->nm_name = p;
  350.     newnl->nm_next = nml;
  351.     return(newnl);
  352.     }
  353. NAMESP orderin(innm,nlist)
  354. FAST char *innm;
  355. FAST NAMESP nlist;
  356. {
  357.     FAST NAMESP newnl,p,q;
  358.  
  359.     if (nlist == NULL) return(cons(innm,nlist));
  360.     else if (strcmp(innm,nlist->nm_name) < 0) return(cons(innm,nlist));
  361.     else {
  362.     p = nlist;
  363.     q = nlist->nm_next;
  364.     while (q != NULL && !(strcmp(innm,q->nm_name) < 0)) {
  365.         p=q;q=p->nm_next;
  366.         }
  367.     p->nm_next = cons(innm,q);
  368.     return(nlist);
  369.     }
  370.     }
  371. freenm(flist)
  372. FAST NAMES *flist;
  373. {
  374.     FAST NAMES *nlist;
  375.     for (;flist != NULL; flist = nlist) {
  376.     nlist = flist->nm_next;
  377.     free(flist->nm_name);
  378.     free(flist);
  379.     }
  380.     }
  381.