diff --git a/KNR C/ex1-17/ex1-17-2-modular.c b/KNR C/ex1-17/ex1-17-2-modular.c new file mode 100644 index 0000000..74436e8 --- /dev/null +++ b/KNR C/ex1-17/ex1-17-2-modular.c @@ -0,0 +1,76 @@ +#include + +#define maxInputSize 32000 +#define maxOutputSize 32100 + +char buffer[maxInputSize] = { 0 }; +char output[maxOutputSize] = { 0 }; + +void store(char to[]); // Complete +void enumerate(char data[], char output[]); // Complete, pending testing. Needs replicate() before testing. +void enumerateAdvance(int extDataCrsr, char accessedData, char externalBuffer[]);// Complete, pending testing. +void replicate(char to[], char from[]);// Not Started + +//Status: Complete & Tested +void store(char to[]){ + int toCrsr = 0; + for(int i = getchar();i != EOF; ++toCrsr){ + to[toCrsr] = i; + i = getchar(); + } +} + +//Status: Complete, pending testing. Not to be used unil enumerate() has been +//validated, at which point the for loop of enumerate can be modified to use +//enumerateAdvance() as its completion action rather than calling an increment +//and char fetch at the end of each loop independently. This function exists +//purely for readability and style. +void enumerateAdvance(int extDataCrsr, char accessedData, char externalBuffer[]){ + ++extDataCrsr; + accessedData = externalBuffer[extDataCrsr]; +} + +//Status: Complete, pending testing. Not testable until replicate is complete. +void enumerate(char data[], char output[]){ + + int dataCrsr = 0; // Stores currently accessed position in data[] + int wscursor = 0; //Stores the cursor position in workingStorage + int lineLen = 0; // Stores the length of the current line being enumerated. + char workingStorage[maxOutputSize] = { 0 }; // Stores processed data until + // replicated to output. + + //Begin main enumeration loop. + for(int current = data[dataCrsr]; current != 0;){ + //Begin case: newline encountered with acceptable line length. + if(current == '\n' && lineLen >= 80){ + //Reset line length in preparation for next dataset. + lineLen = 0; + //Increment wscursor and add a null byte at the end of valid data + //for replicate to break on. + ++wscursor; + workingStorage[wscursor] = 0; + //Copy workingStorage into output. + replicate(output, workingStorage); + //Reset wscuror. Existing data in workingStorage will be ovrwritten + //by next dataset. + wscursor = 0; + //Begin case: newline with unacceptable line length. + } else if (current == '\n' && lineLen < 80){ + //Reset line length and wscuror in preparation for nxet dataset. + lineLen = 0; + wscursor = 0; + //Begin case: non-newline character. + }else if(current != '\n'){ + //Increment line length, write to workingStorage at wscursor, and + //increment wscursor. + ++lineLen; + workingStorage[wscursor] = current; + ++wscursor; + } + //Regardless of result, fetch new data. + ++dataCrsr; + current = data[dataCrsr]; + } +} + + diff --git a/KNR C/ex1-17/store.c b/KNR C/ex1-17/store.c new file mode 100644 index 0000000..eb5ae71 --- /dev/null +++ b/KNR C/ex1-17/store.c @@ -0,0 +1,25 @@ +#include + +char buffer[32000] = {0}; + +void store(char to[]){ + int toCrsr = 0; + for(int i = getchar();i != EOF; ++toCrsr){ + to[toCrsr] = i; + i = getchar(); + } +} + +void test(){ + int pos = 0; + + for(char b = buffer[pos]; b != 0; ++pos){ + putchar(buffer[pos]); + b = buffer[pos]; + } +} + +int main(){ + store(buffer); + test(); +}