240 lines
5.0 KiB
C
240 lines
5.0 KiB
C
#include "compdir.h"
|
|
#ifdef COMPILE_FOR_DOS
|
|
#define PVOID void *
|
|
#include <stdarg.h>
|
|
#endif
|
|
|
|
//
|
|
// Walk down list and add Node using InsertFront
|
|
//
|
|
|
|
void AddToList(LinkedFileList Node, LinkedFileList *List)
|
|
{
|
|
int Result;
|
|
LinkedFileList *TmpPtr;
|
|
|
|
//
|
|
// If Node is empty do nothing
|
|
//
|
|
|
|
if (Node == NULL)
|
|
return;
|
|
//
|
|
// If list is empty just point to Node
|
|
//
|
|
|
|
if (*List == NULL)
|
|
*List = Node;
|
|
|
|
//
|
|
// Otherwise go down the list and add
|
|
// in sorted order
|
|
//
|
|
|
|
else if (*List != NULL) {
|
|
Result = strcmp ((*Node).Name, (**List).Name);
|
|
if (Result < 0) {
|
|
InsertFront(Node, List);
|
|
return;
|
|
}
|
|
TmpPtr = &(**List).Next;
|
|
while (*TmpPtr != NULL) {
|
|
Result = strcmp ((*Node).Name, (**TmpPtr).Name);
|
|
if (Result < 0) {
|
|
InsertFront(Node, &(*TmpPtr));
|
|
return;
|
|
}
|
|
TmpPtr = &(**TmpPtr).Next;
|
|
|
|
} /* end while */
|
|
|
|
*TmpPtr = Node;
|
|
|
|
} /*end else */
|
|
|
|
} /* AddToList */
|
|
|
|
//
|
|
// See if Name matches any name on ExtenList
|
|
//
|
|
|
|
BOOL AnyMatches(char **ExtenList, char *Name, int Length)
|
|
{
|
|
if (ExtenList == NULL)
|
|
return FALSE;
|
|
if ((*ExtenList == NULL) || (Length == 0))
|
|
return FALSE;
|
|
return (Match(*ExtenList, Name) ||
|
|
AnyMatches(ExtenList + 1, Name, Length - 1));
|
|
|
|
} /* AnyMatches */
|
|
|
|
//
|
|
// Allocate memory and fill in data of Node
|
|
//
|
|
|
|
#ifdef COMPILE_FOR_DOS
|
|
void CreateNode(LinkedFileList *Node, struct find_t *Buff)
|
|
{
|
|
struct tm temptm;
|
|
|
|
temptm.tm_sec = ((*Buff).wr_time & 0x1f) * 2;
|
|
temptm.tm_min = ((*Buff).wr_time >> 5) & 0x0f;
|
|
temptm.tm_hour = ((*Buff).wr_time >> 9);
|
|
temptm.tm_mday = (*Buff).wr_date & 0x1f;
|
|
temptm.tm_mon = ((*Buff).wr_date >> 5) & 0x0f;
|
|
temptm.tm_year = ((*Buff).wr_date >> 9) + 80;
|
|
#else
|
|
void CreateNode(LinkedFileList *Node, WIN32_FIND_DATA *Buff)
|
|
{
|
|
#endif
|
|
(*Node) = malloc(sizeof(struct NodeStruct));
|
|
if ((*Node) == NULL)
|
|
OutOfMem();
|
|
(**Node).Name = _strlwr(_strdup((*Buff).cFileName));
|
|
if ((**Node).Name == NULL)
|
|
OutOfMem();
|
|
strcpy((**Node).Flag, "");
|
|
(**Node).Attributes = (*Buff).dwFileAttributes;
|
|
if ((*Buff).dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
strcpy((**Node).Flag, "DIR");
|
|
#ifdef COMPILE_FOR_DOS
|
|
(**Node).SizeHigh = 0;
|
|
(**Node).SizeLow = (*Buff).size;
|
|
(**Node).Time = mktime(&temptm);
|
|
#else
|
|
(**Node).SizeHigh = (*Buff).nFileSizeHigh;
|
|
(**Node).SizeLow = (*Buff).nFileSizeLow;
|
|
(**Node).Time.dwLowDateTime = (*Buff).ftLastWriteTime.dwLowDateTime;
|
|
(**Node).Time.dwHighDateTime = (*Buff).ftLastWriteTime.dwHighDateTime;
|
|
#endif
|
|
(**Node).Next = NULL;
|
|
(**Node).DiffNode = NULL;
|
|
|
|
} /* CreateNode */
|
|
|
|
//
|
|
// Walk list and delete entry that matches Name using RemoveFront
|
|
//
|
|
|
|
LinkedFileList DeleteFromList(char *Name, LinkedFileList *List)
|
|
{
|
|
LinkedFileList Node = NULL;
|
|
LinkedFileList *FindNode = NULL;
|
|
|
|
FindNode = FindInList(Name, List);
|
|
|
|
Node = RemoveFront(FindNode);
|
|
if (Node != NULL) {
|
|
(*Node).Next = NULL;
|
|
}
|
|
return Node;
|
|
|
|
} /* DeleteFromList */
|
|
|
|
LinkedFileList *FindInList(char *Name, LinkedFileList *List)
|
|
{
|
|
int Result;
|
|
LinkedFileList *tmpptr = List;
|
|
|
|
while (*tmpptr != NULL) {
|
|
Result = strcmp((**tmpptr).Name, Name);
|
|
if (Result == 0)
|
|
return tmpptr;
|
|
if (Result > 0)
|
|
return NULL;
|
|
tmpptr = &(**tmpptr).Next;
|
|
}
|
|
return NULL;
|
|
|
|
} /* FindInList */
|
|
|
|
//
|
|
// Walk down list and free each entry
|
|
//
|
|
|
|
void FreeList(LinkedFileList *List)
|
|
{
|
|
LinkedFileList Node;
|
|
|
|
while ((*List) != NULL) {
|
|
Node = RemoveFront(List);
|
|
FreeList(&(*Node).DiffNode);
|
|
free((*Node).Name);
|
|
free(Node);
|
|
}
|
|
free (*List);
|
|
|
|
} /* FreeList */
|
|
|
|
void InsertFront(LinkedFileList Node, LinkedFileList *List)
|
|
{
|
|
//
|
|
// If List is empty have it point to Node
|
|
//
|
|
|
|
if ((Node != NULL) &&
|
|
(*List == NULL) )
|
|
*List = Node;
|
|
else if ((Node != NULL)&&
|
|
(*List != NULL) ) {
|
|
(*Node).Next = *List;
|
|
*List = Node;
|
|
}
|
|
} /* InsertFront */
|
|
|
|
//
|
|
// This function is is the same as strcat except
|
|
// that it does the memory allocation for the string
|
|
//
|
|
|
|
LPSTR MyStrCat(char *FirstString, char *SecondString)
|
|
{
|
|
char *String;
|
|
|
|
String = malloc(strlen(FirstString) + strlen(SecondString) + 1);
|
|
if (String == NULL)
|
|
OutOfMem();
|
|
|
|
strcpy(String, FirstString);
|
|
strcpy(&(String[strlen(FirstString)]), SecondString);
|
|
|
|
return(String);
|
|
|
|
} /* MyStrCat */
|
|
|
|
BOOL Match (char *Pat, char* Text)
|
|
{
|
|
switch (*Pat) {
|
|
case '\0':
|
|
return *Text == '\0';
|
|
case '?':
|
|
return *Text != '\0' && Match (Pat + 1, Text + 1);
|
|
case '*':
|
|
do {
|
|
if (Match (Pat + 1, Text))
|
|
return TRUE;
|
|
} while (*Text++);
|
|
return FALSE;
|
|
default:
|
|
return toupper (*Text) == toupper (*Pat) && Match (Pat + 1, Text + 1);
|
|
}
|
|
} /* Match */
|
|
|
|
void OutOfMem(void)
|
|
{
|
|
fprintf(stderr, "-out of memory-\n");
|
|
exit(1);
|
|
} /* OutOfMem */
|
|
|
|
LinkedFileList RemoveFront(LinkedFileList *List)
|
|
{
|
|
LinkedFileList Node = *List;
|
|
|
|
if (*List != NULL)
|
|
*List = (**List).Next;
|
|
(*Node).Next = NULL;
|
|
return Node;
|
|
|
|
} /* RemoveFront */
|