home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 5
/
DATAFILE_PDCD5.iso
/
utilities
/
m
/
multimod
/
!MultiMod
/
c
/
gen
< prev
next >
Wrap
Text File
|
1992-11-16
|
11KB
|
432 lines
/* gen.c */
/* Contains routines which I have finished with */
#include "all.h"
static void mark_settitle(wimp_w w,char *title,int withstar)
{
char buf[308];
sprintf(buf,"Multi Module: %s%s",title,withstar ? " *" : "");
win_settitle(w,buf);
}
void mark_changed(int handle)
{ mark_settitle(data[handle]->w,data[handle]->filename,data[handle]->changed = 1); }
void mark_unchanged(int handle)
{ mark_settitle(data[handle]->w,data[handle]->filename,data[handle]->changed = 0); }
BOOL save_empty_mm(char *name,void *handle)
{
int h;
h = allocate_named_window(name);
return h == -1 ? FALSE : save_mm(name, (void *)h);
}
char *suggest(int f)
{
return (strcmp(data[f]->filename,"<Untitled>")==0) ?
"Collection" :
data[f]->filename;
}
void handler(void *handle, char *hit)
{
int f = (int) handle;
switch (hit[0])
{
case mm_menu_disp: switch (hit[1])
{
case sorting_none :
case sorting_alpha :
case sorting_size :
case sorting_revsize :
if (data[f]->sort != hit[1])
{
data[f]->sort = hit[1];
setflags(f);
resort(f);
force_redraw(f);
}
break;
case display_fullinfo:
case display_small :
case display_large :
if (data[f]->disp != hit[1])
{
data[f]->disp = hit[1];
setflags(f);
resize_window(f);
force_redraw(f);
}
}
break;
case mm_menu_svap: saveas(0xff8,Module_Suggestion,0,save_to_absolute,0
,print_info,(void *)f); break;
case mm_menu_save: saveas(MultiModule_FileType,suggest(f),
sizeof(single_file_info),
save_mm,0,print_info,(void *)f); break;
case mm_menu_del : delete_module(f); break;
case mm_menu_quit: if (verify_quit()) exit(0);
}
}
void setflags(int handle)
{
SFI d = data[handle];
int dispmode = d->disp;
int sortmode = d->sort;
int f;
for (f = display_large; f <= display_fullinfo; f++)
menu_setflags(disp_menu,f,dispmode == f ? 1 : 0,0);
for (f = sorting_none; f <= sorting_revsize; f++)
menu_setflags(disp_menu,f,sortmode == f ? 1 : 0,0);
}
void data_handler(int i, wimp_w w)
{
win_register_event_handler(w, data_win_handler, (void *)i);
event_attachmenumaker(w,maker,handler,(void *)i);
}
void blank_data(SFI d)
{
int i;
char *j = (char *) d;
for (i=0; i<sizeof(single_file_info); *j++ = '\0' , i++);
sprintf(d->ident,IDENT);
d->version = VERSION_NUMBER;
}
BOOL save_mm(char *name, void *handle)
{
SFI d = data[(int)handle];
int f = (int) d;
os_regset regs;
d->changed = FALSE;
if (xfersend_file_is_safe()) strncpy(d->filename,name,256);
regs.r[0] = 10;
regs.r[1] = (int) name;
regs.r[2] = MultiModule_FileType;
regs.r[4] = f;
regs.r[5] = f + sizeof(single_file_info);
os_swi(OS_File,®s);
if (xfersend_file_is_safe()) mark_unchanged((int)handle);
else mark_changed((int)handle);
return TRUE;
}
void data_init(void)
{
int i;
for (i = 0; i < MaxFiles ; i++)
using[i] = FALSE;
}
void destroy_data(int i)
{
if (!using[i]) werr(-1,"Tried to free an unallocated block"); else {
flex_free((flex_ptr)&data[i]);
using[i] = FALSE;
}
}
/* Handles 'printing' of a multimod file */
int print_info(char *name, void *handle) /* returns file type */
{
FILE *f = fopen(name,"w");
SFI d = data[(int)handle];
int i;
int offset = AUXSIZE;
char size[12];
if (f == NULL)
{
werr(0,"Couldn't save data for printing");
return xfersend_printFailed;
}
fprintf(f,"Printout of contents of '%s' by Multi Module version %s\n\n",
d->filename, example_Version_String);
fprintf(f,"Number of modules in file: %d\n\n",d->entries);
fprintf(f,"No. %-16.16s Module Size Data Offset\n","Module Leaf Name");
calculate_offsets((int)handle);
for (i = 0; i < d->entries; i++)
{
fprintf(f,"%3d: %-16.16s %-11.11s &%08x\n",
i+1, d->m[i].leaf, size_string(d->m[i].size,size), offset);
offset += d->m[i].size + 4;
}
fprintf(f,"\nTotal size of modules : %s\n",size_string(offset-AUXSIZE,size));
fprintf(f,"Size of auxiliary code: %s\n\n",size_string(AUXSIZE,size));
fprintf(f,"Total application size: %s\n\n",size_string(offset + AUXSIZE,size));
fclose(f);
return 0xfff;
}
char *size_string(int size, char *buffer)
{
os_regset regs;
regs.r[0] = size;
regs.r[1] = (int) buffer;
regs.r[2] = 12;
os_swi(OS_ConvertFixedFileSize,®s);
return buffer;
}
int align(int i)
{
return (i % 4) == 0 ? i : align(i+1);
}
void calculate_offsets(int handle)
{
SFI d = data[handle];
int i,sum = AUXSIZE + 4;
if (d->entries > 0)
for (i = 0; i < d->entries; sum += align(d->m[i++].size) + 4)
d->m[i].offset = sum;
}
void delete_module(int handle)
{
SFI d = data[handle];
if (d->cm >= d->entries) { werr(0,"Module index doesn't exist"); return; }
if (d->cm != --d->entries)
{
SMI smibase = &(d->m[d->cm]), sminext = smibase+1;
int m;
for (m = d->cm ; m < d->entries ; m++)
*smibase++ = *sminext++;
}
mark_changed(handle);
resize_window(handle);
force_redraw(handle);
}
void add_module(int handle, char *filename)
{
SFI d = data[handle];
SMI m = &(d->m[d->entries++]);
char leaf[12];
char fsp[256];
int match;
if ((match = check_duplicates(handle,filename,leaf,fsp)) > -1)
{
werr(0,"Module already in this collection");
d->entries--;
return;
}
if (d->entries > MaxModules)
{
werr(0,"Too many modules (%d) in file",--d->entries);
return;
}
if ((m->size = filesize(filename)) == -2)
{
d->entries--;
werr(0,"Only modules can be dropped in this window");
return;
}
mark_changed(handle);
m->order = d->next++;
strcpy(m->leaf,leaf); /* Set the leaf name up */
strcpy(m->filename,filename); /* Set the filename up */
sprintf(m->display,"%.11s",size_string(m->size,leaf));
resize_window(handle);
}
int check_duplicates(int handle,char *filename,char *copy,char *copy2)
{
char *leaf = filename;
char *orig = filename;
int i;
SMI m = &(data[handle]->m[0]);
while (*filename) if (*filename++ == '.') leaf = filename;
if ((leaf - filename) > 16)
{
werr(0,"Name too long '%s'",leaf);
return -1;
}
for (i = 0; i<data[handle]->entries; i++, m++)
if (strcmp(m->filename,orig) == 0) return i;