Page 110
Rewrite readlines
to store lines in an array supplied by main
, rather than
calling alloc
to maintain storage. How much faster is the program?
#include <stdio.h>
#include <string.h>
#define MAXLINES 5000
#define MAXCHARS 500000
char *lineptr[MAXLINES];
int readlines(char *lineptr[], int nlines, char storage[], int maxchars);
void writelines(char *lineptr[], int nlines);
void qsort(char *lineptr[], int left, int right);
int main()
{
int nlines;
char storage[MAXCHARS];
if ((nlines = readlines(lineptr, MAXLINES, storage, MAXCHARS)) >= 0) {
qsort(lineptr, 0, nlines - 1);
writelines(lineptr, nlines);
return 0;
} else {
printf("error: input too big to sort\n");
return 1;
}
}
#define MAXLEN 1000
int get_line(char *, int);
int readlines(char *lineptr[], int maxlines, char storage[], int maxchars)
{
int len, nlines;
char line[MAXLEN];
int i;
i = 0;
nlines = 0;
while ((len = get_line(line, MAXLEN)) > 0) {
if (nlines >= maxlines || (i + len) >= maxchars) {
return -1;
} else {
line[len - 1] = '\0';
strcpy(storage + i, line);
lineptr[nlines++] = storage + i;
i += len;
}
}
return nlines;
}
void writelines(char *lineptr[], int nlines)
{
while (nlines-- > 0) {
printf("%s\n", *lineptr++);
}
}
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;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
int get_line(char s[], int lim)
{
int c, i;
i = 0;
while (--lim > 0 && (c = getchar()) != EOF && c != '\n') {
s[i++] = c;
}
if (c == '\n') {
s[i++] = c;
}
s[i] = '\0';
return i;
}