summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/mpware/dmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/mpware/dmp.c')
-rw-r--r--Build/source/texk/web2c/mpware/dmp.c1091
1 files changed, 627 insertions, 464 deletions
diff --git a/Build/source/texk/web2c/mpware/dmp.c b/Build/source/texk/web2c/mpware/dmp.c
index 9debc6510d7..cf876f8aa91 100644
--- a/Build/source/texk/web2c/mpware/dmp.c
+++ b/Build/source/texk/web2c/mpware/dmp.c
@@ -23,8 +23,8 @@
* gets modified.
*/
-char *banner="% Written by DMP, Version 0.991"; /* first line of output */
-char *term_banner="This is DMP, Version 0.991";
+char *banner = "% Written by DMP, Version 0.992"; /* first line of output */
+char *term_banner = "This is DMP, Version 0.992";
#include <stdio.h>
#include <stdlib.h>
@@ -42,17 +42,16 @@ char *term_banner="This is DMP, Version 0.991";
#define PI 3.14159265358979323846
#endif
-#define POOLMAX 65000 /* total characters in all font and char names */
-#define FCOUNT 100 /* maximum number of fonts */
-#define SHIFTS 100 /* maximum number of characters with special shifts */
-#define line_length 79 /* maximum output line length (must be at least 60) */
-#define Hprime 307 /* much bigger than max(chars/font,fonts/job) */
-#define MAXCHARS 256 /* character codes fall in the range 0..MAXCHARS-1 */
-#define LLENGTH 1024 /* one more than maximum line length for troff output */
+#define FCOUNT 100 /* maximum number of fonts */
+#define SHIFTS 100 /* maximum number of characters with special shifts */
+#define line_length 79 /* maximum output line length (must be at least 60) */
+#define Hprime 307 /* much bigger than max(chars/font,fonts/job) */
+#define MAXCHARS 256 /* character codes fall in the range 0..MAXCHARS-1 */
+#define LLENGTH 1024 /* one more than maximum line length for troff output */
#define is_specchar(c) (!gflag && (c)<=2) /* does charcode c identify a special char? */
-#define LWscale 0.03 /* line width for graphics as a fraction of pointsize */
-#define YCORR 12.0 /* V coordinate of reference point in (big) points */
+#define LWscale 0.03 /* line width for graphics as a fraction of pointsize */
+#define YCORR 12.0 /* V coordinate of reference point in (big) points */
char strpool[POOLMAX]; /* text for font names and char names */
int poolsize = 0; /* chars used so far in strpool */
@@ -60,21 +59,21 @@ int poolsize = 0; /* chars used so far in strpool */
char *texname[FCOUNT]; /* TeX names (null-terminated strings) */
int font_num[FCOUNT]; /* external font numbers */
float font_design_size[FCOUNT]; /* design size in TeX points */
-struct hcell *charcodes[FCOUNT];/* hash tables for translating char names */
+struct hcell *charcodes[FCOUNT]; /* hash tables for translating char names */
int next_specfnt[FCOUNT]; /* used to link special fonts together */
float charwd[FCOUNT][MAXCHARS]; /* width/ptsize indexed [font num][char code] */
-int nfonts; /* no. of internal font nums (texname indices)*/
+int nfonts; /* no. of internal font nums (texname indices) */
int shiftchar[SHIFTS]; /* charcode of character to shift, else -1 */
-float shifth[SHIFTS],shiftv[SHIFTS]; /* shift vals/fontsize (y is upward) */
+float shifth[SHIFTS], shiftv[SHIFTS]; /* shift vals/fontsize (y is upward) */
int shiftptr = 0; /* number of entries in shift tables */
int shiftbase[FCOUNT]; /* initial index into shifth,shiftv,shiftchar */
-int specfnt = FCOUNT; /* int. num. of first special font (or FCOUNT)*/
+int specfnt = FCOUNT; /* int. num. of first special font (or FCOUNT) */
int *specf_tail = &specfnt; /* tail of specfnt list (*specf_tail==FCOUNT) */
FILE *trf; /* the input file (troff output) */
FILE *mpxf; /* the output file */
struct hcell *trfonts; /* hash tab for internal nums of troff fonts */
-float unit = 0.0; /* (big) points per troff unit (0 when unset)*/
-int h,v; /* current position in tr. units (v downward)*/
+float unit = 0.0; /* (big) points per troff unit (0 when unset) */
+int h, v; /* current position in tr. units (v downward) */
float cursize; /* current type size in (big) points */
int curfont; /* internal number for current font */
float Xslant; /* degrees additional slant for all fonts */
@@ -85,23 +84,29 @@ int lnno = 0; /* line num. in troff output file (our input) */
float sizescale; /* groff font size scaling factor */
int gflag = 0; /* non-zero if using groff fonts */
-void quit(char *msg1, char *msg2, char *msg3)
+void
+quit(char *msg1, char *msg2, char *msg3)
{
- fprintf(stderr,"DMP abort at troff output line %d:\n%s%s%s\n",
- lnno, msg1, msg2, msg3);
+ fprintf(stderr, "DMP abort at troff output line %d:\n%s%s%s\n",
+ lnno, msg1, msg2, msg3);
exit(1);
}
-void warn(char *msg1, char *msg2, char *msg3)
+void
+warn(char *msg1, char *msg2, char *msg3)
{
- fprintf(stderr,"DMP warning at troff output line %d:\n%s%s%s\n",
- lnno, msg1, msg2, msg3);
+ fprintf(stderr, "DMP warning at troff output line %d:\n%s%s%s\n",
+ lnno, msg1, msg2, msg3);
}
-void add_to_pool(char c)
+void
+add_to_pool(char c)
{
- if (poolsize==POOLMAX) quit("Need to increase POOLMAX","","");
- else strpool[poolsize++] = c;
+ if (poolsize == POOLMAX) {
+ fprintf(stderr, "%s", strpool);
+ quit("Need to increase POOLMAX", "", "");
+ } else
+ strpool[poolsize++] = c;
}
@@ -112,25 +117,27 @@ void add_to_pool(char c)
***************************************************************/
typedef struct hcell {
- char* lab;
+ char *lab;
int datum;
} Hcell;
#define new_htab (Hcell*) calloc((unsigned)Hprime, (unsigned)sizeof(Hcell))
-int hash(char *s)
+int
+hash(char *s)
{
register int r;
- for(r=0; *s!=0; s++) {
- /* GROFF - in font metrics file the character name may be 8bit
- groff_font(5): Groff supports eight bit characters;
- groff_out(5): Note that single characters can have the
- eighth bit set, as can the names of fonts and special
- characters.
- */
- r = (r<<1) + *(unsigned char*)s;
- while (r>=Hprime) r-=Hprime;
+ for (r = 0; *s != 0; s++) {
+ /* GROFF - in font metrics file the character name may be 8bit
+ groff_font(5): Groff supports eight bit characters;
+ groff_out(5): Note that single characters can have the
+ eighth bit set, as can the names of fonts and special
+ characters.
+ */
+ r = (r << 1) + *(unsigned char *) s;
+ while (r >= Hprime)
+ r -= Hprime;
}
return r;
}
@@ -141,35 +148,44 @@ int hash(char *s)
*/
Hcell *failure; /* null unless last hfind failed (used below) */
-int *hfind(char *s, Hcell* htab)
+int *
+hfind(char *s, Hcell * htab)
{
register Hcell *p;
register int cnt = Hprime;
failure = (Hcell *) 0;
p = &htab[hash(s)];
do {
- if (p->lab==NULL) {
+ if (p->lab == NULL) {
failure = p;
- if (s<&strpool[0] || s>=&strpool[POOLMAX]) {
+ if (s < &strpool[0] || s >= &strpool[POOLMAX]) {
p->lab = &strpool[poolsize];
- do add_to_pool(*s); while (*s++!='\0');
- } else p->lab = s;
+ do
+ add_to_pool(*s);
+ while (*s++ != '\0');
+ } else
+ p->lab = s;
return &p->datum;
}
- if (strcmp(s, p->lab)==0) return &p->datum;
- if (p==htab) p= &htab[Hprime-1];
- else p--;
+ if (strcmp(s, p->lab) == 0)
+ return &p->datum;
+ if (p == htab)
+ p = &htab[Hprime - 1];
+ else
+ p--;
} while (--cnt >= 0);
- quit("Need to increase Hprime","","");
- return (int*)0; /* keep lint happy */
+ quit("Need to increase Hprime", "", "");
+ return (int *) 0; /* keep lint happy */
}
/* If the last hfind() failed, undo the insertion and return zero (FALSE).
*/
-int hfound(void)
+int
+hfound(void)
{
- if (failure==(Hcell *)0) return 1;
+ if (failure == (Hcell *) 0)
+ return 1;
failure->lab = NULL;
return 0;
}
@@ -184,22 +200,27 @@ int hfound(void)
numbers from strings but they give no indication of how much of the string
is consumed. These homemade versions don't parse scientific notation.
*/
-char *arg_tail; /* char after the number just gotten; NULL on failure */
+char *arg_tail; /* char after the number just gotten; NULL on failure */
-int get_int(char *s)
+int
+get_int(char *s)
{
register int i, d, neg;
- if (s==NULL) goto bad;
- for (neg=0;; s++)
- if (*s=='-') neg=!neg;
- else if (*s!=' ' && *s!='\t') break;
- if (i= *s-'0', 0>i||i>9) goto bad;
- while (d= *++s-'0', 0<=d&&d<=9)
- i = 10*i + d;
+ if (s == NULL)
+ goto bad;
+ for (neg = 0;; s++)
+ if (*s == '-')
+ neg = !neg;
+ else if (*s != ' ' && *s != '\t')
+ break;
+ if (i = *s - '0', 0 > i || i > 9)
+ goto bad;
+ while (d = *++s - '0', 0 <= d && d <= 9)
+ i = 10 * i + d;
arg_tail = s;
return neg ? -i : i;
-bad:arg_tail = NULL;
+ bad:arg_tail = NULL;
return 0;
}
@@ -208,14 +229,17 @@ bad:arg_tail = NULL;
a 0 it will be interpreted as octal; if it starts with 0x
or 0X it will be intepreted as hexadecimal.
*/
-int get_int_map (char *s)
+int
+get_int_map(char *s)
{
register int i;
- if (s==NULL) goto bad;
- i=strtol(s,&arg_tail,0);
- if (s==arg_tail) goto bad;
+ if (s == NULL)
+ goto bad;
+ i = strtol(s, &arg_tail, 0);
+ if (s == arg_tail)
+ goto bad;
return i;
-bad:arg_tail = NULL;
+ bad:arg_tail = NULL;
return 0;
}
@@ -224,31 +248,35 @@ bad:arg_tail = NULL;
number is not being used for character positioning. (For non-PostScript
applications h and v are usually in pixels and should be integers.)
*/
-float get_float(char *s)
+float
+get_float(char *s)
{
register int d, neg, digits;
register float x, y;
digits = 0;
- if (s!=NULL) {
- for (neg=0;; s++)
- if (*s=='-') neg=!neg;
- else if (*s!=' ' && *s!='\t') break;
+ if (s != NULL) {
+ for (neg = 0;; s++)
+ if (*s == '-')
+ neg = !neg;
+ else if (*s != ' ' && *s != '\t')
+ break;
x = 0.0;
- while (d= *s-'0', 0<=d&&d<=9) {
- x = 10.0*x + d;
- digits++; s++;
+ while (d = *s - '0', 0 <= d && d <= 9) {
+ x = 10.0 * x + d;
+ digits++;
+ s++;
}
- if (*s=='.') {
+ if (*s == '.') {
y = 1.0;
- while (d= *++s-'0', 0<=d&&d<=9) {
+ while (d = *++s - '0', 0 <= d && d <= 9) {
y /= 10.0;
- x += y*d;
+ x += y * d;
digits++;
}
}
}
- if (digits==0) {
+ if (digits == 0) {
arg_tail = NULL;
return 0.0;
}
@@ -262,13 +290,14 @@ float get_float(char *s)
used anyway - thus just skip the value,
eat all non-space chars.
*/
-float get_float_map (char *s)
+float
+get_float_map(char *s)
{
- if (s!=NULL) {
- while (isspace(*s))
- s++;
- while (!isspace(*s) && *s)
- s++;
+ if (s != NULL) {
+ while (isspace(*s))
+ s++;
+ while (!isspace(*s) && *s)
+ s++;
}
arg_tail = s;
return 0;
@@ -285,30 +314,41 @@ float get_float_map (char *s)
PostScript name. ("\t" means one or more tabs.)
*/
-void read_fmap( char *dbase)
+void
+read_fmap(char *dbase)
{
FILE *fin;
int c; /* last character read */
char *nam; /* a font name being read */
nfonts = 0;
- fin = fsearch(dbase,"",DB_TYPE);
+ fin = fsearch(dbase, "", DB_TYPE);
trfonts = new_htab;
- while ((c=getc(fin))!=EOF) {
- if (nfonts==FCOUNT) quit("Need to increase FCOUNT","","");
+ while ((c = getc(fin)) != EOF) {
+ if (nfonts == FCOUNT)
+ quit("Need to increase FCOUNT", "", "");
nam = &strpool[poolsize];
- for (;c!='\t'; c=getc(fin)) add_to_pool(c);
+ for (; c != '\t'; c = getc(fin)) {
+ if (c == EOF)
+ break;
+ add_to_pool(c);
+ }
add_to_pool(0);
*hfind(nam, trfonts) = nfonts;
texname[nfonts] = &strpool[poolsize];
do {
poolsize = texname[nfonts] - strpool;
- do c=getc(fin); while (c=='\t');
- for (;c!='\t' && c!='\n'; c=getc(fin))
+ do
+ c = getc(fin);
+ while (c == '\t');
+ for (; c != '\t' && c != '\n'; c = getc(fin)) {
+ if (c == EOF)
+ break;
add_to_pool(c);
+ }
add_to_pool(0);
- } while (c=='\t');
- font_num[nfonts] = -1; /* indicate font is not mounted */
+ } while (c == '\t');
+ font_num[nfonts] = -1; /* indicate font is not mounted */
nfonts++;
}
fclose(fin);
@@ -329,28 +369,33 @@ void read_fmap( char *dbase)
becomes redundant. Simply keeping an empty "trchars.adj" file
around will do fine without requiring any changes to this program.
*/
-void read_char_adj(char *adjfile)
+void
+read_char_adj(char *adjfile)
{
- FILE* fin;
+ FILE *fin;
char buf[200];
int i;
fin = fsearch(adjfile, "", DB_TYPE);
- for (i=0; i<nfonts; i++)
+ for (i = 0; i < nfonts; i++)
shiftbase[i] = 0;
- while (fgets(buf,200,fin)!=NULL) {
- if (shiftptr==SHIFTS-1) quit("Need to increase SHIFTS","","");
- if (buf[0]!=' ' && buf[0]!='\t') {
- for (i=0; buf[i]!='\0'; i++)
- if (buf[i]=='\n') buf[i]='\0';
+ while (fgets(buf, 200, fin) != NULL) {
+ if (shiftptr == SHIFTS - 1)
+ quit("Need to increase SHIFTS", "", "");
+ if (buf[0] != ' ' && buf[0] != '\t') {
+ for (i = 0; buf[i] != '\0'; i++)
+ if (buf[i] == '\n')
+ buf[i] = '\0';
shiftchar[shiftptr++] = -1;
- shiftbase[*hfind(buf,trfonts)] = shiftptr;
- if (!hfound()) quit(adjfile," refers to unknown font ",buf);
+ shiftbase[*hfind(buf, trfonts)] = shiftptr;
+ if (!hfound())
+ quit(adjfile, " refers to unknown font ", buf);
} else {
shiftchar[shiftptr] = get_int(buf);
shifth[shiftptr] = get_float(arg_tail);
shiftv[shiftptr] = -get_float(arg_tail);
- if (arg_tail==NULL) quit("Bad shift entry : \"",buf,"\"");
+ if (arg_tail == NULL)
+ quit("Bad shift entry : \"", buf, "\"");
shiftptr++;
}
}
@@ -361,62 +406,63 @@ void read_char_adj(char *adjfile)
/* Read the DESC file of the troff device to gather information
about sizescale and whether running under groff.
*/
-void read_desc(void)
+void
+read_desc(void)
{
/* Ignore all commands not specially handled. This relieves
of collecting commands without arguments here and also
makes the program more robust in case of future DESC
extensions.
- */
- const char* const k1[] = {
+ */
+ const char *const k1[] = {
"res", "hor", "vert", "unitwidth", "paperwidth",
"paperlength", "biggestfont", "spare2", "encoding",
NULL
};
- const char* const g1[] = {
+ const char *const g1[] = {
"family", "paperheight", "postpro", "prepro",
"print", "image_generator", "broken",
NULL
};
char cmd[200];
- FILE* fp;
+ FILE *fp;
int i, n;
fp = fsearch("DESC", "", TRFONTS_TYPE);
- while (fscanf(fp, "%199s", cmd)!=EOF) {
- if (*cmd=='#') {
- while ((i = getc(fp))!=EOF && i!='\n');
+ while (fscanf(fp, "%199s", cmd) != EOF) {
+ if (*cmd == '#') {
+ while ((i = getc(fp)) != EOF && i != '\n');
continue;
}
- if (strcmp(cmd, "fonts")==0) {
- if (fscanf(fp, "%d", &n)!=1)
+ if (strcmp(cmd, "fonts") == 0) {
+ if (fscanf(fp, "%d", &n) != 1)
return;
for (i = 0; i < n; i++)
- if (fscanf(fp, "%*s")==EOF)
+ if (fscanf(fp, "%*s") == EOF)
return;
- } else if (strcmp(cmd, "sizes")==0) {
- while (fscanf(fp, "%d", &n)==1 && n!=0);
- } else if (strcmp(cmd, "styles")==0 ||
- strcmp(cmd, "papersize")==0) {
+ } else if (strcmp(cmd, "sizes") == 0) {
+ while (fscanf(fp, "%d", &n) == 1 && n != 0);
+ } else if (strcmp(cmd, "styles") == 0 ||
+ strcmp(cmd, "papersize") == 0) {
gflag++;
- while ((i = getc(fp))!=EOF && i!='\n');
- } else if (strcmp(cmd, "sizescale")==0) {
- if (fscanf(fp, "%d", &n)==1)
+ while ((i = getc(fp)) != EOF && i != '\n');
+ } else if (strcmp(cmd, "sizescale") == 0) {
+ if (fscanf(fp, "%d", &n) == 1)
sizescale = n;
gflag++;
- } else if (strcmp(cmd, "charset")==0) {
+ } else if (strcmp(cmd, "charset") == 0) {
return;
} else {
for (i = 0; k1[i]; i++)
- if (strcmp(cmd, k1[i])==0) {
- if (fscanf(fp, "%*s")==EOF)
+ if (strcmp(cmd, k1[i]) == 0) {
+ if (fscanf(fp, "%*s") == EOF)
return;
break;
}
- if (k1[i]==0)
+ if (k1[i] == 0)
for (i = 0; g1[i]; i++)
- if (strcmp(cmd, g1[i])==0) {
- if (fscanf(fp, "%*s")==EOF)
+ if (strcmp(cmd, g1[i]) == 0) {
+ if (fscanf(fp, "%*s") == EOF)
return;
gflag = 1;
break;
@@ -437,39 +483,42 @@ void read_desc(void)
because the latter source reflects alterations made only by dpost (the
troff output driver that is bypassed when using MetaPost).
*/
-void read_tfm(int f)
+void
+read_tfm(int f)
{
- FILE* tf;
+ FILE *tf;
long a = 0;
- int sizes[5]; /* file & header lengths, bc, ec, words in wd table */
- long wd[256]; /* the width table (font size relative, scaled 2^20) */
+ int sizes[5]; /* file & header lengths, bc, ec, words in wd table */
+ long wd[256]; /* the width table (font size relative, scaled 2^20) */
int i, j;
- long wtmp; /* needed to a floating exception on certain machines */
+ long wtmp; /* needed to a floating exception on certain machines */
tf = fsearch(texname[f], ".tfm", TEXFONTS_TYPE);
- for (i=0; i<5; i++) {
+ for (i = 0; i < 5; i++) {
sizes[i] = getc(tf);
- sizes[i] = (sizes[i]<<8) | (getc(tf) & 0377);
+ sizes[i] = (sizes[i] << 8) | (getc(tf) & 0377);
}
- if (sizes[1]<2 || sizes[2]<0 || sizes[3]<sizes[2]-1 || sizes[3]>255
- || sizes[0]<sizes[1]+sizes[3]-sizes[2]+sizes[4]+7)
- quit("Bad tfm file: ",texname[f],".tfm");
- for (i=2*5; i<28; i++)
+ if (sizes[1] < 2 || sizes[2] < 0 || sizes[3] < sizes[2] - 1
+ || sizes[3] > 255
+ || sizes[0] < sizes[1] + sizes[3] - sizes[2] + sizes[4] + 7)
+ quit("Bad tfm file: ", texname[f], ".tfm");
+ for (i = 2 * 5; i < 28; i++)
(void) getc(tf);
- for (i=0; i<4; i++)
- a = (a<<8) | (long) (getc(tf) & 0377);
- font_design_size[f] = ((float) a)/1048576.0;
- fseek(tf, (long)(28+4*(sizes[1]+sizes[3]-sizes[2])), 0);
- for (i=0; i<sizes[4]; i++) {
+ for (i = 0; i < 4; i++)
+ a = (a << 8) | (long) (getc(tf) & 0377);
+ font_design_size[f] = ((float) a) / 1048576.0;
+ fseek(tf, (long) (28 + 4 * (sizes[1] + sizes[3] - sizes[2])), 0);
+ for (i = 0; i < sizes[4]; i++) {
wd[i] = 0L;
- for (j=0; j<4; j++)
- wd[i] = (wd[i]<<8) | (long) (getc(tf) & 0377);
+ for (j = 0; j < 4; j++)
+ wd[i] = (wd[i] << 8) | (long) (getc(tf) & 0377);
}
- fseek(tf, (long)(24+4*sizes[1]), 0);
- for (i=sizes[2]; i<=sizes[3]; i++) {
+ fseek(tf, (long) (24 + 4 * sizes[1]), 0);
+ for (i = sizes[2]; i <= sizes[3]; i++) {
wtmp = wd[getc(tf) & 0377];
- charwd[f][i] = ((double) wtmp)/1048576.0/unit;
- for (j=3; --j>=0;) (void) getc(tf);
+ charwd[f][i] = ((double) wtmp) / 1048576.0 / unit;
+ for (j = 3; --j >= 0;)
+ (void) getc(tf);
}
fclose(tf);
}
@@ -491,58 +540,63 @@ void read_tfm(int f)
2. The `charcode' field parsed by "lastcode = get_int(arg_tail);"
may be given either in decimal, octal, or hexadecimal format.
*/
-int scan_desc_line(int f, char *lin)
+int
+scan_desc_line(int f, char *lin)
{
static int lastcode;
char *s;
s = &strpool[poolsize];
- while (*lin!=' ' && *lin!='\t' && *lin!='\0')
+ while (*lin != ' ' && *lin != '\t' && *lin != '\0')
add_to_pool(*lin++);
add_to_pool('\0');
- while (*lin==' ' || *lin=='\t') lin++;
- if (*lin=='"') {
- if (lastcode<MAXCHARS)
- *hfind(s,charcodes[f]) = lastcode;
+ while (*lin == ' ' || *lin == '\t')
+ lin++;
+ if (*lin == '"') {
+ if (lastcode < MAXCHARS)
+ *hfind(s, charcodes[f]) = lastcode;
} else {
- (void) get_float_map(lin);
- (void) get_int(arg_tail);
- lastcode = get_int_map(arg_tail);
- if (arg_tail==NULL) return 0;
- if (lastcode<MAXCHARS)
- *hfind(s,charcodes[f]) = lastcode;
- }
+ (void) get_float_map(lin);
+ (void) get_int(arg_tail);
+ lastcode = get_int_map(arg_tail);
+ if (arg_tail == NULL)
+ return 0;
+ if (lastcode < MAXCHARS)
+ *hfind(s, charcodes[f]) = lastcode;
+ }
return 1;
}
/* Read the font description file for the font with the given troff name
and update the data structures. The result is the internal font number.
*/
-int read_fontdesc(char *nam) /* troff name */
-{
+int
+read_fontdesc(char *nam)
+{ /* troff name */
char buf[200];
- FILE* fin; /* input file */
+ FILE *fin; /* input file */
int f; /* internal font number */
- if (unit==0.0) quit("Resolution is not set soon enough","","");
+ if (unit == 0.0)
+ quit("Resolution is not set soon enough", "", "");
f = *hfind(nam, trfonts);
if (!hfound())
- quit("Font was not in map file","","");
+ quit("Font was not in map file", "", "");
fin = fsearch(nam, "", TRFONTS_TYPE);
for (;;) {
- if (fgets(buf,200,fin)==NULL)
- quit("Description file for ",nam," ends unexpectedly");
- if (strncmp(buf,"special",7)==0) {
+ if (fgets(buf, 200, fin) == NULL)
+ quit("Description file for ", nam, " ends unexpectedly");
+ if (strncmp(buf, "special", 7) == 0) {
*specf_tail = f;
next_specfnt[f] = FCOUNT;
specf_tail = &next_specfnt[f];
- } else if (strncmp(buf,"charset",7)==0)
+ } else if (strncmp(buf, "charset", 7) == 0)
break;
}
charcodes[f] = new_htab;
- while (fgets(buf,200,fin)!=NULL)
+ while (fgets(buf, 200, fin) != NULL)
if (scan_desc_line(f, buf) == 0)
- quit(nam," has a bad line in its description file: ",buf);
+ quit(nam, " has a bad line in its description file: ", buf);
fclose(fin);
return f;
}
@@ -569,53 +623,58 @@ int read_fontdesc(char *nam) /* troff name */
and an ampersand should come next. The starting condition state=initial
is a lot like state=special, except no ampersand is required.
*/
-#define special 0 /* the state after printing a `char' expression */
-#define normal 1 /* the state value in a quoted string */
-#define initial 2 /* initial state */
+#define special 0 /* the state after printing a `char' expression */
+#define normal 1 /* the state value in a quoted string */
+#define initial 2 /* initial state */
int state = initial;
-int print_col = 0; /* there are at most this many characters on the current line */
+int print_col = 0; /* there are at most this many characters on the current line */
/* To print a string on the MPX file, initialize print_col, ensure that
state=initial, and pass the characters one-at-a-time to print_char.
*/
-void print_char(char cc)
+void
+print_char(char cc)
{
- int printable; /* nonzero if it is safe to print c */
- int l; /* number of chars in c or the `char' expression */
- int c; /* equal to cc mod 256, but always positive */
-
- c = cc&0377;
- printable = isprint(c) && c<128; /* avoid high-bit-on Latin-1 chars */
- if (printable) l=1;
- else if (c<10) l=5;
- else if (c<100) l=6;
- else l=7;
- if (print_col+l>line_length-2) {
- if (state==normal) {
- putc('"',mpxf);
+ int printable; /* nonzero if it is safe to print c */
+ int l; /* number of chars in c or the `char' expression */
+ int c; /* equal to cc mod 256, but always positive */
+
+ c = cc & 0377;
+ printable = isprint(c) && c < 128; /* avoid high-bit-on Latin-1 chars */
+ if (printable)
+ l = 1;
+ else if (c < 10)
+ l = 5;
+ else if (c < 100)
+ l = 6;
+ else
+ l = 7;
+ if (print_col + l > line_length - 2) {
+ if (state == normal) {
+ putc('"', mpxf);
state = special;
}
- putc('\n',mpxf);
+ putc('\n', mpxf);
print_col = 0;
}
- if (state==normal)
- if (printable) putc(c,mpxf);
+ if (state == normal)
+ if (printable)
+ putc(c, mpxf);
else {
- fprintf(mpxf,"\"&char%d",c);
+ fprintf(mpxf, "\"&char%d", c);
print_col += 2;
- }
- else {
- if (state==special) {
- putc('&',mpxf);
+ } else {
+ if (state == special) {
+ putc('&', mpxf);
print_col++;
}
if (printable) {
- fprintf(mpxf,"\"%c",c);
+ fprintf(mpxf, "\"%c", c);
print_col++;
} else
- fprintf(mpxf,"char%d",c);
+ fprintf(mpxf, "char%d", c);
}
print_col += l;
state = printable ? normal : special;
@@ -625,15 +684,16 @@ void print_char(char cc)
/* The end_char_string procedure gets the string ended properly and ensures
that there is room for |l| more characters on the output line.
*/
-void end_char_string(int l)
+void
+end_char_string(int l)
{
- while (state>special) {
- putc('"',mpxf);
+ while (state > special) {
+ putc('"', mpxf);
print_col++;
state--;
}
- if (print_col+l>line_length) {
- putc('\n',mpxf);
+ if (print_col + l > line_length) {
+ putc('\n', mpxf);
print_col = 0;
}
state = initial; /* get ready to print the next string */
@@ -648,7 +708,7 @@ void end_char_string(int l)
char font_used[FCOUNT]; /* nonzero for fonts used on this page */
int fonts_used; /* nonzero if any font been used on this page */
int graphics_used; /* nonzero if any graphics seen on this page */
-float str_h1,str_v; /* corrected start pos for current out string */
+float str_h1, str_v; /* corrected start pos for current out string */
float str_h2; /* where the current output string ends */
int str_f; /* internal font num for cur. output string */
float str_size; /* point size for this text string */
@@ -657,22 +717,26 @@ float str_size; /* point size for this text string */
/* Before using any fonts we need to define a MetaPost macro for typesetting
character strings.
*/
-void prepare_font_use(void)
+void
+prepare_font_use(void)
{
int k;
- for (k=0;k<nfonts;k++) font_used[k]=0;
+ for (k = 0; k < nfonts; k++)
+ font_used[k] = 0;
fonts_used = 1;
- fprintf(mpxf,"string n[];\n");
- fprintf(mpxf,"vardef s(expr t,m,x,y) =\n");
- fprintf(mpxf," addto p also t scaled(m*1.00375) shifted(x,y); enddef;\n");
+ fprintf(mpxf, "string n[];\n");
+ fprintf(mpxf, "vardef s(expr t,m,x,y) =\n");
+ fprintf(mpxf,
+ " addto p also t scaled(m*1.00375) shifted(x,y); enddef;\n");
}
/* Do what is necessary when the font with internal number f is used for the
first time on a page.
*/
-void first_use(int f)
+void
+first_use(int f)
{
font_used[f] = 1;
fprintf(mpxf, "n%d=\"%s\";\n", font_num[f], texname[f]);
@@ -682,41 +746,44 @@ void first_use(int f)
/* Print any transformations required by the current Xslant and Xheight
settings.
*/
-void slant_and_ht(void)
+void
+slant_and_ht(void)
{
int i = 0;
- if (Xslant!=0.0) {
- fprintf(mpxf," slanted%.5f",Xslant);
+ if (Xslant != 0.0) {
+ fprintf(mpxf, " slanted%.5f", Xslant);
i++;
}
- if (Xheight!=cursize && Xheight!=0.0 && cursize!=0.0) {
- fprintf(mpxf," yscaled%.4f", Xheight/cursize);
+ if (Xheight != cursize && Xheight != 0.0 && cursize != 0.0) {
+ fprintf(mpxf, " yscaled%.4f", Xheight / cursize);
i++;
}
- if (i>0) fprintf(mpxf, "\n ");
+ if (i > 0)
+ fprintf(mpxf, "\n ");
}
/* We maintain the invariant that str_f is -1 when there is no output string
under construction.
*/
-void finish_last_char(void)
+void
+finish_last_char(void)
{
- float m,x,y; /* font scale, MetaPost coords of reference point */
-
- if (str_f>=0) {
- m = str_size/font_design_size[str_f];
- x = str_h1*unit;
- y = YCORR-str_v*unit;
- if (fabs(x)>=4096.0 || fabs(y)>=4096.0 || m>=4096.0 || m<0) {
- warn("text out of range ignored","","");
+ float m, x, y; /* font scale, MetaPost coords of reference point */
+
+ if (str_f >= 0) {
+ m = str_size / font_design_size[str_f];
+ x = str_h1 * unit;
+ y = YCORR - str_v * unit;
+ if (fabs(x) >= 4096.0 || fabs(y) >= 4096.0 || m >= 4096.0 || m < 0) {
+ warn("text out of range ignored", "", "");
end_char_string(67);
- }
- else end_char_string(47);
- fprintf(mpxf,")infont n%d", font_num[str_f]);
+ } else
+ end_char_string(47);
+ fprintf(mpxf, ")infont n%d", font_num[str_f]);
slant_and_ht();
- fprintf(mpxf,",%.5f,%.4f,%.4f);\n", m, x,y);
+ fprintf(mpxf, ",%.5f,%.4f,%.4f);\n", m, x, y);
str_f = -1;
}
}
@@ -724,48 +791,54 @@ void finish_last_char(void)
/* Output character number c in the font with internal number f.
*/
-void set_num_char(int f,int c)
+void
+set_num_char(int f, int c)
{
float hh, vv; /* corrected versions of h, v */
int i;
hh = h;
vv = v;
- for (i=shiftbase[f]; shiftchar[i]>=0; i++)
- if (shiftchar[i]==c) {
- hh += (cursize/unit)*shifth[i];
- vv += (cursize/unit)*shiftv[i];
+ for (i = shiftbase[f]; shiftchar[i] >= 0; i++)
+ if (shiftchar[i] == c) {
+ hh += (cursize / unit) * shifth[i];
+ vv += (cursize / unit) * shiftv[i];
break;
}
/* if (c==0) quit("attempt to typeset an invalid character","",""); */
- if (hh-str_h2>=1.0 || str_h2-hh>=1.0 || vv-str_v>=1.0 || str_v-vv>=1.0
- || f!=str_f || cursize!=str_size) {
- if (str_f>=0) finish_last_char();
+ if (hh - str_h2 >= 1.0 || str_h2 - hh >= 1.0 || vv - str_v >= 1.0
+ || str_v - vv >= 1.0 || f != str_f || cursize != str_size) {
+ if (str_f >= 0)
+ finish_last_char();
else if (!fonts_used)
prepare_font_use(); /* first font usage on this page */
if (!font_used[f])
first_use(f); /* first use of font f on this page */
- fprintf(mpxf,"s((");
+ fprintf(mpxf, "s((");
print_col = 3;
- str_f=f; str_v=vv; str_h1=hh;
+ str_f = f;
+ str_v = vv;
+ str_h1 = hh;
str_size = cursize;
}
print_char(c);
- str_h2 = hh + cursize*charwd[f][c];
+ str_h2 = hh + cursize * charwd[f][c];
}
/* Output a string. */
-void set_string (char *cname)
+void
+set_string(char *cname)
{
- float hh; /* corrected version of h, current horisontal position */
+ float hh; /* corrected version of h, current horisontal position */
- if (!*cname) return;
+ if (!*cname)
+ return;
hh = h;
- set_num_char(curfont,*cname);
- hh+= cursize*charwd[curfont][*cname];
- while (*++cname){
- print_char(*cname);
- hh += cursize*charwd[curfont][*cname];
+ set_num_char(curfont, *cname);
+ hh += cursize * charwd[curfont][*cname];
+ while (*++cname) {
+ print_char(*cname);
+ hh += cursize * charwd[curfont][*cname];
}
h = rint(hh);
finish_last_char();
@@ -773,20 +846,24 @@ void set_string (char *cname)
/* The following initialization and clean-up is required.
*/
-void start_picture(void)
+void
+start_picture(void)
{
fonts_used = graphics_used = 0;
str_f = -1;
str_v = 0.0;
str_h2 = 0.0;
str_size = 0.0;
- fprintf(mpxf,"begingroup save C,D,p,s,n; picture p; p=nullpicture;\n");
+ fprintf(mpxf,
+ "begingroup save C,D,p,s,n; picture p; p=nullpicture;\n");
}
-void stop_picture(void)
+void
+stop_picture(void)
{
- if (str_f>=0) finish_last_char();
- fprintf(mpxf,"p endgroup\n");
+ if (str_f >= 0)
+ finish_last_char();
+ fprintf(mpxf, "p endgroup\n");
}
@@ -800,8 +877,8 @@ void stop_picture(void)
the vardef macro, puts it in the string pool, and index where the
string starts. The name should be C.<something>.
*/
-char specintro[] = "vardef "; /* MetaPost name follows this */
-#define speci 7 /* length of the above string */
+char specintro[] = "vardef "; /* MetaPost name follows this */
+#define speci 7 /* length of the above string */
/* TH: A bit of trickery is added here for case-insensitive
file systems. This aliasing allows the CHARLIB directory
@@ -814,38 +891,43 @@ char specintro[] = "vardef "; /* MetaPost name follows this */
else ungetc(c,deff)
-int copy_spec_char(char *cname)
+int
+copy_spec_char(char *cname)
{
- int k = 0; /* how much of specintro so far */
+ int k = 0; /* how much of specintro so far */
FILE *deff;
int c, s;
- if (strcmp(cname,"ao") == 0) {
- deff = fsearch("ao.x", "", CHARLIB_TYPE);
- test_redo_search;
- } else if (strcmp(cname,"lh") == 0) {
- deff = fsearch("lh.x", "", CHARLIB_TYPE);
- test_redo_search;
- } else if (strcmp(cname,"~=") == 0) {
- deff = fsearch("twiddle", "", CHARLIB_TYPE);
- test_redo_search;
- } else {
- deff = fsearch(cname, "", CHARLIB_TYPE);
- }
- while (k<speci) {
- if ((c=getc(deff))==EOF)
- quit("No vardef in charlib/",cname,"");
+ if (strcmp(cname, "ao") == 0) {
+ deff = fsearch("ao.x", "", CHARLIB_TYPE);
+ test_redo_search;
+ } else if (strcmp(cname, "lh") == 0) {
+ deff = fsearch("lh.x", "", CHARLIB_TYPE);
+ test_redo_search;
+ } else if (strcmp(cname, "~=") == 0) {
+ deff = fsearch("twiddle", "", CHARLIB_TYPE);
+ test_redo_search;
+ } else {
+ deff = fsearch(cname, "", CHARLIB_TYPE);
+ }
+ while (k < speci) {
+ if ((c = getc(deff)) == EOF)
+ quit("No vardef in charlib/", cname, "");
putc(c, mpxf);
- if (c==specintro[k]) k++; else k=0;
+ if (c == specintro[k])
+ k++;
+ else
+ k = 0;
}
s = poolsize;
- while ((c=getc(deff))!='(') {
- if (c==EOF) quit("vardef in charlib/",cname," has no arguments");
+ while ((c = getc(deff)) != '(') {
+ if (c == EOF)
+ quit("vardef in charlib/", cname, " has no arguments");
putc(c, mpxf);
add_to_pool(c);
}
putc(c, mpxf);
add_to_pool('\0');
- while ((c=getc(deff))!=EOF)
+ while ((c = getc(deff)) != EOF)
putc(c, mpxf);
return s;
}
@@ -856,36 +938,43 @@ int copy_spec_char(char *cname)
If the character is not in the current font we have to search the special
fonts.
*/
-Hcell *spec_tab = (Hcell*)0;
+Hcell *spec_tab = (Hcell *) 0;
-void set_char(char *cname)
+void
+set_char(char *cname)
{
int f, c, *flagp;
- if (*cname==' '||*cname=='\t') return;
+ if (*cname == ' ' || *cname == '\t')
+ return;
f = curfont;
c = *hfind(cname, charcodes[f]);
if (!hfound()) {
- for (f=specfnt; f!=FCOUNT; f=next_specfnt[f]) {
+ for (f = specfnt; f != FCOUNT; f = next_specfnt[f]) {
c = *hfind(cname, charcodes[f]);
- if (hfound()) goto out;
+ if (hfound())
+ goto out;
}
- quit("There is no character ",cname,"");
+ quit("There is no character ", cname, "");
}
-out:if (!is_specchar(c)) set_num_char(f,c);
+ out:if (!is_specchar(c))
+ set_num_char(f, c);
else {
- if (str_f>=0) finish_last_char();
- if (!fonts_used) prepare_font_use();
- if (!font_used[f]) first_use(f);
- if (spec_tab==(Hcell*)0)
+ if (str_f >= 0)
+ finish_last_char();
+ if (!fonts_used)
+ prepare_font_use();
+ if (!font_used[f])
+ first_use(f);
+ if (spec_tab == (Hcell *) 0)
spec_tab = new_htab;
flagp = hfind(cname, spec_tab);
- if (*flagp==0)
+ if (*flagp == 0)
*flagp = copy_spec_char(cname); /* this won't be zero */
fprintf(mpxf, "s(%s(n%d)", &strpool[*flagp], font_num[f]);
slant_and_ht();
fprintf(mpxf, ",%.5f,%.4f,%.4f);\n",
- cursize/font_design_size[f], h*unit, YCORR-v*unit);
+ cursize / font_design_size[f], h * unit, YCORR - v * unit);
}
}
@@ -898,19 +987,21 @@ out:if (!is_specchar(c)) set_num_char(f,c);
/* Mount the font with troff name nam at external font number n and read any
necessary font files.
*/
-void do_font_def(int n, char *nam)
+void
+do_font_def(int n, char *nam)
{
int f, k;
f = *hfind(nam, trfonts);
if (!hfound())
- quit("Font ",nam," was not in map file");
- if (font_design_size[f]==0) {
+ quit("Font ", nam, " was not in map file");
+ if (font_design_size[f] == 0) {
read_fontdesc(nam);
read_tfm(f);
}
- for (k=0; k<nfonts; k++)
- if (font_num[k]==n) font_num[k]= -1;
+ for (k = 0; k < nfonts; k++)
+ if (font_num[k] == n)
+ font_num[k] = -1;
font_num[f] = n;
}
@@ -925,14 +1016,16 @@ void do_font_def(int n, char *nam)
/* Given the control points of a cubic Bernstein polynomial, evaluate
it at t.
*/
-float Beval(float *xx, float t)
+float
+Beval(float *xx, float t)
{
float zz[4];
register int i, j;
- for (i=0; i<=3; i++) zz[i]=xx[i];
- for (i=3; i>0; i--)
- for (j=0; j<i; j++)
- zz[j] += t*(zz[j+1]-zz[j]);
+ for (i = 0; i <= 3; i++)
+ zz[i] = xx[i];
+ for (i = 3; i > 0; i--)
+ for (j = 0; j < i; j++)
+ zz[j] += t * (zz[j + 1] - zz[j]);
return zz[0];
}
@@ -941,29 +1034,31 @@ float Beval(float *xx, float t)
The tables below give the Bezier control points for MetaPost's cubic
approximation to the first octant of a unit circle.
*/
-float xx[4] = {1.0, 1.0, 0.8946431597, 0.7071067812};
-float yy[4] = {0.0, 0.2652164899, 0.5195704026, 0.7071067812};
+float xx[4] = { 1.0, 1.0, 0.8946431597, 0.7071067812 };
+float yy[4] = { 0.0, 0.2652164899, 0.5195704026, 0.7071067812 };
-float circangle(float t)
+float
+circangle(float t)
{
float ti;
ti = floor(t);
t -= ti;
- return (float) atan(Beval(yy,t)/Beval(xx,t)) + ti*Speed;
+ return (float) atan(Beval(yy, t) / Beval(xx, t)) + ti * Speed;
}
/* Find the spline parameter where `makepath pencircle' comes closest to
(cos(a)/2,sin(a)/2).
*/
-float circtime(float a)
+float
+circtime(float a)
{
int i;
float t;
- t = a/Speed;
- for (i=2; --i>=0;)
- t += (a - circangle(t))/Speed;
+ t = a / Speed;
+ for (i = 2; --i >= 0;)
+ t += (a - circangle(t)) / Speed;
return t;
}
@@ -973,12 +1068,14 @@ float circtime(float a)
Troff Graphics
***************************************************************/
-float gx, gy; /* current point for graphics (init. (h,YCORR/unit-v) */
+float gx, gy; /* current point for graphics (init. (h,YCORR/unit-v) */
-void prepare_graphics(void)
+void
+prepare_graphics(void)
{
- fprintf(mpxf,"vardef D(expr d)expr q =\n");
- fprintf(mpxf," addto p doublepath q withpen pencircle scaled d; enddef;\n");
+ fprintf(mpxf, "vardef D(expr d)expr q =\n");
+ fprintf(mpxf,
+ " addto p doublepath q withpen pencircle scaled d; enddef;\n");
graphics_used = 1;
}
@@ -988,17 +1085,19 @@ void prepare_graphics(void)
of the string s or NULL if nothing could be read from s, it provides the
argument for the next iteration.
*/
-char *do_line(char *s)
+char *
+do_line(char *s)
{
float dh, dv;
- fprintf(mpxf, "(%.3f,%.3f)", gx*unit, gy*unit);
+ fprintf(mpxf, "(%.3f,%.3f)", gx * unit, gy * unit);
dh = get_float(s);
dv = get_float(arg_tail);
- if (arg_tail==NULL) return NULL;
+ if (arg_tail == NULL)
+ return NULL;
gx += dh;
gy -= dv;
- fprintf(mpxf,"--\n");
+ fprintf(mpxf, "--\n");
return arg_tail;
}
@@ -1010,34 +1109,40 @@ char *do_line(char *s)
terminate the iteration by printing last time's ending point and returning
NULL.
*/
-char * spline_seg(char *s)
+char *
+spline_seg(char *s)
{
float dh1, dv1, dh2, dv2;
dh1 = get_float(s);
dv1 = get_float(arg_tail);
- if (arg_tail==NULL) quit("Missing spline increments","","");
+ if (arg_tail == NULL)
+ quit("Missing spline increments", "", "");
s = arg_tail;
- fprintf(mpxf, "(%.3f,%.3f)", (gx+.5*dh1)*unit, (gy-.5*dv1)*unit);
+ fprintf(mpxf, "(%.3f,%.3f)", (gx + .5 * dh1) * unit,
+ (gy - .5 * dv1) * unit);
gx += dh1;
gy -= dv1;
dh2 = get_float(s);
dv2 = get_float(arg_tail);
- if (arg_tail==NULL) return NULL;
+ if (arg_tail == NULL)
+ return NULL;
fprintf(mpxf, "..\ncontrols (%.3f,%.3f) and (%.3f,%.3f)..\n",
- (gx-dh1/6.0)*unit, (gy+dv1/6.0)*unit, (gx+dh2/6.0)*unit,
- (gy-dv2/6.0)*unit);
+ (gx - dh1 / 6.0) * unit, (gy + dv1 / 6.0) * unit,
+ (gx + dh2 / 6.0) * unit, (gy - dv2 / 6.0) * unit);
return s;
}
/* Draw an ellipse with the given major and minor axes.
*/
-void do_ellipse(float a, float b)
+void
+do_ellipse(float a, float b)
{
fprintf(mpxf, "makepath(pencircle xscaled %.3f\n yscaled %.3f",
- a*unit, b*unit);
- fprintf(mpxf, " shifted (%.3f,%.3f));\n", (gx+.5*a)*unit, gy*unit);
+ a * unit, b * unit);
+ fprintf(mpxf, " shifted (%.3f,%.3f));\n", (gx + .5 * a) * unit,
+ gy * unit);
gx += a;
}
@@ -1045,16 +1150,19 @@ void do_ellipse(float a, float b)
/* Draw a counter-clockwise arc centered at (cx,cy) with initial and final radii
(ax,ay) and (bx,by) respectively.
*/
-void do_arc(float cx, float cy, float ax, float ay, float bx, float by)
+void
+do_arc(float cx, float cy, float ax, float ay, float bx, float by)
{
float t1, t2;
t1 = circtime(atan2(ay, ax));
t2 = circtime(atan2(by, bx));
- if (t2 < t1) t2 += 8.0;
+ if (t2 < t1)
+ t2 += 8.0;
fprintf(mpxf, "subpath (%.5f,%.5f) of\n", t1, t2);
- fprintf(mpxf, " makepath(pencircle scaled %.3f shifted (%.3f,%.3f));\n",
- 2.0*sqrt(ax*ax+ay*ay)*unit, cx*unit, cy*unit);
+ fprintf(mpxf,
+ " makepath(pencircle scaled %.3f shifted (%.3f,%.3f));\n",
+ 2.0 * sqrt(ax * ax + ay * ay) * unit, cx * unit, cy * unit);
gx = cx + bx;
gy = cy + by;
}
@@ -1063,29 +1171,34 @@ void do_arc(float cx, float cy, float ax, float ay, float bx, float by)
/* string s is everything following the initial `D' in a troff graphics command.
*/
-void do_graphic(char *s)
+void
+do_graphic(char *s)
{
float h1, v1, h2, v2;
finish_last_char();
/* GROFF uses Fd to set fill color for solid drawing objects to the
default, so just ignore that.
- */
- if (s[0] == 'F' && s[1] == 'd') return;
+ */
+ if (s[0] == 'F' && s[1] == 'd')
+ return;
gx = (float) h;
- gy = YCORR/unit - ((float) v);
- if (!graphics_used) prepare_graphics();
- fprintf(mpxf,"D(%.4f) ", LWscale*cursize);
+ gy = YCORR / unit - ((float) v);
+ if (!graphics_used)
+ prepare_graphics();
+ fprintf(mpxf, "D(%.4f) ", LWscale * cursize);
switch (*s++) {
case 'c':
h1 = get_float(s);
- if (arg_tail==NULL) quit("Bad argument in ",s-2,"");
- do_ellipse(h1,h1);
+ if (arg_tail == NULL)
+ quit("Bad argument in ", s - 2, "");
+ do_ellipse(h1, h1);
break;
case 'e':
h1 = get_float(s);
v1 = get_float(arg_tail);
- if (arg_tail==NULL) quit("Bad argument in ",s-2,"");
- do_ellipse(h1,v1);
+ if (arg_tail == NULL)
+ quit("Bad argument in ", s - 2, "");
+ do_ellipse(h1, v1);
break;
case 'A':
fprintf(mpxf, "reverse ");
@@ -1095,28 +1208,34 @@ void do_graphic(char *s)
v1 = get_float(arg_tail);
h2 = get_float(arg_tail);
v2 = get_float(arg_tail);
- if (arg_tail==NULL) quit("Bad argument in ",s-2,"");
- do_arc(gx+h1, gy-v1, -h1, v1, h2, -v2);
+ if (arg_tail == NULL)
+ quit("Bad argument in ", s - 2, "");
+ do_arc(gx + h1, gy - v1, -h1, v1, h2, -v2);
break;
- case 'l': case 'p':
- while (s!=NULL)
+ case 'l':
+ case 'p':
+ while (s != NULL)
s = do_line(s);
fprintf(mpxf, ";\n");
break;
case 'q':
- do s = spline_seg(s); while (s!=NULL);
+ do
+ s = spline_seg(s);
+ while (s != NULL);
fprintf(mpxf, ";\n");
break;
case '~':
- fprintf(mpxf, "(%.3f,%.3f)--", gx*unit, gy*unit);
- do s = spline_seg(s); while (s!=NULL);
- fprintf(mpxf, "--(%.3f,%.3f);\n", gx*unit, gy*unit);
+ fprintf(mpxf, "(%.3f,%.3f)--", gx * unit, gy * unit);
+ do
+ s = spline_seg(s);
+ while (s != NULL);
+ fprintf(mpxf, "--(%.3f,%.3f);\n", gx * unit, gy * unit);
break;
default:
- quit("Unknown drawing function",s-2,"");
+ quit("Unknown drawing function", s - 2, "");
}
- h = (int) floor(gx+.5);
- v = (int) floor(YCORR/unit+.5-gy);
+ h = (int) floor(gx + .5);
+ v = (int) floor(YCORR / unit + .5 - gy);
}
@@ -1125,68 +1244,84 @@ void do_graphic(char *s)
Interpreting Troff Output
***************************************************************/
-void change_font(int f)
+void
+change_font(int f)
{
- for (curfont=0; curfont<nfonts; curfont++)
- if (font_num[curfont]==f) return;
- quit("Bad font setting","","");
+ for (curfont = 0; curfont < nfonts; curfont++)
+ if (font_num[curfont] == f)
+ return;
+ quit("Bad font setting", "", "");
}
/* String s0 is everything following the initial `x' in a troff device control
command. A zero result indicates a stop command.
*/
-int do_x_cmd(char *s0)
+int
+do_x_cmd(char *s0)
{
float x;
int n;
char *s;
s = s0;
- while (*s==' ' || *s=='\t') s++;
+ while (*s == ' ' || *s == '\t')
+ s++;
switch (*s++) {
case 'r':
- if (unit!=0.0) quit("Attempt to reset resolution","","");
- while (*s!=' ' && *s!='\t') s++;
+ if (unit != 0.0)
+ quit("Attempt to reset resolution", "", "");
+ while (*s != ' ' && *s != '\t')
+ s++;
unit = get_float(s);
- if (unit<=0.0) quit("Bad resolution: x",s0,"");
- unit = 72.0/unit;
+ if (unit <= 0.0)
+ quit("Bad resolution: x", s0, "");
+ unit = 72.0 / unit;
break;
case 'f':
- while (*s!=' ' && *s!='\t') s++;
+ while (*s != ' ' && *s != '\t')
+ s++;
n = get_int(s);
- if (arg_tail==NULL) quit("Bad font def: x",s0,"");
+ if (arg_tail == NULL)
+ quit("Bad font def: x", s0, "");
s = arg_tail;
- while (*s==' ' || *s=='\t') s++;
+ while (*s == ' ' || *s == '\t')
+ s++;
do_font_def(n, s);
break;
case 's':
return 0;
case 'H':
- while (*s!=' ' && *s!='\t') s++;
+ while (*s != ' ' && *s != '\t')
+ s++;
Xheight = get_float(s);
/* GROFF troff output is scaled
groff_out(5): The argument to the s command is in scaled
- points (units of points/n, where n is the argument
- to the sizescale command in the DESC file.) The
- argument to the x Height command is also in scaled points.
- sizescale for groff devps is 1000
- */
+ points (units of points/n, where n is the argument
+ to the sizescale command in the DESC file.) The
+ argument to the x Height command is also in scaled points.
+ sizescale for groff devps is 1000
+ */
if (sizescale) {
- if(unit != 0.0) Xheight *= unit; /* ??? */
- else Xheight /= sizescale;
+ if (unit != 0.0)
+ Xheight *= unit; /* ??? */
+ else
+ Xheight /= sizescale;
}
- if (Xheight==cursize) Xheight=0.0;
+ if (Xheight == cursize)
+ Xheight = 0.0;
break;
case 'S':
- while (*s!=' ' && *s!='\t') s++;
- Xslant = get_float(s)*(PI/180.0);
+ while (*s != ' ' && *s != '\t')
+ s++;
+ Xslant = get_float(s) * (PI / 180.0);
x = cos(Xslant);
- if (-1e-4<x && x<1e-4) quit("Excessive slant","","");
- Xslant = sin(Xslant)/x;
+ if (-1e-4 < x && x < 1e-4)
+ quit("Excessive slant", "", "");
+ Xslant = sin(Xslant) / x;
break;
default:
- /* do nothing */;
+ /* do nothing */ ;
}
return 1;
}
@@ -1205,118 +1340,142 @@ int do_x_cmd(char *s0)
must be disabled by removing the line "tcommand" from the DESC file
in the $(prefix)/lib/groff/devps directory.
*/
-int do_page(void)
+int
+do_page(void)
{
char buf[LLENGTH];
char a, *c, *cc;
h = v = 0;
- while (fgets(buf,LLENGTH,trf)!=NULL) {
- for (c=buf; *c!='\n'; c++)
- if (*c=='\0') quit("Need to increase LLENGTH","","");
+ while (fgets(buf, LLENGTH, trf) != NULL) {
+ for (c = buf; *c != '\n'; c++)
+ if (*c == '\0')
+ quit("Need to increase LLENGTH", "", "");
*c = '\0';
lnno++;
c = buf;
- while (*c!='\0') {
- switch(*c) {
- case ' ': case '\t': case 'w':
+ while (*c != '\0') {
+ switch (*c) {
+ case ' ':
+ case '\t':
+ case 'w':
c++;
break;
case 's':
- cursize = get_float(c+1);
+ cursize = get_float(c + 1);
/* GROFF troff output is scaled
groff_out(5): The argument to the s command is in scaled
- points (units of points/n, where n is the argument
- to the sizescale command in the DESC file.) The
- argument to the x Height command is also in scaled
- points.
- sizescale for groff devps is 1000
- */
+ points (units of points/n, where n is the argument
+ to the sizescale command in the DESC file.) The
+ argument to the x Height command is also in scaled
+ points.
+ sizescale for groff devps is 1000
+ */
if (sizescale) {
- if (unit != 0.0) cursize *= unit; /* ??? */
- else cursize /= sizescale;
+ if (unit != 0.0)
+ cursize *= unit; /* ??? */
+ else
+ cursize /= sizescale;
}
goto iarg;
case 'f':
- change_font(get_int(c+1));
+ change_font(get_int(c + 1));
goto iarg;
case 'c':
- if (c[1]=='\0') quit("Bad c command in troff output","","");
- cc = c+2;
+ if (c[1] == '\0')
+ quit("Bad c command in troff output", "", "");
+ cc = c + 2;
goto set;
case 'C':
- cc=c; do cc++; while (*cc!=' ' && *cc!='\t' && *cc!='\0');
+ cc = c;
+ do
+ cc++;
+ while (*cc != ' ' && *cc != '\t' && *cc != '\0');
goto set;
case 'N':
- set_num_char(curfont, get_int(c+1));
+ set_num_char(curfont, get_int(c + 1));
goto iarg;
case 'H':
- h = get_int(c+1);
+ h = get_int(c + 1);
goto iarg;
case 'V':
- v = get_int(c+1);
+ v = get_int(c + 1);
goto iarg;
case 'h':
- h += get_int(c+1);
+ h += get_int(c + 1);
goto iarg;
case 'v':
- v += get_int(c+1);
+ v += get_int(c + 1);
goto iarg;
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- if (c[1]<'0' || c[1]>'9' || c[2]=='\0')
- quit("Bad nnc command in troff output","","");
- h += 10*(c[0]-'0') + c[1]-'0';
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (c[1] < '0' || c[1] > '9' || c[2] == '\0')
+ quit("Bad nnc command in troff output", "", "");
+ h += 10 * (c[0] - '0') + c[1] - '0';
c++;
- cc = c+2;
+ cc = c + 2;
goto set;
case 'p':
return 1;
case 'n':
- (void) get_int(c+1);
+ (void) get_int(c + 1);
(void) get_int(arg_tail);
goto iarg;
case 'D':
- do_graphic(c+1);
+ do_graphic(c + 1);
goto eoln;
case 'x':
- if (!do_x_cmd(c+1)) return 0;
+ if (!do_x_cmd(c + 1))
+ return 0;
goto eoln;
case '#':
goto eoln;
case 'F':
- /* GROFF uses this command to report filename */
- goto eoln;
+ /* GROFF uses this command to report filename */
+ goto eoln;
case 'm':
- /* GROFF uses this command to control color */
+ /* GROFF uses this command to control color */
goto eoln;
case 'u':
- /* GROFF uses this command to output a word with additional
- white space between characters, not implemented
- */
+ /* GROFF uses this command to output a word with additional
+ white space between characters, not implemented
+ */
quit("Bad command in troff output\n",
- "change the DESC file for your GROFF PostScript device, ",
- "remove tcommand");
+ "change the DESC file for your GROFF PostScript device, ",
+ "remove tcommand");
case 't':
- /* GROFF uses this command to output a word */
- cc=c; do cc++; while (*cc!=' ' && *cc!='\t' && *cc!='\0');
- a= *cc; *cc='\0';
- set_string(++c);
- c = cc;
- *c = a;
- continue;
+ /* GROFF uses this command to output a word */
+ cc = c;
+ do
+ cc++;
+ while (*cc != ' ' && *cc != '\t' && *cc != '\0');
+ a = *cc;
+ *cc = '\0';
+ set_string(++c);
+ c = cc;
+ *c = a;
+ continue;
default:
- quit("Bad command in troff output","","");
+ quit("Bad command in troff output", "", "");
}
continue;
- set:a= *cc; *cc='\0';
+ set:a = *cc;
+ *cc = '\0';
set_char(++c);
c = cc;
*c = a;
continue;
- iarg:c = arg_tail;
+ iarg:c = arg_tail;
}
- eoln:/* do nothing */;
+ eoln: /* do nothing */ ;
}
return 0;
}
@@ -1326,55 +1485,59 @@ int do_page(void)
Main Program
***************************************************************/
-void usage (char *name, int status)
+void
+usage(char *name, int status)
{
FILE *f = status == 0 ? stdout : stderr;
- fputs ("Usage: dmp [OPTION]... DITROFFFILE [MPXFILE]\n\
+ fputs("Usage: dmp [OPTION]... DITROFFFILE [MPXFILE]\n\
Translate DITROFFFILE to the MetaPost MPXFILE or standard output.\n\
\n\
--help display this help and exit\n\
--version output version information and exit\n", f);
- putc ('\n', f);
- fputs ("Email bug reports to metapost@tug.org.\n", f);
+ putc('\n', f);
+ fputs("Email bug reports to metapost@tug.org.\n", f);
exit(status);
}
-int main(int argc, char **argv)
+int
+main(int argc, char **argv)
{
int more;
- fsearch_init();
+ fsearch_init(argc, argv);
trf = stdin;
mpxf = stdout;
if (argc == 1) {
- fputs ("dmp: Need one or two file arguments.\n", stderr);
- fputs ("Try `dmp --help' for more information.\n", stderr);
- exit(1);
- } else if (argc > 1 && (strcmp (argv[1], "--help") == 0
- || strcmp (argv[1], "-help") == 0)) {
- usage (argv[0], 0);
- } else if (argc > 1 && (strcmp (argv[1], "--version") == 0
- || strcmp (argv[1], "-version") == 0)) {
- fputs (term_banner,stdout);
- fputs ("\nThis program is in the public domain.\n\
-Primary author of dmp: John Hobby.\n", stdout);
- exit (0);
+ fputs("dmp: Need one or two file arguments.\n", stderr);
+ fputs("Try `dmp --help' for more information.\n", stderr);
+ exit(1);
+ } else if (argc > 1 && (strcmp(argv[1], "--help") == 0
+ || strcmp(argv[1], "-help") == 0)) {
+ usage(argv[0], 0);
+ } else if (argc > 1 && (strcmp(argv[1], "--version") == 0
+ || strcmp(argv[1], "-version") == 0)) {
+ fputs(term_banner, stdout);
+ fputs("\nThis program is in the public domain.\n\
+Primary author of dmp: John Hobby.\n\
+Current maintainer: Taco Hoekwater.\n", stdout);
+ exit(0);
}
- if (argc>3) usage(argv[0], 1);
- if (argc>1) {
+ if (argc > 3)
+ usage(argv[0], 1);
+ if (argc > 1) {
trf = fopen(argv[1], "r");
- if (trf==(FILE*)0) {
- fprintf (stderr, "%s: ", argv[0]);
- perror (argv[1]);
- exit(1);
+ if (trf == (FILE *) 0) {
+ fprintf(stderr, "%s: ", argv[0]);
+ perror(argv[1]);
+ exit(1);
}
- if (argc>2) {
+ if (argc > 2) {
mpxf = fopen(argv[2], "w");
- if (mpxf==(FILE*)0) {
- fprintf (stderr, "%s: ", argv[0]);
- perror (argv[2]);
- exit(1);
+ if (mpxf == (FILE *) 0) {
+ fprintf(stderr, "%s: ", argv[0]);
+ perror(argv[2]);
+ exit(1);
}
}
}
@@ -1382,17 +1545,17 @@ Primary author of dmp: John Hobby.\n", stdout);
read_desc();
read_fmap(dbname);
if (!gflag)
- read_char_adj(adjname);
+ read_char_adj(adjname);
if (do_page()) {
do {
- h=0; v=0;
+ h = 0;
+ v = 0;
Xslant = Xheight = 0.0;
start_picture();
more = do_page();
stop_picture();
- fprintf(mpxf,"mpxbreak\n");
+ fprintf(mpxf, "mpxbreak\n");
} while (more);
}
exit(0);
}
-