📄 ckucmd.c
字号:
height = n / cols; /* How long is each column? */ if (n % cols) height++; /* Add one for remainder, if any */ for (i = 0; i < height; i++) { /* Loop for each row */ for (j = 0; j < cmd_cols; j++) /* First fill row with blanks */ b[j] = SP; for (j = 0; j < cols; j++) { /* Loop for each column in row */ k = i + (j * height); /* Index of next filename */ if (k < n) { /* In range? */ pa = pre; px = post; p = s2[k]; /* Point to filename */ q = b + (j * width) + 1; /* and destination */ while ((q < bx) && (*q++ = *pa++)) ; /* Copy prefix */ q--; /* Back up over NUL */ while ((q < bx) && (*q++ = *p++)) ; /* Copy filename */ q--; /* Back up over NUL */ while ((q < bx) && (*q++ = *px++)) ; /* Copy suffix */ if (j < cols - 1) { q--; *q = SP; /* Replace the space */ } } } p = b + cmd_cols - 1; /* Last char in line */ while (*p-- == SP) ; /* Trim */ *(p+2) = NUL; printf("%s\n",b); /* Print the line */ if (++lc > (cmd_rows - 2)) { /* Screen full? */ if (!askmore()) { /* Do more-prompting... */ rc = 0; goto xfilhelp; } else lc = 0; } } printf("\n"); /* Blank line at end of report */ rc = 0; goto xfilhelp; } else { /* Malloc failure, no columns */ for (i = 0; i < n; i++) { znext(filbuf); printf("%s%s%s\n",pre,filbuf,post); if (++lc > (cmd_rows - 2)) { /* Screen full? */ if (!askmore()) { /* Do more-prompting... */ rc = 0; goto xfilhelp; } else lc = 0; } }xfilhelp: if (b) free(b); for (i = 0; i < n2; i++) if (s2[i]) free(s2[i]); if (s2) free(s2); return(rc); }}/* C M S E T U P -- Set up command buffers */#ifdef DCMDBUFintcmsetup() { if (!(cmdbuf = malloc(CMDBL + 4))) return(-1); if (!(savbuf = malloc(CMDBL + 4))) return(-1); savbuf[0] = '\0';#ifdef OLDHELP if (!(hlpbuf = malloc(HLPBL + 4))) return(-1);#endif /* OLDHELP */ if (!(atmbuf = malloc(ATMBL + 4))) return(-1); if (!(atxbuf = malloc(CMDBL + 4))) return(-1); if (!(atybuf = malloc(ATMBL + 4))) return(-1); if (!(filbuf = malloc(ATMBL + 4))) return(-1); if (!(cmprom = malloc(PROMPTL + 4))) return(-1); if (!(cmprxx = malloc(PROMPTL + 4))) return(-1);#ifdef CK_RECALL cmrini(cm_recall);#endif /* CK_RECALL */ return(0);}#ifdef CK_RECALL/* Initialize or change size of command recall buffer */intcmrini(n) int n; { int i; if (recall && in_recall) { /* Free old storage, if any */ for (i = 0; i < cm_recall; i++) { if (recall[i]) { free(recall[i]); recall[i] = NULL; } } free(recall); recall = NULL; } cm_recall = n; /* Set new size */ rlast = current = -1; /* Initialize pointers */ if (n > 0) { recall = (char **)malloc((cm_recall + 1) * sizeof(char *)); if (!recall) return(1); for (i = 0; i < cm_recall; i++) { recall[i] = NULL; } in_recall = 1; /* Recall buffers init'd */ } return(0);}#endif /* CK_RECALL */#endif /* DCMDBUF *//* C M S E T P -- Set the program prompt. */VOIDcmsetp(s) char *s; { strncpy(cmprxx,s,PROMPTL - 1); cmprxx[PROMPTL] = NUL; psetf = 1; /* Flag that prompt has been set. */}/* C M S A V P -- Save a copy of the current prompt. */VOID#ifdef CK_ANSICcmsavp(char s[], int n)#elsecmsavp(s,n) char s[]; int n;#endif /* CK_ANSIC *//* cmsavp */ { strncpy(s,cmprxx,n-1); s[n-1] = NUL;}/* P R O M P T -- Issue the program prompt. */VOIDprompt(f) xx_strp f; { char *sx, *sy; int n; if (psetf == 0) cmsetp(dfprom); /* If no prompt set, set default. */ sx = cmprxx; /* Unevaluated copy */ if (f) { /* If conversion function given */ sy = cmprom; /* Evaluate it */ debug(F101,"PROMPT sx","",sx); debug(F101,"PROMPT sy","",sy); n = PROMPTL; if ((*f)(sx,&sy,&n) < 0) /* If evaluation failed */ sx = cmprxx; /* revert to unevaluated copy */ else sx = cmprom; } else strcpy(cmprom,sx);#ifdef OSK fputs(sx, stdout);#else#ifdef MAC printf("%s", sx);#else printf("\r%s",sx); /* Print the prompt. */ fflush(stdout); /* Now! */#endif /* MAC */#endif /* OSK */}#ifndef NOSPLVOIDpushcmd() { /* For use with IF command. */ strncpy(savbuf,np,CMDBL); /* Save the dependent clause, */ cmres(); /* and clear the command buffer. */ debug(F110, "pushcmd: savbuf:", savbuf, 0);}#endif /* NOSPL */#ifdef COMMENT/* no longer used... */VOIDpopcmd() { strncpy(cmdbuf,savbuf,CMDBL); /* Put back the saved material */ *savbuf = '\0'; /* and clear the save buffer */ cmres();}#endif /* COMMENT *//* C M R E S -- Reset pointers to beginning of command buffer. */VOIDcmres() { inword = 0; /* We're not in a word */ cc = 0; /* Character count is zero *//* Initialize pointers */ pp = cmdbuf; /* Beginning of current field */ bp = cmdbuf; /* Current position within buffer */ np = cmdbuf; /* Where to start next field */ cmflgs = -5; /* Parse not yet started. */ ungw = 0; /* Don't need to unget a word. */}/* C M I N I -- Clear the command and atom buffers, reset pointers. *//*The argument specifies who is to echo the user's typein -- 1 means the cmd package echoes 0 somebody else (system, front end, terminal) echoes*/VOIDcmini(d) int d; { for (bp = cmdbuf; bp < cmdbuf+CMDBL; bp++) *bp = NUL; *atmbuf = *savbuf = *atxbuf = *atybuf = *filbuf = NUL;#ifdef OLDHELP *hlpbuf = NUL;#endif /* OLDHELP */ blocklvl = 0; /* Block level is 0 */ linebegin = 1; /* And we're at the beginning of a line */ dpx = d; /* Make a global copy of the echo flag */ cmres();}#ifndef NOSPL/* The following bits are to allow the command package to call itself *//* in the middle of a parse. To do this, begin by calling cmpush, and *//* end by calling cmpop. */#ifdef DCMDBUFstruct cmp { int i[5]; /* stack for integers */ char *c[3]; /* stack for pointers */ char *b[8]; /* stack for buffer contents */};struct cmp *cmp = 0;#elseint cmp_i[CMDDEP+1][5]; /* Stack for integers */char *cmp_c[CMDDEP+1][5]; /* for misc pointers */char *cmp_b[CMDDEP+1][7]; /* for buffer contents pointers */#endif /* DCMDBUF */int cmddep = -1; /* Current stack depth */intcmpush() { /* Save the command environment */ char *cp; /* Character pointer */ if (cmddep >= CMDDEP) /* Enter a new command depth */ return(-1); cmddep++; debug(F101,"&cmpush","",cmddep);#ifdef DCMDBUF /* allocate memory for cmp if not already done */ if (!cmp && !(cmp = (struct cmp *) malloc(sizeof(struct cmp)*(CMDDEP+1)))) fatal("cmpush: no memory for cmp"); cmp[cmddep].i[0] = cmflgs; /* First do the global ints */ cmp[cmddep].i[1] = cmfsav; cmp[cmddep].i[2] = atxn; cmp[cmddep].i[3] = ungw; cmp[cmddep].c[0] = bp; /* Then the global pointers */ cmp[cmddep].c[1] = pp; cmp[cmddep].c[2] = np;#else cmp_i[cmddep][0] = cmflgs; /* First do the global ints */ cmp_i[cmddep][1] = cmfsav; cmp_i[cmddep][2] = atxn; cmp_i[cmddep][3] = ungw; cmp_c[cmddep][0] = bp; /* Then the global pointers */ cmp_c[cmddep][1] = pp; cmp_c[cmddep][2] = np;#endif /* DCMDBUF */ /* Now the buffers themselves. A lot of repititious code... */#ifdef DCMDBUF cp = malloc((int)strlen(cmdbuf)+1); /* 0: Command buffer */ if (cp) strcpy(cp,cmdbuf); cmp[cmddep].b[0] = cp; if (cp == NULL) return(-1); cp = malloc((int)strlen(savbuf)+1); /* 1: Save buffer */ if (cp) strcpy(cp,savbuf); cmp[cmddep].b[1] = cp; if (cp == NULL) return(-1);#ifdef OLDHELP cp = malloc((int)strlen(hlpbuf)+1); /* 2: Help string buffer */ if (cp) strcpy(cp,hlpbuf); cmp[cmddep].b[2] = cp; if (cp == NULL) return(-1);#else cmp[cmddep].b[2] = NULL;#endif /* OLDHELP */ cp = malloc((int)strlen(atmbuf)+1); /* 3: Atom buffer */ if (cp) strcpy(cp,atmbuf); cmp[cmddep].b[3] = cp; if (cp == NULL) return(-1); cp = malloc((int)strlen(atxbuf)+1); /* 4: Expansion buffer */ if (cp) strcpy(cp,atxbuf); cmp[cmddep].b[4] = cp; if (cp == NULL) return(-1); cp = malloc((int)strlen(atybuf)+1); /* 5: Atom buffer copy */ if (cp) strcpy(cp,atybuf); cmp[cmddep].b[5] = cp; if (cp == NULL) return(-1); cp = malloc((int)strlen(filbuf)+1); /* 6: File name buffer */ if (cp) strcpy(cp,filbuf); cmp[cmddep].b[6] = cp; if (cp == NULL) return(-1);#else cp = malloc((int)strlen(cmdbuf)+1); /* 0: Command buffer */ if (cp) strcpy(cp,cmdbuf); cmp_b[cmddep][0] = cp; if (cp == NULL) return(-1); cp = malloc((int)strlen(savbuf)+1); /* 1: Save buffer */ if (cp) strcpy(cp,savbuf); cmp_b[cmddep][1] = cp; if (cp == NULL) return(-1);#ifdef OLDHELP cp = malloc((int)strlen(hlpbuf)+1); /* 2: Help string buffer */ if (cp) strcpy(cp,hlpbuf); cmp_b[cmddep][2] = cp; if (cp == NULL) return(-1);#else cmp_b[cmddep][2] = NULL; #endif /* OLDHELP */ cp = malloc((int)strlen(atmbuf)+1); /* 3: Atom buffer */ if (cp) strcpy(cp,atmbuf); cmp_b[cmddep][3] = cp; if (cp == NULL) return(-1); cp = malloc((int)strlen(atxbuf)+1); /* 4: Expansion buffer */ if (cp) strcpy(cp,atxbuf); cmp_b[cmddep][4] = cp; if (cp == NULL) return(-1); cp = malloc((int)strlen(atybuf)+1); /* 5: Atom buffer copy */ if (cp) strcpy(cp,atybuf); cmp_b[cmddep][5] = cp; if (cp == NULL) return(-1); cp = malloc((int)strlen(filbuf)+1); /* 6: File name buffer */ if (cp) strcpy(cp,filbuf); cmp_b[cmddep][6] = cp; if (cp == NULL) return(-1);#endif /* DCMDBUF */ cmini(dpx); /* Initize the command parser */ return(0);}intcmpop() { /* Restore the command environment */ debug(F101,"&cmpop","",cmddep); if (cmddep < 0) return(-1); /* Don't pop too much! */#ifdef DCMDBUF cmflgs = cmp[cmddep].i[0]; /* First do the global ints */ cmfsav = cmp[cmddep].i[1]; atxn = cmp[cmddep].i[2]; ungw = cmp[cmddep].i[3]; bp = cmp[cmddep].c[0]; /* Then the global pointers */ pp = cmp[cmddep].c[1]; np = cmp[cmddep].c[2];#else cmflgs = cmp_i[cmddep][0]; /* First do the global ints */ cmfsav = cmp_i[cmddep][1]; atxn = cmp_i[cmddep][2]; ungw = cmp_i[cmddep][3]; bp = cmp_c[cmddep][0]; /* Then the global pointers */ pp = cmp_c[cmddep][1]; np = cmp_c[cmddep][2];#endif /* DCMDBUF */ /* Now the buffers themselves. */#ifdef DCMDBUF if (cmp[cmddep].b[0]) { strncpy(cmdbuf,cmp[cmddep].b[0],CMDBL); /* 0: Command buffer */ free(cmp[cmddep].b[0]); cmp[cmddep].b[0] = NULL; } if (cmp[cmddep].b[1]) { strncpy(savbuf,cmp[cmddep].b[1],CMDBL); /* 1: Save buffer */ free(cmp[cmddep].b[1]); cmp[cmddep].b[1] = NULL; }#ifdef OLDHELP if (cmp[cmddep].b[2]) { strncpy(hlpbuf,cmp[cmddep].b[2],HLPBL); /* 2: Help buffer */ free(cmp[cmddep].b[2]); cmp[cmddep].b[2] = NULL; }#endif /* OLDHELP */ if (cmp[cmddep].b[3]) { strncpy(atmbuf,cmp[cmddep].b[3],ATMBL); /* 3: Atomic buffer! */ free(cmp[cmddep].b[3]); cmp[cmddep].b[3] = NULL; } if (cmp[cmddep].b[4]) { strncpy(atxbuf,cmp[cmddep].b[4],ATMBL); /* 4: eXpansion buffer */ free(cmp[cmddep].b[4]); cmp[cmddep].b[4] = NULL; } if (cmp[cmddep].b[5]) { strncpy(atybuf,cmp[cmddep].b[5],ATMBL); /* 5: Atom buffer copY */ free(cmp[cmddep].b[5]); cmp[cmddep].b[5] = NULL; } if (cmp[cmddep].b[6]) { strncpy(filbuf,cmp[cmddep].b[6],ATMBL); /* 6: Filename buffer */ free(cmp[cmddep].b[6]); cmp[cmddep].b[6] = NULL; }#else if (cmp_b[cmddep][0]) { strncpy(cmdbuf,cmp_b[cmddep][0],CMDBL); /* 0: Command buffer */ free(cmp_b[cmddep][0]); cmp_b[cmddep][0] = NULL; } if (cmp_b[cmddep][1]) { strncpy(savbuf,cmp_b[cmddep][1],CMDBL); /* 1: Save buffer */ free(cmp_b[cmddep][1]); cmp_b[cmddep][1] = NULL; }#ifdef OLDHELP if (cmp_b[cmddep][2]) { strncpy(hlpbuf,cmp_b[cmddep][2],HLPBL); /* 2: Help buffer */ free(cmp_b[cmddep][2]); cmp_b[cmddep][2] = NULL; }#endif /* OLDHELP */ if (cmp_b[cmddep][3]) { strncpy(atmbuf,cmp_b[cmddep][3],ATMBL); /* 3: Atomic buffer! */ free(cmp_b[cmddep][3]); cmp_b[cmddep][3] = NULL; } if (cmp_b[cmddep][4]) { strncpy(atxbuf,cmp_b[cmddep][4],ATMBL); /* 4: eXpansion buffer */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -