/trunk/HuntnGather/Gather/Gather.c |
@@ -15,6 +15,10 @@ |
#include <proto/dos.h> |
#include <proto/exec.h> |
|
#if defined ___AsyncIO___ |
#include <asyncio.h> |
#endif |
|
#include "StringStack.h" |
|
#if !defined ___HAVE_GETOPT___ |
@@ -21,7 +25,7 @@ |
#include "getopt.h" |
#endif |
|
#define PROGRAM_VERSION "1.7.2" |
#define PROGRAM_VERSION "1.7.3" |
|
#if defined ___AmigaOS___ |
/*************************************************************************/ |
@@ -39,6 +43,7 @@ |
#define FALSE 0; |
#endif |
|
#define ASYNC_BUF 8192 |
#define MAX_MEM 262144 |
#define NAME_BUF 32 |
#define PATH_BUF 128 |
@@ -69,11 +74,16 @@ |
* Sorts a database file lexicographically. |
*/ |
void SortDatabase(char *dbFile) { |
#if defined ___AsyncIO___ |
struct AsyncFile *fp; |
LONG c; |
#else |
FILE *fp; |
char c; |
#endif |
char *name = NULL; |
char *path = NULL; |
char **database; |
char c; |
int i; |
int side; |
unsigned int line; |
@@ -81,7 +91,11 @@ |
int path_size; |
|
// Open database file for reading. |
#if defined ___AsyncIO___ |
if((fp = OpenAsync(dbFile, MODE_READ, ASYNC_BUF)) == NULL) { |
#else |
if((fp = fopen(dbFile, "r")) == NULL) { |
#endif |
fprintf(stderr, "Unable to open gather database for reading.\n"); |
return; |
} |
@@ -91,6 +105,7 @@ |
name = malloc(name_size * sizeof(*name)); |
path_size = PATH_BUF; |
path = malloc(path_size * sizeof(*path)); |
|
line = 0; |
side = 0; |
i = 0; |
@@ -98,8 +113,11 @@ |
if(verbose) { |
fprintf(stdout, "Sorting database: '%s'\n", dbFile); |
} |
|
#if defined ___AsyncIO___ |
while(run && (c = ReadCharAsync(fp)) != -1) { |
#else |
while(run && fscanf(fp, "%c", &c) == 1) { |
#endif |
#if defined ___AmigaOS___ |
// Check if CTRL+C was pressed and abort the program. |
if(SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) { |
@@ -150,7 +168,7 @@ |
path[i + 1] = '\0'; |
break; |
default: |
fprintf(stderr, "Database corrupted.\n"); |
fprintf(stderr, "Database corrupted: %d\n", side); |
break; |
} |
++i; |
@@ -158,23 +176,41 @@ |
} |
} |
|
#if defined ___AsyncIO___ |
CloseAsync(fp); |
#else |
fclose(fp); |
#endif |
|
// Sort the database. |
qsort(database, line, sizeof(char *), compare); |
|
// Write the database lines back to the database. |
#if defined ___AsyncIO___ |
if((fp = OpenAsync(dbFile, MODE_READ|MODE_WRITE, ASYNC_BUF)) == NULL) { |
#else |
if((fp = fopen(dbFile, "w+")) == NULL) { |
#endif |
fprintf(stderr, "Unable to open gather database for writing.\n"); |
return; |
} |
|
for(i = 0; i < line; ++i) { |
#if defined ___AsyncIO___ |
WriteAsync(fp, database[i], (LONG)(strlen(database[i]) * sizeof(char))); |
WriteAsync(fp, "\n", 1 * sizeof(char)); |
#else |
fprintf(fp, "%s\n", database[i]); |
#endif |
} |
|
#if defined ___AsyncIO___ |
CloseAsync(fp); |
#else |
fclose(fp); |
#endif |
|
free(database); |
fclose(fp); |
} |
|
/* |
@@ -182,7 +218,11 @@ |
* Updates a database file "dbFile". |
*/ |
void UpdateDatabase(char *dbFile, stringStack *dirStack, stats *stats) { |
#if defined ___AsyncIO___ |
struct AsyncFile *fp; |
#else |
FILE *fp; |
#endif |
DIR *dir; |
struct dirent *dirEntry; |
struct stat dirStat; |
@@ -190,7 +230,11 @@ |
char *path; |
char *subPath; |
|
#if defined ___AsyncIO___ |
if((fp = OpenAsync(dbFile, MODE_READ|MODE_WRITE, ASYNC_BUF)) == NULL) { |
#else |
if((fp = fopen(dbFile, "w+")) == NULL) { |
#endif |
fprintf(stderr, "Unable to open gather database for writing.\n"); |
return; |
} |
@@ -252,8 +296,14 @@ |
strupr(dirEntry->d_name); |
#endif |
|
#if defined ___AsyncIO___ |
WriteAsync(fp, dirEntry->d_name, (LONG)(strlen(dirEntry->d_name) * sizeof(char))); |
WriteAsync(fp, "\t", 1 * sizeof(char)); |
WriteAsync(fp, subPath, (LONG)(strlen(subPath) * sizeof(char))); |
WriteAsync(fp, "\n", 1 * sizeof(char)); |
#else |
fprintf(fp, "%s\t%s\n", dirEntry->d_name, subPath); |
|
#endif |
++stats->files; |
|
if(verbose) { |
@@ -274,7 +324,11 @@ |
fprintf(stdout, "\n"); |
} |
|
#if defined ___AsyncIO___ |
CloseAsync(fp); |
#else |
fclose(fp); |
#endif |
|
} |
|
@@ -304,18 +358,30 @@ |
* Counts the lines in a database file "dbFile". |
*/ |
int CountDatabaseLines(char *dbFile) { |
#if defined ___AsyncIO___ |
struct AsyncFile *fp; |
LONG c; |
#else |
FILE *fp; |
char c; |
#endif |
int lines; |
char c; |
|
#if defined ___AsyncIO___ |
if((fp = OpenAsync(dbFile, MODE_READ, ASYNC_BUF)) == NULL) { |
#else |
if((fp = fopen(dbFile, "r")) == NULL) { |
#endif |
fprintf(stderr, "Unable to open gather database for reading.\n"); |
fclose(fp); |
return 0; |
} |
|
lines = 0; |
#if defined ___AsyncIO___ |
while((c = ReadCharAsync(fp)) != -1) { |
#else |
while(fscanf(fp, "%c", &c) == 1) { |
#endif |
switch(c) { |
case '\n': |
++lines; |
@@ -323,7 +389,11 @@ |
} |
} |
|
#if defined ___AsyncIO___ |
CloseAsync(fp); |
#else |
fclose(fp); |
#endif |
|
return lines; |
} |
@@ -369,19 +439,31 @@ |
* Writes lines from the database "dbFile" to temporary filenames "tmpNames". |
*/ |
void WriteTempFiles(char *dbFile, char **tmpNames, int tmpFiles, int tmpLines, int total) { |
#if defined ___AsyncIO___ |
struct AsyncFile *fp, *tp; |
LONG c; |
#else |
FILE *fp, *tp; |
char c; |
#endif |
int lines; |
int linesWritten; |
|
#if defined ___AsyncIO___ |
if((fp = OpenAsync(dbFile, MODE_READ, ASYNC_BUF)) == NULL) { |
#else |
if((fp = fopen(dbFile, "r")) == NULL) { |
#endif |
fprintf(stderr, "Unable to open gather database for reading.\n"); |
return; |
} |
|
#if defined ___AsyncIO___ |
if((tp = OpenAsync(tmpNames[--tmpFiles], MODE_READ|MODE_WRITE, ASYNC_BUF)) == NULL) { |
#else |
if((tp = fopen(tmpNames[--tmpFiles], "w+")) == NULL) { |
#endif |
fprintf(stderr, "Unable to open temporary file '%s' for writing.\n", tmpNames[tmpFiles]); |
fclose(fp); |
return; |
} |
|
@@ -391,7 +473,11 @@ |
|
linesWritten = 0; |
lines = 0; |
#if defined ___AsyncIO___ |
while(run && (c = ReadCharAsync(fp)) != -1) { |
#else |
while(run && fscanf(fp, "%c", &c) == 1) { |
#endif |
#if defined ___AmigaOS___ |
// Check if CTRL+C was pressed and abort the program. |
if(SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) { |
@@ -408,10 +494,19 @@ |
} |
|
// Write the newline character back. |
#if defined ___AsyncIO___ |
if(WriteCharAsync(tp, (UBYTE)c) != 1) { |
#else |
if(fprintf(tp, "%c", c) != 1) { |
#endif |
fprintf(stderr, "Unable to write to temporary file '%s'.\n", tmpNames[tmpFiles]); |
#if defined ___AsyncIO___ |
CloseAsync(tp); |
CloseAsync(fp); |
#else |
fclose(tp); |
fclose(fp); |
#endif |
return; |
} |
// Switch to the next temporary file. |
@@ -422,11 +517,21 @@ |
} |
|
// Close the previous temporary file and write to the next temporary file. |
#if defined ___AsyncIO___ |
CloseAsync(tp); |
if((tp = OpenAsync(tmpNames[--tmpFiles], MODE_READ|MODE_WRITE, ASYNC_BUF)) == NULL) { |
#else |
fclose(tp); |
if((tp = fopen(tmpNames[--tmpFiles], "w+")) == NULL) { |
#endif |
fprintf(stderr, "Unable to open temporary file '%s' for writing.\n", tmpNames[tmpFiles]); |
#if defined ___AsyncIO___ |
CloseAsync(tp); |
CloseAsync(fp); |
#else |
fclose(tp); |
fclose(fp); |
#endif |
} |
lines = 0; |
break; |
@@ -433,10 +538,19 @@ |
} |
break; |
default: |
#if defined ___AsyncIO___ |
if(WriteCharAsync(tp, (UBYTE)c) != 1) { |
#else |
if(fprintf(tp, "%c", c) != 1) { |
#endif |
fprintf(stderr, "Unable to write to temporary file '%s'.\n", tmpNames[tmpFiles]); |
#if defined ___AsyncIO___ |
CloseAsync(tp); |
CloseAsync(fp); |
#else |
fclose(tp); |
fclose(fp); |
#endif |
return; |
} |
break; |
@@ -445,8 +559,13 @@ |
|
fprintf(stdout, "\n"); |
|
#if defined ___AsyncIO___ |
CloseAsync(tp); |
CloseAsync(fp); |
#else |
fclose(tp); |
fclose(fp); |
#endif |
} |
|
/* |
@@ -453,16 +572,21 @@ |
* |
* Skips a line in a database file "fp". |
*/ |
|
#if defined ___AsyncIO___ |
void SkipDatabaseLine(struct AsyncFile *fp) { |
LONG c; |
while((c = ReadCharAsync(fp)) != -1) { |
#else |
void SkipDatabaseLine(FILE *fp) { |
char c; |
|
while(fscanf(fp, "%c", &c) == 1) { |
if(c == '\n') { |
break; |
#endif |
switch(c) { |
case '\n': |
return; |
} |
} |
|
return; |
} |
|
/* |
@@ -469,8 +593,13 @@ |
* |
* Reads a line from the database file "fp". |
*/ |
#if defined ___AsyncIO___ |
char *ReadDatabaseLine(struct AsyncFile *fp) { |
LONG c; |
#else |
char *ReadDatabaseLine(FILE *fp) { |
char c; |
#endif |
char *line; |
int line_size; |
int i; |
@@ -479,7 +608,11 @@ |
line = malloc(line_size * sizeof(*line)); |
|
i = 0; |
#if defined ___AsyncIO___ |
while(run && (c = ReadCharAsync(fp)) != -1) { |
#else |
while(run && fscanf(fp, "%c", &c) == 1) { |
#endif |
#if defined ___AmigaOS___ |
// Check if CTRL+C was pressed and abort the program. |
if(SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) { |
@@ -489,7 +622,14 @@ |
switch(c) { |
case '\n': |
// Rewind the file by the number of read characters. |
#if defined ___AsyncIO___ |
if(SeekAsync(fp, -(i + 1), MODE_CURRENT) == -1) { |
fprintf(stderr, "Could not seek in file.\n"); |
return NULL; |
} |
#else |
fseek(fp, -(i + 1), SEEK_CUR); |
#endif |
return line; |
default: |
if(strlen(line) == line_size) { |
@@ -512,8 +652,13 @@ |
* Merges temporary files "tmpNames" into a database "dbFile". |
*/ |
void MergeDatabase(char *dbFile, char **tmpNames, int files, int lines) { |
#if defined ___AsyncIO___ |
struct AsyncFile *fp; |
struct AsyncFile **tp; |
#else |
FILE *fp; |
FILE **tp; |
#endif |
int i; |
int j; |
char *tmp; |
@@ -520,7 +665,11 @@ |
char *min; |
int count; |
|
#if defined ___AsyncIO___ |
if((fp = OpenAsync(dbFile, MODE_READ|MODE_WRITE, ASYNC_BUF)) == NULL) { |
#else |
if((fp = fopen(dbFile, "w+")) == NULL) { |
#endif |
fprintf(stderr, "Unable to open gather database for writing.\n"); |
return; |
} |
@@ -530,12 +679,20 @@ |
|
// Open all temporary files for reading. |
for(i = 0; i < files; ++i) { |
#if defined ___AsyncIO___ |
if((tp[i] = OpenAsync(tmpNames[i], MODE_READ, ASYNC_BUF)) == NULL) { |
#else |
if((tp[i] = fopen(tmpNames[i], "r")) == NULL) { |
#endif |
fprintf(stderr, "Unable to open temporary file '%s' for reading.\n", tmpNames[i]); |
// Close all temporary files. |
--i; |
while(i >= 0) { |
#if defined ___AsyncIO___ |
CloseAsync(tp[i]); |
#else |
fclose(tp[i]); |
#endif |
} |
return; |
} |
@@ -585,7 +742,12 @@ |
|
// Write the smallest line. |
if(min != NULL) { |
#if defined ___AsyncIO___ |
WriteAsync(fp, min, (LONG)(strlen(min) * sizeof(char))); |
WriteAsync(fp, "\n", 1 * sizeof(char)); |
#else |
fprintf(fp, "%s\n", min); |
#endif |
free(min); |
} |
} |
@@ -596,13 +758,22 @@ |
if(tmp == NULL) { |
continue; |
} |
#if defined ___AsyncIO___ |
WriteAsync(fp, tmp, (LONG)(strlen(tmp) * sizeof(char))); |
WriteAsync(fp, "\n", 1 * sizeof(char)); |
#else |
fprintf(fp, "%s\n", tmp); |
#endif |
free(tmp); |
} |
|
// Close and delete all temporary files. |
for(i = 0; i < files; ++i) { |
#if defined ___AsyncIO___ |
CloseAsync(tp[i]); |
#else |
fclose(tp[i]); |
#endif |
// Delete temporary file. |
remove(tmpNames[i]); |
} |
@@ -611,7 +782,11 @@ |
fprintf(stdout, "\n"); |
} |
|
#if defined ___AsyncIO___ |
CloseAsync(fp); |
#else |
fclose(fp); |
#endif |
} |
|
/* |