home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Black Box 4
/
BlackBox.cdr
/
progc
/
djsrc106.arj
/
SORT.CC
< prev
next >
Wrap
C/C++ Source or Header
|
1991-03-20
|
3KB
|
151 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct ENTRY {
ENTRY *before, *after;
ENTRY *same;
unsigned char *line;
unsigned char *sort_ptr;
ENTRY();
~ENTRY();
};
ENTRY::ENTRY()
{
before = after = same = 0;
line = sort_ptr = 0;
}
ENTRY::~ENTRY()
{
if (before) delete before;
if (after) delete after;
if (same) delete same;
if (line) delete line;
}
int column_flag = 0;
int uniq_flag = 0;
int num_flag = 0;
int rev_flag = 0;
ENTRY *eroot=0;
void read_one_data(unsigned char *s)
{
ENTRY *e, **eptr;
e = new ENTRY;
e->line = strdup(s);
e->sort_ptr = e->line;
for (int i=0; i<column_flag; i++)
{
while ((*e->sort_ptr <= ' ') && *e->sort_ptr)
e->sort_ptr++;
while (*e->sort_ptr > ' ')
e->sort_ptr++;
while ((*e->sort_ptr <= ' ') && *e->sort_ptr)
e->sort_ptr++;
}
eptr = &eroot;
while (*eptr)
{
int cmp;
if (num_flag)
cmp = atoi(e->sort_ptr) - atoi((*eptr)->sort_ptr);
else
cmp = strcmp(e->sort_ptr, (*eptr)->sort_ptr);
if (cmp == 0)
{
while (*eptr)
eptr = &((*eptr)->same);
*eptr = e;
return;
}
else if (cmp < 0)
{
eptr = &((*eptr)->before);
}
else
{
eptr = &((*eptr)->after);
}
}
*eptr = e;
}
void read_data(FILE *f)
{
unsigned char buf[1024];
while (fgets(buf, 1024, f) != NULL)
{
buf[strlen(buf)-1] = 0;
read_one_data(buf);
}
}
void print_data(ENTRY *e)
{
if (!e) return;
if (rev_flag)
print_data(e->after);
else
print_data(e->before);
puts(e->line);
if (!uniq_flag)
print_data(e->same);
if (rev_flag)
print_data(e->before);
else
print_data(e->after);
}
main(int argc, char **argv)
{
int i;
while (1)
{
if (argv[1][0] == '+')
{
column_flag = atoi(argv[1]+1);
argc--;
argv++;
}
else if (argv[1][0] == '-')
{
switch (argv[1][1])
{
case 'u':
uniq_flag = 1;
break;
case 'n':
num_flag = 1;
break;
case 'r':
rev_flag = 1;
break;
}
argc--;
argv++;
}
else
break;
}
if (argc > 1)
{
FILE *f;
f = fopen(argv[1], "r");
if (!f)
{
printf("Can't open file %s\n", argv[1]);
exit(1);
}
read_data(f);
fclose(f);
}
else
read_data(stdin);
print_data(eroot);
}