home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / canada-remote-systems / cpower / globcp.arc / DEVGLOB.C next >
Text File  |  2019-04-13  |  3KB  |  112 lines

  1. /*
  2.  * ├OPYRIGHT (├) ┴DRIAN ╨EPPER, 1989
  3.  *
  4.  *  ┬UT ╔ (┴DRIAN ╨EPPER) CONSIDER THIS
  5.  * MATERIAL TO BE IN THE ╨UBLIC ─OMAIN.
  6.  */
  7. /*
  8.  * DEVGLOB.C - EXPAND WILDCARD FILENAMES
  9.  *
  10.  * DEVGLOB EXECUTES THE GIVEN FUNCTION
  11.  *  FOR EACH FILE NAME RETURNED BY A
  12.  *  DIRECTORY LISTING OF THE GIVEN
  13.  *  FILENAME WILDCARD PATTERN ON THE
  14.  *  GIVEN DEVICE
  15.  *
  16.  * RETURNS AS FUNCTION VALUE THE NUMBER
  17.  *  OF NAMES MATCHED
  18.  *
  19.  * ╘HE 'SELECT' FUNCTION ARGUMENT ALLOWS
  20.  *  THE FILE SELECTION PROCESS TO BE
  21.  *  CUSTOMIZED.
  22.  */
  23. #INCLUDE <STDIO.H>
  24.  
  25. /*
  26.  * THIS STRUCTURE IS TO CREATE A LINKED
  27.  *  LIST OF MATCHING FILE NAMES
  28.  */
  29. TYPEDEF STRUCT LINK █
  30.   STRUCT LINK *LñNEXT;  /* POINT TO NEXT IN LIST */
  31.   CHAR *LñNAME;    /* POINT TO NAME OF THIS FILE */
  32. ▌ ╠╔╬╦;
  33.  
  34. STATIC ╠╔╬╦ *NAMELIST;
  35. STATIC CHAR BUF[100];
  36.  
  37. DEVGLOB(DEV,PAT,FUNC,SELECT)
  38. UNSIGNED DEV;    /* DEVICE TO USE FOR DIR */
  39. CHAR *PAT;       /* FILENAME PATTERN TO EXPAND */
  40. INT (*FUNC)();   /* FUNCTION TO CALL ON MATCHES */
  41. INT (*SELECT)(); /* EXTRA MATCHER */
  42.   EXTERN CHAR *MALLOC();
  43.   EXTERN CHAR *STRDUP();
  44.   ╠╔╬╦ **PLINK; /* KEEP TRACK OF END OF LIST */
  45.   ╠╔╬╦ *NLINK;  /* POINTER TO NEW ╠╔╬╦ CREATED */
  46.   CHAR *NNAME;  /* POINTER TO NEW SAVED NAME */
  47.   ╠╔╬╦ *LLINK;  /* GENERAL POINTER TO ╠╔╬╦ */
  48.   CHAR *B;
  49.   ╞╔╠┼ FID;
  50.   INT N;
  51.  
  52.   SPRINTF(BUF,"$%S", PAT);   /* FORM DIRECTORY NAME */
  53.  
  54.   FID = 5;
  55.   IF (!OPEN(FID, DEV, 0, BUF) ▀▀ FERROR() )
  56.     RETURN 0;
  57.  
  58.   PLINK = &NAMELIST;  /* MATCHING FILE NAMES WILL */
  59.   *PLINK = ╬╒╠╠;      /* BE SAVED IN A LINKED LIST */
  60.  
  61.   FGETC(FID);         /* SKIP "LOAD ADDRESS" */
  62.   FGETC(FID);         /* ... */
  63.  
  64.   WHILE (GDIRLINE(BUF,FID) != ┼╧╞) █
  65.     IF (*BUF != ' ')
  66.       ;  /* NOT A FILENAME LINE; SKIP IT */
  67.     ELSE █
  68.       FOR (B = BUF+STRLEN(BUF);
  69.         B > BUF && *B != '"'; --B)
  70.         ;
  71.       *B = '\0';
  72.       FOR (B = BUF; *B != '\0' && *B++ != '"'; )
  73.         ;  /* SKIP TO ┼╧╙ OR AFTER FIRST '"' */
  74.       IF (!SELECT ▀▀ (*SELECT)(B)) █
  75.         /* GOT A GOOD ONE! */
  76.         /* USE MALLOC TO CREATE A ╠╔╬╦ STRUCT FOR LIST */
  77.         NLINK = (╠╔╬╦ *)MALLOC(1,SIZEOF(╠╔╬╦));
  78.         NNAME = STRDUP(B);      /* SAVE COPY OF NAME */
  79. /* NOTE: BUG IN ╨╧╫┼╥ ├ CAUSES LOW BYTE */
  80. /* ONLY TO BE TESTED IF ASSIGNMENT DONE INSIDE IF */
  81.         IF (!NLINK ▀▀ !NNAME) █
  82.           PRINTF("GLOB: TOO MANY NAMES AT %S\N", B );
  83.           BREAK;                /* FINISH PREMATURELY */
  84.         ▌
  85.         NLINK->LñNAME = NNAME;  /* POINT TO NAME */
  86.         *PLINK = NLINK;         /* AND LINK NEW ╠╔╬╦ */
  87.         PLINK = &NLINK->LñNEXT; /* LINK NEXT ONE HERE */
  88.         *PLINK = ╬╒╠╠;          /* ╬╒╠╠ (END) FOR NOW */
  89.       ▌
  90.     ▌
  91.   ▌
  92.   FCLOSE(FID);  /* FCLOSE FOR OPEN() ALLOWS RE-USE */
  93.  
  94.   /*
  95.    * NOW RUN THROUGH THE LIST OF SAVED
  96.    * NAMES, EXECUTING THE FUNCTION FOR
  97.    * EACH ONE
  98.    */
  99.   N = 0;
  100.   FOR (LLINK = NAMELIST; LLINK; LLINK=NLINK) █
  101.     IF (FUNC)
  102.       (*FUNC)(LLINK->LñNAME); /* CALL FUNCTION */
  103.     NLINK = LLINK->LñNEXT;    /* REMEMBER NEXT */
  104.     FREE(LLINK->LñNAME);      /* BEFORE PTR FREED */
  105.     FREE(LLINK);
  106.     ++N;                      /* COUNT MATCHING NAMES */
  107.   ▌
  108.  
  109.   RETURN N;
  110.