2 * NEATROFF TYPESETTING SYSTEM
4 * Copyright (C) 2012-2016 Ali Gholami Rudi <ali at rudi dot ir>
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24 void errmsg(char *fmt
, ...)
28 vfprintf(stderr
, fmt
, ap
);
32 void errdie(char *msg
)
38 void *mextend(void *old
, long oldsz
, long newsz
, int memsz
)
40 void *new = xmalloc(newsz
* memsz
);
41 memcpy(new, old
, oldsz
* memsz
);
42 memset(new + oldsz
* memsz
, 0, (newsz
- oldsz
) * memsz
);
47 void *xmalloc(long len
)
49 void *m
= malloc(len
);
51 errdie("neatroff: malloc() failed\n");
55 static int xopens(char *path
)
57 FILE *filp
= fopen(path
, "r");
63 /* parse the argument of -r and -d options */
64 static void cmddef(char *arg
, int *reg
, char **def
)
66 char regname
[RNLEN
] = "";
67 char *eq
= strchr(arg
, '=');
68 memcpy(regname
, arg
, eq
? MIN(RNLEN
- 1, eq
- arg
) : 1);
70 *def
= eq
? eq
+ 1 : arg
+ 1;
73 /* find the macro specified with -m option */
74 static int cmdmac(char *dir
, char *arg
)
77 snprintf(path
, sizeof(path
), "%s/%s.tmac", dir
, arg
);
79 snprintf(path
, sizeof(path
), "%s/tmac.%s", dir
, arg
);
81 snprintf(path
, sizeof(path
), "%s/%s", dir
, arg
);
89 "Usage: neatroff [options] input\n\n"
91 " -mx \tinclude macro x\n"
92 " -rx=y \tset number register x to y\n"
93 " -dx=y \tdefine string register x as y\n"
94 " -C \tenable compatibility mode\n"
95 " -Tdev \tset output device\n"
96 " -Fdir \tset font directory (" TROFFFDIR
")\n"
97 " -Mdir \tset macro directory (" TROFFMDIR
")\n";
99 int main(int argc
, char **argv
)
101 char *fontdir
= TROFFFDIR
;
102 char *macrodir
= TROFFMDIR
;
103 char *mac
, *def
, *dev
= "utf";
106 for (i
= 1; i
< argc
; i
++) {
107 if (argv
[i
][0] != '-' || !argv
[i
][1])
109 switch (argv
[i
][1]) {
115 if (strchr(mac
, '/') || (cmdmac(macrodir
, mac
) && cmdmac(".", mac
)))
119 cmddef(argv
[i
][2] ? argv
[i
] + 2 : argv
[++i
], ®
, &def
);
120 num_set(reg
, eval_re(def
, num_get(reg
), 'u'));
123 cmddef(argv
[i
][2] ? argv
[i
] + 2 : argv
[++i
], ®
, &def
);
127 fontdir
= argv
[i
][2] ? argv
[i
] + 2 : argv
[++i
];
130 macrodir
= argv
[i
][2] ? argv
[i
] + 2 : argv
[++i
];
133 dev
= argv
[i
][2] ? argv
[i
] + 2 : argv
[++i
];
140 if (dev_open(fontdir
, dev
)) {
141 fprintf(stderr
, "neatroff: cannot open device %s\n", dev
);
148 in_queue(NULL
); /* reading from standard input */
149 for (; i
< argc
; i
++)
150 in_queue(!strcmp("-", argv
[i
]) ? NULL
: argv
[i
]);