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