/* * Copyright 1983-2003 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ /* All Rights Reserved */ /* * Copyright (c) 1980 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ /* from OpenSolaris "t4.c 1.10 05/06/02 SMI" */ /* * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany * Portions Copyright (c) 2015 Carsten Kunze * * Sccsid @(#)t4.c 1.7 (gritter) 9/8/06 */ /* t4.c: read table specification */ # include "t..c" # include # include # include # include "global.h" static int oncol; static int morecols(int); static int moreheads(int); static void initspec(int); static void inithead(int, int); int getspec(void) { int i; moreheads(0); morecols(0); initspec(0); nclin=ncol=0; oncol =0; left1flg=rightl=0; if (readspec()) return -1; fprintf(tabout, ".rm"); for(i=0; i0) {ncol++; rightl++;}; if(sawchar) nclin++; if (nclin>=MAXHEAD && !moreheads(nclin)) return error("too many lines in specification"); icol=0; if (ncol==0 || nclin==0) return error("no specification"); if (c== '.') { while ((c=get1char()) && c != '\n') if (c != ' ' && c != '\t') return error( "dot not last character on format line"); /* fix up sep - default is 3 except at edge */ for(icol=0; icol=MAXCOL && !morecols(icol)) return error("too many columns in table"); sawchar=1; continue; case 'b': case 'i': c += 'A'-'a'; /* FALLTHRU */ case 'B': case 'I': if (sawchar == 0) continue; if (icol==0) continue; snp=font[nclin][icol-1]; snp[0]= (c=='I' ? '2' : '3'); snp[1]=0; continue; case 't': case 'T': if (sawchar == 0) { continue; } if (icol>0) ctop[nclin][icol-1] = 1; continue; case 'd': case 'D': if (sawchar == 0) continue; if (icol>0) ctop[nclin][icol-1] = -1; continue; case 'f': case 'F': if (sawchar == 0) continue; if (icol==0) continue; snp=font[nclin][icol-1]; snp[0]=snp[1]=stopc=0; for(i=0; i= '0' && c<= '9') break; } if (stopc) if (get1char()!=stopc) return error("Nonterminated font name"); continue; case 'P': case 'p': if (sawchar == 0) continue; if (icol<=0) continue; temp = snp = csize[nclin][icol-1]; while ((c = get1char())) { if (c== ' ' || c== tab || c=='\n') break; if (c=='-' || c == '+') if (snp>temp) break; else *snp++=c; else if (isdigit(c)) *snp++ = c; else break; if (snp-temp>20) return error("point size too large"); } *snp = 0; if (atoi(temp)>36) return error("point size unreasonable"); un1getc (c); continue; case 'V': case 'v': if (sawchar == 0) continue; if (icol<=0) continue; temp = snp = vsize[nclin][icol-1]; while ((c = get1char())) { if (c== ' ' || c== tab || c=='\n') break; if (c=='-' || c == '+') if (snp>temp) break; else *snp++=c; else if (isdigit(c)) *snp++ = c; else break; if (snp-temp>20) return error( "vertical spacing value too large"); } *snp=0; un1getc(c); continue; case 'w': case 'W': if (sawchar == 0) { /* * This should be an error case. * However, for the backward-compatibility, * treat as if 'c' was specified. */ style[nclin][icol] = 'c'; icol++; if (icol >= MAXCOL && !morecols(icol)) { return error("too many columns in table"); } sawchar = 1; } snp = cll [icol-1]; /* Dale Smith didn't like this check * possible to have two text blocks * of different widths now .... if (*snp) { fprintf(tabout, "Ignored second width specification"); continue; } * end commented out code ... */ stopc=0; while ((c = get1char())) { if (snp==cll[icol-1] && c==' ') continue; if (snp==cll[icol-1] && c=='(') { stopc = ')'; continue; } if ( !stopc && (c>'9' || c< '0')) break; if (stopc && c== stopc) break; if (snp-cll[icol-1]>CLLEN) return error ("column width too long"); *snp++ =c; } *snp=0; if (!stopc) un1getc(c); continue; case 'x': case 'X': if (!sawchar || icol < 1) break; xcol[icol-1] = 1; xcolflg++; expflg = 0; break; case 'e': case 'E': if (sawchar == 0) continue; if (icol<1) continue; evenup[icol-1]=1; evenflg=1; continue; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': sn[0] = c; snp=sn+1; while (isdigit(*snp++ = c = get1char())) ; un1getc(c); sep[icol-1] = max(sep[icol-1], strtol(sn, NULL, 10)); continue; case '|': lefline[nclin][icol]++; if (icol==0) left1flg=1; continue; } } return error("EOF reading table specification"); } static int morecols(int n) { int i, j, inc = 10, maxcol; void *vp; if (n < MAXCOL) return(1); while ((maxcol = MAXCOL + inc) < n) inc *= 2; for (i=0; i