aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzlg <zlg@zlg.space>2013-01-29 23:34:57 -0600
committerzlg <zlg@zlg.space>2013-01-29 23:34:57 -0600
commit0cf71f1358f9fe4d2b597283ab4d43200c2dc4ac (patch)
tree0a88fb0e507fa226dab8bf076961a81ea597bd3e
parentSolve Exercise 1-22: wordwrap (diff)
downloadknr-0cf71f1358f9fe4d2b597283ab4d43200c2dc4ac.tar.gz
knr-0cf71f1358f9fe4d2b597283ab4d43200c2dc4ac.tar.bz2
knr-0cf71f1358f9fe4d2b597283ab4d43200c2dc4ac.tar.xz
knr-0cf71f1358f9fe4d2b597283ab4d43200c2dc4ac.zip
Solve exercise 1-23: Remove C comments
-rw-r--r--1-22_wordwrap.c30
-rw-r--r--1-23_decomment.c84
2 files changed, 99 insertions, 15 deletions
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 <stdio.h>
+
+/* 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
+ */
+}