#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLINES 5000 /* максимальное число строк */
char *lineptr[MAXLINES]; /* указатели на строки текста */
int readlines(char *lineptr[], int nlines);
void writelines(char *lineptr[], int nlines);
void qqsort(void *lineptr[], int left, int right,int (*comp)(void *, void *));
char *allloc(int n);
int numcmp(char *, char *);
int getline(char *s, int lim);
/* сортировка строк */
main(int argc, char *argv[])
{
int nlines; /* количество прочитанных строк */
int numeric = 0; /* 1, если сорт. по числ. знач. */
if (argc
> 1 && strcmp(argv
[1], "-n") == 0) numeric = 1;
if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
qqsort
((void **) lineptr
, 0, nlines
-1,(int (*)(void*,void*))(numeric
? numcmp
: strcmp)); writelines(lineptr, nlines);
return 0;
} else {
printf("Bведено слишком много строк\n"); return 1;
}
}
#define MAXLEN 1000
int readlines(char *lineptr[], int maxlines)
{
int len, nlines;
char *p, line[MAXLEN];
nlines = 0;
while ((len = getline(line, MAXLEN)) > 0)
if (nlines >= maxlines || (p = allloc(len)) == NULL)
return -1;
else {
line[len-1] = '\0'; /* убираем символ \n */
//printf("%d\n",line);
//printf("%d",p);
lineptr[nlines++] = p;
}
return nlines;
}
void qqsort(void *v[], int left, int right, int (*comp)(void *, void *))
{
int i, last;
void swap(void *v[], int, int);
if (left >= right) /* ничего не делается, если */
return; /* в массиве менее двух элементов */
swap(v, left, (left + right)/2);
last = left;
for (i = left+1; i <= right; i++)
if ((*comp)(v[i], v[left]) < 0)
swap(v, ++last, i);
swap(v, left, last);
qqsort(v, left, last-1, comp);
qqsort(v, last+1, right, comp);
}
/* numcmp: сравнивает s1 и s2 как числа */
int numcmp(char *s1, char *s2)
{
double v1, v2;
if (v1 < v2)
return -1;
else if (v1 > v2)
return 1;
else
return 0;
}
void writelines(char *lineptr[], int nlines)
{
int i;
for (i = 0; i < nlines; i++)
}
#define ALLOCSIZE 10000 /* размер доступного пространства */
static char allocbuf[ALLOCSIZE]; /* память для alloc */
static char *allocp = allocbuf; /* указатель на своб. место */
char *allloc(int n) /* возвращает указатель на n символов */
{
if (allocbuf + ALLOCSIZE - allocp >= n) {
allocp += n; /* пространство есть */
return allocp - n; /* старое p */
} else /* пространства нет */
return 0;
}
int 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;
}
void swap(void *v[], int i, int j)
{
void *temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojZGVmaW5lIE1BWExJTkVTIDUwMDAgLyog0LzQsNC60YHQuNC80LDQu9GM0L3QvtC1INGH0LjRgdC70L4g0YHRgtGA0L7QuiAqLwpjaGFyICpsaW5lcHRyW01BWExJTkVTXTsgLyog0YPQutCw0LfQsNGC0LXQu9C4INC90LAg0YHRgtGA0L7QutC4INGC0LXQutGB0YLQsCAqLwppbnQgcmVhZGxpbmVzKGNoYXIgKmxpbmVwdHJbXSwgaW50IG5saW5lcyk7CnZvaWQgd3JpdGVsaW5lcyhjaGFyICpsaW5lcHRyW10sIGludCBubGluZXMpOwp2b2lkIHFxc29ydCh2b2lkICpsaW5lcHRyW10sIGludCBsZWZ0LCBpbnQgcmlnaHQsaW50ICgqY29tcCkodm9pZCAqLCB2b2lkICopKTsKY2hhciAqYWxsbG9jKGludCBuKTsKaW50IG51bWNtcChjaGFyICosIGNoYXIgKik7CmludCBnZXRsaW5lKGNoYXIgKnMsIGludCBsaW0pOwovKiDRgdC+0YDRgtC40YDQvtCy0LrQsCDRgdGC0YDQvtC6ICovCm1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgaW50IG5saW5lczsgLyog0LrQvtC70LjRh9C10YHRgtCy0L4g0L/RgNC+0YfQuNGC0LDQvdC90YvRhSDRgdGC0YDQvtC6ICovCiAgICBpbnQgbnVtZXJpYyA9IDA7IC8qIDEsINC10YHQu9C4INGB0L7RgNGCLiDQv9C+INGH0LjRgdC7LiDQt9C90LDRhy4gKi8KICAgIGlmIChhcmdjID4gMSAmJiBzdHJjbXAoYXJndlsxXSwgIi1uIikgPT0gMCkKICAgICAgICBudW1lcmljID0gMTsKICAgIGlmICgobmxpbmVzID0gcmVhZGxpbmVzKGxpbmVwdHIsIE1BWExJTkVTKSkgPj0gMCkgewogICAgICAgIHFxc29ydCgodm9pZCAqKikgbGluZXB0ciwgMCwgbmxpbmVzLTEsKGludCAoKikodm9pZCosdm9pZCopKShudW1lcmljID8gbnVtY21wIDogc3RyY21wKSk7CiAgICAgICAgd3JpdGVsaW5lcyhsaW5lcHRyLCBubGluZXMpOwogICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludGYoIkLQstC10LTQtdC90L4g0YHQu9C40YjQutC+0Lwg0LzQvdC+0LPQviDRgdGC0YDQvtC6XG4iKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KfQoKI2RlZmluZSBNQVhMRU4gMTAwMAoKaW50IHJlYWRsaW5lcyhjaGFyICpsaW5lcHRyW10sIGludCBtYXhsaW5lcykKewogICAgaW50IGxlbiwgbmxpbmVzOwogICAgY2hhciAqcCwgbGluZVtNQVhMRU5dOwoKICAgIG5saW5lcyA9IDA7CiAgICB3aGlsZSAoKGxlbiA9IGdldGxpbmUobGluZSwgTUFYTEVOKSkgPiAwKQogICAgICAgIGlmIChubGluZXMgPj0gbWF4bGluZXMgfHwgKHAgPSBhbGxsb2MobGVuKSkgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBsaW5lW2xlbi0xXSA9ICdcMCc7IC8qINGD0LHQuNGA0LDQtdC8INGB0LjQvNCy0L7QuyBcbiAqLwogICAgICAgICAgICBzdHJjcHkocCwgbGluZSk7CiAgICAgICAgICAgIC8vcHJpbnRmKCIlZFxuIixsaW5lKTsKICAgICAgICAgICAgLy9wcmludGYoIiVkIixwKTsKICAgICAgICAgICAgbGluZXB0cltubGluZXMrK10gPSBwOwogICAgICAgIH0KICAgIHJldHVybiBubGluZXM7Cn0KCnZvaWQgcXFzb3J0KHZvaWQgKnZbXSwgaW50IGxlZnQsIGludCByaWdodCwgaW50ICgqY29tcCkodm9pZCAqLCB2b2lkICopKQp7CiAgICBpbnQgaSwgbGFzdDsKICAgIHZvaWQgc3dhcCh2b2lkICp2W10sIGludCwgaW50KTsKICAgIGlmIChsZWZ0ID49IHJpZ2h0KSAvKiDQvdC40YfQtdCz0L4g0L3QtSDQtNC10LvQsNC10YLRgdGPLCDQtdGB0LvQuCAqLwogICAgICAgIHJldHVybjsgLyog0LIg0LzQsNGB0YHQuNCy0LUg0LzQtdC90LXQtSDQtNCy0YPRhSDRjdC70LXQvNC10L3RgtC+0LIgKi8KICAgIHN3YXAodiwgbGVmdCwgKGxlZnQgKyByaWdodCkvMik7CiAgICBsYXN0ID0gbGVmdDsKICAgIGZvciAoaSA9IGxlZnQrMTsgaSA8PSByaWdodDsgaSsrKQogICAgICAgIGlmICgoKmNvbXApKHZbaV0sIHZbbGVmdF0pIDwgMCkKICAgICAgICAgICAgc3dhcCh2LCArK2xhc3QsIGkpOwogICAgc3dhcCh2LCBsZWZ0LCBsYXN0KTsKICAgIHFxc29ydCh2LCBsZWZ0LCBsYXN0LTEsIGNvbXApOwogICAgcXFzb3J0KHYsIGxhc3QrMSwgcmlnaHQsIGNvbXApOwp9CgovKiBudW1jbXA6INGB0YDQsNCy0L3QuNCy0LDQtdGCIHMxINC4IHMyINC60LDQuiDRh9C40YHQu9CwICovCmludCBudW1jbXAoY2hhciAqczEsIGNoYXIgKnMyKQp7CiAgICBkb3VibGUgdjEsIHYyOwogICAgdjEgPSBhdG9mKHMxKTsKICAgIHYyID0gYXRvZihzMik7CiAgICBpZiAodjEgPCB2MikKICAgICAgICByZXR1cm4gLTE7CiAgICBlbHNlIGlmICh2MSA+IHYyKQogICAgICAgIHJldHVybiAxOwogICAgZWxzZQogICAgICAgIHJldHVybiAwOwp9Cgp2b2lkIHdyaXRlbGluZXMoY2hhciAqbGluZXB0cltdLCBpbnQgbmxpbmVzKQp7CiAgICBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBubGluZXM7IGkrKykKICAgICAgICBwcmludGYoIiVzXG4iLCBsaW5lcHRyW2ldKTsKfQoKI2RlZmluZSBBTExPQ1NJWkUgMTAwMDAgLyog0YDQsNC30LzQtdGAINC00L7RgdGC0YPQv9C90L7Qs9C+INC/0YDQvtGB0YLRgNCw0L3RgdGC0LLQsCAqLwpzdGF0aWMgY2hhciBhbGxvY2J1ZltBTExPQ1NJWkVdOyAvKiDQv9Cw0LzRj9GC0Ywg0LTQu9GPIGFsbG9jICovCnN0YXRpYyBjaGFyICphbGxvY3AgPSBhbGxvY2J1ZjsgLyog0YPQutCw0LfQsNGC0LXQu9GMINC90LAg0YHQstC+0LEuINC80LXRgdGC0L4gKi8KY2hhciAqYWxsbG9jKGludCBuKSAvKiDQstC+0LfQstGA0LDRidCw0LXRgiDRg9C60LDQt9Cw0YLQtdC70Ywg0L3QsCBuINGB0LjQvNCy0L7Qu9C+0LIgKi8KewogICAgaWYgKGFsbG9jYnVmICsgQUxMT0NTSVpFIC0gYWxsb2NwID49IG4pIHsKICAgICAgICBhbGxvY3AgKz0gbjsgLyog0L/RgNC+0YHRgtGA0LDQvdGB0YLQstC+INC10YHRgtGMICovCiAgICAgICAgcmV0dXJuIGFsbG9jcCAtIG47IC8qINGB0YLQsNGA0L7QtSBwICovCiAgICB9IGVsc2UgLyog0L/RgNC+0YHRgtGA0LDQvdGB0YLQstCwINC90LXRgiAqLwogICAgICAgIHJldHVybiAwOwp9CgppbnQgZ2V0bGluZShjaGFyICpzLCBpbnQgbGltKQp7CiAgICBpbnQgYywgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBsaW0tMSAmJiAoYyA9IGdldGNoYXIoKSkgIT0gRU9GICYmIGMgIT0gJ1xuJzsgKytpKQogICAgICAgIHNbaV0gPSBjOwogICAgaWYgKGMgPT0gJ1xuJykgewogICAgICAgIHNbaV0gPSBjOwogICAgICAgICsraTsKICAgIH0KICAgIHNbaV0gPSAnXDAnOwogICAgcmV0dXJuIGk7Cn0Kdm9pZCBzd2FwKHZvaWQgKnZbXSwgaW50IGksIGludCBqKQp7CnZvaWQgKnRlbXA7CnRlbXAgPSB2W2ldOwp2W2ldID0gdltqXTsKdltqXSA9IHRlbXA7Cn0=