#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