📄 fancy.c
字号:
}fixcol (r,c,l,ch,inc)register int l, ch;int r, c, inc;{ register int i; curmove (r,c); fancyc (ch); for (i = 1; i < l; i++) { curmove (curr+inc,curc-1); fancyc (ch); }}curmove (r,c)register int r, c;{ if (curr == r && curc == c) return; if (realr == -1) { realr = curr; realc = curc; } curr = r; curc = c;}newpos () { register int r; /* destination row */ register int c; /* destination column */ register int mode = -1; /* mode of movement */ int count = 1000; /* character count */ int i; /* index */ int j; /* index */ int n; /* temporary variable */ char *m; /* string containing CM movement */ if (realr == -1) /* see if already there */ return; r = curr; /* set current and dest. positions */ c = curc; curr = realr; curc = realc; /* double check position */ if (curr == r && curc == c) { realr = realc = -1; return; } if (CM) { /* try CM to get there */ mode = 0; m = (char *)tgoto (CM,c,r); count = strlen (m); } /* try HO and local movement */ if (HO && (n = r+c*lND+lHO) < count) { mode = 1; count = n; } /* try various LF combinations */ if (r >= curr) { /* CR, LF, and ND */ if ((n = (r-curr)+c*lND+1) < count) { mode = 2; count = n; } /* LF, ND */ if (c >= curc && (n = (r-curr)+(c-curc)*lND) < count) { mode = 3; count = n; } /* LF, BS */ if (c < curc && (n = (r-curr)+(curc-c)*lBC) < count) { mode = 4; count = n; } } /* try corresponding UP combinations */ if (r < curr) { /* CR, UP, and ND */ if ((n = (curr-r)*lUP+c*lND+1) < count) { mode = 5; count = n; } /* UP and ND */ if (c >= curc && (n = (curr-r)*lUP+(c-curc)*lND) < count) { mode = 6; count = n; } /* UP and BS */ if (c < curc && (n = (curr-r)*lUP+(curc-c)*lBC) < count) { mode = 7; count = n; } } /* space over */ if (curr == r && c > curc && linect[r] < curc && c-curc < count) mode = 8; switch (mode) { case -1: /* error! */ write (2,"\r\nInternal cursor error.\r\n",26); getout(); /* direct cursor motion */ case 0: tputs (m,abs(curr-r),addbuf); break; /* relative to "home" */ case 1: tputs (HO,r,addbuf); for (i = 0; i < r; i++) addbuf ('\012'); for (i = 0; i < c; i++) tputs (ND,1,addbuf); break; /* CR and down and over */ case 2: addbuf ('\015'); for (i = 0; i < r-curr; i++) addbuf ('\012'); for (i = 0; i < c; i++) tputs (ND,1,addbuf); break; /* down and over */ case 3: for (i = 0; i < r-curr; i++) addbuf ('\012'); for (i = 0; i < c-curc; i++) tputs (ND,1,addbuf); break; /* down and back */ case 4: for (i = 0; i < r-curr; i++) addbuf ('\012'); for (i = 0; i < curc-c; i++) addbuf ('\010'); break; /* CR and up and over */ case 5: addbuf ('\015'); for (i = 0; i < curr-r; i++) tputs (UP,1,addbuf); for (i = 0; i < c; i++) tputs (ND,1,addbuf); break; /* up and over */ case 6: for (i = 0; i < curr-r; i++) tputs (UP,1,addbuf); for (i = 0; i < c-curc; i++) tputs (ND,1,addbuf); break; /* up and back */ case 7: for (i = 0; i < curr-r; i++) tputs (UP,1,addbuf); for (i = 0; i < curc-c; i++) { if (BC) tputs (BC,1,addbuf); else addbuf ('\010'); } break; /* safe space */ case 8: for (i = 0; i < c-curc; i++) addbuf (' '); } /* fix positions */ curr = r; curc = c; realr = -1; realc = -1;}clear () { register int i; /* double space if can't clear */ if (CL == 0) { writel ("\n\n"); return; } curr = curc = 0; /* fix position markers */ realr = realc = -1; for (i = 0; i < 24; i++) /* clear line counts */ linect[i] = -1; buffnum = -1; /* ignore leftover buffer contents */ tputs (CL,CO,addbuf); /* put CL in buffer */}tos () { /* home cursor */ curmove (0,0);}fancyc (c)register char c; /* character to output */{ register int sp; /* counts spaces in a tab */ if (c == '\007') { /* bells go in blindly */ addbuf (c); return; } /* process tabs, use spaces if the * the tab should be erasing things, * otherwise use cursor movement * routines. Note this does not use * hardware tabs at all. */ if (c == '\t') { sp = (curc+8) & (~ 7); /* compute spaces */ /* check line length */ if (linect[curr] >= curc || sp < 4) { for (; sp > curc; sp--) addbuf (' '); curc = sp; /* fix curc */ } else curmove (curr,sp); return; } /* do newline be calling newline */ if (c == '\n') { newline(); return; } /* ignore any other control chars */ if (c < ' ') return; /* if an erasing space or non-space, * just add it to buffer. Otherwise * use cursor movement routine, so that * multiple spaces will be grouped * together */ if (c > ' ' || linect[curr] >= curc) { newpos (); /* make sure position correct */ addbuf (c); /* add character to buffer */ /* fix line length */ if (c == ' ' && linect[curr] == curc) linect[curr]--; else if (linect[curr] < curc) linect[curr] = curc; curc++; /* fix curc */ } else /* use cursor movement routine */ curmove (curr,curc+1);}clend() { register int i; register char *s; if (CD) { tputs (CD,CO-curr,addbuf); for (i = curr; i < LI; i++) linect[i] = -1; return; } curmove (i = curr,0); cline(); while (curr < LI-1) { curmove (curr+1,0); if (linect[curr] > -1) cline (); } curmove (i,0);}cline () { register int i; register int c; register char *s; if (curc > linect[curr]) return; newpos (); if (CE) { tputs (CE,1,addbuf); linect[curr] = curc-1; } else { c = curc-1; while (linect[curr] > c) { addbuf (' '); curc++; linect[curr]--; } curmove (curr,c+1); }}newline () { cline(); if (curr == LI-1) curmove (begscr,0); else curmove (curr+1,0);}getcaps (s)register char *s;{ register char *code; /* two letter code */ register char ***cap; /* pointer to cap string */ char *bufp; /* pointer to cap buffer */ char tentry[1024]; /* temporary uncoded caps buffer */ tgetent (tentry,s); /* get uncoded termcap entry */ LI = tgetnum ("li"); /* get number of lines */ if (LI == -1) LI = 12; CO = tgetnum ("co"); /* get number of columns */ if (CO == -1) CO = 65; bufp = tbuf; /* get padding character */ tgetstr ("pc",&bufp); if (bufp != tbuf) PC = *tbuf; else PC = 0; bufp = tbuf; /* get string entries */ cap = tstr; for (code = tcap; *code; code += 2) **cap++ = (char *)tgetstr (code,&bufp); /* get pertinent lengths */ if (HO) lHO = strlen (HO); if (BC) lBC = strlen (BC); else lBC = 1; if (UP) lUP = strlen (UP); if (ND) lND = strlen (ND); if (LI < 24 || CO < 72 || !(CL && UP && ND)) return (0); linect = (int *)calloc (LI+1,sizeof(int)); return (1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -