home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 562.lha / EZQ / icon.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-08-10  |  14.3 KB  |  458 lines

  1. /* ICON v2.0  © 1989, 1991 Aki Rimpilainen & Arnie Cachelin   */
  2. /* Updated for AmigaDOS/WorkBench 2.0, SAS C  */
  3. /* 23 Jul 1991 At 11:27:58 */
  4.  
  5. #include <exec/exec.h>                   /* include files */
  6. #include <intuition/intuition.h>
  7. #include <workbench/workbench.h>
  8. #include <libraries/dos.h>
  9. #include <proto/intuition.h>
  10. #include <proto/exec.h>
  11. #include <proto/dos.h>
  12. #include <proto/icon.h>
  13. #include <stdio.h>
  14.  
  15. struct  IntuitionBase *IntuitionBase;     /* global structures... */
  16. struct  IconBase      *IconBase;
  17. struct  DiskObject    *dob;
  18. struct  Gadget        gdg;
  19. struct  Image         *image,*image2;
  20.  
  21. UWORD   arno;                             /* ...and vars */
  22. char    *ttypes[255];
  23. UWORD   *data,*data2;
  24.  
  25.  
  26.  
  27. NewType(arg)       /* change tooltype */
  28. char *arg;
  29. {
  30.   char bailout[50];
  31.  
  32.   if      ((strcmp("PROJECT",arg)==0) || (strcmp("project",arg)==0))
  33.     dob->do_Type=WBPROJECT;
  34.   else if ((strcmp("TOOL",arg)==0) || (strcmp("tool",arg)==0))
  35.     dob->do_Type=WBTOOL;
  36.   else
  37.    {
  38.     strcpy(bailout,"Tool Type not supported : ");
  39.     strcat(bailout,arg);
  40.     Closing(bailout);
  41.     exit(0);
  42.    }
  43.   printf("  New ToolType    : %s\n",arg);
  44.   arno+=2;
  45.   return(0);
  46. }
  47.  
  48.  
  49. NewStack(arg)      /* change stack size */
  50. char *arg;
  51. {
  52.   dob->do_StackSize=atol(arg);
  53.   printf("  New StackSize   : %ld\n",dob->do_StackSize);
  54.   arno+=2;
  55.   return(0);
  56. }
  57.  
  58.  
  59. NewDefTool(arg)    /* change default tool */
  60. char *arg;
  61. {
  62.   strcpy(dob->do_DefaultTool,arg);     /* second filename */
  63.   printf("  New DefaultTool : %s\n",dob->do_DefaultTool);
  64.   arno+=2;
  65.   return(0);
  66. }
  67.  
  68.  
  69. InfoScreen(arg)              /* give info about an icon... */
  70. char *arg;
  71. {
  72.   short i;
  73.  
  74.   puts("");
  75.   printf("  Object name  : %s.info\n",arg);
  76.   printf("  Object type  : ");
  77.   switch (dob->do_Type) {                  /* icon type */
  78.     case WBDISK    :
  79.       puts("WBDISK");
  80.       break;
  81.     case WBDRAWER  :
  82.       puts("WBDRAWER");
  83.       break;
  84.     case WBTOOL    :
  85.       puts("WBTOOL");
  86.       break;
  87.     case WBPROJECT :
  88.       puts("WBPROJECT");
  89.       break;
  90.     case WBGARBAGE :
  91.       puts("WBGARBAGE");
  92.       break;
  93.     case WBDEVICE  :
  94.       puts("WBDEVICE");
  95.       break;
  96.     case WBKICK    :
  97.       puts("WBKICK");
  98.       break;
  99.     default        :
  100.       puts("UNKNOWN");
  101.       break;
  102.   }
  103.   printf("  Default Tool : ");   /* default tool */
  104.   if (strlen(dob->do_DefaultTool)!=0)
  105.     printf("%s\n",dob->do_DefaultTool);
  106.   else puts("No tool specified");
  107.  
  108.   printf("  ToolTypes    : ");
  109.   if (strlen(dob->do_ToolTypes[0])!=0)   /* tooltypes array */
  110.    {
  111.     for (i=0; strlen(dob->do_ToolTypes[i])!=0; i++)
  112.      {
  113.       if (i!=0) printf("                 ");
  114.       printf("%s\n",dob->do_ToolTypes[i]);
  115.      }
  116.    } else puts("No tooltypes specified");
  117.  
  118.   printf("  Image Mode   : ");  /* image highlighting */
  119.   switch (gdg.Flags) {
  120.     case GADGIMAGE | GADGHCOMP  :
  121.       puts("COMPLEMENT");
  122.       break;
  123.     case GADGIMAGE | GADGHBOX   :
  124.       puts("BOX");
  125.       break;
  126.     case GADGIMAGE | GADGHIMAGE :
  127.       puts("IMAGE");
  128.       break;
  129.     default :
  130.       puts("UNKNOWN");
  131.       break;
  132.    }                                     /* and other useful data */
  133.   printf("  X-position   : ");
  134.   if (dob->do_CurrentX==NO_ICON_POSITION) puts("NO_ICON_POSITION");
  135.   else printf("%ld\n",dob->do_CurrentX);
  136.   printf("  Y-position   : ");
  137.   if (dob->do_CurrentY==NO_ICON_POSITION) puts("NO_ICON_POSITION");
  138.   else printf("%ld\n",dob->do_CurrentY);
  139.   printf("  Stack size   : %ld\n",dob->do_StackSize);
  140.   return(0);
  141. }
  142.  
  143.  
  144. CDump(arg,j)        /* save C-language DiskObject-related structures */
  145. char *arg;
  146. short j;
  147. {
  148.   FILE  *fp;
  149.   short i=0;
  150.  
  151.   arno+=2;
  152.   if ( (dob->do_Type!=WBPROJECT) && (dob->do_Type!=WBTOOL) ) {
  153.     Closing("Sorry, your tool type is not supported with this option.");
  154.     exit(0);
  155.    }
  156.  
  157.   fp=fopen(arg,"w");       /* open file for saving */
  158.   if (fp==0) { Closing("Can't open save file"); exit(0); }
  159.  
  160.   fputs("/* The following code created with Aki & Arnie's ICON program */\n\n",fp);
  161.   fputs("#define CHIP   __chip \n\n",fp);    /* __chip is ANSI extension for SAS 5.10 */
  162.   fputs("USHORT CHIP DOBdata[]=\n",fp);              /* data section out */
  163.   fputs("{\n",fp);
  164.   for (i=0;i<j;i++)
  165.      {
  166.       fprintf(fp,"  0x%04x",data[i]);
  167.       if (i<(j-1)) fprintf(fp,",");          /* comma every four columns */
  168.       if ((i+1)%4==0) fprintf(fp,"\n");
  169.      }
  170.   fputs("};\t\t/* ImageData           */\n\n",fp);
  171.  
  172.   fputs("struct Image DOBimage =\n",fp);       /* image structure out */
  173.   fputs  ("{\n",fp);
  174.   fputs  ("  0,\t\t/* LeftEdge            */\n",fp);
  175.   fputs  ("  0,\t\t/* TopEdge             */\n",fp);
  176.   fprintf(fp,"  %d,\t\t/* Width               */\n",image->Width);
  177.   fprintf(fp,"  %d,\t\t/* Height              */\n",image->Height);
  178.   fprintf(fp,"  %d,\t\t/* Depth               */\n",image->Depth);
  179.   fputs  ("  &DOBdata[0],\n",fp);
  180.   fputs  ("\t\t/* ImageData           */\n",fp);
  181.   fprintf(fp,"  %d,\t\t/* PlanePick           */\n",image->PlanePick);
  182.   fprintf(fp,"  %d,\t\t/* PlaneOnOff          */\n",image->PlaneOnOff);
  183.   fputs  ("  NULL\t\t/* NextImage           */\n",fp);
  184.   fputs  ("};\n\n",fp);
  185.  
  186.   if (image2!=0)     /* we have an alternative image */
  187.    {
  188.     fputs("USHORT CHIP DOBdata2[]=\n",fp);              /* data section out */
  189.     fputs("{\n",fp);
  190.     for (i=0;i<j;i++)
  191.      {
  192.       fprintf(fp,"  0x%04x",data2[i]);
  193.       if (i<(j-1)) fprintf(fp,",");          /* comma every four columns */
  194.       if ((i+1)%4==0) fprintf(fp,"\n");
  195.      }
  196.     fputs("};\t\t/* ImageData           */\n\n",fp);
  197.  
  198.     fputs("struct Image DOBimage2 =\n",fp);       /* image structure out */
  199.     fputs  ("{\n",fp);
  200.     fputs  ("  0,\t\t/* LeftEdge            */\n",fp);
  201.     fputs  ("  0,\t\t/* TopEdge             */\n",fp);
  202.     fprintf(fp,"  %d,\t\t/* Width               */\n",image2->Width);
  203.     fprintf(fp,"  %d,\t\t/* Height              */\n",image2->Height);
  204.     fprintf(fp,"  %d,\t\t/* Depth               */\n",image2->Depth);
  205.     fputs  ("  &DOBdata2[0],\n",fp);
  206.     fputs  ("\t\t/* ImageData           */\n",fp);
  207.     fprintf(fp,"  %d,\t\t/* PlanePick           */\n",image2->PlanePick);
  208.     fprintf(fp,"  %d,\t\t/* PlaneOnOff          */\n",image2->PlaneOnOff);
  209.     fputs  ("  NULL\t\t/* NextImage           */\n",fp);
  210.     fputs  ("};\n\n",fp);
  211.    }
  212.  
  213.   if (strlen(dob->do_ToolTypes[0])!=0)    /* possible tooltypes array */
  214.    {
  215.     fputs("static char *DOBtools[] =\n",fp);
  216.     fprintf(fp,"{\n");
  217.     for (i=0; strlen(dob->do_ToolTypes[i])!=0; i++)
  218.      {
  219.       fprintf(fp,"\n  \"%s\"",dob->do_ToolTypes[i]);
  220.       if (dob->do_ToolTypes[i+1]!=0) fprintf(fp,",");    /* no comma aft. last */
  221.      }
  222.     fprintf(fp,"\n};\t\t/* do_ToolTypes       */\n\n");
  223.    }
  224.  
  225.   fputs("struct DiskObject DOB =\n",fp);
  226.   fputs  ("{\n",fp);
  227.   fputs  ("  WB_DISKMAGIC,  \t/* do_Magic            */\n",fp);
  228.   fputs  ("  WB_DISKVERSION,\t/* do_Version          */\n",fp);
  229.   fputs  ("  NULL,\t\t\t/* NextGadget          */\n",fp);
  230.   fprintf(fp,"  %d,\t\t\t/* LeftEdge            */\n",gdg.LeftEdge);
  231.   fprintf(fp,"  %d,\t\t\t/* TopEdge             */\n",gdg.TopEdge);
  232.   fprintf(fp,"  %d,\t\t\t/* Width               */\n",gdg.Width);
  233.   fprintf(fp,"  %d,\t\t\t/* Height              */\n",gdg.Height);
  234.   switch (gdg.Flags) {
  235.     case GADGIMAGE | GADGHCOMP  :
  236.       fputs("  GADGIMAGE | GADGHCOMP,\n",fp);
  237.       break;
  238.     case GADGIMAGE | GADGHBOX   :
  239.       fputs("  GADGIMAGE | GADGHBOX,\n",fp);
  240.       break;
  241.     case GADGIMAGE | GADGHIMAGE :
  242.       fputs("  GADGIMAGE | GADGHIMAGE,\n",fp);
  243.       break;
  244.     default :
  245.       fprintf(fp,"  %d,\n",gdg.Flags);
  246.       break;
  247.    }
  248.   fputs("\t\t\t/* Flags               */\n",fp);
  249.   fputs  ("  RELVERIFY | GADGIMMEDIATE,\n",fp);
  250.   fputs  ("\t\t\t/* Activation          */\n",fp);
  251.   fputs  ("  BOOLGADGET,\t\t/* GadgetType          */\n",fp);
  252.   fputs  ("  (APTR)&DOBimage,\n",fp);
  253.   fputs  ("\t\t\t/* GadgetRender        */\n",fp);
  254.   if (image2!=0)    /* alternate image */
  255.    {
  256.     fputs  ("  (APTR)&DOBimage2,\n",fp);
  257.     fputs  ("\t\t\t/* SelectRender        */\n",fp);
  258.    }
  259.   else fputs ("  NULL,\t\t\t/* SelectRender        */\n",fp);
  260.   fputs  ("  NULL,\t\t\t/* GadgetText          */\n",fp);
  261.   fprintf(fp,"  %ld,\t\t\t/* MutualExclude       */\n",gdg.MutualExclude);
  262.   fputs  ("  NULL,\t\t\t/* SpecialInfo         */\n",fp);
  263.   fprintf(fp,"  %d,\t\t\t/* GadgetID            */\n",gdg.GadgetID);
  264.   fputs  ("  NULL,\t\t\t/* UserData            */\n",fp);
  265.   switch (dob->do_Type) {
  266.     case WBDISK    :
  267.       fprintf(fp,"  WBDISK");
  268.       break;
  269.     case WBDRAWER  :
  270.       fprintf(fp,"  WBDRAWER");
  271.       break;
  272.     case WBTOOL    :
  273.       fprintf(fp,"  WBTOOL");
  274.       break;
  275.     case WBPROJECT :
  276.       fprintf(fp,"  WBPROJECT");
  277.       break;
  278.     case WBGARBAGE :
  279.       fprintf(fp,"  WBGARBAGE");
  280.       break;
  281.     case WBDEVICE  :
  282.       fprintf(fp,"  WBDEVICE");
  283.       break;
  284.     case WBKICK    :
  285.       fprintf(fp,"  WBKICK");
  286.       break;
  287.     default        :
  288.       fprintf(fp,"  %u",dob->do_Type);
  289.       break;
  290.   }
  291.   fputs(",\t\t/* do_Type             */\n",fp);
  292.  
  293.   if (strlen(dob->do_DefaultTool)!=0)
  294.     fprintf(fp,"  \"%s\",\n",dob->do_DefaultTool);
  295.   else fputs("  NULL,\n",fp);
  296.   fputs("\t\t\t/* do_DefaultTool      */\n",fp);
  297.   if (strlen(dob->do_ToolTypes[0])==0)
  298.    fputs("  NULL,\t\t\t/* do_ToolTypes        */\n",fp);   /* no tooltypes */
  299.   else
  300.     fputs("  (char **)&DOBtools,\t/* do_ToolTypes        */\n",fp);
  301.   fputs  ("  NO_ICON_POSITION,\t/* do_CurrentX         */\n",fp);
  302.   fputs  ("  NO_ICON_POSITION,\t/* do_CurrentY         */\n",fp);
  303.   fputs  ("  NULL,\t\t\t/* DrawerData          */\n",fp);
  304.   fputs  ("  NULL,\t\t\t/* do_Toolwindow       */\n",fp);
  305.   fprintf(fp,"  %ld\t\t\t/* do_StackSize        */\n",dob->do_StackSize);
  306.   fputs("};\n\n",fp);
  307.   fclose(fp);
  308.  
  309.   puts("  C-language header file created");
  310.   return(0);
  311. }
  312.  
  313.  
  314. void Usage()
  315. {
  316.   puts("Usage: ICON (filename) [C savefilename] [D DefaultTool]");
  317.   puts("  [S stacksize] [T type]");
  318.   puts("  [R Tool_1 Tool_2 ... Tool_N END]");
  319.   puts("  [A Tool_1 Tool_2 ... Tool_N END]");
  320.   puts("");
  321.   puts("Options:\n\tC\tSave as C-structure.");
  322.   puts("\tD\tChange DefaultTool");
  323.   puts("\tS\tChange stack size");
  324.   puts("\tT\tChange icon type (PROJECT or TOOL)");
  325.   puts("\tR\tRedefine ToolTypes");
  326.   puts("\tA\tAdd ToolTypes");
  327.   Closing(NULL);
  328.   exit(0L);
  329. }
  330.  
  331.  
  332. Closing(mes)
  333. char *mes;
  334. {
  335.   if (mes)
  336.    {
  337.     printf("ERROR - %s\n",mes);
  338.     puts("None of the changes will be saved");
  339.    }
  340.   puts("");
  341.   if (dob) FreeDiskObject(dob);
  342.   if (IconBase) CloseLibrary(IconBase);
  343.   if (IntuitionBase) CloseLibrary(IntuitionBase);
  344.   return(0);
  345. }
  346.  
  347.  
  348.  
  349. main(argc,argv)                          /* and now the program */
  350.  int argc;
  351.  char *argv[];
  352. {
  353.   char     name[40],opt[10];   /* local vars */
  354.   short    i,j;
  355.  
  356.  
  357.   puts("\nICON v2.0  © Aki Rimpilainen & Arnie Cachelin 1989,1991");
  358.   if (argc<2) Usage();                /* Check for arguments */
  359.   strcpy(name,argv[1]);  /* get icon filename */
  360.  
  361.   IntuitionBase = (struct IntuitionBase *)
  362.     OpenLibrary("intuition.library",0L);
  363.   if (IntuitionBase==0) { Closing("Can't open intuition."); exit(0L); }
  364.  
  365.   IconBase=(struct IconBase *)
  366.     OpenLibrary("icon.library",0L);
  367.   if (IconBase==0) { Closing("Can't open icon.library."); exit(0L); }
  368.  
  369.   if(!(dob=(struct  DiskObject *)GetDiskObject(name)))
  370.   {
  371.     printf("Can't find file %s.info\n",name);
  372.     if(!(dob=(struct  DiskObject *)GetDiskObjectNew(name)))
  373.     {
  374.       Closing("Can't open file!"); exit(0L);
  375.     }
  376.     Closing("Icon is WorkBench2.0 Phantom!");
  377.     exit(0L);
  378.   }
  379. /* initialize some general structures/variables for future */
  380.   gdg=dob->do_Gadget;
  381.   image =(struct Image *)dob->do_Gadget.GadgetRender;
  382.   image2=(struct Image *)dob->do_Gadget.SelectRender;
  383.   data =(UWORD *)image->ImageData;
  384.   data2=(UWORD *)image2->ImageData;    /* note how we also get a pointer */
  385.                                        /* to a possible alternate image! */
  386.   j=(gdg.Width+15)/16;
  387.   j=j*gdg.Height*2;    /* calculating the length of the data section */
  388.  
  389.   if (argc==2) InfoScreen(name);   /* two arguments gives information */
  390.   else
  391.    {
  392.     arno=3;                     /* this is our argument 'bookmark', which */
  393.     do {                        /* points to the user arg being processed */
  394.       strcpy(opt,argv[arno-1]);      /* get the option  */
  395.       if ((strlen(opt))>1)           /* if opt longer than byte, exit */
  396.        {
  397.         strcpy(name,"Unknown option : ");
  398.         strcat(name,opt);            /* display what went wrong */
  399.         Closing(name);
  400.         exit(0L);
  401.        }
  402.       if      ((*opt=='c') || (*opt=='C')) CDump(argv[arno],j);
  403.                                   /* Then we're saving a C statement...*/
  404.       else if ((*opt=='d') || (*opt=='D')) NewDefTool(argv[arno]);
  405.                                   /* changing DefaultTool...*/
  406.       else if ((*opt=='s') || (*opt=='S')) NewStack(argv[arno]);
  407.                                   /* changing stack size */
  408.       else if ((*opt=='t') || (*opt=='T')) NewType(argv[arno]);
  409.                                   /* changing type */
  410.       else if ((*opt=='r') || (*opt=='R'))
  411.        {                          /* redefining tool types */
  412.         i=0;
  413.         while ((strcmp("end",argv[arno])!=0) && (strcmp("END",argv[arno])!=0))
  414.          {
  415.           if (strlen(argv[arno])>127) /* bail out if string too long */
  416.            {
  417.             Closing("ToolType string too long (or missing END)!");
  418.             exit(0L);
  419.            }
  420.           ttypes[i++]=argv[arno];
  421.           printf("  New ToolType    : %s\n",argv[arno++]);
  422.          }
  423.         arno+=2;
  424.         dob->do_ToolTypes=ttypes;
  425.        }
  426.       else if ((*opt=='a') || (*opt=='A'))
  427.        {                            /* adding tool types */
  428.         for (i=0;(ttypes[i]=dob->do_ToolTypes[i])!=0;i++);
  429.                                     /* find the last tooltype entry */
  430.         while ((strcmp("end",argv[arno])!=0) && (strcmp("END",argv[arno])!=0))
  431.          {
  432.           if (strlen(argv[arno])>127) /* bail out if string too long */
  433.            {
  434.             Closing("ToolType string too long (or missing END)!");
  435.             exit(0L);
  436.            }
  437.           ttypes[i++]=argv[arno];
  438.           printf("  Added ToolType  : %s\n",argv[arno++]);
  439.          }
  440.         arno+=2;
  441.         dob->do_ToolTypes=ttypes;
  442.        }
  443.       else                           /* unknown option, exit */
  444.        {
  445.         strcpy(name,"Unknown option : ");
  446.         strcat(name,opt);            /* display what went wrong */
  447.         Closing(name);
  448.         exit(0L);
  449.        }
  450.     } while (arno<(argc+1));   /* repeat the loop while args remain */
  451.    }
  452.  
  453.   PutDiskObject(name,dob); /* save modified diskobject */
  454.   Closing(NULL);
  455.   exit(0L);
  456. }
  457.  
  458.