HuntnGather

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 21  →  ?path2? @ 22
/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
}
 
/*