home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 1
/
GoldFishApril1994_CD2.img
/
d4xx
/
d494
/
bref
/
bref4.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-06-06
|
39KB
|
1,357 lines
/* Name: bref4.c -- select input
This is a modification of Anders Bjerin's FileWindow routine.
Set TAB value to 3 for this listing.
Invoked from bref.c which is main().
*/
#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <exec/libraries.h>
#include <exec/ports.h>
#include <exec/interrupts.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <intuition/intuition.h>
#include <string.h>
/* #include "FileWindow.h" */
/* Included code for FileWindow.h */
/* What file_window() will return: */
#define GO 500
#define OPTION 600
#define HELP 700
#define CANCEL 800
#define QUIT 900
#define PANIC1 1001
#define PANIC2 1002
/* The maximum size of the strings: */
#define DRAWER_LENGTH 100 /* 100 char's incl NULL. */
#define FILE_LENGTH 30 /* 30 -"- */
#define TOTAL_LENGTH 130 /* 130 -"- */
/* THE END of FileWindow.h */
#define igncase(c) (isupper(c)? tolower(c) : (c)) /* Ignore case--sort*/
/* Declare the functions we are going to use: */
USHORT FileWindow();
STRPTR right_pos();
APTR save_file_info();
BOOL file_comp();
BOOL directory();
BOOL last_check();
BOOL new_drawer();
BOOL pick_file();
void put_in();
void deallocate_file_info();
void change_device();
void parent();
void request_ok();
void display_list();
void connect_dir_file();
void adjust_string_gadgets();
extern struct IntuitionBase *IntuitionBase;
struct Window *file_window;
struct IntuiMessage *my_gadget_message;
/* Structure for memory allocate of each file/directory */
struct file_info
{
BYTE name[28]; /* Name of the file/directory, 27 characters. */
BOOL directory; /* If it is a directory. */
struct file_info *next; /* Pointer to the next file_info structure. */
};
struct FileInfoBlock *file_info;
struct FileLock *lock, *Lock();
BOOL file_lock; /* Have we locked a file? */
BOOL more_files; /* More files in the directory? */
BOOL first_file; /* First file? */
struct file_info *first_pointer; /* Pointing to the first structure. */
/* ********************************************************************* */
/* * IntuiText structures for the requesters * */
struct IntuiText text_request={0,2,JAM1,15,5,NULL,NULL,NULL};
struct IntuiText ok_request={0, 2,JAM1,6, 3,NULL,"OK",NULL};
struct IntuiText option1_request={0, 2,JAM1,6, 3,NULL,NULL,NULL};
struct IntuiText option2_request={0, 2,JAM1,6, 3,NULL,NULL,NULL};
/* Values for a 4-letter box: */
SHORT points4[]={0,0, 44,0, 44,14, 0,14, 0,0};
/* Values for a 6-letter box: */
SHORT points6[]={0,0, 60,0, 60,14, 0,14, 0,0};
/* A border for a 4-letter box: */
struct Border border_text4={0, 0,1, 2, JAM1,5,points4,NULL};
/* A border for a 6-letter box: */
struct Border border_text6={0, 0,1, 2, JAM1,5,points6,NULL};
/* ********************************************************************* */
/* * Information for the help gadget */
struct IntuiText text_help = {3,0,JAM1,7,4,NULL,"HELP",NULL};
struct Gadget gadget_help = {NULL,360,40,61,15,GADGHCOMP,RELVERIFY,
BOOLGADGET,&border_text4,NULL,&text_help,NULL,NULL,0,NULL};
/* ********************************************************************* */
/* * Information for the option gadget */
struct IntuiText text_option = {3,0,JAM1,7,4,NULL,"OPTION",NULL};
struct Gadget gadget_option = {&gadget_help,360,20,61,15,GADGHCOMP,
RELVERIFY,BOOLGADGET,&border_text6,NULL,&text_option,NULL,NULL,0,NULL};
/*********************************************************************** */
/* * Information for the proportional gadget */
struct Image image_prop;
struct PropInfo prop_info=
{
AUTOKNOB| /* We want to use the auto-knob. */
FREEVERT, /* The knob should move vertically. */
0,0, /* HorizPot, VertPot: will be initialized later. */
0, /* HorizBody -"- */
0xFFFF, /* VertBody: No data to show, maximum. */
0,0,0,0,0,0 /* Intuition sets and maintains these variables. */
};
struct Gadget gadget_proportional={&gadget_option,290, 50, 21, 72,GADGHCOMP,
GADGIMMEDIATE|FOLLOWMOUSE|RELVERIFY, /* Activation */
PROPGADGET, /* GadgetType */
(APTR) &image_prop, /* GadgetRender */
NULL,NULL,NULL,(APTR) &prop_info,NULL,NULL };
UBYTE name_backup[DRAWER_LENGTH]; /* String Gadgets Undo Buffer */
/* ********************************************************************* */
/* * Information for the string gadget "Drawer:" * */
UBYTE drawer_name[DRAWER_LENGTH];
/* Values for a 28-letter string box: */
SHORT points28s[]={-7,-4, 200,-4, 200,11, -7,11, -7,-4};
/* A border for a 28-letter string box: */
struct Border border_text28s={0, 0,1, 2, JAM1,5,points28s,NULL};
struct IntuiText text_drawer={1, 2,JAM1,-69, 0,NULL,"Drawer:",NULL};
struct StringInfo string_drawer={drawer_name,name_backup,0,70,0,
0,0, 0,NULL,NULL,NULL,};
struct Gadget gadget_drawer=
{ &gadget_proportional,83, 35, 198, 8,
GADGHCOMP, RELVERIFY, STRGADGET,(APTR) &border_text28s,
NULL,&text_drawer,NULL,(APTR) &string_drawer,NULL,NULL};
/* ********************************************************************* */
/* * Information for the string gadget "File:" * */
UBYTE file_name[FILE_LENGTH];
/* Values for a 30-letter string box: */
SHORT points30s[]={-7,-4, 244,-4, 244,11, -7,11, -7,-4};
/* A border for a 30-letter string box: */
struct Border border_text30s={0, 0,1, 2, JAM1,5,points30s,NULL};
struct IntuiText text_file={1, 2,JAM1,-53, 0,NULL,"File:",NULL};
struct StringInfo string_file={file_name,name_backup,0,40,0,
0,0, 0,NULL,NULL,NULL,};
struct Gadget gadget_file={&gadget_drawer,66, 129, 240, 8,GADGHCOMP,
RELVERIFY,STRGADGET,(APTR) &border_text30s,
NULL,&text_file,NULL,(APTR) &string_file,NULL,NULL};
/* ********************************************************************* */
/* * Information for the string gadget "Extension" * */
UBYTE extension_name[7]; /* 7 characters including NULL. */
/* Values for a 6-letter string box: */
SHORT points6s[]={-7,-4, 57,-4, 57,10, -7,10, -7,-4};
/* A border for a 6-letter string box: */
struct Border border_text6s={0,0,1,2,JAM1,5,points6s,NULL};
struct IntuiText text_extension={1, 2,JAM1,-45, 0,NULL,"Ext:",NULL};
struct StringInfo string_extension={extension_name,name_backup,0,7,0,
0,0, 0,NULL,NULL,NULL,};
struct Gadget gadget_extension=
{&gadget_file,263, 17, 59, 8,GADGHCOMP,RELVERIFY,STRGADGET,
(APTR) &border_text6s,NULL,
&text_extension,NULL,(APTR) &string_extension,NULL,NULL};
/* ********************************************************************* */
/* * Information for the boolean gadget parent "<" * */
/* Values for a 1-letter box: */
SHORT points1[]={0,0, 20,0, 20,15, 0,15, 0,0};
/* A border for a 1-letter box: */
struct Border border_text1={0, 0,1, 2, JAM1,5,points1,NULL};
struct IntuiText text_parent={1, 2,JAM1,7,4,NULL,"<",NULL};
struct Gadget gadget_parent=
{&gadget_extension,290, 31, 21, 16,
GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR) &border_text1,
NULL,&text_parent,NULL,NULL,NULL,NULL};
/* ********************************************************************* */
/* * Information for the boolean gadget "ram:" * */
struct IntuiText text_ram={1, 2,JAM1,7,4,NULL,"ram:",NULL};
struct Gadget gadget_ram={&gadget_parent,161, 13, 45, 15,
GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR) &border_text4,
NULL,&text_ram,NULL,NULL,NULL,NULL};
/* ********************************************************************* */
/* * Information for the boolean gadget "dh0:" * */
struct IntuiText text_dh0={1, 2,JAM1,7,4,NULL,"dh0:",NULL};
struct Gadget gadget_dh0={&gadget_ram,110, 13, 45, 15,
GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR) &border_text4,
NULL,&text_dh0,NULL,NULL,NULL,NULL};
/* ********************************************************************* */
/* * Information for the boolean gadget "df1:" * */
struct IntuiText text_df1={1, 2,JAM1,7,4,NULL,"df1:",NULL};
struct Gadget gadget_df1={&gadget_dh0,59, 13, 45, 15,
GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR) &border_text4,
NULL,&text_df1,NULL,NULL,NULL,NULL};
/* ********************************************************************* */
/* * Information for the boolean gadget "df0:" * */
struct IntuiText text_df0={1, 2,JAM1,7,4,NULL,"df0:",NULL};
struct Gadget gadget_df0={&gadget_df1,8, 13, 45, 15,
GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR) &border_text4,
NULL,&text_df0,NULL,NULL,NULL,NULL};
/* ********************************************************************* */
/* * Information for the boolean gadget "CANCEL" * */
struct IntuiText text_cancel={3, 2,JAM1,7,4,NULL,"CANCEL",NULL};
struct Gadget gadget_cancel={&gadget_df0,360, 144, 61, 15,
GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR) &border_text6,
NULL,&text_cancel,NULL,NULL,NULL,NULL};
/* ********************************************************************* */
/* * Information for the boolean gadget "GO" * */
struct IntuiText text_input={3, 2,JAM1,7,4,NULL,"GO",NULL};
struct Gadget gadget_input={&gadget_cancel,8, 144, 61, 15,
GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR) &border_text4,
NULL,&text_input,NULL,NULL,NULL,NULL};
UBYTE display_text[8][34];
struct IntuiText text_list[8]=
{
{1, 0,JAM2,0,0,NULL,display_text[0],&text_list[1]},
{1, 0,JAM2,0,8,NULL,display_text[1],&text_list[2]},
{1, 0,JAM2,0,16,NULL,display_text[2],&text_list[3]},
{1, 0,JAM2,0,24,NULL,display_text[3],&text_list[4]},
{1, 0,JAM2,0,32,NULL,display_text[4],&text_list[5]},
{1, 0,JAM2,0,40,NULL,display_text[5],&text_list[6]},
{1, 0,JAM2,0,48,NULL,display_text[6],&text_list[7]},
{1, 0,JAM2,0,56,NULL,display_text[7],NULL}
};
struct Gadget gadget_display[8]=
{
{&gadget_display[1],8, 50, 276, 12,GADGHNONE,GADGIMMEDIATE,
BOOLGADGET,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
{&gadget_display[2],8, 62, 276, 8,GADGHNONE,GADGIMMEDIATE,
BOOLGADGET,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
{&gadget_display[3],8, 70, 276, 8,GADGHNONE,GADGIMMEDIATE,
BOOLGADGET,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
{&gadget_display[4],8, 78, 276, 8,GADGHNONE,GADGIMMEDIATE,
BOOLGADGET,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
{&gadget_display[5],8, 86, 276, 8,GADGHNONE,GADGIMMEDIATE,
BOOLGADGET,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
{&gadget_display[6],8, 94, 276, 8,GADGHNONE,GADGIMMEDIATE,
BOOLGADGET,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
{&gadget_display[7],8, 102, 276, 8,GADGHNONE,GADGIMMEDIATE,
BOOLGADGET,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
{&gadget_input,8, 110, 276, 12,GADGHNONE,GADGIMMEDIATE,
BOOLGADGET,NULL,NULL,NULL,NULL,NULL,NULL,NULL}
};
/* ********************************************************************* */
/* * BIG BOX * */
/* Values for a big box: */
SHORT points_big_box[]={8,50, 283,50, 283,121, 8,121, 8,50};
/* A border for a 1-letter box: */
struct Border border_big_box={0, 0,1, 2, JAM1,5,points_big_box,NULL};
/* ********************************************************************* */
/* * Information for the window */
struct NewWindow new_file_window={0,0,480, 163,0,1,
CLOSEWINDOW| GADGETDOWN| MOUSEMOVE| GADGETUP,
ACTIVATE| WINDOWDEPTH| WINDOWDRAG| WINDOWCLOSE| SMART_REFRESH,
&gadget_display[0],NULL,NULL,NULL,NULL,0,0,0,0,WBENCHSCREEN};
/* ******************************************************************* */
/* Entry point */
USHORT FileWindow(total_file_name )
STRPTR total_file_name;
{
STRPTR extension = "";
SHORT x=0,y=0;
int temp1; /* Variable used for loops etc. */
int file_count; /* How many files/directories there are. */
ULONG class; /* Saved IntuiMessage: IDCMP flags. */
USHORT code; /* -"- : Special code. */
APTR address; /* -"- : The address of the object. */
int position; /* The number of the first file in the display. */
BOOL working; /* Wants the user to quit? */
BOOL fix_display; /* Should we update the file-display? */
STRPTR string_pointer; /* Pointer to a string. */
struct file_info *pointer; /* Pointer to a file_info structure. */
USHORT operation; /* What operation FileWindow will return. */
file_lock=FALSE; /* We have not locked any file/directory. */
more_files=FALSE; /* Do not list any files yet. */
/* Make sure the proportional gadget is at the top, showing 100%: */
prop_info.VertBody=0xFFFF;
prop_info.HorizBody=0;
prop_info.VertPot=0;
prop_info.HorizPot=0;
/* Copy the extension into the string gadget: */
strcpy(extension_name, extension);
/* If there is an extension, the text "Ext:" will be highlighted: */
if(*extension_name != '\0')
text_extension.FrontPen=3; /* Orange. (Normal WB colour) */
else
text_extension.FrontPen=1; /* White. (Normal WB colour) */
/* Change some values in the new_file_window structure: */
new_file_window.LeftEdge=x;
new_file_window.TopEdge=y;
new_file_window.Title= "BREF FileWindow";
/* Open the window: */
if( (file_window = (struct Window *) OpenWindow(&new_file_window)) == NULL )
{
/* We could NOT open the window! */
return(PANIC1); /* No msg here; BREF will give error msg */
}
/* Draw the big box around the display: */
DrawBorder(file_window->RPort, &border_big_box, 0, 0);
/* Allocate memory for the FileInfoBlock: */
if((file_info=(struct FileInfoBlock *)
AllocMem(sizeof(struct FileInfoBlock), MEMF_PUBLIC|MEMF_CLEAR))==NULL)
{
/* Could not allocate memory for the FileInfoBlock! */
request_ok("FileWindow--NOT enough memory!");
return(PANIC2); /* Since msg given here, no msg in BREF */
}
/* Anything in total_file_name? */
if(*total_file_name != '\0')
{
/* Yes--Try to "lock" the file/directory: */
if((lock=Lock(total_file_name, ACCESS_READ))==NULL)
{
/* PROBLEMS! */
/* File/directory/device did NOT exist! */
}
else
{
/* Could lock the file/directory! */
file_lock=TRUE;
/* Get some information of the file/directory: */
if((Examine(lock, file_info))==NULL)
{
/* Could NOT examine the object! */
request_ok("FileWindow--ERROR reading file/directory!");
}
else
{
/* Is it a directory or a file? */
if(directory(file_info))
{
/* It is a directory! */
*file_name='\0'; /* Clear file_name string. */
/* Copy total_file_name into drawer_name string: */
strcpy(drawer_name, total_file_name);
/* Since it is a directory, we will look for more files: */
more_files=TRUE;
}
else
{
/* File--Separate the file name from the path: */
if(string_pointer=right_pos(total_file_name, '/'))
{
/* Copy the file name into file_name string: */
strcpy(file_name, string_pointer+1);
*string_pointer='\0';
}
else
{
if(string_pointer=right_pos(total_file_name, ':'))
{
/* Copy the file name into file_name string: */
strcpy(file_name, string_pointer+1);
*(string_pointer+1)='\0';
}
else
{
strcpy(file_name, total_file_name);
*drawer_name='\0';
*total_file_name='\0';
}
}
strcpy(drawer_name, total_file_name);
/* Since it is a file, we will NOT look for more files: */
} /* Is it a directory? */
} /* Could we examine the object? */
} /* Could we "lock" the file/directory? */
} /* Anything in the total_file_name string? */
/* Adjust the string gadgets */
adjust_string_gadgets();
new_drawer(); /* Start to show us the files. */
position=0; /* The display will show the first file. */
fix_display=FALSE; /* We do not need to fix the display. */
first_file=TRUE; /* No files saved. */
file_count=0; /* No files saved. */
working=TRUE;
do
{
/* If all files shown, put task to sleep */
if(more_files==FALSE)
Wait(1 << file_window->UserPort->mp_SigBit);
/* Any gadget activity? */
while(my_gadget_message = (struct IntuiMessage *)
GetMsg(file_window->UserPort))
{
/* Stay in loop while mouse moving. Update display when mouse stops*/
class = my_gadget_message->Class;
code = my_gadget_message->Code;
address = my_gadget_message->IAddress;
ReplyMsg((struct Message *)my_gadget_message);
switch(class)
{
case MOUSEMOVE:
/* Proportional gadget selected, & mouse is moving. */
/* Update file_display when mouse stops. */
fix_display=TRUE;
break;
case CLOSEWINDOW: /* User wants to quit. */
connect_dir_file(total_file_name);
working=FALSE;
operation=QUIT;
break;
case GADGETDOWN: /* Gadget selected -- which one? */
/* File Display */
for(temp1=0; temp1 < 8; temp1++)
{
if(address == (APTR)&gadget_display[temp1])
{
/* The user wants to select a file/directory: */
pick_file(temp1+position);
}
}
break;
case GADGETUP: /* Gadget released -- which one? */
if(address == (APTR)&gadget_input || /* GO */
address == (APTR)&gadget_file) /* FILE */
{
if(last_check(total_file_name))
{
working=FALSE;
operation=GO;
}
break;
}
if(address == (APTR)&gadget_cancel) /* CANCEL */
{
connect_dir_file(total_file_name);
working=FALSE;
operation=CANCEL;
break;
}
if(address == (APTR)&gadget_df0) /* df0: */
{
change_device("df0:");
break;
}
if(address == (APTR)&gadget_df1) /* df1: */
{
change_device("df1:");
break;
}
if(address == (APTR)&gadget_dh0) /* dh0: */
{
change_device("dh0:");
break;
}
if(address == (APTR)&gadget_ram) /* ram: */
{
change_device("ram:");
break;
}
if(address == (APTR)&gadget_drawer) /* DRAWER: */
{
/* The user has entered something new in the drawer: */
new_drawer();
break;
}
if(address == (APTR)&gadget_extension) /* EXTENSION: */
{
/* If extension used, text "Ext:" is highlighted */
if(*extension_name != '\0')
text_extension.FrontPen=3; /* Orange. (Normal WB colour) */
else
text_extension.FrontPen=1; /* White. (Normal WB colour) */
/* Show the user the colour change: */
RefreshGadgets(&gadget_extension, file_window, NULL);
/* Start again to diplay the files, using a new extension. */
new_drawer();
break;
}
if(address == (APTR)&gadget_parent) /* PARENT: "<" */
{
parent();
break;
}
if(address == (APTR)&gadget_proportional) /* PROPORTIONAL */
{
/* Proportional gadget released, update display */
fix_display=TRUE;
break;
}
if(address == (APTR)&gadget_option) /* OPTION */
{
connect_dir_file(total_file_name);
working=FALSE;
operation=OPTION;
break;
}
if(address == (APTR)&gadget_help) /* HELP */
{
connect_dir_file(total_file_name);
working=FALSE;
operation=HELP;
break;
}
}
}
if(fix_display) /* Do we need to update the file display? */
{
fix_display=FALSE;
/* Which file should we start to show in the display? */
if(file_count > 8)
position=(int) prop_info.VertPot/(float) 0xFFFF*(file_count-8);
else
position=0;
/* List the files: (Starting with position) */
display_list(position);
}
if(more_files)
{
/* Are there more files/dirtectories left to be collected? */
if(ExNext(lock, file_info))
{
/* List the file/directory if it is: */
/* 1. A file which has the right extension. */
/* 2. A directory. */
/* if(stricmp(extension_name, (file_info->fib_FileName+*/
/* changed "stricmp" to "strcmp" */
if(strcmp(extension_name, (file_info->fib_FileName+
strlen(file_info->fib_FileName)-strlen(extension_name)))==0 ||
directory(file_info) )
{
/* Is this the first file/directory? */
if(first_file)
{
/* first_pointer will point at the first file in our list: */
first_pointer=(struct file_info *) save_file_info(file_info);
if(first_pointer != NULL)
{
/* There are no more elements (for the moment) in our list: */
first_pointer->next=NULL;
first_file=FALSE;
}
file_count=1;
position=1;
}
else
{
/* save_file_info will return a pointer to the allocated */
/* structure: */
pointer=(struct file_info *) save_file_info(file_info);
/* If space allocated for file, add it to list */
if(pointer !=NULL)
{
/* Put new structure into list: */
put_in(first_pointer, pointer);
file_count++;
}
}
/* If > 8 files/directories, modify proportional gadget */
if(file_count > 8)
{
ModifyProp
(
&gadget_proportional, /* PropGadget */
file_window, /* Pointer */
NULL, /* Requester */
prop_info.Flags, /* Flags */
0, /* HorizPot */
prop_info.VertPot, /* VertPot */
0, /* HorizBody */
(ULONG) 0xFFFF*8/file_count /* VerBody */
);
position=(int) prop_info.VertPot/(float) 0xFFFF*(file_count-8);
}
else
position=0;
/* List all the files: */
display_list(position);
}
}
else
{
/* ExNext() failed: */
more_files=FALSE; /* Do not try to list any more files. */
/* Check what went wrong: */
/* If error msg NOT "ERROR_NO_MORE_ENTRIES", serious reading error*/
if(IoErr() != ERROR_NO_MORE_ENTRIES)
{
request_ok("FileWindow--ERROR reading file/directory!");
}
}
}
} while(working);
/* Clean up and leave: */
/* This will clear the IDCMP port: */
while( (my_gadget_message = (struct IntuiMessage *)
GetMsg(file_window->UserPort)) )
{
ReplyMsg((struct Message *)my_gadget_message);
}
/* Deallocate the memory we have dynamically allocated: */
deallocate_file_info();
/* If we have "locked" a file/directory, "unlock" it: */
if(file_lock)
{
UnLock(lock);
file_lock=FALSE;
}
/* Deallocate FileInfoBlock: */
if(file_info) FreeMem(file_info, sizeof(struct FileInfoBlock));
/* If we have successfully opened the file_window, we close it: */
if(file_window)
CloseWindow(file_window);
/* Leave with a message: */
return(operation);
}
/* Deallocate the memory we have dynamically allocated: */
void deallocate_file_info()
{
struct file_info *pointer, *temp_pointer;
/* Does the first pointer point to an allocated structure? */
if(first_pointer)
{
/* Save the address of the next structure: */
pointer=first_pointer->next;
/* Deallocate the first structure: */
FreeMem( first_pointer, sizeof(struct file_info));
/* As long as pointer points to an allocated structure: */
while(pointer)
{
/* Save the address of the next structure: */
temp_pointer=pointer->next;
FreeMem( pointer, sizeof(struct file_info));
pointer=temp_pointer;
}
}
/* Clear first_pointer: */
first_pointer=NULL;
/* Next time we try to list the files, we start with the first_file: */
first_file=TRUE;
}
/* Allocate memory for the new file/directory, and fills the structure */
/* with information. (name of the object, and if it is a directory.) */
/* Returns a memory pointer to the allocated structure, or NULL. */
APTR save_file_info(info)
struct FileInfoBlock *info;
{
struct file_info *pointer;
if((pointer=(struct file_info *)
AllocMem(sizeof(struct file_info), MEMF_PUBLIC|MEMF_CLEAR))==NULL)
{
/* We could NOT allocate memory for the structure! */
request_ok("FileWindow--NOT enough memory!"); /* Inform the user. */
more_files=FALSE; /* Do not list any more files/directories. */
return(NULL);
}
else
{
/* If the file/directory name is not too long, we copy it into the */
/* new stucture: */
if(strlen(info->fib_FileName) < 28)
strcpy(pointer->name, info->fib_FileName);
else
{
/* The file/directory name is too long! */
/* Inform the user: */
if( directory(info))
request_ok("FileWindow--Directory name too long!");/* Directory*/
else
request_ok("FileWindow--File name too long!"); /* File. */
/* Deallocate the structure: */
FreeMem( pointer, sizeof(struct file_info));
return(NULL);
}
/* Is it a file or a directory? */
if( directory(info))
pointer->directory=TRUE; /* It is a directory. */
else
pointer->directory=FALSE; /* It is a file. */
}
/* Return the address of the allocated structure: */
return( (APTR) pointer);
}
/* Will check a FileInfoBlock if it is a file or a directory. */
/* Return TRUE if it is a directory, FALSE if it is a file. */
BOOL directory(info)
struct FileInfoBlock *info;
{
if(info->fib_DirEntryType < 0)
return(FALSE);
else
return(TRUE);
}
/* Put the new structure into the dynamically allocated list at the */
/* right place (sorted alphabetically, directories first): */
void put_in(a_pointer, pointer)
struct file_info *a_pointer, *pointer;
{
struct file_info *old_pointer=NULL;
/* Move slowly down the list and try to fit in the structure: */
while( a_pointer && file_comp(a_pointer->name, pointer->name) )
{
old_pointer=a_pointer;
a_pointer=a_pointer->next;
}
if(a_pointer)
{
if(old_pointer)
{
/* Put the structure into the list: */
pointer->next=old_pointer->next;
old_pointer->next=pointer;
}
else
{
/* First in the list! */
pointer->next=first_pointer;
first_pointer=pointer;
}
}
else
{
/* Last int the list: */
old_pointer->next=pointer;
pointer->next=NULL;
}
}
/* This function will return TRUE if the first pointer (a_pointer) */
/* points to a file structure which should come before the second */
/* pointers file structure. */
/* ORDER: 1. DIRECTORIES alpha sort. 2. FILES alpha sort. */
BOOL file_comp(a_pointer, pointer)
struct file_info *a_pointer, *pointer;
{
char name1[28], name2[28], *cp1, *cp2;
if(a_pointer->directory == FALSE && pointer->directory)
return(FALSE);
if(a_pointer->directory == pointer->directory)
{
/* if(stricmp(a_pointer->name, pointer->name) <= 0 )*/
/* changed "stricmp" to "strcmp". But to function like stricmp, */
/* we need to convert the names to lower case for the sort. */
/* Convert first name to lower case in name1 */
for (cp1=a_pointer->name, cp2=name1; *cp2++ = igncase(*cp1); cp1++) ;
/* Convert second name to lower case in name2 */
for (cp1=pointer->name, cp2=name2; *cp2++ = igncase(*cp1); cp1++) ;
if(strcmp(name1, name2) <= 0 )
return(TRUE);
else
return(FALSE);
}
return(TRUE);
}
/* Give this function a string and a character, and it will return a */
/* pointer to the right most occurance character in you string which */
/* match your character. */
STRPTR right_pos(string, sign)
STRPTR string;
char sign;
{
STRPTR start_pos;
start_pos=string;
/* Go to the end: */
while(*string != '\0')
string++;
/* Start to go backwards and check teh string: */
while(*string != sign && string > start_pos)
string--;
if(*string==sign)
return(string); /* We have found a matching character. */
return(NULL); /* We could not find a matching character. */
}
/* This function will change to a new device, for example df0:. */
/* Does not return anything. */
void change_device(device)
STRPTR device;
{
strcpy(drawer_name, device); /* Change the drawer string. */
adjust_string_gadgets(); /* Adjust the string gadgets. */
new_drawer(); /* Start to show us the new files/directories */
}
/* When the user or the program has changet the drawer string, this */
/* function is called, and will do what is necessary to start to collect */
/* the new files/directories from the disk. */
/* Returns TRUE if everything is OK, and FALSE if something went wrong. */
BOOL new_drawer()
{
STRPTR string_pointer;
/* Unlock: */
if(file_lock)
{
UnLock(lock);
file_lock=FALSE;
}
/* Deallocate the memory we have dynamically allocated: */
deallocate_file_info();
/* Change the proportianal gadget: */
ModifyProp
(
&gadget_proportional, /* PropGadget */
file_window, /* Pointer */
NULL, /* Requester */
prop_info.Flags, /* Flags */
0, /* HorizPot */
0, /* VertPot */
0, /* HorizBody */
(ULONG) 0xFFFF /* VerBody */
);
/* Clear the display: */
display_list(0);
more_files=FALSE;
/* Try to "lock" the file/directory: */
if((lock=Lock(drawer_name, ACCESS_READ))==NULL)
{
/* We could NOT lock the file/directory/device! */
/* Inform the user: */
string_pointer=drawer_name+strlen(drawer_name)-1;
if(*string_pointer==':')
request_ok("FileWindow--Device NOT found!");
else
request_ok("FileWindow--Device/Directory NOT found!");
return(FALSE); /* ERROR */
}
else
{
/* We "locked" the file/directory! */
file_lock=TRUE;
}
/* Now try to get some information from the file/directory: */
if((Examine(lock, file_info))==NULL)
{
/* We could NOT examine the file/directory! */
request_ok("FileWindow--ERROR reading file/directory!");
return(FALSE); /* ERROR */
}
/* Is it a directory or a file? */
if(directory(file_info))
{
/* It is a directory! */
/* Since it is a directory, we will look for more files: */
more_files=TRUE;
}
else
{
/* It is a file! */
request_ok("FileWindow--NOT a valid directory name!");
return(FALSE);
}
return(TRUE);
}
/* The function parent() will try to go backwards one step in the */
/* directory path. */
/* Does not return anything. */
void parent()
{
STRPTR string_pointer;
/* Separate the last directory from the path: */
if(string_pointer=right_pos(drawer_name, '/'))
{
/* Take away the last directory: */
*string_pointer='\0';
}
else
{
if(string_pointer=right_pos(drawer_name, ':'))
{
/* Take away the last directory: */
/* Only the device ("df0:" for example) left: */
*(string_pointer+1)='\0';
}
else
{
/* Strange drawer_name, clear it: */
*drawer_name='\0';
}
}
/* Since we have messed around with the string gadgets, adjust them: */
adjust_string_gadgets();
/* Start to show the user the files etc in the new directory: */
new_drawer();
}
/* You give this function a pointer to an error string, and it will open */
/* a simple requester displaying the message. The requester will go away */
/* first when the user has selected the button "OK". */
/* Does not return anything. */
void request_ok(message)
STRPTR message;
{
text_request.IText=message;
AutoRequest
(
file_window, /* Window */
&text_request, /* BodyText */
NULL, /* PositiveText nothing */
&ok_request, /* NegativeText OK */
NULL, /* PositiveFlags */
NULL, /* NegativeFlags */
320, /* Width */
72 /* Height */
);
}
/* This function will display the files etc which are inside the */
/* directory, starting with the file number start_pos. */
/* Does not return anything. */
void display_list(start_pos)
int start_pos;
{
struct file_info *pointer;
int pos, temp1;
/* 123456789012345678901234567890123 */
char empty_name[]=" ";
STRPTR string_pointer;
BOOL clear;
pos=0;
/* Does it exist any files at all? */
if(first_pointer)
{
pointer=first_pointer;
/* Go through the list until you have found the file/directory */
/* which should be shown first: */
while(pointer && pos < start_pos)
{
pos++;
pointer=pointer->next;
}
/* Try to show the eight files: */
pos=0;
while(pointer && pos < 8)
{
strcpy(display_text[pos], pointer->name);
clear=FALSE;
temp1=0;
string_pointer=display_text[pos];
if(pointer->directory)
{
/* It is a directory: */
text_list[pos].FrontPen=3; /* Highlight it. */
/* Clear everything after the name, and add the string "(Dir)". */
while(temp1 < 28)
{
if(*string_pointer=='\0')
clear=TRUE;
if(clear)
*string_pointer=' ';
string_pointer++;
temp1++;
}
*string_pointer='\0';
strcat(display_text[pos], "(Dir)");
}
else
{
/* It is a file: */
text_list[pos].FrontPen=1; /* Normal colour. */
/* Clear everything after the name: */
while(temp1 < 33)
{
if(*string_pointer=='\0')
clear=TRUE;
if(clear)
*string_pointer=' ';
string_pointer++;
temp1++;
}
*string_pointer='\0';
}
pos++;
pointer=pointer->next; /* Next. */
}
}
/* If there are less than eight files, show clear the rest of the */
/* display: */
while(pos < 8)
{
strcpy(display_text[pos], empty_name);
pos++;
}
/* Show the user the new display: */
PrintIText(file_window->RPort, text_list, 13+3, 53+1);
}
/* The user has selected a file or a directory. If it is a file put it */
/* into the file string, otherwise put it into the drawer string. */
/* Returns TRUE if everything went OK, FALSE if there was a problem. */
BOOL pick_file(file_pos)
int file_pos;
{
struct file_info *pointer=NULL;
STRPTR string_pointer;
int pos=0;
/* Go through the allocated list untill we find the file/directory: */
if(first_pointer)
{
pointer=first_pointer;
while(pointer && pos < file_pos)
{
pos++;
pointer=pointer->next;
}
}
/* Have we found the file/directory? */
if(pointer)
{
if(pointer->directory)
{
/* It is a directory! */
/* Is the drawer_name string long enough? */
/* (+2: 1 for the NULL ('\0') character, 1 for the '\' character) */
if((strlen(pointer->name)+strlen(drawer_name)+2) <= DRAWER_LENGTH)
{
/* YES!, there is enough room for it. */
string_pointer=drawer_name+strlen(drawer_name)-1;
if(*string_pointer==':' || *string_pointer=='\0' )
strcat(drawer_name, pointer->name);
else
{
/* We need to add a '/' before we can add the directory. */
strcat(drawer_name, "/");
strcat(drawer_name, pointer->name);
}
/* Adjust the string gadgets: */
adjust_string_gadgets();
}
else
{
/* The drawer_name is NOT big enough! */
request_ok("FileWindow--Too long drawer string");
return(FALSE); /* ERROR */
}
new_drawer();
return(TRUE); /* OK */
}
else
{
/* It is a File! */
/* Is the file_name string long enough? */
/* (+1 for the NULL ('\0') character.) */
if((strlen(pointer->name)+1) <= FILE_LENGTH)
{
strcpy(file_name, pointer->name);
adjust_string_gadgets();
}
else
{
/* The file_name is NOT big enough! */
request_ok("FileWindow--File name too long!");
return(FALSE); /* ERROR */
}
return(TRUE); /* OK */
}
}
}
/* Adjust the string gadgets, so the user can */
/* at least see the last 28/22 characters. */
/* Does not return anything. */
void adjust_string_gadgets()
{
int length;
length=strlen(file_name);
if(length > 28)
string_file.DispPos=length-28;
else
string_file.DispPos=0;
string_file.BufferPos=string_file.DispPos;
length=strlen(drawer_name);
if(length > 22)
string_drawer.DispPos=length-22;
else
string_drawer.DispPos=0;
string_drawer.BufferPos=string_drawer.DispPos;
/* Display the changes. */
RefreshGadgets(&gadget_file, file_window, NULL);
}
/* Returns TRUE if there exist a file name, otherwise FALSE. */
BOOL last_check(name)
STRPTR name;
{
if(*file_name == '\0')
{
/* No file name! */
request_ok("FileWindow--NO filename selected!");
return(FALSE);
}
else
{
/* Change the total_file_name. Drawer + File. */
connect_dir_file(name);
}
return(TRUE);
}
/* This function will connect the drawer string with the file string. */
/* Does not return anything. */
void connect_dir_file(name)
STRPTR name;
{
STRPTR string_pointer;
strcpy(name, drawer_name); /* Copy the drawer string into name. */
/* Does it exist a file name? */
if(*file_name != '\0')
{
/* Yes! */
string_pointer=drawer_name+strlen(drawer_name)-1;
if(*string_pointer==':' || *string_pointer=='\0' )
{
strcat(name, file_name); /* Add the file name. */
}
else
{
strcat(name, "/"); /* Add a '\'. */
strcat(name, file_name); /* Add the file name. */
}
}
} /* THE END */