1*39339e78Sderaadt /* $OpenBSD: misc.c,v 1.72 2022/05/21 01:21:29 deraadt Exp $ */
2e134e629Smillert
3df930be7Sderaadt /* Copyright 1988,1990,1993,1994 by Paul Vixie
4a5198fa1Smillert * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
5f454ebdeSmillert * Copyright (c) 1997,2000 by Internet Software Consortium, Inc.
6df930be7Sderaadt *
7f454ebdeSmillert * Permission to use, copy, modify, and distribute this software for any
8f454ebdeSmillert * purpose with or without fee is hereby granted, provided that the above
9f454ebdeSmillert * copyright notice and this permission notice appear in all copies.
10df930be7Sderaadt *
11a5198fa1Smillert * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
12a5198fa1Smillert * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13a5198fa1Smillert * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
14a5198fa1Smillert * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15a5198fa1Smillert * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16a5198fa1Smillert * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
17a5198fa1Smillert * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18df930be7Sderaadt */
19df930be7Sderaadt
20fa575ea2Smillert #include <sys/types.h>
21fa575ea2Smillert #include <sys/wait.h>
22fa575ea2Smillert
23fa575ea2Smillert #include <bitstring.h> /* for structs.h */
24fa575ea2Smillert #include <stdio.h>
25fa575ea2Smillert #include <stdlib.h>
26fa575ea2Smillert #include <string.h>
27fa575ea2Smillert #include <time.h> /* for structs.h */
28fa575ea2Smillert
29fa575ea2Smillert #include "macros.h"
30fa575ea2Smillert #include "structs.h"
31fa575ea2Smillert #include "funcs.h"
32fa575ea2Smillert #include "globals.h"
33df930be7Sderaadt
344a3a0dd4Smillert int LineNumber;
35d8a30772Smillert
36df930be7Sderaadt /* get_char(file) : like getc() but increment LineNumber on newlines
37df930be7Sderaadt */
38df930be7Sderaadt int
get_char(FILE * file)39785ecd14Stedu get_char(FILE *file)
40785ecd14Stedu {
41df930be7Sderaadt int ch;
42df930be7Sderaadt
43df930be7Sderaadt ch = getc(file);
44df930be7Sderaadt if (ch == '\n')
45df930be7Sderaadt Set_LineNum(LineNumber + 1)
46f454ebdeSmillert return (ch);
47df930be7Sderaadt }
48df930be7Sderaadt
49df930be7Sderaadt /* unget_char(ch, file) : like ungetc but do LineNumber processing
50df930be7Sderaadt */
51df930be7Sderaadt void
unget_char(int ch,FILE * file)52785ecd14Stedu unget_char(int ch, FILE *file)
53785ecd14Stedu {
54df930be7Sderaadt ungetc(ch, file);
55df930be7Sderaadt if (ch == '\n')
56df930be7Sderaadt Set_LineNum(LineNumber - 1)
57df930be7Sderaadt }
58df930be7Sderaadt
59df930be7Sderaadt /* get_string(str, max, file, termstr) : like fgets() but
60df930be7Sderaadt * (1) has terminator string which should include \n
61df930be7Sderaadt * (2) will always leave room for the null
62df930be7Sderaadt * (3) uses get_char() so LineNumber will be accurate
63df930be7Sderaadt * (4) returns EOF or terminating character, whichever
64df930be7Sderaadt */
65df930be7Sderaadt int
get_string(char * string,int size,FILE * file,char * terms)66785ecd14Stedu get_string(char *string, int size, FILE *file, char *terms)
67785ecd14Stedu {
68df930be7Sderaadt int ch;
69df930be7Sderaadt
70*39339e78Sderaadt while ((ch = get_char(file)) != EOF && !strchr(terms, ch)) {
71df930be7Sderaadt if (size > 1) {
724d4e2f5aStedu *string++ = ch;
73df930be7Sderaadt size--;
74df930be7Sderaadt }
75df930be7Sderaadt }
76df930be7Sderaadt
77df930be7Sderaadt if (size > 0)
78df930be7Sderaadt *string = '\0';
79df930be7Sderaadt
80f454ebdeSmillert return (ch);
81df930be7Sderaadt }
82df930be7Sderaadt
83df930be7Sderaadt /* skip_comments(file) : read past comment (if any)
84df930be7Sderaadt */
85df930be7Sderaadt void
skip_comments(FILE * file)86785ecd14Stedu skip_comments(FILE *file)
87785ecd14Stedu {
88df930be7Sderaadt int ch;
89df930be7Sderaadt
90*39339e78Sderaadt while ((ch = get_char(file)) != EOF) {
91df930be7Sderaadt /* ch is now the first character of a line.
92df930be7Sderaadt */
93df930be7Sderaadt
94df930be7Sderaadt while (ch == ' ' || ch == '\t')
95df930be7Sderaadt ch = get_char(file);
96df930be7Sderaadt
97df930be7Sderaadt if (ch == EOF)
98df930be7Sderaadt break;
99df930be7Sderaadt
100df930be7Sderaadt /* ch is now the first non-blank character of a line.
101df930be7Sderaadt */
102df930be7Sderaadt
103df930be7Sderaadt if (ch != '\n' && ch != '#')
104df930be7Sderaadt break;
105df930be7Sderaadt
106df930be7Sderaadt /* ch must be a newline or comment as first non-blank
107df930be7Sderaadt * character on a line.
108df930be7Sderaadt */
109df930be7Sderaadt
110df930be7Sderaadt while (ch != '\n' && ch != EOF)
111df930be7Sderaadt ch = get_char(file);
112df930be7Sderaadt
113df930be7Sderaadt /* ch is now the newline of a line which we're going to
114df930be7Sderaadt * ignore.
115df930be7Sderaadt */
116df930be7Sderaadt }
117df930be7Sderaadt if (ch != EOF)
118df930be7Sderaadt unget_char(ch, file);
119df930be7Sderaadt }
120df930be7Sderaadt
121c95ed473Smillert /* char *first_word(char *s, char *t)
122c95ed473Smillert * return pointer to first word
123c95ed473Smillert * parameters:
124c95ed473Smillert * s - string we want the first word of
125c95ed473Smillert * t - terminators, implicitly including \0
126c95ed473Smillert * warnings:
127df930be7Sderaadt * (1) this routine is fairly slow
128df930be7Sderaadt * (2) it returns a pointer to static storage
129df930be7Sderaadt */
130df930be7Sderaadt char *
first_word(char * s,char * t)131785ecd14Stedu first_word(char *s, char *t)
132785ecd14Stedu {
133df930be7Sderaadt static char retbuf[2][MAX_TEMPSTR + 1]; /* sure wish C had GC */
134df930be7Sderaadt static int retsel = 0;
135f454ebdeSmillert char *rb, *rp;
136df930be7Sderaadt
137df930be7Sderaadt /* select a return buffer */
138df930be7Sderaadt retsel = 1-retsel;
139df930be7Sderaadt rb = &retbuf[retsel][0];
140df930be7Sderaadt rp = rb;
141df930be7Sderaadt
142df930be7Sderaadt /* skip any leading terminators */
143df930be7Sderaadt while (*s && (NULL != strchr(t, *s))) {
144df930be7Sderaadt s++;
145df930be7Sderaadt }
146df930be7Sderaadt
147df930be7Sderaadt /* copy until next terminator or full buffer */
148df930be7Sderaadt while (*s && (NULL == strchr(t, *s)) && (rp < &rb[MAX_TEMPSTR])) {
149df930be7Sderaadt *rp++ = *s++;
150df930be7Sderaadt }
151df930be7Sderaadt
152df930be7Sderaadt /* finish the return-string and return it */
153df930be7Sderaadt *rp = '\0';
154f454ebdeSmillert return (rb);
155df930be7Sderaadt }
156