From 0cf71f1358f9fe4d2b597283ab4d43200c2dc4ac Mon Sep 17 00:00:00 2001 From: zlg Date: Tue, 29 Jan 2013 23:34:57 -0600 Subject: Solve exercise 1-23: Remove C comments --- 1-22_wordwrap.c | 30 ++++++++++---------- 1-23_decomment.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 15 deletions(-) create mode 100644 1-23_decomment.c diff --git a/1-22_wordwrap.c b/1-22_wordwrap.c index 5e17b50..83acfd6 100644 --- a/1-22_wordwrap.c +++ b/1-22_wordwrap.c @@ -53,22 +53,22 @@ int b_find_blank(char s[], int lim) { int main() { while (j = get_line(data, MAXLEN)) { - if (j == 80) { - // We know it's a long line now. Let's make sure we're breaking in - // the right place - k = b_find_blank(data, MAXLEN); - //printf("%d\n", k); - if (k > -1) { - data[k] = '\n'; - data[MAXLEN] = '\0'; - printf("%s", data); - continue; - } else { - data[MAXLEN] = '\0'; - printf("%s\n", data); - continue; - } + if (j == 80) { + // We know it's a long line now. Let's make sure we're breaking in + // the right place + k = b_find_blank(data, MAXLEN); + //printf("%d\n", k); + if (k > -1) { + data[k] = '\n'; + data[MAXLEN] = '\0'; + printf("%s", data); + continue; + } else { + data[MAXLEN] = '\0'; + printf("%s\n", data); + continue; } + } printf("%s", data); } diff --git a/1-23_decomment.c b/1-23_decomment.c new file mode 100644 index 0000000..63193cd --- /dev/null +++ b/1-23_decomment.c @@ -0,0 +1,84 @@ +#include + +/* The C Programming Language: 2nd Edition + * Exercise 1-23: + * "Write a program to remove all comments from a C program. Don't forget to + * handle quoted strings and character constants properly. C comments do not + * nest." + * + * I'm not sure why the instructions tell the reader to account for quoted + * strings and character constants. Comments always begin with either // or + * /*, so that sets the boundary of state. + * + * The states for this program are IN_MULTI for a multi-line comment, + * IN_SINGLE for a single line comment, and OUT for being outside a comment. + * These three states are all I need to determine whether I should output the + * contents of the C file or not. Characters are only output when the state is + * OUT, and there are conditions for getting into and out of comment state. + * + * I don't know of any other way to do this without invoking some higher-level + * libraries. + */ + +#define IN_MULTI 1 +#define IN_SINGLE 2 +#define OUT 0 + +char c, p; +int status; + +int main() { + // Treat input like a stream, since that's all the K&R has explained so far. + while ((c = getchar()) != EOF) { + + // Check for the ways to open a comment, and set state accordingly + if (c == '/' && status == OUT) { + // Look ahead and store the character that's returned + p = getchar(); + + if (p == '*') { + status = IN_MULTI; + } else if (p == '/') { + status = IN_SINGLE; + } else { + putchar(c); + putchar(p); + continue; + } + } + + // Ignore everything in a single line comment until a newline + if (status == IN_SINGLE) { + + if (c == '\n') { + putchar(c); + status = OUT; + continue; + } + + } + + // Ignore everything until you reach the end of a multi comment + if (status == IN_MULTI && c == '*') { + p = getchar(); + + if (p == '/') { + status = OUT; + continue; + } + + } + + // Output everything when we're not in a comment! + if (status == OUT) { + putchar(c); + } + + } + + /* derpsauce + * + * + * Testing comment for the lulz. lolololol + */ +} -- cgit v1.2.3-70-g09d2 -0700'>2019-04-30Release version 0.3 beta 4zlg4-42/+100 2019-04-29README.md: Clarify a few detailszlg1-4/+2 2019-04-29setup.py: Remove obsolete informationzlg1-1/+0 2019-01-03vgstash: Add "notes" filter to schemazlg1-1/+2 2018-11-21Prepare for distributionzlg2-1/+3 2018-10-22vgstash: let backlog filter ignore unbeatable gameszlg1-1/+1 2018-10-18Bump to 0.3beta2 for PyPIzlg1-3/+3 2018-10-18vgstash.DB.__init__: fix error output formattingzlg1-1/+1 2018-10-18README: fix inline <code> formattingzlg1-3/+4 2018-10-18cli: show msg if game to be deleted is not in DBzlg2-2/+12 2018-10-18README: expand on usage, cover shell quotingzlg1-7/+99 2018-10-18cli: Tell the user when a game lacks noteszlg2-3/+15 2018-10-18Catch when an invalid list filter is passedzlg4-3/+24 2018-10-12cli: Add zero-game import/export messageszlg2-11/+18 2018-10-10Bump to 0.3beta1 for PyPIzlg1-1/+1 2018-10-10Move tests and data to dedicated directoryzlg7-10/+26 2018-10-10cli: Add "export" commandzlg2-5/+54 2018-10-10cli: Add "import" commandzlg5-1/+76 2018-10-09Bump 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