aboutsummaryrefslogtreecommitdiff
path: root/ch5
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ch5/5-19_undcl-no-redundant-parens.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/ch5/5-19_undcl-no-redundant-parens.c b/ch5/5-19_undcl-no-redundant-parens.c
new file mode 100644
index 0000000..4af4314
--- /dev/null
+++ b/ch5/5-19_undcl-no-redundant-parens.c
@@ -0,0 +1,113 @@
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+/* The C Programming Language: 2nd Edition
+ *
+ * Exercise 5-19: Modify `undcl` so that it does not add redundant parentheses
+ * to declarations.
+ *
+ * Notes: The only circumstance that `undcl` will add extra parens is when it
+ * comes across a pointer. So we look ahead and count pointers, then add them
+ * all at once before output. It's a fairly simple fix.
+ */
+
+#define MAXTOKEN 100
+#define BUFSIZE 100
+#define MAXPTR 10
+
+enum { NAME, PARENS, BRACKETS, TYPE };
+
+int gettoken(void);
+int getch(void);
+void ungetch(int);
+
+char buf[BUFSIZE];
+int bufp = 0;
+int tokentype;
+char token[MAXTOKEN];
+char name[MAXTOKEN];
+char datatype[MAXTOKEN];
+char out[1000];
+
+int gettoken(void) {
+ int c;
+ char *p = token;
+ while ((c = getch()) == ' ' || c == '\t') {
+ }
+ if (c == '(') {
+ if ((c = getch()) == ')') {
+ strcpy(token, "()");
+ return tokentype = PARENS;
+ } else {
+ ungetch(c);
+ return tokentype = '(';
+ }
+ } else if (c == '[') {
+ for (*p++ = c; (*p++ = getch()) != ']'; ) {
+ }
+ *p = '\0';
+ return tokentype = BRACKETS;
+ } else if (isalpha(c)) {
+ for (*p++ = c; isalnum(c = getch()); ) {
+ *p++ = c;
+ }
+ *p = '\0';
+ ungetch(c);
+ return tokentype = NAME;
+ } else {
+ return tokentype = c;
+ }
+}
+
+int getch(void) {
+ return (bufp > 0) ? buf[--bufp] : getchar();
+}
+
+void ungetch(int c) {
+ if (bufp >= BUFSIZE) {
+ printf("ungetch: Too many characters.\n");
+ } else {
+ buf[bufp++] = c;
+ }
+}
+
+int main(void) {
+ int type, pcount, i, c;
+ char temp[MAXTOKEN];
+ char p[MAXPTR];
+ while (gettoken() != EOF) {
+ strcpy(out, token);
+ while ((type = gettoken()) != '\n') {
+ if (type == PARENS || type == BRACKETS) {
+ strcat(out, token);
+ } else if (type == '*') {
+ pcount++;
+ while ((c = getch()) == '*' || c == ' ') {
+ if (c == '*') {
+ if (pcount < (MAXPTR - 1)) {
+ pcount++;
+ } else {
+ break;
+ }
+ }
+ }
+ ungetch(c);
+ for (i = 0; i < pcount; i++) {
+ p[i] = '*';
+ }
+ pcount = 0;
+ p[i] = '\0';
+ sprintf(temp, "(%s%s)", p, out);
+ strcpy(out, temp);
+ } else if (type == NAME) {
+ sprintf(temp, "%s %s", token, out);
+ strcpy(out, temp);
+ } else {
+ printf("Invalid input at %s\n", token);
+ }
+ }
+ printf("%s\n", out);
+ }
+ return 0;
+}
=1'>Bump to 0.3alpha6 for PyPIzlg1-1/+1 2018-10-09cli: Add "notes" commandzlg2-4/+74 2018-10-09update_game: ensure notes are also savedzlg1-2/+2 2018-10-09cli: add 'update' commandzlg3-20/+92 2018-10-06cli: Add "delete" commandzlg2-0/+19 2018-10-06Remove ID field from DBzlg3-38/+46 2018-10-06cli: change "Status" heading to "Progress"zlg2-36/+40 2018-09-29Bump to 0.3alpha5 for PyPIzlg1-1/+1 2018-09-29cli: Add pretty printing to 'list' commandzlg3-17/+107 2018-09-08setup.py: Bump to alpha4 for PyPIzlg1-1/+1 2018-09-08cli: add '--raw' option to list commandzlg2-9/+45 2018-09-08Add remaining filters to vgstash packagezlg1-2/+11 2018-09-04Update LICENSE to match setup.pyzlg1-80/+67 2018-09-03Branch off from master with pytest, tox, clickzlg16-778/+779 2018-03-18Flesh out filter types and ownership statuszlg3-82/+144 2018-03-18README.mdown: break line correctlyzlg1-1/+1 2018-03-18add 'playlog' list filterzlg2-2/+9 2018-03-13Update helpers a bitzlg1-2/+9 2018-03-13Make VGSTASH_DB_LOCATION point to a filezlg2-21/+20 2016-11-18Remove settings from helpers.shZe Libertine Gamer1-5/+0 2016-11-15Correct phrasing in README.Ze Libertine Gamer1-4/+4 2016-11-13DerpZe Libertine Gamer1-0/+1 2016-11-03Improve error handling in shell scriptsZe Libertine Gamer4-3/+23 2016-10-24Correct run_again, add recursionZe Libertine Gamer1-0/+4 2016-10-21Add quotes to correct behavior for arglistZe Libertine Gamer1-1/+1 2016-10-14updater.sh: add recursion, error handlingZe Libertine Gamer1-43/+101 2016-10-14Correct pipe-handling behaviorZe Libertine Gamer1-1/+9 2016-10-12Clarify a method to move between platformsZe Libertine Gamer1-2/+5