diff options
author | Martin Ashby <martin@ashbysoft.com> | 2023-02-07 22:20:47 +0000 |
---|---|---|
committer | Martin Ashby <martin@ashbysoft.com> | 2023-02-07 22:20:47 +0000 |
commit | cabe1a14b31edce1a247c367f8e1d7265abec34e (patch) | |
tree | e66fd91f6682d084ea8484b1be43bd5631dc7610 /ex5-7.c | |
parent | 7fa502ba4e60ce762ab529996c66a1a831cb789f (diff) | |
download | learn-c-cabe1a14b31edce1a247c367f8e1d7265abec34e.tar.gz learn-c-cabe1a14b31edce1a247c367f8e1d7265abec34e.tar.bz2 learn-c-cabe1a14b31edce1a247c367f8e1d7265abec34e.tar.xz learn-c-cabe1a14b31edce1a247c367f8e1d7265abec34e.zip |
Chapter 5
Diffstat (limited to 'ex5-7.c')
-rw-r--r-- | ex5-7.c | 111 |
1 files changed, 111 insertions, 0 deletions
@@ -0,0 +1,111 @@ +#include <stdio.h> +#include <string.h> + +// 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<nlines; i++) + printf("%s\n", lineptr[i]); +} + +void qsort(char* v[], int left, int right) { + int i, last; + void swap(char* v[], int i, int j); + if (left >= 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<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) { + s[i] = c; + } + if (c == '\n') { + s[i] = c; + ++i; + } + s[i] = '\0'; + return i; +}
\ No newline at end of file |