home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / m / multimod / !MultiMod / c / gen < prev    next >
Text File  |  1992-11-16  |  11KB  |  432 lines

  1. /* gen.c */
  2.  
  3. /* Contains routines which I have finished with */
  4.  
  5. #include "all.h"
  6.  
  7. static void mark_settitle(wimp_w w,char *title,int withstar)
  8. {
  9.         char buf[308];
  10.  
  11.         sprintf(buf,"Multi Module: %s%s",title,withstar ? " *" : "");
  12.         win_settitle(w,buf);
  13. }
  14.  
  15. void mark_changed(int handle)
  16. { mark_settitle(data[handle]->w,data[handle]->filename,data[handle]->changed = 1); }
  17.  
  18. void mark_unchanged(int handle)
  19. { mark_settitle(data[handle]->w,data[handle]->filename,data[handle]->changed = 0); }
  20.  
  21.  
  22. BOOL save_empty_mm(char *name,void *handle)
  23. {
  24.         int h;
  25.  
  26.         h = allocate_named_window(name);
  27.         return h == -1 ? FALSE : save_mm(name, (void *)h);
  28. }
  29.  
  30. char *suggest(int f)
  31. {
  32.         return (strcmp(data[f]->filename,"<Untitled>")==0) ?
  33.                 "Collection" :
  34.                 data[f]->filename;
  35. }
  36.  
  37. void handler(void *handle, char *hit)
  38. {
  39.         int f = (int) handle;
  40.  
  41.         switch (hit[0])
  42.         {
  43.         case mm_menu_disp: switch (hit[1])
  44.                            {
  45.                              case sorting_none    :
  46.                              case sorting_alpha   :
  47.                              case sorting_size    :
  48.                              case sorting_revsize :
  49.                                 if (data[f]->sort != hit[1])
  50.                                 {
  51.                                         data[f]->sort = hit[1];
  52.                                         setflags(f);
  53.                                         resort(f);
  54.                                         force_redraw(f);
  55.                                 }
  56.                                 break;
  57.  
  58.                              case display_fullinfo:
  59.                              case display_small   :
  60.                              case display_large   :
  61.                                 if (data[f]->disp != hit[1])
  62.                                 {
  63.                                         data[f]->disp = hit[1];
  64.                                         setflags(f);
  65.                                         resize_window(f);
  66.                                         force_redraw(f);
  67.                                 }
  68.                            }
  69.                            break;
  70.         case mm_menu_svap: saveas(0xff8,Module_Suggestion,0,save_to_absolute,0
  71.                                         ,print_info,(void *)f); break;
  72.         case mm_menu_save: saveas(MultiModule_FileType,suggest(f),
  73.                                   sizeof(single_file_info),
  74.                                   save_mm,0,print_info,(void *)f); break;
  75.         case mm_menu_del : delete_module(f); break;
  76.         case mm_menu_quit: if (verify_quit()) exit(0);
  77.         }
  78. }
  79.  
  80. void setflags(int handle)
  81. {
  82.         SFI d        = data[handle];
  83.         int dispmode = d->disp;
  84.         int sortmode = d->sort;
  85.         int f;
  86.  
  87.         for (f = display_large; f <= display_fullinfo; f++)
  88.                 menu_setflags(disp_menu,f,dispmode == f ? 1 : 0,0);
  89.  
  90.         for (f = sorting_none; f <= sorting_revsize; f++)
  91.                 menu_setflags(disp_menu,f,sortmode == f ? 1 : 0,0);
  92. }
  93.  
  94. void data_handler(int i, wimp_w w)
  95. {
  96.         win_register_event_handler(w, data_win_handler, (void *)i);
  97.         event_attachmenumaker(w,maker,handler,(void *)i);
  98. }
  99.  
  100. void blank_data(SFI d)
  101. {
  102.         int i;
  103.         char *j = (char *) d;
  104.  
  105.         for (i=0; i<sizeof(single_file_info); *j++ = '\0' , i++);
  106.         sprintf(d->ident,IDENT);
  107.         d->version = VERSION_NUMBER;
  108. }
  109.  
  110. BOOL save_mm(char *name, void *handle)
  111. {
  112.         SFI d = data[(int)handle];
  113.         int f = (int) d;
  114.  
  115.         os_regset regs;
  116.  
  117.         d->changed = FALSE;
  118.         if (xfersend_file_is_safe()) strncpy(d->filename,name,256);
  119.         regs.r[0] = 10;
  120.         regs.r[1] = (int) name;
  121.         regs.r[2] = MultiModule_FileType;
  122.         regs.r[4] = f;
  123.         regs.r[5] = f + sizeof(single_file_info);
  124.         os_swi(OS_File,®s);
  125.         if (xfersend_file_is_safe()) mark_unchanged((int)handle); 
  126.                         else         mark_changed((int)handle);
  127.         return TRUE;
  128. }
  129.  
  130. void data_init(void)
  131. {
  132.         int i;
  133.         for (i = 0; i < MaxFiles ; i++)
  134.                 using[i] = FALSE;
  135. }
  136.  
  137. void destroy_data(int i)
  138. {
  139.         if (!using[i]) werr(-1,"Tried to free an unallocated block"); else {
  140.         flex_free((flex_ptr)&data[i]);
  141.         using[i] = FALSE;
  142.         }
  143. }
  144.  
  145. /* Handles 'printing' of a multimod file */
  146.  
  147. int  print_info(char *name, void *handle)  /* returns file type */
  148. {
  149.         FILE *f = fopen(name,"w");
  150.         SFI   d = data[(int)handle];
  151.         int   i;
  152.         int   offset = AUXSIZE;
  153.         char  size[12];
  154.  
  155.         if (f == NULL)
  156.         {
  157.                 werr(0,"Couldn't save data for printing");
  158.                 return xfersend_printFailed;
  159.         }
  160.         fprintf(f,"Printout of contents of '%s' by Multi Module version %s\n\n",
  161.                         d->filename, example_Version_String);
  162.         fprintf(f,"Number of modules in file: %d\n\n",d->entries);
  163.         fprintf(f,"No.  %-16.16s Module Size  Data Offset\n","Module Leaf Name");
  164.  
  165.         calculate_offsets((int)handle);
  166.  
  167.         for (i = 0; i < d->entries; i++)
  168.         {
  169.                 fprintf(f,"%3d: %-16.16s %-11.11s   &%08x\n",
  170.                           i+1, d->m[i].leaf, size_string(d->m[i].size,size), offset);
  171.                 offset += d->m[i].size + 4;
  172.         }
  173.  
  174.         fprintf(f,"\nTotal size of modules : %s\n",size_string(offset-AUXSIZE,size));
  175.         fprintf(f,"Size of auxiliary code: %s\n\n",size_string(AUXSIZE,size));
  176.         fprintf(f,"Total application size: %s\n\n",size_string(offset + AUXSIZE,size));
  177.         fclose(f);
  178.         return 0xfff;
  179. }
  180.  
  181. char *size_string(int size, char *buffer)
  182. {
  183.         os_regset regs;
  184.  
  185.         regs.r[0] = size;
  186.         regs.r[1] = (int) buffer;
  187.         regs.r[2] = 12;
  188.         os_swi(OS_ConvertFixedFileSize,®s);
  189.         return buffer;
  190. }
  191.  
  192. int align(int i)
  193. {
  194.         return (i % 4) == 0 ? i : align(i+1);
  195. }
  196.  
  197. void calculate_offsets(int handle)
  198. {
  199.         SFI d = data[handle];
  200.         int i,sum = AUXSIZE + 4;
  201.  
  202.         if (d->entries > 0)
  203.                 for (i = 0; i < d->entries; sum += align(d->m[i++].size) + 4)
  204.                         d->m[i].offset = sum;
  205.  
  206. }
  207.  
  208. void delete_module(int handle)
  209. {
  210.         SFI d = data[handle];
  211.  
  212.         if (d->cm >= d->entries) { werr(0,"Module index doesn't exist"); return; }
  213.         if (d->cm != --d->entries)
  214.         {
  215.                 SMI smibase = &(d->m[d->cm]), sminext = smibase+1;
  216.                 int m;
  217.  
  218.                 for (m = d->cm ; m < d->entries ; m++)
  219.                         *smibase++ = *sminext++;
  220.         }
  221.         mark_changed(handle);
  222.         resize_window(handle);
  223.         force_redraw(handle);
  224. }
  225.  
  226. void add_module(int handle, char *filename)
  227. {
  228.         SFI d = data[handle];
  229.         SMI m = &(d->m[d->entries++]);
  230.         char leaf[12];
  231.         char fsp[256];
  232.         int match;
  233.  
  234.         if ((match = check_duplicates(handle,filename,leaf,fsp)) > -1)
  235.         {
  236.                 werr(0,"Module already in this collection");
  237.                 d->entries--;
  238.                 return;
  239.         }
  240.  
  241.         if (d->entries > MaxModules)
  242.         {        
  243.                 werr(0,"Too many modules (%d) in file",--d->entries);
  244.                 return;
  245.         }        
  246.  
  247.         if ((m->size = filesize(filename)) == -2)
  248.         {
  249.                 d->entries--;
  250.                 werr(0,"Only modules can be dropped in this window");
  251.                 return;
  252.         }
  253.  
  254.         mark_changed(handle);
  255.         m->order = d->next++;
  256.         strcpy(m->leaf,leaf);         /* Set the leaf name up */
  257.         strcpy(m->filename,filename); /* Set the filename up  */
  258.         sprintf(m->display,"%.11s",size_string(m->size,leaf));
  259.         resize_window(handle);
  260. }
  261.  
  262. int check_duplicates(int handle,char *filename,char *copy,char *copy2)
  263. {
  264.         char *leaf = filename;
  265.         char *orig = filename;
  266.         int  i;
  267.         SMI  m = &(data[handle]->m[0]);
  268.  
  269.         while (*filename) if (*filename++ == '.') leaf = filename;
  270.         if ((leaf - filename) > 16)
  271.         {
  272.                 werr(0,"Name too long '%s'",leaf);
  273.                 return -1;
  274.         }
  275.  
  276.         for (i = 0; i<data[handle]->entries; i++, m++)
  277.                 if (strcmp(m->filename,orig) == 0) return i;