From 5018e06c580dd21c958ec1672c26a3448faf0c55 Mon Sep 17 00:00:00 2001 From: zlg Date: Wed, 13 Feb 2013 20:48:44 -0600 Subject: Add license file, reorganize project --- ch1/1-23_decomment.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 ch1/1-23_decomment.c (limited to 'ch1/1-23_decomment.c') diff --git a/ch1/1-23_decomment.c b/ch1/1-23_decomment.c new file mode 100644 index 0000000..63193cd --- /dev/null +++ b/ch1/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 ommit message (Expand)AuthorFilesLines 2013-06-22Solve Exercise 4-7: ungets()zlg2-2/+278 class='deletions'>-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