From cabe1a14b31edce1a247c367f8e1d7265abec34e Mon Sep 17 00:00:00 2001 From: Martin Ashby Date: Tue, 7 Feb 2023 22:20:47 +0000 Subject: Chapter 5 --- ex5-7.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 ex5-7.c (limited to 'ex5-7.c') diff --git a/ex5-7.c b/ex5-7.c new file mode 100644 index 0000000..2d277ad --- /dev/null +++ b/ex5-7.c @@ -0,0 +1,111 @@ +#include +#include + +// An extremely simple allocation system. +// Memory must be freed in the reverse order it was allocated. +#define ALLOCSIZE 10000 + +static char allocbuf[ALLOCSIZE]; +static char *allocp = allocbuf; + +char *alloc(int n) { + if (allocbuf + ALLOCSIZE - allocp >= n) { + allocp += n; + return allocp - n; + } else { + return NULL; + } +} + +void afree(char *p) { + if (p >= allocbuf && p < allocbuf + ALLOCSIZE) { + allocp = p; + } +} + +#define MAXLINES 5000 + +int readlines(char* lineptr[], int nlines); + +void writelines(char* lineptr[], int nlines); + +void qsort(char* lineptr[], int left, int right); + +int main() { + int nlines; + char* lineptr[MAXLINES]; + if ((nlines = readlines(lineptr, MAXLINES)) >= 0) { + qsort(lineptr, 0, nlines-1); + writelines(lineptr, nlines); + return 0; + } else { + fprintf(stderr, "error: input too big to sort\n"); + return 1; + } +} + +#define MAXLEN 1000 + +int z_getline(char*, int); +char* alloc(int); + +int readlines(char* lineptr[], int maxlines) { + int len; + int nlines = 0; + char* p; + char line[MAXLEN]; + while ((len = z_getline(line, MAXLEN)) > 0) { + if (nlines >= maxlines || (p = alloc(len)) == NULL) { + return -1; + } else { + line[len-1] = '\0'; // delete newline + strcpy(p, line); + lineptr[nlines++] = p; + } + } + return nlines; +} + +void writelines(char* lineptr[], int nlines) { + for (int i=0; i= right) { + return; + } + swap(v, left, (left+right)/2); + last = left; + for (i=left+1; i<=right; i++) { + if (strcmp(v[i], v[left]) < 0) { + swap(v, ++last, i); + } + } + swap(v, left, last); + qsort(v, left, last-1); + qsort(v, last+1, right); +} + +void swap(char* v[], int i, int j) { + char* temp = v[i]; + v[i] = v[j]; + v[j] = temp; +} + + +/* getline: read a line into s, return length */ +int z_getline(char s[], int lim) { + int c, i; + for (i=0; i