home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / s1 / stripleft / !StripLeft / c / !RunImage
Text File  |  1994-09-06  |  5KB  |  294 lines

  1. /*************************************************************
  2.           Lefthand wastage sprite stripper by Ian Jeffray
  3.               Copyright (C) Riscy Developments 1994
  4.  
  5.      Ian Jeffray. EMail: aug@dmu.ac.uk, Tel: 01162 332 347
  6.    Term Time: 47 Barclay Street, Leicester, LE3 0JD
  7.     Holidays: Field House, Sessay, Thirsk, N. Yorks, YO7 3BE
  8.  
  9.  **************************************************************/
  10.  
  11.  
  12. #define VERSION "1.00"
  13.  
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include "wimp.h"
  17. #include "res.h"
  18. #include "resspr.h"
  19. #include "sprite.h"
  20. #include "baricon.h"
  21. #include "dbox.h"
  22. #include "event.h"
  23. #include "menu.h"
  24. #include "os.h"
  25. #include "saveas.h"
  26. #include "bbc.h"
  27. #include "template.h"
  28. #include "werr.h"
  29. #include "wimpt.h"
  30. #include "win.h"
  31. #include "flex.h"
  32. #include "visdelay.h"
  33. #include "xferrecv.h"
  34. #include "kernel.h"
  35.  
  36. #define ibar_info 1
  37. #define ibar_quit 2
  38.  
  39. #define APP_NAME       "StripLeft"
  40. #define ICON_NAME      "!StripLeft"
  41.  
  42. #define MENU_ITEMS     ">Info,Quit"
  43.  
  44. #define version_field  4
  45.  
  46. menu iconbar_menu;
  47. char app_dir[256];
  48. char start_file[256]="";
  49. int save_len=0;
  50. int *data=NULL;
  51.  
  52. int filesize(char *filename)
  53. {
  54.   os_filestr file;
  55.  
  56.   file.action = 5;
  57.   file.name   = filename;
  58.   if (wimpt_complain(os_file(&file)) != 0) return 0;
  59.  
  60.   switch (file.action)
  61.   {
  62.     case 0: werr(0, "File not found");              return 0;
  63.     case 2: werr(0, "You cannot load a directory"); return 0;
  64.   }
  65.  
  66.   if ((file.loadaddr & 0xFFF00000) == 0xFFF00000)
  67.     return file.start;
  68.   else
  69.   {
  70.     werr(0, "File cannot be loaded");
  71.     return 0;
  72.   }
  73. }
  74.  
  75. void load(char *filename,int size)
  76. {
  77.   int *sprite,x;
  78.   
  79.   if (flex_alloc((flex_ptr) &data, size+32))
  80.   {
  81.     data[0]=size+32;
  82.     data[2]=16;
  83.     wimpt_complain(os_swi2(46,521,(int) data));
  84.     wimpt_complain(os_swi3(46,522,(int) data,(int) filename));
  85.     if (data[1]==0)
  86.     {
  87.       flex_free((flex_ptr) &data);
  88.       werr(0, "No sprites in sprite file!");
  89.     }
  90.     else
  91.     {
  92.       sprite=(int *) (data[2]+(int) data);
  93.       for (x=1;x<=data[1];x++)
  94.       {
  95.         wimpt_complain(os_swi3(46,566,(int) data,(int) sprite));
  96.         wimpt_complain(os_swi3(46,524,(int) data,(int) filename));
  97.         sprite=(int *) ((int) sprite + sprite[0]);
  98.       }
  99.       flex_free((flex_ptr) &data);
  100.     }
  101.   }
  102.   else
  103.   {
  104.     werr(0, "Memory could not be allocated for the sprite");
  105.   }
  106. }
  107.  
  108. void load_file()
  109. {
  110.   char *filename;
  111.   int size=0;
  112.   int filetype = xferrecv_checkinsert(&filename);
  113.   save_len=0;
  114.   size = filesize(filename);
  115.   if (size>0 && filetype==0xff9 )
  116.   {
  117.     visdelay_begin();
  118.     load(filename,size);
  119.     visdelay_end();
  120.   }
  121.   xferrecv_insertfileok();
  122. }
  123.  
  124. /*
  125.  * Handles info window
  126.  *
  127.  */
  128.  
  129. void info_handler (void)
  130. {          
  131.   dbox info_window;
  132.   char versionstring[256];
  133.  
  134.   if (info_window = dbox_new ("progInfo"), info_window != NULL)     
  135.     {
  136.       sprintf(versionstring,"%s (%s)",VERSION,__DATE__);
  137.       dbox_setfield(info_window,version_field,versionstring);
  138.       dbox_show (info_window);
  139.       dbox_fillin (info_window);
  140.       dbox_dispose (&info_window);
  141.     }
  142. }
  143.  
  144.  
  145. /*
  146.  * Iconbar click handler
  147.  *
  148.  */
  149.  
  150. void iconbar_click (wimp_i icon)
  151. {
  152.   icon=icon;
  153.   bbc_vdu(7);
  154. }
  155.  
  156. /*
  157.  * Event handler
  158.  *
  159.  */
  160.  
  161. BOOL my_event_handler(dbox d,void *event,void *handle)
  162. {
  163. /*  wimp_eventstr *e=(wimp_eventstr *) event;
  164.   wimp_i icon;
  165.   handle=handle;
  166. */
  167.   return FALSE;
  168. }
  169.  
  170.  
  171. /*
  172.  * Iconbar menu handler
  173.  *
  174.  */ 
  175.  
  176. void iconbar_menu_selection (void *handle, char *hit)  
  177. {
  178.     handle=handle;
  179.     switch (hit [0])
  180.     {
  181.       case ibar_info:
  182.         info_handler ();
  183.         break;
  184.         
  185.       case ibar_quit:
  186.         exit (0);
  187.     }
  188. }
  189.  
  190.  
  191. /*
  192.  * Main misc. handler
  193.  *
  194.  */ 
  195.  
  196. BOOL main_event_handler(wimp_eventstr *action,void *handle)
  197. {
  198.   BOOL ret=FALSE;
  199.   handle=handle;
  200.   switch (action->e)
  201.   {
  202.     case wimp_EOPEN:
  203.       wimpt_noerr(wimp_open_wind(&action->data.o));
  204.       ret=TRUE;
  205.       break;
  206.       
  207.     case wimp_ECLOSE:
  208.       wimpt_noerr(wimp_delete_wind(action->data.o.w));
  209.       ret=TRUE;
  210.       break;
  211.       
  212.     case wimp_ESEND:
  213.     case wimp_ESENDWANTACK:
  214.     {
  215.       switch (action->data.msg.hdr.action)
  216.       {
  217.         case wimp_MDATALOAD:
  218.           load_file();
  219.           ret=TRUE;
  220.           break;
  221.  
  222.         default:
  223.           break;
  224.       }
  225.     }
  226.  
  227.     default:
  228.       break;
  229.   }
  230.   return ret;
  231. }
  232.  
  233. /*
  234.  * Update menu flags
  235.  *
  236.  */
  237.  
  238. menu make_iconbar_menu(void *handle)
  239. {
  240.   handle=handle;
  241.   return iconbar_menu;
  242. }
  243.  
  244.  
  245. /*
  246.  * Get the wimp in gear
  247.  *
  248.  */
  249.  
  250. BOOL initialise_application (void)
  251. {
  252.   os_read_var_val("StripLeft$Dir",app_dir,255);
  253.   if (*app_dir=='\0') return FALSE;
  254.   
  255.   wimpt_init (APP_NAME);
  256.   res_init (APP_NAME);
  257.   flex_init ();
  258.   resspr_init ();
  259.   template_init ();
  260.   dbox_init ();
  261.     
  262.   baricon (ICON_NAME, (int) resspr_area () , iconbar_click );
  263.      
  264.   iconbar_menu = menu_new (APP_NAME, MENU_ITEMS);
  265.   win_add_unknown_event_processor(main_event_handler,(void *) NULL);
  266.  
  267.   if (! event_attachmenumaker (win_ICONBAR, make_iconbar_menu, iconbar_menu_selection, 0))
  268.     return FALSE;
  269.  
  270.   return TRUE;
  271. }
  272.  
  273.  
  274. /*
  275.  * Main
  276.  *
  277.  */ 
  278.  
  279.  
  280. int main (int argc, char *argv[])
  281. {
  282.   if (argc>1) strcpy(start_file,argv[1]);
  283.   
  284.   if (! initialise_application ())
  285.     return 0;
  286.  
  287.   while (TRUE)
  288.     event_process ();
  289.  
  290.   return 0;
  291.  
  292. }
  293.  
  294.