Annotation of coherent/g/usr/bin/vi/amiwild.c, revision 1.1.1.1

1.1       root        1: /* amiwild.c */
                      2: 
                      3: /*-
                      4:  *     Mike Rieser                             Dale Rahn
                      5:  *     2410 Happy Hollow Rd. Apt D-10          540 Vine St.
                      6:  *     West Lafayette, IN 47906                West Lafayette, IN 47906
                      7:  *     [email protected]           [email protected]
                      8:  */
                      9: 
                     10: /* The following macros were defined in "vi.h". I'm undefining them so they
                     11:  * don't conflict with the versions in exec/io.h.
                     12:  */
                     13: #ifdef CMD_READ
                     14: #undef CMD_READ
                     15: #undef CMD_WRITE
                     16: #undef CMD_STOP
                     17: #endif
                     18: 
                     19: /* #include <string.h> */
                     20: #include <stdio.h>
                     21: #include <stddef.h>
                     22: #include <exec/memory.h>
                     23: #include <dos/dosextens.h>
                     24: #include <clib/dos_protos.h>
                     25: 
                     26: /* Some needed prototypes from clib/exec_protos.h */
                     27: extern APTR  AllocMem(unsigned long byteSize, unsigned long requirements);
                     28: extern void  FreeMem(APTR memoryBlock, unsigned long byteSize);
                     29: extern struct Library *OpenLibrary(UBYTE * libName, unsigned long version);
                     30: extern void  CloseLibrary(struct Library *library);
                     31: 
                     32: #if AZTEC_C
                     33: #include <pragmas/exec_lib.h>
                     34: #include <pragmas/dos_lib.h>
                     35: #else
                     36: #include <pragmas/exec.h>
                     37: #include <pragmas/dos.h>
                     38: #endif
                     39: 
                     40: #define        DOS_LIBRARY     ((UBYTE *) "dos.library")
                     41: 
                     42: #ifdef AZTEC_C
                     43: /* Some needed prototypes from string.h and stdlib.h */
                     44: extern char *strdup(char *);
                     45: extern char *strpbrk(char *, char *);
                     46: extern void *realloc(void *, size_t);
                     47: extern void  free(void *);
                     48: #endif
                     49: 
                     50: /* Dynamic Stack Routines by Mike Rieser */
                     51: void         push(void *object);
                     52: void        *pop(void);
                     53: 
                     54: #define STACK_SIZE     20
                     55: 
                     56: static struct stack
                     57: {
                     58:     void       **top, **bottom;
                     59: } stack = { (void **) 0, (void **) 0 };
                     60: 
                     61: /* Functions */
                     62: 
                     63: /*-
                     64:  * Only push() a pointer to the object to be stacked!
                     65:  *
                     66:  * The first call to push() allocates the stack's memory,
                     67:  * and a push() to a full stack increases its size.
                     68:  *
                     69:  * WARNING:  Modification to an object after a push()
                     70:  * will effect the stacked value!
                     71:  */
                     72: void push(void   *object)
                     73: {
                     74:     size_t       stack_size = stack.top - stack.bottom;
                     75: 
                     76:     if (0 == stack_size % STACK_SIZE)
                     77:     {
                     78:        stack.bottom = (void **) realloc(stack.bottom, sizeof(stack.top)
                     79:                                         * (stack_size + STACK_SIZE));
                     80:        if ((void **) 0 == stack.bottom)
                     81:        {
                     82:            free(stack.bottom);
                     83:            puts("Memory exhausted.");
                     84:            clean_exit(10);
                     85:        }
                     86:        stack.top = stack.bottom + stack_size;
                     87:     }
                     88:     *stack.top++ = object;             /* increment the top of the stack */
                     89:     return;
                     90: }
                     91: 
                     92: 
                     93: /*-
                     94:  * pop() returns a pointer to the top object on the stack.
                     95:  *
                     96:  * pop() on the last elment frees the stack's memory.
                     97:  *
                     98:  * pop() on an empty stack is permitted and returns 0.
                     99:  *
                    100:  * NOTE: As long as you aren't trying to save NULL pointers,
                    101:  * you can use pop() to tell when the stack is empty.
                    102:  */
                    103: void *pop(void)
                    104: {
                    105:     void        *object;
                    106: 
                    107:     if (!stack.bottom)
                    108:        return (void *) 0;
                    109: 
                    110:     object = *--stack.top;
                    111: 
                    112:     if (stack.top == stack.bottom)
                    113:     {
                    114:        free(stack.bottom);
                    115:        stack.top = stack.bottom = (void **) 0;
                    116:     }
                    117:     return object;
                    118: }
                    119: 
                    120: 
                    121: /*
                    122:  * isOldDos - this function checks if the dos version is pre 2.x.
                    123:  */
                    124: int isOldDOS()
                    125: {
                    126:     static BOOL  OldDOS = -1;
                    127: 
                    128:     switch (OldDOS)
                    129:     {
                    130:     case 0:
                    131:        break;
                    132:     case 1:
                    133:        break;
                    134:     default:
                    135:        {
                    136:            struct Library *DosBase;
                    137: 
                    138:            if (DosBase = OpenLibrary(DOS_LIBRARY, 37L))
                    139:            {
                    140:                CloseLibrary(DosBase);
                    141:                OldDOS = 0;
                    142:            } else
                    143:            {
                    144:                OldDOS = 1;
                    145:            }
                    146:        }
                    147:     }
                    148: 
                    149:     return OldDOS;
                    150: }
                    151: 
                    152: 
                    153: /*
                    154:  * matchwild - pushes filenames which match the given pattern.
                    155:  * it also returns a count of the matches found.
                    156: */
                    157: int matchwild(char *pattern)
                    158: {
                    159:     static char *special = "#?*%([|";  /* )] */
                    160:     struct AnchorPath *APath;
                    161:     int          matches = 0;
                    162:     LONG         error;
                    163: 
                    164:     /* Check if correct OS */
                    165:     if (isOldDOS())
                    166:        return;
                    167: 
                    168:     /* Check if pattern is special */
                    169:     if (!(strpbrk(pattern, special)))
                    170:        return;
                    171: 
                    172:     APath = AllocMem(sizeof(struct AnchorPath) + BLKSIZE, MEMF_CLEAR);
                    173: 
                    174:     if (!(APath))
                    175:        return;
                    176: 
                    177:     APath->ap_Strlen = BLKSIZE;
                    178:     APath->ap_BreakBits = SIGBREAKF_CTRL_C;
                    179: 
                    180:     if ((error = MatchFirst((UBYTE *) pattern, APath)) == 0)
                    181:     {
                    182:        do
                    183:        {
                    184:            ++matches;
                    185:            push(strdup((char *) APath->ap_Buf));
                    186:        }
                    187:        while ((error = MatchNext(APath)) == 0);
                    188:     }
                    189:     MatchEnd(APath);
                    190: 
                    191:     if (error != ERROR_NO_MORE_ENTRIES)
                    192:     {
                    193:        PrintFault(error, NULL);
                    194:     }
                    195:     FreeMem(APath, sizeof(struct AnchorPath) + BLKSIZE);
                    196: 
                    197:     return matches;
                    198: }
                    199: 
                    200: 
                    201: /*
                    202:  * expand -- returns new char **argv to replace previous one. It also adjusts
                    203:  * argc.
                    204:  * 
                    205:  * NOTE: The calling function really needs to free each element.
                    206:  */
                    207: char **expand(int  *argc, char **argv)
                    208: {
                    209:     int          i;
                    210:     static char *special = "#?*%([|";  /* )] */
                    211: 
                    212:     for (i = 0; i < *argc; ++i)
                    213:     {
                    214:        if (strpbrk(argv[i], special))
                    215:        {
                    216:            matchwild(argv[i]);         /* expands the wildcard pattern */
                    217:        } else
                    218:        {
                    219:            push(strdup(argv[i]));      /* Make sure nobody frees memory twice */
                    220:        }
                    221:     }
                    222: 
                    223:     *argc = stack.top - stack.bottom;
                    224:     return stack.bottom;
                    225: }
                    226: 
                    227: 
                    228: /*
                    229:  * This is something I wish I didn't have to participate in.
                    230:  *
                    231:  * wildcard - returns filename arguments in one string 
                    232:  * separated by spaces.
                    233:  */
                    234: char *wildcard(char *names)
                    235: {
                    236:     int          i, count;
                    237:     char        *pc, *buf;
                    238: 
                    239:     buf = strdup(names);
                    240:     if (0 == (count = matchwild(names)))
                    241:     {
                    242:        strcpy(names, buf);
                    243:        free(buf);
                    244:        return names;
                    245:     }
                    246:     free(buf);
                    247: 
                    248:     buf = tmpblk.c;
                    249:     for (i = 0; i < count; ++i)
                    250:     {
                    251:        buf += sprintf(buf, "%s ", pc = pop());
                    252:        free(pc);
                    253:     }
                    254: 
                    255:     return tmpblk.c;
                    256: }
                    257: 
                    258: 
                    259: #ifndef AZTEC_C
                    260: 
                    261: /*
                    262:  * strdup -- copies a string into a safe place.
                    263:  */
                    264: char *strdup(char *str)
                    265: {
                    266:     char        *dup = (char *) malloc(strlen(str) + 1);
                    267: 
                    268:     return (dup) ? strcpy(dup, str) : (char *) 0;      /* returns dup */
                    269: }
                    270: 
                    271: #endif
                    272: 
                    273: 
                    274: /*
                    275:  * Replace main by one that will expand the arg list.
                    276:  */
                    277: void main(int argc, char **argv)
                    278: {
                    279:     char       **nargv;
                    280: 
                    281:     if (argc == 0)
                    282:        if (Output() == 0)
                    283:            exit(2);    /* ran from WorkBench with no window */
                    284: 
                    285:     nargv = expand(&argc, argv);
                    286: 
                    287:     (void) _user_main(argc, nargv);
                    288:     (void) clean_exit(0);
                    289: }
                    290: 
                    291: 
                    292: clean_exit(int val)
                    293: {
                    294:     void        *pc;
                    295: 
                    296:     while (pc = pop())
                    297:        free(pc);
                    298:     exit(val);
                    299: }
                    300: 
                    301: #define main   _user_main
                    302: #define exit   clean_exit
                    303: 
                    304: /* The following macros were defined in <exec/io.h>. I'm undefining them so they
                    305:  * don't conflict with the versions in vi.h. If they're used in main.c after
                    306:  * this point, you need to redefine the way amiwild.c works.
                    307:  */
                    308: #ifdef CMD_READ
                    309: #undef CMD_READ
                    310: #endif
                    311: 
                    312: #ifdef CMD_WRITE
                    313: #undef CMD_WRITE
                    314: #endif
                    315: 
                    316: #ifdef CMD_STOP
                    317: #undef CMD_STOP
                    318: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.