/* -*-c,save-*- */ /* * LUMAIN.C - LU Main Program * Robert Heller. Created: Fri Nov 7, 1986 23:39:14.25 * Last Mod: * * (c) Copyright 1986 by Robert Heller * All Rights Reserved * * */ #include /* STD I/O defs */ #include /* char type defs */ #include "ludef.h" /* ludefs */ #define GLOBAL /* global defs */ #include "luvars.h" /* lu variables */ LOCAL char lastcmmd[2] = {'?', ' '}; /* last command characters */ /* library functions */ int lu_opn(), lu_close(), lu_exit(), lu_extract(), lu_eusq(), lu_add(), lu_asq(), lu_list(), lu_help(), lu_kill(), lu_reorg(); /* command defs */ LOCAL struct { char cm_cmd1,cm_cmd2; int (*cm_fun)(); char *cm_help; } cmdlist[] = { {'o', ' ', lu_opn, "Open library file"}, {'c', ' ', lu_close, "Close library file"}, {'x', ' ', lu_exit, "Exit LU"}, {'e', ' ', lu_extract, "Extract file(s)"} {'e', 'u', lu_eusq, "Extract and unsqueeze"} {'a', ' ', lu_add, "Add or replace file(s)"}, {'a', 's', lu_asq, "Squeeze and add or replace file(s)"}, {'l', ' ', lu_list, "List files in library"}, {'k', ' ', lu_kill, "Kill file(s) in library"}, {'r', ' ', lu_reorg, "Reorganize library"}, {'h', ' ', lu_help, "This text"}, {'?', ' ', lu_help, "This text"}, {'\0', '\0', NULL, NULL} }; main(argc,argv) int argc; char *argv[]; { printf("XLU68K - Library Utility for CP/M-68K\n"); printf("(c) 1986 by Robert Heller\n"); argc--; argv++; /* skip silly "program name" */ lu_openp = FALSE; /* nothing open yet */ if (argc == 0) interactive(); else docmdwords(argc,argv); lu_exit(&argc,&argv); } interactive() { LOCAL char *argv[80]; /* holds command line word vector */ LOCAL char wordbuff[80], /* holds a current word */ linebuff[258]; /* holds line read in */ FAST int argc, /* arg count */ len, /* word length */ instring; /* in string flag */ FAST char *wptr, /* word pointer */ ch, /* current character */ *lptr; /* line pointer */ for(;;) { /* endless loop (we'll exit with exit() function) */ printf("-%c%c > ",lastcmmd[0],lastcmmd[1]); /* prompt */ if (gets(linebuff) == NULL) { /* get input line */ if (!isatty(fileno(stdin))) printf("-x\n"); strcpy(linebuff,"-x"); } if (!isatty(fileno(stdin))) printf("%s\n",linebuff); if (strlen(linebuff) == 0) continue; /* skip blank lines */ argc = 0; /* no args yet */ wptr = wordbuff; /* init wptr to point to start of word buffer */ instring = FALSE; for (lptr=linebuff;*lptr != '\0';lptr++) { /* scan down line */ ch = *lptr; /* get character */ if (ch == '\\') { /* is character the escape character? */ lptr++; /* if it is skip it and grap next character */ if (*lptr == '\0') { /* at eol? then get more input */ /* continuation prompt */ printf("_-%c%c > ",lastcmmd[0],lastcmmd[1]); if(gets(linebuff) == NULL) { /* get line */ if (!isatty(fileno(stdin))) printf("-x\n"); strcpy(linebuff,"-x"); } lptr = linebuff-1; /* init pointer. */ if (instring) *wptr++ = '\n'; } else *wptr++ = *lptr; /* else treat as word character */ } else if (ch == '"') instring = !instring; else if (instring) *wptr++ = ch; else if (isspace(ch)) { /* is character a while space character? */ *wptr = '\0'; /* if so we may have a word. terminate word */ len = strlen(wordbuff); /* how long is the word? */ if (len>0) { /* if word is not empty... */ argv[argc] = calloc(len+1,sizeof(char)); /* allocate space */ strcpy(argv[argc],wordbuff); /* copy it */ argc++; /* count word */ wptr = wordbuff; /* setup for next word */ } } else *wptr++ = ch; /* else grab character */ } /* end of for loop */ *wptr = '\0'; /* terminate last word (if any) */ len = strlen(wordbuff); /* how long is the word? */ if (len>0) { /* if word is not empty... */ argv[argc] = calloc(len+1,sizeof(char)); /* allocate space */ strcpy(argv[argc],wordbuff); /* copy it */ argc++; /* count word */ wptr = wordbuff; /* setup for next word */ } if (argc>0) docmdwords(argc,argv); /* do command if there are any args */ /* clean up garbage */ for (len=0;len 0) { if (**argv == '-') { ocmd[0] = lastcmmd[0]; ocmd[1] = lastcmmd[1]; lastcmmd[0] = toupper(*(argv[0]+1)); lastcmmd[1] = toupper(*(argv[0]+2)); if (lastcmmd[1] == '\0') lastcmmd[1] = ' '; argc--; argv++; } fnum = lkcmd(); if (fnum == FAILURE) { fprintf(stderr,"lu: bad command: -%c%c\n", lastcmmd[0],lastcmmd[1]); lastcmmd[0] = ocmd[0]; lastcmmd[1] = ocmd[1]; continue; } (*(cmdlist[fnum].cm_fun))(&argc,&argv); } } lkcmd() { FAST int i; for (i=0; cmdlist[i].cm_cmd1 != '\0'; i++) { if (cmdlist[i].cm_cmd1 == tolower(lastcmmd[0]) && cmdlist[i].cm_cmd2 == tolower(lastcmmd[1])) return(i); } return(FAILURE); } int lu_help(argcc,argvv) FAST int *argcc; FAST char ***argvv; { FAST int i; printf("Command\tFunction\n=======\t==========================\n"); for (i=0; cmdlist[i].cm_cmd1 != '\0'; i++) { printf("-%c%c\t%s\n",cmdlist[i].cm_cmd1, cmdlist[i].cm_cmd2,cmdlist[i].cm_help); } /* skip any arguments */ while (*argcc > 0 && ***argvv != '-') { *argcc -= 1; *argvv += 1; } }