tok: ignore "\\\n"
[neatcc.git] / npp.c
blobd96de5b2c6dc39856e391186af766dffc15ea89d
1 /*
2 * neatpp - a small and simple C preprocessor
4 * Copyright (C) 2010-2012 Ali Gholami Rudi
6 * This file is released under GNU GPL version 2.
7 */
8 #include <errno.h>
9 #include <fcntl.h>
10 #include <stdarg.h>
11 #include <stdio.h>
12 #include <string.h>
13 #include <stdlib.h>
14 #include <unistd.h>
15 #include <sys/stat.h>
16 #include "tok.h"
18 #define OBUFSZ (1 << 19)
20 static int rmcomments(char *d, char *s, int l)
22 char *e = s + l;
23 char *d1 = d;
24 char *r = s;
25 while (r < e) {
26 if (r + 3 < e && r[0] == '/' && r[1] == '*') {
27 memcpy(d, s, r - s);
28 d += r - s;
29 while (r + 1 < e) {
30 r++;
31 if (r[0] == '*' && r[1] == '/') {
32 r++;
33 break;
36 s = r + 1;
38 if (r + 1 < e && (r[0] == '\'' || r[0] == '"')) {
39 char c = r[0];
40 r++;
41 while (r < e && *r != c) {
42 if (*r == '\\')
43 r++;
44 r++;
47 r++;
49 memcpy(d, s, e - s);
50 d += e - s;
51 return d - d1;
54 static int xwrite(int fd, char *buf, int len)
56 int nw = 0;
57 while (nw < len) {
58 int ret = write(fd, buf + nw, len - nw);
59 if (ret == -1 && (errno == EAGAIN || errno == EINTR))
60 continue;
61 if (ret < 0)
62 break;
63 nw += ret;
65 return nw;
68 void err(char *fmt, ...)
70 va_list ap;
71 char msg[512];
72 va_start(ap, fmt);
73 vsprintf(msg, fmt, ap);
74 va_end(ap);
75 die(msg);
78 int main(int argc, char *argv[])
80 int ofd = 1;
81 int i = 1;
82 char *s1, *s2;
83 int nr;
84 int len = 0;
85 while (i < argc && argv[i][0] == '-') {
86 if (argv[i][1] == 'I')
87 cpp_addpath(argv[i][2] ? argv[i] + 2 : argv[++i]);
88 if (argv[i][1] == 'D') {
89 char *name = argv[i] + 2;
90 char *def = "";
91 char *eq = strchr(name, '=');
92 if (eq) {
93 *eq = '\0';
94 def = eq + 1;
96 cpp_define(name, def);
98 i++;
100 if (i + 1 >= argc) {
101 printf("usage: npp [-I idir] [-D define] input output\n");
102 return 0;
104 if (cpp_init(argv[i++]))
105 die("npp: cannot open <%s>\n", argv[i - 1]);
106 ofd = open(argv[i++], O_WRONLY | O_TRUNC | O_CREAT, 0600);
107 if (ofd < 0)
108 die("npp: cannot open <%s>\n", argv[i - 1]);
109 s1 = malloc(OBUFSZ);
110 s2 = malloc(OBUFSZ);
111 if (!s1 || !s2)
112 die("npp: cannot allocate enough memory\n");
113 while ((nr = cpp_read(s1 + len)) >= 0)
114 len += nr;
115 len = rmcomments(s2, s1, len);
116 xwrite(ofd, s2, len);
117 close(ofd);
118 return 0;