diff --git a/intro/ex1_20_entab.c b/intro/ex1_20_detab.c similarity index 94% rename from intro/ex1_20_entab.c rename to intro/ex1_20_detab.c index 7b869bd..e830956 100644 --- a/intro/ex1_20_entab.c +++ b/intro/ex1_20_detab.c @@ -13,9 +13,10 @@ main() char line[MAXLINE]; /* current input line */ char detab_line[MAXLINE]; /* detabbed line */ - while ((len = my_getline(line, MAXLINE)) > 0) + while ((len = my_getline(line, MAXLINE)) > 0) { detab(detab_line, line); printf("%s", detab_line); + } return 0; } diff --git a/intro/ex1_21_entab.c b/intro/ex1_21_entab.c new file mode 100644 index 0000000..88652ea --- /dev/null +++ b/intro/ex1_21_entab.c @@ -0,0 +1,58 @@ +#include + +#define MAXLINE 1000 /* maximum characters in a line */ +#define TABWIDTH 4 /* tab size */ + +int my_getline(char line[], int maxline); +void entab(char to[], char from[]); + + +main() +{ + int len; /* current line length */ + char line[MAXLINE]; /* current input line */ + char entab_line[MAXLINE]; /* detabbed line */ + + while ((len = my_getline(line, MAXLINE)) > 0) { + entab(entab_line, line); + printf("%s", entab_line); + } + return 0; +} + +/* my_getline: reads in a line, return the length */ +int my_getline(char line[], int lim) +{ + int c, i; + + for (i = 0; i < lim-1 && (c=getchar()) != EOF && c != '\n'; ++i) + line[i] = c; + if (c == '\n') { + line[i] = c; + ++i; + } + line[i] = '\0'; + return i; +} + +/* entab: replace blanks with tab in line; does not handle the limit */ +void entab(char to[], char from[]) +{ + int i, j, k; + + i = j = k = 0; + while ((to[j] = from[i]) != '\0') { + if (from[i] == ' ') { + ++k; + if (k == TABWIDTH) { + k = 0; + j = j - TABWIDTH; + to[j] = '\t'; + } + } else { + k = 0; + } + ++j; + ++i; + } +}