1*a841e1ebSBaptiste Daroussin /* $OpenBSD: misc.c,v 1.42 2010/09/07 19:58:09 marco 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. 19*a841e1ebSBaptiste 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 */ 35acc9d408SJuli Mallett #include <sys/cdefs.h> 36acc9d408SJuli Mallett __FBSDID("$FreeBSD$"); 379b50d902SRodney W. Grimes 389b50d902SRodney W. Grimes #include <sys/types.h> 39acc9d408SJuli Mallett #include <errno.h> 40acc9d408SJuli Mallett #include <unistd.h> 41*a841e1ebSBaptiste Daroussin #include <stdarg.h> 429b50d902SRodney W. Grimes #include <stdio.h> 439b50d902SRodney W. Grimes #include <stdlib.h> 44acc9d408SJuli Mallett #include <stddef.h> 459b50d902SRodney W. Grimes #include <string.h> 46acc9d408SJuli Mallett #include <err.h> 479b50d902SRodney W. Grimes #include "mdef.h" 489b50d902SRodney W. Grimes #include "stdd.h" 499b50d902SRodney W. Grimes #include "extern.h" 509b50d902SRodney W. Grimes #include "pathnames.h" 519b50d902SRodney W. Grimes 52acc9d408SJuli Mallett 53acc9d408SJuli Mallett char *ep; /* first free char in strspace */ 54acc9d408SJuli Mallett static char *strspace; /* string space for evaluation */ 55acc9d408SJuli Mallett char *endest; /* end of string space */ 56acc9d408SJuli Mallett static size_t strsize = STRSPMAX; 57acc9d408SJuli Mallett static size_t bufsize = BUFSIZE; 58acc9d408SJuli Mallett 59*a841e1ebSBaptiste Daroussin unsigned char *buf; /* push-back buffer */ 60*a841e1ebSBaptiste Daroussin unsigned char *bufbase; /* the base for current ilevel */ 61*a841e1ebSBaptiste Daroussin unsigned char *bbase[MAXINP]; /* the base for each ilevel */ 62*a841e1ebSBaptiste Daroussin unsigned char *bp; /* first available character */ 63*a841e1ebSBaptiste Daroussin unsigned char *endpbb; /* end of push-back buffer */ 64acc9d408SJuli Mallett 65acc9d408SJuli Mallett 669b50d902SRodney W. Grimes /* 679b50d902SRodney W. Grimes * find the index of second str in the first str. 689b50d902SRodney W. Grimes */ 69acc9d408SJuli Mallett ptrdiff_t 70bd2bfb58SJuli Mallett indx(const char *s1, const char *s2) 719b50d902SRodney W. Grimes { 72acc9d408SJuli Mallett char *t; 739b50d902SRodney W. Grimes 74acc9d408SJuli Mallett t = strstr(s1, s2); 75acc9d408SJuli Mallett if (t == NULL) 769b50d902SRodney W. Grimes return (-1); 77acc9d408SJuli Mallett else 78acc9d408SJuli Mallett return (t - s1); 799b50d902SRodney W. Grimes } 809b50d902SRodney W. Grimes /* 81*a841e1ebSBaptiste Daroussin * pushback - push character back onto input 829b50d902SRodney W. Grimes */ 839b50d902SRodney W. Grimes void 84*a841e1ebSBaptiste Daroussin pushback(int c) 859b50d902SRodney W. Grimes { 867c5eeb39SAndrey A. Chernov if (c == EOF) 87b63b4cdbSAndrey A. Chernov return; 88acc9d408SJuli Mallett if (bp >= endpbb) 89acc9d408SJuli Mallett enlarge_bufspace(); 909b50d902SRodney W. Grimes *bp++ = c; 919b50d902SRodney W. Grimes } 929b50d902SRodney W. Grimes 939b50d902SRodney W. Grimes /* 949b50d902SRodney W. Grimes * pbstr - push string back onto input 95*a841e1ebSBaptiste Daroussin * pushback is replicated to improve 969b50d902SRodney W. Grimes * performance. 979b50d902SRodney W. Grimes */ 989b50d902SRodney W. Grimes void 99bd2bfb58SJuli Mallett pbstr(const char *s) 1009b50d902SRodney W. Grimes { 101acc9d408SJuli Mallett size_t n; 1029b50d902SRodney W. Grimes 103acc9d408SJuli Mallett n = strlen(s); 104*a841e1ebSBaptiste Daroussin while (endpbb - bp <= (long)n) 105acc9d408SJuli Mallett enlarge_bufspace(); 106acc9d408SJuli Mallett while (n > 0) 107acc9d408SJuli Mallett *bp++ = s[--n]; 1089b50d902SRodney W. Grimes } 1099b50d902SRodney W. Grimes 1109b50d902SRodney W. Grimes /* 1119b50d902SRodney W. Grimes * pbnum - convert number to string, push back on input. 1129b50d902SRodney W. Grimes */ 1139b50d902SRodney W. Grimes void 114bd2bfb58SJuli Mallett pbnum(int n) 1159b50d902SRodney W. Grimes { 116*a841e1ebSBaptiste Daroussin pbnumbase(n, 10, 0); 117*a841e1ebSBaptiste Daroussin } 118*a841e1ebSBaptiste Daroussin 119*a841e1ebSBaptiste Daroussin void 120*a841e1ebSBaptiste Daroussin pbnumbase(int n, int base, int d) 121*a841e1ebSBaptiste Daroussin { 122*a841e1ebSBaptiste Daroussin static char digits[36] = "0123456789abcdefghijklmnopqrstuvwxyz"; 123acc9d408SJuli Mallett int num; 124*a841e1ebSBaptiste Daroussin int printed = 0; 125*a841e1ebSBaptiste Daroussin 126*a841e1ebSBaptiste Daroussin if (base > 36) 127*a841e1ebSBaptiste Daroussin m4errx(1, "base %d > 36: not supported.", base); 128*a841e1ebSBaptiste Daroussin 129*a841e1ebSBaptiste Daroussin if (base < 2) 130*a841e1ebSBaptiste Daroussin m4errx(1, "bad base %d for conversion.", base); 1319b50d902SRodney W. Grimes 1329b50d902SRodney W. Grimes num = (n < 0) ? -n : n; 1339b50d902SRodney W. Grimes do { 134*a841e1ebSBaptiste Daroussin pushback(digits[num % base]); 135*a841e1ebSBaptiste Daroussin printed++; 1369b50d902SRodney W. Grimes } 137*a841e1ebSBaptiste Daroussin while ((num /= base) > 0); 1389b50d902SRodney W. Grimes 1399b50d902SRodney W. Grimes if (n < 0) 140*a841e1ebSBaptiste Daroussin printed++; 141*a841e1ebSBaptiste Daroussin while (printed++ < d) 142*a841e1ebSBaptiste Daroussin pushback('0'); 143*a841e1ebSBaptiste Daroussin 144*a841e1ebSBaptiste Daroussin if (n < 0) 145*a841e1ebSBaptiste Daroussin pushback('-'); 1469b50d902SRodney W. Grimes } 1479b50d902SRodney W. Grimes 1489b50d902SRodney W. Grimes /* 149acc9d408SJuli Mallett * pbunsigned - convert unsigned long to string, push back on input. 150acc9d408SJuli Mallett */ 151acc9d408SJuli Mallett void 152bd2bfb58SJuli Mallett pbunsigned(unsigned long n) 153acc9d408SJuli Mallett { 154acc9d408SJuli Mallett do { 155*a841e1ebSBaptiste Daroussin pushback(n % 10 + '0'); 156acc9d408SJuli Mallett } 157acc9d408SJuli Mallett while ((n /= 10) > 0); 158acc9d408SJuli Mallett } 159acc9d408SJuli Mallett 160acc9d408SJuli Mallett void 161d1fea89cSJuli Mallett initspaces(void) 162acc9d408SJuli Mallett { 163acc9d408SJuli Mallett int i; 164acc9d408SJuli Mallett 165*a841e1ebSBaptiste Daroussin strspace = xalloc(strsize+1, NULL); 166acc9d408SJuli Mallett ep = strspace; 167acc9d408SJuli Mallett endest = strspace+strsize; 168*a841e1ebSBaptiste Daroussin buf = (unsigned char *)xalloc(bufsize, NULL); 169acc9d408SJuli Mallett bufbase = buf; 170acc9d408SJuli Mallett bp = buf; 171acc9d408SJuli Mallett endpbb = buf + bufsize; 172acc9d408SJuli Mallett for (i = 0; i < MAXINP; i++) 173acc9d408SJuli Mallett bbase[i] = buf; 174acc9d408SJuli Mallett } 175acc9d408SJuli Mallett 176acc9d408SJuli Mallett void 177d1fea89cSJuli Mallett enlarge_strspace(void) 178acc9d408SJuli Mallett { 179acc9d408SJuli Mallett char *newstrspace; 180acc9d408SJuli Mallett int i; 181acc9d408SJuli Mallett 182acc9d408SJuli Mallett strsize *= 2; 183acc9d408SJuli Mallett newstrspace = malloc(strsize + 1); 184acc9d408SJuli Mallett if (!newstrspace) 185acc9d408SJuli Mallett errx(1, "string space overflow"); 186acc9d408SJuli Mallett memcpy(newstrspace, strspace, strsize/2); 187acc9d408SJuli Mallett for (i = 0; i <= sp; i++) 188acc9d408SJuli Mallett if (sstack[i]) 189acc9d408SJuli Mallett mstack[i].sstr = (mstack[i].sstr - strspace) 190acc9d408SJuli Mallett + newstrspace; 191acc9d408SJuli Mallett ep = (ep-strspace) + newstrspace; 192acc9d408SJuli Mallett free(strspace); 193acc9d408SJuli Mallett strspace = newstrspace; 194acc9d408SJuli Mallett endest = strspace + strsize; 195acc9d408SJuli Mallett } 196acc9d408SJuli Mallett 197acc9d408SJuli Mallett void 198d1fea89cSJuli Mallett enlarge_bufspace(void) 199acc9d408SJuli Mallett { 200*a841e1ebSBaptiste Daroussin unsigned char *newbuf; 201acc9d408SJuli Mallett int i; 202acc9d408SJuli Mallett 203*a841e1ebSBaptiste Daroussin bufsize += bufsize/2; 204*a841e1ebSBaptiste Daroussin newbuf = xrealloc(buf, bufsize, "too many characters pushed back"); 205acc9d408SJuli Mallett for (i = 0; i < MAXINP; i++) 206acc9d408SJuli Mallett bbase[i] = (bbase[i]-buf)+newbuf; 207acc9d408SJuli Mallett bp = (bp-buf)+newbuf; 208acc9d408SJuli Mallett bufbase = (bufbase-buf)+newbuf; 209acc9d408SJuli Mallett buf = newbuf; 210acc9d408SJuli Mallett endpbb = buf+bufsize; 211acc9d408SJuli Mallett } 212acc9d408SJuli Mallett 213acc9d408SJuli Mallett /* 2149b50d902SRodney W. Grimes * chrsave - put single char on string space 2159b50d902SRodney W. Grimes */ 2169b50d902SRodney W. Grimes void 217bd2bfb58SJuli Mallett chrsave(int c) 2189b50d902SRodney W. Grimes { 219acc9d408SJuli Mallett if (ep >= endest) 220acc9d408SJuli Mallett enlarge_strspace(); 2219b50d902SRodney W. Grimes *ep++ = c; 2229b50d902SRodney W. Grimes } 2239b50d902SRodney W. Grimes 2249b50d902SRodney W. Grimes /* 2259b50d902SRodney W. Grimes * read in a diversion file, and dispose it. 2269b50d902SRodney W. Grimes */ 2279b50d902SRodney W. Grimes void 228bd2bfb58SJuli Mallett getdiv(int n) 2299b50d902SRodney W. Grimes { 230acc9d408SJuli Mallett int c; 2319b50d902SRodney W. Grimes 2329b50d902SRodney W. Grimes if (active == outfile[n]) 233*a841e1ebSBaptiste Daroussin m4errx(1, "undivert: diversion still active."); 234acc9d408SJuli Mallett rewind(outfile[n]); 235acc9d408SJuli Mallett while ((c = getc(outfile[n])) != EOF) 236acc9d408SJuli Mallett putc(c, active); 2379b50d902SRodney W. Grimes (void) fclose(outfile[n]); 2389b50d902SRodney W. Grimes outfile[n] = NULL; 2399b50d902SRodney W. Grimes } 2409b50d902SRodney W. Grimes 2419b50d902SRodney W. Grimes void 242*a841e1ebSBaptiste Daroussin onintr(__unused int signo) 2439b50d902SRodney W. Grimes { 244acc9d408SJuli Mallett #define intrmessage "m4: interrupted.\n" 245acc9d408SJuli Mallett write(STDERR_FILENO, intrmessage, sizeof(intrmessage)-1); 246acc9d408SJuli Mallett _exit(1); 2479b50d902SRodney W. Grimes } 2489b50d902SRodney W. Grimes 2499b50d902SRodney W. Grimes /* 2509b50d902SRodney W. Grimes * killdiv - get rid of the diversion files 2519b50d902SRodney W. Grimes */ 2529b50d902SRodney W. Grimes void 253d1fea89cSJuli Mallett killdiv(void) 2549b50d902SRodney W. Grimes { 255acc9d408SJuli Mallett int n; 2569b50d902SRodney W. Grimes 257acc9d408SJuli Mallett for (n = 0; n < maxout; n++) 2589b50d902SRodney W. Grimes if (outfile[n] != NULL) { 2599b50d902SRodney W. Grimes (void) fclose(outfile[n]); 2609b50d902SRodney W. Grimes } 2619b50d902SRodney W. Grimes } 2629b50d902SRodney W. Grimes 263*a841e1ebSBaptiste Daroussin extern char *__progname; 264*a841e1ebSBaptiste Daroussin 265*a841e1ebSBaptiste Daroussin void 266*a841e1ebSBaptiste Daroussin m4errx(int evaluation, const char *fmt, ...) 267*a841e1ebSBaptiste Daroussin { 268*a841e1ebSBaptiste Daroussin fprintf(stderr, "%s: ", __progname); 269*a841e1ebSBaptiste Daroussin fprintf(stderr, "%s at line %lu: ", CURRENT_NAME, CURRENT_LINE); 270*a841e1ebSBaptiste Daroussin if (fmt != NULL) { 271*a841e1ebSBaptiste Daroussin va_list ap; 272*a841e1ebSBaptiste Daroussin 273*a841e1ebSBaptiste Daroussin va_start(ap, fmt); 274*a841e1ebSBaptiste Daroussin vfprintf(stderr, fmt, ap); 275*a841e1ebSBaptiste Daroussin va_end(ap); 276*a841e1ebSBaptiste Daroussin } 277*a841e1ebSBaptiste Daroussin fprintf(stderr, "\n"); 278*a841e1ebSBaptiste Daroussin exit(evaluation); 279*a841e1ebSBaptiste Daroussin } 280*a841e1ebSBaptiste Daroussin 281acc9d408SJuli Mallett /* 282acc9d408SJuli Mallett * resizedivs: allocate more diversion files */ 2839b50d902SRodney W. Grimes void 284bd2bfb58SJuli Mallett resizedivs(int n) 285164c01f0SGregory Neil Shapiro { 286acc9d408SJuli Mallett int i; 287acc9d408SJuli Mallett 288*a841e1ebSBaptiste Daroussin outfile = (FILE **)xrealloc(outfile, sizeof(FILE *) * n, 289*a841e1ebSBaptiste Daroussin "too many diverts %d", n); 290acc9d408SJuli Mallett for (i = maxout; i < n; i++) 291acc9d408SJuli Mallett outfile[i] = NULL; 292acc9d408SJuli Mallett maxout = n; 293164c01f0SGregory Neil Shapiro } 294acc9d408SJuli Mallett 295acc9d408SJuli Mallett void * 296*a841e1ebSBaptiste Daroussin xalloc(size_t n, const char *fmt, ...) 297acc9d408SJuli Mallett { 298*a841e1ebSBaptiste Daroussin void *p = malloc(n); 299acc9d408SJuli Mallett 300*a841e1ebSBaptiste Daroussin if (p == NULL) { 301*a841e1ebSBaptiste Daroussin if (fmt == NULL) 302acc9d408SJuli Mallett err(1, "malloc"); 303*a841e1ebSBaptiste Daroussin else { 304*a841e1ebSBaptiste Daroussin va_list va; 305*a841e1ebSBaptiste Daroussin 306*a841e1ebSBaptiste Daroussin va_start(va, fmt); 307*a841e1ebSBaptiste Daroussin verr(1, fmt, va); 308*a841e1ebSBaptiste Daroussin va_end(va); 309*a841e1ebSBaptiste Daroussin } 310*a841e1ebSBaptiste Daroussin } 311*a841e1ebSBaptiste Daroussin return p; 312*a841e1ebSBaptiste Daroussin } 313*a841e1ebSBaptiste Daroussin 314*a841e1ebSBaptiste Daroussin void * 315*a841e1ebSBaptiste Daroussin xrealloc(void *old, size_t n, const char *fmt, ...) 316*a841e1ebSBaptiste Daroussin { 317*a841e1ebSBaptiste Daroussin char *p = realloc(old, n); 318*a841e1ebSBaptiste Daroussin 319*a841e1ebSBaptiste Daroussin if (p == NULL) { 320*a841e1ebSBaptiste Daroussin free(old); 321*a841e1ebSBaptiste Daroussin if (fmt == NULL) 322*a841e1ebSBaptiste Daroussin err(1, "realloc"); 323*a841e1ebSBaptiste Daroussin else { 324*a841e1ebSBaptiste Daroussin va_list va; 325*a841e1ebSBaptiste Daroussin 326*a841e1ebSBaptiste Daroussin va_start(va, fmt); 327*a841e1ebSBaptiste Daroussin verr(1, fmt, va); 328*a841e1ebSBaptiste Daroussin va_end(va); 329*a841e1ebSBaptiste Daroussin } 330*a841e1ebSBaptiste Daroussin } 331acc9d408SJuli Mallett return p; 332acc9d408SJuli Mallett } 333acc9d408SJuli Mallett 334acc9d408SJuli Mallett char * 335bd2bfb58SJuli Mallett xstrdup(const char *s) 336acc9d408SJuli Mallett { 337acc9d408SJuli Mallett char *p = strdup(s); 338acc9d408SJuli Mallett if (p == NULL) 339acc9d408SJuli Mallett err(1, "strdup"); 340acc9d408SJuli Mallett return p; 341164c01f0SGregory Neil Shapiro } 342164c01f0SGregory Neil Shapiro 343164c01f0SGregory Neil Shapiro void 344d1fea89cSJuli Mallett usage(void) 3459b50d902SRodney W. Grimes { 346*a841e1ebSBaptiste Daroussin fprintf(stderr, "usage: m4 [-gPs] [-Dname[=value]] [-d flags] " 347*a841e1ebSBaptiste Daroussin "[-I dirname] [-o filename]\n" 348*a841e1ebSBaptiste Daroussin "\t[-t macro] [-Uname] [file ...]\n"); 3499b50d902SRodney W. Grimes exit(1); 3509b50d902SRodney W. Grimes } 351acc9d408SJuli Mallett 352acc9d408SJuli Mallett int 353bd2bfb58SJuli Mallett obtain_char(struct input_file *f) 354acc9d408SJuli Mallett { 355acc9d408SJuli Mallett if (f->c == EOF) 356acc9d408SJuli Mallett return EOF; 357acc9d408SJuli Mallett 358acc9d408SJuli Mallett f->c = fgetc(f->file); 359*a841e1ebSBaptiste Daroussin if (f->c == '\n') 360*a841e1ebSBaptiste Daroussin f->lineno++; 361*a841e1ebSBaptiste Daroussin 362acc9d408SJuli Mallett return f->c; 363acc9d408SJuli Mallett } 364acc9d408SJuli Mallett 365acc9d408SJuli Mallett void 366bd2bfb58SJuli Mallett set_input(struct input_file *f, FILE *real, const char *name) 367acc9d408SJuli Mallett { 368acc9d408SJuli Mallett f->file = real; 369acc9d408SJuli Mallett f->lineno = 1; 370acc9d408SJuli Mallett f->c = 0; 371acc9d408SJuli Mallett f->name = xstrdup(name); 372*a841e1ebSBaptiste Daroussin emit_synchline(); 373*a841e1ebSBaptiste Daroussin } 374*a841e1ebSBaptiste Daroussin 375*a841e1ebSBaptiste Daroussin void 376*a841e1ebSBaptiste Daroussin do_emit_synchline(void) 377*a841e1ebSBaptiste Daroussin { 378*a841e1ebSBaptiste Daroussin fprintf(active, "#line %lu \"%s\"\n", 379*a841e1ebSBaptiste Daroussin infile[ilevel].lineno, infile[ilevel].name); 380*a841e1ebSBaptiste Daroussin infile[ilevel].synch_lineno = infile[ilevel].lineno; 381acc9d408SJuli Mallett } 382acc9d408SJuli Mallett 383acc9d408SJuli Mallett void 384bd2bfb58SJuli Mallett release_input(struct input_file *f) 385acc9d408SJuli Mallett { 386acc9d408SJuli Mallett if (f->file != stdin) 387acc9d408SJuli Mallett fclose(f->file); 388acc9d408SJuli Mallett f->c = EOF; 389acc9d408SJuli Mallett /* 390acc9d408SJuli Mallett * XXX can't free filename, as there might still be 391acc9d408SJuli Mallett * error information pointing to it. 392acc9d408SJuli Mallett */ 393acc9d408SJuli Mallett } 394acc9d408SJuli Mallett 395acc9d408SJuli Mallett void 396bd2bfb58SJuli Mallett doprintlineno(struct input_file *f) 397acc9d408SJuli Mallett { 398acc9d408SJuli Mallett pbunsigned(f->lineno); 399acc9d408SJuli Mallett } 400acc9d408SJuli Mallett 401acc9d408SJuli Mallett void 402bd2bfb58SJuli Mallett doprintfilename(struct input_file *f) 403acc9d408SJuli Mallett { 404acc9d408SJuli Mallett pbstr(rquote); 405acc9d408SJuli Mallett pbstr(f->name); 406acc9d408SJuli Mallett pbstr(lquote); 407acc9d408SJuli Mallett } 408acc9d408SJuli Mallett 409acc9d408SJuli Mallett /* 410acc9d408SJuli Mallett * buffer_mark/dump_buffer: allows one to save a mark in a buffer, 411acc9d408SJuli Mallett * and later dump everything that was added since then to a file. 412acc9d408SJuli Mallett */ 413acc9d408SJuli Mallett size_t 414d1fea89cSJuli Mallett buffer_mark(void) 415acc9d408SJuli Mallett { 416acc9d408SJuli Mallett return bp - buf; 417acc9d408SJuli Mallett } 418acc9d408SJuli Mallett 419acc9d408SJuli Mallett 420acc9d408SJuli Mallett void 421bd2bfb58SJuli Mallett dump_buffer(FILE *f, size_t m) 422acc9d408SJuli Mallett { 423*a841e1ebSBaptiste Daroussin unsigned char *s; 424acc9d408SJuli Mallett 425*a841e1ebSBaptiste Daroussin for (s = bp; s-buf > (long)m;) 426acc9d408SJuli Mallett fputc(*--s, f); 427acc9d408SJuli Mallett } 428