1*31129d4fSBaptiste Daroussin /* $OpenBSD: misc.c,v 1.45 2014/12/21 09:33:12 espie Exp $ */ 2acc9d408SJuli Mallett /* $NetBSD: misc.c,v 1.6 1995/09/28 05:37:41 tls Exp $ */ 3acc9d408SJuli Mallett 49b50d902SRodney W. Grimes /* 59b50d902SRodney W. Grimes * Copyright (c) 1989, 1993 69b50d902SRodney W. Grimes * The Regents of the University of California. All rights reserved. 79b50d902SRodney W. Grimes * 89b50d902SRodney W. Grimes * This code is derived from software contributed to Berkeley by 99b50d902SRodney W. Grimes * Ozan Yigit at York University. 109b50d902SRodney W. Grimes * 119b50d902SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 129b50d902SRodney W. Grimes * modification, are permitted provided that the following conditions 139b50d902SRodney W. Grimes * are met: 149b50d902SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 159b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 169b50d902SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 179b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 189b50d902SRodney W. Grimes * documentation and/or other materials provided with the distribution. 19a841e1ebSBaptiste Daroussin * 3. Neither the name of the University nor the names of its contributors 209b50d902SRodney W. Grimes * may be used to endorse or promote products derived from this software 219b50d902SRodney W. Grimes * without specific prior written permission. 229b50d902SRodney W. Grimes * 239b50d902SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 249b50d902SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 259b50d902SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 269b50d902SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 279b50d902SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 289b50d902SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 299b50d902SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 309b50d902SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 319b50d902SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 329b50d902SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 339b50d902SRodney W. Grimes * SUCH DAMAGE. 349b50d902SRodney W. Grimes */ 3588497f0cSBaptiste Daroussin 36acc9d408SJuli Mallett #include <sys/cdefs.h> 37acc9d408SJuli Mallett __FBSDID("$FreeBSD$"); 389b50d902SRodney W. Grimes 399b50d902SRodney W. Grimes #include <sys/types.h> 40acc9d408SJuli Mallett #include <errno.h> 41acc9d408SJuli Mallett #include <unistd.h> 42a841e1ebSBaptiste Daroussin #include <stdarg.h> 439b50d902SRodney W. Grimes #include <stdio.h> 4488497f0cSBaptiste Daroussin #include <stdint.h> 459b50d902SRodney W. Grimes #include <stdlib.h> 46acc9d408SJuli Mallett #include <stddef.h> 479b50d902SRodney W. Grimes #include <string.h> 48acc9d408SJuli Mallett #include <err.h> 499b50d902SRodney W. Grimes #include "mdef.h" 509b50d902SRodney W. Grimes #include "stdd.h" 519b50d902SRodney W. Grimes #include "extern.h" 529b50d902SRodney W. Grimes #include "pathnames.h" 539b50d902SRodney W. Grimes 54acc9d408SJuli Mallett 55acc9d408SJuli Mallett char *ep; /* first free char in strspace */ 56acc9d408SJuli Mallett static char *strspace; /* string space for evaluation */ 57acc9d408SJuli Mallett char *endest; /* end of string space */ 58acc9d408SJuli Mallett static size_t strsize = STRSPMAX; 59acc9d408SJuli Mallett static size_t bufsize = BUFSIZE; 60acc9d408SJuli Mallett 61a841e1ebSBaptiste Daroussin unsigned char *buf; /* push-back buffer */ 62a841e1ebSBaptiste Daroussin unsigned char *bufbase; /* the base for current ilevel */ 63a841e1ebSBaptiste Daroussin unsigned char *bbase[MAXINP]; /* the base for each ilevel */ 64a841e1ebSBaptiste Daroussin unsigned char *bp; /* first available character */ 65a841e1ebSBaptiste Daroussin unsigned char *endpbb; /* end of push-back buffer */ 66acc9d408SJuli Mallett 67*31129d4fSBaptiste Daroussin 689b50d902SRodney W. Grimes /* 699b50d902SRodney W. Grimes * find the index of second str in the first str. 709b50d902SRodney W. Grimes */ 71acc9d408SJuli Mallett ptrdiff_t 72bd2bfb58SJuli Mallett indx(const char *s1, const char *s2) 739b50d902SRodney W. Grimes { 74acc9d408SJuli Mallett char *t; 759b50d902SRodney W. Grimes 76acc9d408SJuli Mallett t = strstr(s1, s2); 77acc9d408SJuli Mallett if (t == NULL) 789b50d902SRodney W. Grimes return (-1); 79acc9d408SJuli Mallett else 80acc9d408SJuli Mallett return (t - s1); 819b50d902SRodney W. Grimes } 829b50d902SRodney W. Grimes /* 83a841e1ebSBaptiste Daroussin * pushback - push character back onto input 849b50d902SRodney W. Grimes */ 859b50d902SRodney W. Grimes void 86a841e1ebSBaptiste Daroussin pushback(int c) 879b50d902SRodney W. Grimes { 887c5eeb39SAndrey A. Chernov if (c == EOF) 89b63b4cdbSAndrey A. Chernov return; 90acc9d408SJuli Mallett if (bp >= endpbb) 91acc9d408SJuli Mallett enlarge_bufspace(); 929b50d902SRodney W. Grimes *bp++ = c; 939b50d902SRodney W. Grimes } 949b50d902SRodney W. Grimes 959b50d902SRodney W. Grimes /* 969b50d902SRodney W. Grimes * pbstr - push string back onto input 97a841e1ebSBaptiste Daroussin * pushback is replicated to improve 989b50d902SRodney W. Grimes * performance. 999b50d902SRodney W. Grimes */ 1009b50d902SRodney W. Grimes void 101bd2bfb58SJuli Mallett pbstr(const char *s) 1029b50d902SRodney W. Grimes { 103acc9d408SJuli Mallett size_t n; 1049b50d902SRodney W. Grimes 105acc9d408SJuli Mallett n = strlen(s); 106a841e1ebSBaptiste Daroussin while (endpbb - bp <= (long)n) 107acc9d408SJuli Mallett enlarge_bufspace(); 108acc9d408SJuli Mallett while (n > 0) 109acc9d408SJuli Mallett *bp++ = s[--n]; 1109b50d902SRodney W. Grimes } 1119b50d902SRodney W. Grimes 1129b50d902SRodney W. Grimes /* 1139b50d902SRodney W. Grimes * pbnum - convert number to string, push back on input. 1149b50d902SRodney W. Grimes */ 1159b50d902SRodney W. Grimes void 116bd2bfb58SJuli Mallett pbnum(int n) 1179b50d902SRodney W. Grimes { 118a841e1ebSBaptiste Daroussin pbnumbase(n, 10, 0); 119a841e1ebSBaptiste Daroussin } 120a841e1ebSBaptiste Daroussin 121a841e1ebSBaptiste Daroussin void 122a841e1ebSBaptiste Daroussin pbnumbase(int n, int base, int d) 123a841e1ebSBaptiste Daroussin { 124a841e1ebSBaptiste Daroussin static char digits[36] = "0123456789abcdefghijklmnopqrstuvwxyz"; 125acc9d408SJuli Mallett int num; 126a841e1ebSBaptiste Daroussin int printed = 0; 127a841e1ebSBaptiste Daroussin 128a841e1ebSBaptiste Daroussin if (base > 36) 129a841e1ebSBaptiste Daroussin m4errx(1, "base %d > 36: not supported.", base); 130a841e1ebSBaptiste Daroussin 131a841e1ebSBaptiste Daroussin if (base < 2) 132a841e1ebSBaptiste Daroussin m4errx(1, "bad base %d for conversion.", base); 1339b50d902SRodney W. Grimes 1349b50d902SRodney W. Grimes num = (n < 0) ? -n : n; 1359b50d902SRodney W. Grimes do { 136a841e1ebSBaptiste Daroussin pushback(digits[num % base]); 137a841e1ebSBaptiste Daroussin printed++; 1389b50d902SRodney W. Grimes } 139a841e1ebSBaptiste Daroussin while ((num /= base) > 0); 1409b50d902SRodney W. Grimes 1419b50d902SRodney W. Grimes if (n < 0) 142a841e1ebSBaptiste Daroussin printed++; 143a841e1ebSBaptiste Daroussin while (printed++ < d) 144a841e1ebSBaptiste Daroussin pushback('0'); 145a841e1ebSBaptiste Daroussin 146a841e1ebSBaptiste Daroussin if (n < 0) 147a841e1ebSBaptiste Daroussin pushback('-'); 1489b50d902SRodney W. Grimes } 1499b50d902SRodney W. Grimes 1509b50d902SRodney W. Grimes /* 151acc9d408SJuli Mallett * pbunsigned - convert unsigned long to string, push back on input. 152acc9d408SJuli Mallett */ 153acc9d408SJuli Mallett void 154bd2bfb58SJuli Mallett pbunsigned(unsigned long n) 155acc9d408SJuli Mallett { 156acc9d408SJuli Mallett do { 157a841e1ebSBaptiste Daroussin pushback(n % 10 + '0'); 158acc9d408SJuli Mallett } 159acc9d408SJuli Mallett while ((n /= 10) > 0); 160acc9d408SJuli Mallett } 161acc9d408SJuli Mallett 162acc9d408SJuli Mallett void 163d1fea89cSJuli Mallett initspaces(void) 164acc9d408SJuli Mallett { 165acc9d408SJuli Mallett int i; 166acc9d408SJuli Mallett 167a841e1ebSBaptiste Daroussin strspace = xalloc(strsize+1, NULL); 168acc9d408SJuli Mallett ep = strspace; 169acc9d408SJuli Mallett endest = strspace+strsize; 17088497f0cSBaptiste Daroussin buf = xalloc(bufsize, NULL); 171acc9d408SJuli Mallett bufbase = buf; 172acc9d408SJuli Mallett bp = buf; 173acc9d408SJuli Mallett endpbb = buf + bufsize; 174acc9d408SJuli Mallett for (i = 0; i < MAXINP; i++) 175acc9d408SJuli Mallett bbase[i] = buf; 176acc9d408SJuli Mallett } 177acc9d408SJuli Mallett 178acc9d408SJuli Mallett void 179d1fea89cSJuli Mallett enlarge_strspace(void) 180acc9d408SJuli Mallett { 181acc9d408SJuli Mallett char *newstrspace; 182acc9d408SJuli Mallett int i; 183acc9d408SJuli Mallett 184acc9d408SJuli Mallett strsize *= 2; 185acc9d408SJuli Mallett newstrspace = malloc(strsize + 1); 186acc9d408SJuli Mallett if (!newstrspace) 187acc9d408SJuli Mallett errx(1, "string space overflow"); 188acc9d408SJuli Mallett memcpy(newstrspace, strspace, strsize/2); 189acc9d408SJuli Mallett for (i = 0; i <= sp; i++) 190*31129d4fSBaptiste Daroussin if (sstack[i] == STORAGE_STRSPACE) 191acc9d408SJuli Mallett mstack[i].sstr = (mstack[i].sstr - strspace) 192acc9d408SJuli Mallett + newstrspace; 193acc9d408SJuli Mallett ep = (ep-strspace) + newstrspace; 194acc9d408SJuli Mallett free(strspace); 195acc9d408SJuli Mallett strspace = newstrspace; 196acc9d408SJuli Mallett endest = strspace + strsize; 197acc9d408SJuli Mallett } 198acc9d408SJuli Mallett 199acc9d408SJuli Mallett void 200d1fea89cSJuli Mallett enlarge_bufspace(void) 201acc9d408SJuli Mallett { 202a841e1ebSBaptiste Daroussin unsigned char *newbuf; 203acc9d408SJuli Mallett int i; 204acc9d408SJuli Mallett 205a841e1ebSBaptiste Daroussin bufsize += bufsize/2; 206a841e1ebSBaptiste Daroussin newbuf = xrealloc(buf, bufsize, "too many characters pushed back"); 207acc9d408SJuli Mallett for (i = 0; i < MAXINP; i++) 208acc9d408SJuli Mallett bbase[i] = (bbase[i]-buf)+newbuf; 209acc9d408SJuli Mallett bp = (bp-buf)+newbuf; 210acc9d408SJuli Mallett bufbase = (bufbase-buf)+newbuf; 211acc9d408SJuli Mallett buf = newbuf; 212acc9d408SJuli Mallett endpbb = buf+bufsize; 213acc9d408SJuli Mallett } 214acc9d408SJuli Mallett 215acc9d408SJuli Mallett /* 2169b50d902SRodney W. Grimes * chrsave - put single char on string space 2179b50d902SRodney W. Grimes */ 2189b50d902SRodney W. Grimes void 219bd2bfb58SJuli Mallett chrsave(int c) 2209b50d902SRodney W. Grimes { 221acc9d408SJuli Mallett if (ep >= endest) 222acc9d408SJuli Mallett enlarge_strspace(); 2239b50d902SRodney W. Grimes *ep++ = c; 2249b50d902SRodney W. Grimes } 2259b50d902SRodney W. Grimes 2269b50d902SRodney W. Grimes /* 2279b50d902SRodney W. Grimes * read in a diversion file, and dispose it. 2289b50d902SRodney W. Grimes */ 2299b50d902SRodney W. Grimes void 230bd2bfb58SJuli Mallett getdiv(int n) 2319b50d902SRodney W. Grimes { 232acc9d408SJuli Mallett int c; 2339b50d902SRodney W. Grimes 2349b50d902SRodney W. Grimes if (active == outfile[n]) 235a841e1ebSBaptiste Daroussin m4errx(1, "undivert: diversion still active."); 236acc9d408SJuli Mallett rewind(outfile[n]); 237acc9d408SJuli Mallett while ((c = getc(outfile[n])) != EOF) 238acc9d408SJuli Mallett putc(c, active); 2399b50d902SRodney W. Grimes (void) fclose(outfile[n]); 2409b50d902SRodney W. Grimes outfile[n] = NULL; 2419b50d902SRodney W. Grimes } 2429b50d902SRodney W. Grimes 2439b50d902SRodney W. Grimes void 24488497f0cSBaptiste Daroussin onintr(int signo __unused) 2459b50d902SRodney W. Grimes { 246acc9d408SJuli Mallett #define intrmessage "m4: interrupted.\n" 247acc9d408SJuli Mallett write(STDERR_FILENO, intrmessage, sizeof(intrmessage)-1); 248acc9d408SJuli Mallett _exit(1); 2499b50d902SRodney W. Grimes } 2509b50d902SRodney W. Grimes 2519b50d902SRodney W. Grimes /* 2529b50d902SRodney W. Grimes * killdiv - get rid of the diversion files 2539b50d902SRodney W. Grimes */ 2549b50d902SRodney W. Grimes void 255d1fea89cSJuli Mallett killdiv(void) 2569b50d902SRodney W. Grimes { 257acc9d408SJuli Mallett int n; 2589b50d902SRodney W. Grimes 259acc9d408SJuli Mallett for (n = 0; n < maxout; n++) 2609b50d902SRodney W. Grimes if (outfile[n] != NULL) { 2619b50d902SRodney W. Grimes (void) fclose(outfile[n]); 2629b50d902SRodney W. Grimes } 2639b50d902SRodney W. Grimes } 2649b50d902SRodney W. Grimes 265a841e1ebSBaptiste Daroussin extern char *__progname; 266a841e1ebSBaptiste Daroussin 267a841e1ebSBaptiste Daroussin void 268*31129d4fSBaptiste Daroussin m4errx(int eval, const char *fmt, ...) 269a841e1ebSBaptiste Daroussin { 270a841e1ebSBaptiste Daroussin fprintf(stderr, "%s: ", __progname); 271a841e1ebSBaptiste Daroussin fprintf(stderr, "%s at line %lu: ", CURRENT_NAME, CURRENT_LINE); 272a841e1ebSBaptiste Daroussin if (fmt != NULL) { 273a841e1ebSBaptiste Daroussin va_list ap; 274a841e1ebSBaptiste Daroussin 275a841e1ebSBaptiste Daroussin va_start(ap, fmt); 276a841e1ebSBaptiste Daroussin vfprintf(stderr, fmt, ap); 277a841e1ebSBaptiste Daroussin va_end(ap); 278a841e1ebSBaptiste Daroussin } 279a841e1ebSBaptiste Daroussin fprintf(stderr, "\n"); 280*31129d4fSBaptiste Daroussin exit(eval); 281a841e1ebSBaptiste Daroussin } 282a841e1ebSBaptiste Daroussin 283acc9d408SJuli Mallett /* 284acc9d408SJuli Mallett * resizedivs: allocate more diversion files */ 2859b50d902SRodney W. Grimes void 286bd2bfb58SJuli Mallett resizedivs(int n) 287164c01f0SGregory Neil Shapiro { 288acc9d408SJuli Mallett int i; 289acc9d408SJuli Mallett 29088497f0cSBaptiste Daroussin outfile = xreallocarray(outfile, n, sizeof(FILE *), 291a841e1ebSBaptiste Daroussin "too many diverts %d", n); 292acc9d408SJuli Mallett for (i = maxout; i < n; i++) 293acc9d408SJuli Mallett outfile[i] = NULL; 294acc9d408SJuli Mallett maxout = n; 295164c01f0SGregory Neil Shapiro } 296acc9d408SJuli Mallett 297acc9d408SJuli Mallett void * 298a841e1ebSBaptiste Daroussin xalloc(size_t n, const char *fmt, ...) 299acc9d408SJuli Mallett { 300a841e1ebSBaptiste Daroussin void *p = malloc(n); 301acc9d408SJuli Mallett 302a841e1ebSBaptiste Daroussin if (p == NULL) { 303a841e1ebSBaptiste Daroussin if (fmt == NULL) 304acc9d408SJuli Mallett err(1, "malloc"); 305a841e1ebSBaptiste Daroussin else { 306a841e1ebSBaptiste Daroussin va_list va; 307a841e1ebSBaptiste Daroussin 308a841e1ebSBaptiste Daroussin va_start(va, fmt); 309a841e1ebSBaptiste Daroussin verr(1, fmt, va); 310a841e1ebSBaptiste Daroussin va_end(va); 311a841e1ebSBaptiste Daroussin } 312a841e1ebSBaptiste Daroussin } 313a841e1ebSBaptiste Daroussin return p; 314a841e1ebSBaptiste Daroussin } 315a841e1ebSBaptiste Daroussin 316a841e1ebSBaptiste Daroussin void * 31788497f0cSBaptiste Daroussin xcalloc(size_t n, size_t s, const char *fmt, ...) 31888497f0cSBaptiste Daroussin { 31988497f0cSBaptiste Daroussin void *p = calloc(n, s); 32088497f0cSBaptiste Daroussin 32188497f0cSBaptiste Daroussin if (p == NULL) { 32288497f0cSBaptiste Daroussin if (fmt == NULL) 32388497f0cSBaptiste Daroussin err(1, "calloc"); 32488497f0cSBaptiste Daroussin else { 32588497f0cSBaptiste Daroussin va_list va; 32688497f0cSBaptiste Daroussin 32788497f0cSBaptiste Daroussin va_start(va, fmt); 32888497f0cSBaptiste Daroussin verr(1, fmt, va); 32988497f0cSBaptiste Daroussin va_end(va); 33088497f0cSBaptiste Daroussin } 33188497f0cSBaptiste Daroussin } 33288497f0cSBaptiste Daroussin return p; 33388497f0cSBaptiste Daroussin } 33488497f0cSBaptiste Daroussin 33588497f0cSBaptiste Daroussin void * 336a841e1ebSBaptiste Daroussin xrealloc(void *old, size_t n, const char *fmt, ...) 337a841e1ebSBaptiste Daroussin { 338a841e1ebSBaptiste Daroussin char *p = realloc(old, n); 339a841e1ebSBaptiste Daroussin 340a841e1ebSBaptiste Daroussin if (p == NULL) { 341a841e1ebSBaptiste Daroussin free(old); 342a841e1ebSBaptiste Daroussin if (fmt == NULL) 343a841e1ebSBaptiste Daroussin err(1, "realloc"); 344a841e1ebSBaptiste Daroussin else { 345a841e1ebSBaptiste Daroussin va_list va; 346a841e1ebSBaptiste Daroussin 347a841e1ebSBaptiste Daroussin va_start(va, fmt); 348a841e1ebSBaptiste Daroussin verr(1, fmt, va); 349a841e1ebSBaptiste Daroussin va_end(va); 350a841e1ebSBaptiste Daroussin } 351a841e1ebSBaptiste Daroussin } 352acc9d408SJuli Mallett return p; 353acc9d408SJuli Mallett } 354acc9d408SJuli Mallett 35588497f0cSBaptiste Daroussin void * 35688497f0cSBaptiste Daroussin xreallocarray(void *old, size_t s1, size_t s2, const char *fmt, ...) 35788497f0cSBaptiste Daroussin { 35888497f0cSBaptiste Daroussin void *p = reallocarray(old, s1, s2); 35988497f0cSBaptiste Daroussin 36088497f0cSBaptiste Daroussin if (p == NULL) { 36188497f0cSBaptiste Daroussin free(old); 36288497f0cSBaptiste Daroussin if (fmt == NULL) 36388497f0cSBaptiste Daroussin err(1, "reallocarray"); 36488497f0cSBaptiste Daroussin else { 36588497f0cSBaptiste Daroussin va_list va; 36688497f0cSBaptiste Daroussin 36788497f0cSBaptiste Daroussin va_start(va, fmt); 36888497f0cSBaptiste Daroussin verr(1, fmt, va); 36988497f0cSBaptiste Daroussin va_end(va); 37088497f0cSBaptiste Daroussin } 37188497f0cSBaptiste Daroussin } 37288497f0cSBaptiste Daroussin return p; 37388497f0cSBaptiste Daroussin } 37488497f0cSBaptiste Daroussin 375acc9d408SJuli Mallett char * 376bd2bfb58SJuli Mallett xstrdup(const char *s) 377acc9d408SJuli Mallett { 378acc9d408SJuli Mallett char *p = strdup(s); 379acc9d408SJuli Mallett if (p == NULL) 380acc9d408SJuli Mallett err(1, "strdup"); 381acc9d408SJuli Mallett return p; 382164c01f0SGregory Neil Shapiro } 383164c01f0SGregory Neil Shapiro 384164c01f0SGregory Neil Shapiro void 385d1fea89cSJuli Mallett usage(void) 3869b50d902SRodney W. Grimes { 387a841e1ebSBaptiste Daroussin fprintf(stderr, "usage: m4 [-gPs] [-Dname[=value]] [-d flags] " 388a841e1ebSBaptiste Daroussin "[-I dirname] [-o filename]\n" 389a841e1ebSBaptiste Daroussin "\t[-t macro] [-Uname] [file ...]\n"); 3909b50d902SRodney W. Grimes exit(1); 3919b50d902SRodney W. Grimes } 392acc9d408SJuli Mallett 393acc9d408SJuli Mallett int 394bd2bfb58SJuli Mallett obtain_char(struct input_file *f) 395acc9d408SJuli Mallett { 396acc9d408SJuli Mallett if (f->c == EOF) 397acc9d408SJuli Mallett return EOF; 398acc9d408SJuli Mallett 399acc9d408SJuli Mallett f->c = fgetc(f->file); 400a841e1ebSBaptiste Daroussin if (f->c == '\n') 401a841e1ebSBaptiste Daroussin f->lineno++; 402a841e1ebSBaptiste Daroussin 403acc9d408SJuli Mallett return f->c; 404acc9d408SJuli Mallett } 405acc9d408SJuli Mallett 406acc9d408SJuli Mallett void 407bd2bfb58SJuli Mallett set_input(struct input_file *f, FILE *real, const char *name) 408acc9d408SJuli Mallett { 409acc9d408SJuli Mallett f->file = real; 410acc9d408SJuli Mallett f->lineno = 1; 411acc9d408SJuli Mallett f->c = 0; 412acc9d408SJuli Mallett f->name = xstrdup(name); 413a841e1ebSBaptiste Daroussin emit_synchline(); 414a841e1ebSBaptiste Daroussin } 415a841e1ebSBaptiste Daroussin 416a841e1ebSBaptiste Daroussin void 417a841e1ebSBaptiste Daroussin do_emit_synchline(void) 418a841e1ebSBaptiste Daroussin { 419a841e1ebSBaptiste Daroussin fprintf(active, "#line %lu \"%s\"\n", 420a841e1ebSBaptiste Daroussin infile[ilevel].lineno, infile[ilevel].name); 421a841e1ebSBaptiste Daroussin infile[ilevel].synch_lineno = infile[ilevel].lineno; 422acc9d408SJuli Mallett } 423acc9d408SJuli Mallett 424acc9d408SJuli Mallett void 425bd2bfb58SJuli Mallett release_input(struct input_file *f) 426acc9d408SJuli Mallett { 427acc9d408SJuli Mallett if (f->file != stdin) 428acc9d408SJuli Mallett fclose(f->file); 429acc9d408SJuli Mallett f->c = EOF; 430acc9d408SJuli Mallett /* 431acc9d408SJuli Mallett * XXX can't free filename, as there might still be 432acc9d408SJuli Mallett * error information pointing to it. 433acc9d408SJuli Mallett */ 434acc9d408SJuli Mallett } 435acc9d408SJuli Mallett 436acc9d408SJuli Mallett void 437bd2bfb58SJuli Mallett doprintlineno(struct input_file *f) 438acc9d408SJuli Mallett { 439acc9d408SJuli Mallett pbunsigned(f->lineno); 440acc9d408SJuli Mallett } 441acc9d408SJuli Mallett 442acc9d408SJuli Mallett void 443bd2bfb58SJuli Mallett doprintfilename(struct input_file *f) 444acc9d408SJuli Mallett { 445acc9d408SJuli Mallett pbstr(rquote); 446acc9d408SJuli Mallett pbstr(f->name); 447acc9d408SJuli Mallett pbstr(lquote); 448acc9d408SJuli Mallett } 449acc9d408SJuli Mallett 450acc9d408SJuli Mallett /* 451acc9d408SJuli Mallett * buffer_mark/dump_buffer: allows one to save a mark in a buffer, 452acc9d408SJuli Mallett * and later dump everything that was added since then to a file. 453acc9d408SJuli Mallett */ 454acc9d408SJuli Mallett size_t 455d1fea89cSJuli Mallett buffer_mark(void) 456acc9d408SJuli Mallett { 457acc9d408SJuli Mallett return bp - buf; 458acc9d408SJuli Mallett } 459acc9d408SJuli Mallett 460acc9d408SJuli Mallett 461acc9d408SJuli Mallett void 462bd2bfb58SJuli Mallett dump_buffer(FILE *f, size_t m) 463acc9d408SJuli Mallett { 464a841e1ebSBaptiste Daroussin unsigned char *s; 465acc9d408SJuli Mallett 466a841e1ebSBaptiste Daroussin for (s = bp; s-buf > (long)m;) 467acc9d408SJuli Mallett fputc(*--s, f); 468acc9d408SJuli Mallett } 469