11a30de1fSmrg/*
21a30de1fSmrg
31a30de1fSmrgCopyright 1988, 1998  The Open Group
41a30de1fSmrg
51a30de1fSmrgPermission to use, copy, modify, distribute, and sell this software and its
61a30de1fSmrgdocumentation for any purpose is hereby granted without fee, provided that
71a30de1fSmrgthe above copyright notice appear in all copies and that both that
81a30de1fSmrgcopyright notice and this permission notice appear in supporting
91a30de1fSmrgdocumentation.
101a30de1fSmrg
111a30de1fSmrgThe above copyright notice and this permission notice shall be included
121a30de1fSmrgin all copies or substantial portions of the Software.
131a30de1fSmrg
141a30de1fSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
151a30de1fSmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
161a30de1fSmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
171a30de1fSmrgIN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
181a30de1fSmrgOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
191a30de1fSmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
201a30de1fSmrgOTHER DEALINGS IN THE SOFTWARE.
211a30de1fSmrg
221a30de1fSmrgExcept as contained in this notice, the name of The Open Group shall
231a30de1fSmrgnot be used in advertising or otherwise to promote the sale, use or
241a30de1fSmrgother dealings in this Software without prior written authorization
251a30de1fSmrgfrom The Open Group.
261a30de1fSmrg
271a30de1fSmrg*/
281a30de1fSmrg
29a733a5bfSmrg#ifdef HAVE_CONFIG_H
30a733a5bfSmrg# include "config.h"
31a733a5bfSmrg#endif
32a733a5bfSmrg
331a30de1fSmrg#include <X11/Xos.h>
341a30de1fSmrg#include <X11/Xlib.h>
351a30de1fSmrg#include <stdio.h>
361a30de1fSmrg#include <ctype.h>
37a733a5bfSmrg#include <stdlib.h>
381a30de1fSmrg#include "xmodmap.h"
391a30de1fSmrg
401a30de1fSmrg#define NOTINFILEFILENAME "commandline"
411a30de1fSmrgconst char *inputFilename = NOTINFILEFILENAME;
421a30de1fSmrgint lineno = 0;
431a30de1fSmrg
441a30de1fSmrgvoid process_file (const char *filename)	/* NULL means use stdin */
451a30de1fSmrg{
461a30de1fSmrg    FILE *fp;
471a30de1fSmrg    char buffer[BUFSIZ];
481a30de1fSmrg
491a30de1fSmrg    /* open the file, eventually we'll want to pipe through cpp */
501a30de1fSmrg
511a30de1fSmrg    if (!filename) {
521a30de1fSmrg	fp = stdin;
531a30de1fSmrg	inputFilename = "stdin";
541a30de1fSmrg    } else {
551a30de1fSmrg	fp = fopen (filename, "r");
561a30de1fSmrg	if (!fp) {
571a30de1fSmrg	    fprintf (stderr, "%s:  unable to open file '%s' for reading\n",
581a30de1fSmrg		     ProgramName, filename);
591a30de1fSmrg	    parse_errors++;
601a30de1fSmrg	    return;
611a30de1fSmrg	}
621a30de1fSmrg	inputFilename = filename;
631a30de1fSmrg    }
641a30de1fSmrg
651a30de1fSmrg
661a30de1fSmrg    /* read the input and filter */
671a30de1fSmrg
681a30de1fSmrg    if (verbose) {
691a30de1fSmrg	printf ("! %s:\n", inputFilename);
701a30de1fSmrg    }
711a30de1fSmrg
721a30de1fSmrg    for (lineno = 0; ; lineno++) {
731a30de1fSmrg	buffer[0] = '\0';
741a30de1fSmrg	if (fgets (buffer, BUFSIZ, fp) == NULL)
751a30de1fSmrg	  break;
761a30de1fSmrg
771a30de1fSmrg	process_line (buffer);
781a30de1fSmrg    }
791a30de1fSmrg
801a30de1fSmrg    inputFilename = NOTINFILEFILENAME;
811a30de1fSmrg    lineno = 0;
821a30de1fSmrg    (void) fclose (fp);
831a30de1fSmrg}
841a30de1fSmrg
851a30de1fSmrg
86a733a5bfSmrgvoid process_line (const char *line)
871a30de1fSmrg{
881a30de1fSmrg    int len;
891a30de1fSmrg    int i;
90a733a5bfSmrg    char *cp, *buffer;
91a733a5bfSmrg
92a733a5bfSmrg    /* copy line to buffer since it may point to unwritable data */
93a733a5bfSmrg    len = strlen(line);
94a733a5bfSmrg    cp = buffer = strdup(line);
95a733a5bfSmrg    if (buffer == NULL) {
96a733a5bfSmrg	fprintf(stderr, "%s: Could not allocate %d bytes\n", ProgramName, len);
97a733a5bfSmrg	Exit(-1);
98a733a5bfSmrg    }
991a30de1fSmrg
1001a30de1fSmrg    for (i = 0; i < len; i++) {		/* look for blank lines */
1011a30de1fSmrg	register char c = buffer[i];
1021a30de1fSmrg	if (!(isspace(c) || c == '\n')) break;
1031a30de1fSmrg    }
104a733a5bfSmrg    if (i == len) goto done;
1051a30de1fSmrg
1061a30de1fSmrg    cp = &buffer[i];
1071a30de1fSmrg
108a733a5bfSmrg    if (*cp == '!') goto done;		/* look for comments */
1091a30de1fSmrg    len -= (cp - buffer);		/* adjust len by how much we skipped */
1101a30de1fSmrg
1111a30de1fSmrg					/* pipe through cpp */
1121a30de1fSmrg
1131a30de1fSmrg					/* strip trailing space */
1141a30de1fSmrg    for (i = len-1; i >= 0; i--) {
1151a30de1fSmrg	register char c = cp[i];
1161a30de1fSmrg	if (!(isspace(c) || c == '\n')) break;
1171a30de1fSmrg    }
1181a30de1fSmrg    if (i >= 0) cp[len = (i+1)] = '\0';  /* nul terminate */
1191a30de1fSmrg
1201a30de1fSmrg    if (verbose) {
1211a30de1fSmrg	printf ("! %d:  %s\n", lineno+1, cp);
1221a30de1fSmrg    }
1231a30de1fSmrg
1241a30de1fSmrg    /* handle input */
1251a30de1fSmrg    handle_line (cp, len);
126a733a5bfSmrg
127a733a5bfSmrg  done:
128a733a5bfSmrg    free(buffer);
1291a30de1fSmrg}
130