home *** CD-ROM | disk | FTP | other *** search
- /* 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;
-
- strcpy(copy,leaf);
- return -1;
- }
-
- int filesize(char *filename)
- {
- os_filestr o;
-
- o.action = 5;
- o.name = filename;
- os_file(&o);
- if (o.action != 1) return -2;
- if ((o.loadaddr & 0xffffff00) != (0xfff00000|(Module_FileType<<8))) return -2;
- return o.start;
-
- }
-
- int lookup_window_bind(wimp_w w)
- {
- int i;
-
- for (i = 0; i<MaxFiles; i++)
- if (using[i])
- if (data[i]->w == w) return i;
-
- return -1;
- }
-
- int sumsizes(int handle)
- {
- int total = 0;
- int loop;
-
- for (loop = 0; loop < data[handle]->entries; loop++)
- total += data[handle]->m[loop].size;
-
- return total;
- }
-
- void force_redraw(int handle)
- {
- wimp_redrawstr r;
- wimp_wstate state;
- coords_cvtstr c;
-
- r.w = data[handle]->w;
- wimp_getwindowoutline(&r);
- wimp_get_wind_state(r.w,&state);
- c.box = state.o.box;
- c.scx = state.o.x;
- c.scy = state.o.y;
- coords_box_toworkarea(&r.box ,&c);
- wimp_force_redraw(&r);
- }
-
- int longest(int handle)
- {
- int i;
- SFI d = data[handle];
- SMI m = &(d->m[0]);
- int h = 0;
- int r;
-
- for (i = 0; i < d->entries; i++, m++)
- h = (r = strlen(m->filename)) > h ? r : h;
-
- return h;
- }
-
- int smaller(int a,int b)
- {
- return (a > b) ? b : a;
- }
-
- int larger(int a, int b)
- {
- return (a > b) ? a : b;
- }
-
- int gbpb(int file, void *ptr, int amount, int at)
- {
- os_gbpbstr g;
-
- g.action = (at == -1) ? 2 : 1;
- g.file_handle = file;
- g.data_addr = ptr;
- g.number = amount;
- g.seq_point = at;
-
- os_gbpb(&g);
-
- if (g.number)
- {
- werr(0,"Save failed");
- return -1;
- }
- return g.seq_point;
- }
-
- int readb(int file, void *ptr, int amount, int at)
- {
- os_gbpbstr g;
-
- g.action = (at == -1) ? 4 : 3;
- g.file_handle = file;
- g.data_addr = ptr;
- g.number = amount;
- g.seq_point = at;
-
- os_gbpb(&g);
-
- if (g.number)
- {
- werr(0,"Load failed");
- return -1;
- }
- return g.seq_point;
- }
-
- #define BUFFER_SIZE 8192
- char buffer[BUFFER_SIZE];
-
- int copyb(int source, int dest)
- {
- os_gbpbstr p;
-
- do
- {
- p.action = 4;
- p.file_handle = source;
- p.data_addr = buffer;
- p.number = BUFFER_SIZE;
-
- os_gbpb(&p);
- if (p.number < BUFFER_SIZE)
- if (gbpb(dest,buffer,BUFFER_SIZE - p.number, -1) == -1) return FALSE;
- } while (p.number == 0);
-
- return TRUE;
- }
-
- #define DBOX_QUIT "You have unsaved data in %d file%s. Are you sure you want to quit?"
-
- BOOL verify_quit(void)
- {
- char qbuf[256];
- int total = 0,i;
-
- for (i=0; i<MaxFiles; i++) if (using[i]) if (data[i]->changed) total++;
-
- sprintf(qbuf,DBOX_QUIT,total,total == 1 ? "" : "s");
- return (total ? dboxquery(qbuf) == dboxquery_YES : TRUE);
- }
-