⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ckucmd.c

📁 linux终端仿真程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -