2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
10 #define MAXLINELEN 1024
12 #include <sys/param.h>
13 #include <sys/types.h>
18 #define TOK_DONTUSE 1 /* Don't copy if match and this flag is set. */
25 /* free token list returned by parseLine */
26 static int FreeTokens(alist)
27 register struct token *alist; {
28 register struct token *nlist;
29 for(; alist; alist = nlist) {
37 #define space(x) ((x) == ' ' || (x) == '\t' || (x) == '<' || (x) == '>')
38 static int ParseLine(aline, alist)
40 struct token **alist; {
41 char tbuffer[MAXTOKLEN+1];
42 register char *tptr = NULL;
44 struct token *first, *last;
45 register struct token *ttok;
49 inToken = 0; /* not copying token chars at start */
50 first = (struct token *) 0;
51 last = (struct token *) 0;
54 if (tc == 0 || space(tc)) { /* terminating null gets us in here, too */
56 inToken = 0; /* end of this token */
58 return -1; /* should never get here */
61 ttok = (struct token *) malloc(sizeof(struct token));
62 ttok->next = (struct token *) 0;
64 ttok->key = (char *) malloc(strlen(tbuffer));
65 strcpy(ttok->key, tbuffer+1);
66 ttok->flags = TOK_DONTUSE;
70 ttok->key = (char *) malloc(strlen(tbuffer)+1);
71 strcpy(ttok->key, tbuffer);
79 if (!first) first = ttok;
83 /* an alpha character */
91 if (tptr - tbuffer >= MAXTOKLEN) return -1; /* token too long */
95 /* last token flushed 'cause space(0) --> true */
96 if (last) last->next = (struct token *) 0;
102 /* read a line into a buffer, putting in null termination and stopping on appropriate
103 end of line char. Returns 0 at eof, > 0 at normal line end, and < 0 on error */
104 static int GetLine(afile, abuffer, amax)
107 register char *abuffer; {
114 if (first && tc < 0) return 0;
116 if (tc <= 0 || tc == '\012') {
117 if (amax > 0) *abuffer++ = 0;
118 return (amax > 0? 1 : -1);
121 /* keep reading to end of line so next one isn't bogus */
128 int mc_copy(ain, aout, alist)
132 char tbuffer[MAXLINELEN];
133 struct token *tokens;
135 register struct token *tt;
140 copying = 1; /* start off copying data */
142 /* copy lines, handling modes appropriately */
143 code = GetLine(ain, tbuffer, MAXLINELEN);
144 if (code <= 0) break;
145 /* otherwise process the line */
146 if (tbuffer[0] == '<') {
147 /* interpret the line as a set of options, any one of which will cause us
148 to start copying the data again. */
149 code = ParseLine(tbuffer, &tokens);
150 if (code != 0) return -1;
153 for(tp = alist; (!done) && (*tp != (char *)0) ; tp++) {
154 for(tt = tokens; tt; tt=tt->next) {
155 if (!strcmp(*tp, tt->key)) {
156 /* Need to search all tokens in case a dont use
157 * flag is set. But we can stop on the first
160 if (tt->flags & TOK_DONTUSE) {
174 /* just copy the line */
176 fwrite(tbuffer, 1, strlen(tbuffer), aout);