home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_C / OPTICN15.ZIP / ICON2C.C < prev    next >
C/C++ Source or Header  |  1994-02-01  |  47KB  |  1,167 lines

  1. /*
  2.  *  ICON2C.C
  3.  */
  4.  
  5. #define VERSION "1.1"
  6. static char versiontag[]= "$VER: $Id: icon2c.c,v 1.1 1994/01/15 09:45:40 tf Exp $";
  7.  
  8. /****** Icon2C ******************************************
  9. *
  10. *   NAME
  11. *    Icon2C -- Generate C sourcecode from an icon image (V36)
  12. *
  13. *   SYNOPSIS
  14. *    Icon2C NAME/A,QUIET/S,TO/K
  15. *
  16. *   FUNCTION
  17. *    Icon2C reads in given ".info" file and writes out well documented
  18. *    and directly compilable C code.  This code if compiled with a symbol
  19. *    TEST defined (usual compiler option: -DTEST) will generate an
  20. *    executable which writes back the icon image file to disk.  This
  21. *    allows you to modify any icon image to your own needs.
  22. *
  23. *   INPUTS
  24. *    NAME          - name of the icon image file.  A trailing ".info"
  25. *            is optional but not required.
  26. *    QUIET         - If this switch is set then Icon2C will not print any
  27. *            warnings.
  28. *    TO            - specifies the output file.  If not specified the
  29. *            standard output stream will be used.
  30. *
  31. *   EXAMPLE
  32. *    ;generate C code for the disk icon of the disk in DF0:
  33. *    icon2c df0:disk quiet to ram:diskicon.c
  34. *
  35. *   DISCLAIMER
  36. *    This file is part of the Icon2C and OptIcon distribution.
  37. *
  38. *    Icon2C and OptIcon are free software; you can redistribute them
  39. *    and/or modify them under the terms of the GNU General Public License
  40. *    as published by the Free Software Foundation; either version 1 of
  41. *    the License, or (at your option) any later version.
  42. *
  43. *    Icon2C and Opticon are distributed in the hope that they will be
  44. *    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  45. *    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  46. *    GNU General Public License for more details.
  47. *
  48. *    You should have received a copy of the GNU General Public License
  49. *    along with these programs; see the file COPYING.  If not, write to
  50. *    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  51. *
  52. *   SEE ALSO
  53. *    PatchIcons, OptIcon
  54. *
  55. ******************************************************************************
  56. *
  57. *    Compile w/ -DDEBUG to output more information at runtime
  58. */
  59.  
  60. #include <intuition/intuition.h>
  61. #include <intuition/intuitionbase.h>
  62.  
  63. #include <workbench/workbench.h>
  64. #include <workbench/icon.h>
  65.  
  66. #include <dos/dos.h>
  67. #include <dos/rdargs.h>
  68.  
  69. #include <stdarg.h>
  70. #include <stdlib.h>
  71. #include <string.h>
  72. #include <stdio.h>
  73.  
  74. #ifdef __GNUC__
  75. /* suggest parentheses around assignment used as truth value */
  76. #define if(assignment) if( (assignment) )
  77. #endif /* __GNUC__ */
  78.  
  79. extern struct Library *OpenLibrary(STRPTR, ULONG);
  80. extern void CloseLibrary(struct Library *);
  81. extern struct RDArgs *ReadArgs(STRPTR, LONG *, struct RDArgs *);
  82. extern LONG IoErr(void);
  83. extern BOOL PrintFault(LONG, STRPTR);
  84. extern void FreeArgs(struct RDArgs *);
  85. extern struct DiskObject *GetDiskObject(char *);
  86. extern void FreeDiskObject(struct DiskObject *);
  87.  
  88. struct IconBase *IconBase;
  89.  
  90. char *whoami, *iname;  /* argv[0], icon filename w/o ".info" */
  91. int quiet= 0;
  92. FILE *fout;
  93.  
  94.  
  95. void pout(const char *fmt, ...)
  96. {
  97.   va_list argp;
  98.   va_start(argp,fmt);
  99.   vfprintf(fout,fmt,argp);
  100.   va_end(argp);
  101. }
  102.  
  103.  
  104. void warn(const char *fmt, ...)
  105. {
  106.   if(!quiet)
  107.   {
  108.     va_list argp;
  109.     va_start(argp,fmt);
  110.     fprintf(stderr,"%s: %s.info: ",whoami, iname);
  111.     vfprintf(stderr,(char *)fmt,argp);
  112.     fprintf(stderr,"\n");
  113.     fflush(stderr);
  114.     va_end(argp);
  115.   }
  116. }
  117.  
  118.  
  119. void display_version_information(void)
  120. {
  121.   static char license[]=
  122.     "Icon2C is free software; you can redistribute it and/or modify\n"
  123.     "it under the terms of the GNU General Public License as published\n"
  124.     "by the Free Software Foundation; either version 1 of the License,\n"
  125.     "or (at your option) any later version.\n"
  126.     "\n"
  127.     "Icon2C is distributed in the hope that it will be useful,\n"
  128.     "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
  129.     "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
  130.     "GNU General Public License for more details.\n"
  131.     "\n"
  132.     "You should have received a copy of the GNU General Public License\n"
  133.     "along with Icon2C; see the file COPYING.  If not, write to the\n"
  134.     "Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n"
  135.     ;
  136.  
  137.   puts("Icon2C Version " VERSION " (compiled " __DATE__ ", " __TIME__ ")\n"
  138.        "(c)Copyright 1994 by Tobias Ferber, ukjg@dkauni2.bitnet\n");
  139.  
  140.   puts(license);
  141. }
  142.  
  143.  
  144. #define oops(field,value)  warn("unexpected value 0x%lx for %s",value,field)
  145.  
  146. #define DISKOBJECT_NAME    "icon"
  147. #define GADGETRENDER_NAME  "gr"
  148. #define SELECTRENDER_NAME  "sr"
  149. #define GADGET_NAME        "g"
  150. #define TTARRAY_NAME       "tt"  /* ToolTypes array */
  151. #define DRAWERDATA_NAME    "dd"
  152.  
  153. #define BEGIN_CODE(s)      pout(                                                  \
  154.                              "/*\n *  code generated from \"%s.info\"\n */\n\n"    \
  155.                              "#include <intuition/intuition.h>\n"                 \
  156.                              "#include <workbench/workbench.h>\n"                 \
  157.                              "#include <workbench/icon.h>\n\n"                    \
  158.                            ,s)
  159.  
  160. #define END_CODE           pout(                                                                     \
  161.                              "\n\n#ifdef TEST\n"                                                     \
  162.                              "#include <intuition/intuitionbase.h>\n"                                \
  163.                              "#include <stdlib.h>\n"                                                 \
  164.                              "#include <stdio.h>\n\n"                                                \
  165.                              "extern struct Library *OpenLibrary(STRPTR, ULONG);\n"                  \
  166.                              "extern void CloseLibrary(struct Library *);\n"                         \
  167.                              "extern LONG IoErr(void);\n"                                            \
  168.                              "extern BOOL PrintFault(LONG, STRPTR);\n"                               \
  169.                              "extern BOOL PutDiskObject(char *, struct DiskObject *);\n\n"           \
  170.                              "struct IconBase *IconBase;\n\n"                                        \
  171.                              "main(int argc, char **argv)\n{\n"                                      \
  172.                              "  if(argc == 2)\n"                                                     \
  173.                              "  {\n"                                                                 \
  174.                              "    if( (IconBase= (struct IconBase *)OpenLibrary(ICONNAME,36)) )\n"   \
  175.                              "    {\n"                                                               \
  176.                              "      if( !PutDiskObject(argv[1],&icon) )\n"                           \
  177.                              "        PrintFault(IoErr(),argv[1]);\n"                                \
  178.                              "      CloseLibrary(IconBase);\n"                                       \
  179.                              "    }\n"                                                               \
  180.                              "    else printf(\"%%s: no %%s.\\n\",*argv,ICONNAME);\n"                \
  181.                              "  }\n"                                                                 \
  182.                              "  else printf(\"usage: %%s <filename>\\n\",*argv);\n"                  \
  183.                              "  exit( IoErr() );\n"                                                  \
  184.                              "}\n"                                                                   \
  185.                              "#endif /* TEST */\n"                                                   \
  186.                            )
  187.  
  188. #define BEGIN_STRUCT(s,n)  pout("\nstruct %s %s = {\n",s,n)
  189. #define END_STRUCT         pout("};\n")
  190. #define BEGIN_FIELD        pout("\t")
  191. #define P_CONST(s)         pout("%s",s)
  192. #define P_NUMVAL(n)        pout("%ld",n)
  193. #define P_HEXVAL(x)        pout("0x%lx",x)
  194. #define P_STRVAL(s)        if(s) { pout("\""); if(*s) pout("%s",s); pout("\""); } else pout("NULL")
  195. #define END_FIELD(f)       if(f && *f) pout(",\t/* %s */\n",f); else pout(",\n")
  196.  
  197.  
  198. #ifdef DEBUG
  199.  
  200. void p_strN(int n, char *s)
  201. {
  202.   if(s)
  203.   { putchar('\"');
  204.     while(*s && 0<n--) putchar(*s++);
  205.     putchar('\"');
  206.   }
  207.   else pout("NULL");
  208. }
  209.  
  210.  
  211. void p_Gadget(struct Gadget *g, char *name)
  212. {
  213.   pout("\n#ifdef UNDEFINED\n");
  214.  
  215.   BEGIN_STRUCT( ((g->Flags & GFLG_EXTENDED) ? "ExtGadget" : "Gadget"), name);
  216.  
  217.     BEGIN_FIELD;
  218.       P_CONST("NULL");
  219.       if(g->NextGadget)
  220.         pout(" /* 0x%lx */",g->NextGadget);
  221.     END_FIELD("NextGadget");
  222.  
  223.     BEGIN_FIELD;
  224.       P_NUMVAL(g->LeftEdge);
  225.     END_FIELD("LeftEdge");
  226.  
  227.     BEGIN_FIELD;
  228.       P_NUMVAL(g->TopEdge);
  229.     END_FIELD("TopEdge");
  230.  
  231.     BEGIN_FIELD;
  232.       P_NUMVAL(g->Width);
  233.     END_FIELD("Width");
  234.  
  235.     BEGIN_FIELD;
  236.       P_NUMVAL(g->Height);
  237.     END_FIELD("Height");
  238.  
  239.     BEGIN_FIELD;
  240.     {
  241.       UWORD f= g->Flags;
  242.  
  243.       if(f)
  244.       {
  245.         /* <workbench/workbench.h> */
  246.         if(f & GADGBACKFILL)      { P_CONST("GADGBACKFILL");      f &= ~GADGBACKFILL;      if(f) P_CONST("|"); }
  247.         /* <intuition/intuition.h> */
  248.         /*if(f & GFLG_GADGHIGHBITS) { P_CONST("GFLG_GADGHIGHBITS"); f &= ~GFLG_GADGHIGHBITS; if(f) P_CONST("|"); }*/
  249.         if(f & GFLG_GADGHCOMP)    { P_CONST("GFLG_GADGHCOMP");    f &= ~GFLG_GADGHCOMP;    if(f) P_CONST("|"); }
  250.         if(f & GFLG_GADGHBOX)     { P_CONST("GFLG_GADGHBOX");     f &= ~GFLG_GADGHBOX;     if(f) P_CONST("|"); }
  251.         if(f & GFLG_GADGHIMAGE)   { P_CONST("GFLG_GADGHIMAGE");   f &= ~GFLG_GADGHIMAGE;   if(f) P_CONST("|"); }
  252.         if(f & GFLG_GADGHNONE)    { P_CONST("GFLG_GADGHNONE");    f &= ~GFLG_GADGHNONE;    if(f) P_CONST("|"); }
  253.         if(f & GFLG_GADGIMAGE)    { P_CONST("GFLG_GADGIMAGE");    f &= ~GFLG_GADGIMAGE;    if(f) P_CONST("|"); }
  254.         if(f & GFLG_RELBOTTOM)    { P_CONST("GFLG_RELBOTTOM");    f &= ~GFLG_RELBOTTOM;    if(f) P_CONST("|"); }
  255.         if(f & GFLG_RELRIGHT)     { P_CONST("GFLG_RELRIGHT");     f &= ~GFLG_RELRIGHT;     if(f) P_CONST("|"); }
  256.         if(f & GFLG_RELWIDTH)     { P_CONST("GFLG_RELWIDTH");     f &= ~GFLG_RELWIDTH;     if(f) P_CONST("|"); }
  257.         if(f & GFLG_RELHEIGHT)    { P_CONST("GFLG_RELHEIGHT");    f &= ~GFLG_RELHEIGHT;    if(f) P_CONST("|"); }
  258.         if(f & GFLG_RELSPECIAL)   { P_CONST("GFLG_RELSPECIAL");   f &= ~GFLG_RELSPECIAL;   if(f) P_CONST("|"); }
  259.         if(f & GFLG_SELECTED)     { P_CONST("GFLG_SELECTED");     f &= ~GFLG_SELECTED;     if(f) P_CONST("|"); }
  260.         if(f & GFLG_DISABLED)     { P_CONST("GFLG_DISABLED");     f &= ~GFLG_DISABLED;     if(f) P_CONST("|"); }
  261.         if(f & GFLG_LABELMASK)    { P_CONST("GFLG_LABELMASK");    f &= ~GFLG_LABELMASK;    if(f) P_CONST("|"); }
  262.         if(f & GFLG_LABELITEXT)   { P_CONST("GFLG_LABELITEXT");   f &= ~GFLG_LABELITEXT;   if(f) P_CONST("|"); }
  263.         if(f & GFLG_LABELSTRING)  { P_CONST("GFLG_LABELSTRING");  f &= ~GFLG_LABELSTRING;  if(f) P_CONST("|"); }
  264.         if(f & GFLG_LABELIMAGE)   { P_CONST("GFLG_LABELIMAGE");   f &= ~GFLG_LABELIMAGE;   if(f) P_CONST("|"); }
  265.         if(f & GFLG_TABCYCLE)     { P_CONST("GFLG_TABCYCLE");     f &= ~GFLG_TABCYCLE;     if(f) P_CONST("|"); }
  266.         if(f & GFLG_STRINGEXTEND) { P_CONST("GFLG_STRINGEXTEND"); f &= ~GFLG_STRINGEXTEND; if(f) P_CONST("|"); }
  267.         if(f & GFLG_IMAGEDISABLE) { P_CONST("GFLG_IMAGEDISABLE"); f &= ~GFLG_IMAGEDISABLE; if(f) P_CONST("|"); }
  268.         if(f & GFLG_EXTENDED)     { P_CONST("GFLG_EXTENDED");     f &= ~GFLG_EXTENDED;     if(f) P_CONST("|"); }
  269.         if(f) P_NUMVAL(f);
  270.       }
  271.       else P_CONST("NULL");
  272.     }
  273.     END_FIELD("Flags");
  274.  
  275.     BEGIN_FIELD;
  276.     {
  277.       UWORD a= g->Activation;
  278.  
  279.       if(a)
  280.       {
  281.         if(a & GFLG_LABELITEXT)   { P_CONST("GFLG_LABELITEXT");   a &= ~GFLG_LABELITEXT;   if(a) P_CONST("|"); }
  282.         if(a & GACT_RELVERIFY)    { P_CONST("GACT_RELVERIFY");    a &= ~GACT_RELVERIFY;    if(a) P_CONST("|"); }
  283.         if(a & GACT_IMMEDIATE)    { P_CONST("GACT_IMMEDIATE");    a &= ~GACT_IMMEDIATE;    if(a) P_CONST("|"); }
  284.         if(a & GACT_ENDGADGET)    { P_CONST("GACT_ENDGADGET");    a &= ~GACT_ENDGADGET;    if(a) P_CONST("|"); }
  285.         if(a & GACT_FOLLOWMOUSE)  { P_CONST("GACT_FOLLOWMOUSE");  a &= ~GACT_FOLLOWMOUSE;  if(a) P_CONST("|"); }
  286.         if(a & GACT_RIGHTBORDER)  { P_CONST("GACT_RIGHTBORDER");  a &= ~GACT_RIGHTBORDER;  if(a) P_CONST("|"); }
  287.         if(a & GACT_LEFTBORDER)   { P_CONST("GACT_LEFTBORDER");   a &= ~GACT_LEFTBORDER;   if(a) P_CONST("|"); }
  288.         if(a & GACT_TOPBORDER)    { P_CONST("GACT_TOPBORDER");    a &= ~GACT_TOPBORDER;    if(a) P_CONST("|"); }
  289.         if(a & GACT_BOTTOMBORDER) { P_CONST("GACT_BOTTOMBORDER"); a &= ~GACT_BOTTOMBORDER; if(a) P_CONST("|"); }
  290.         if(a & GACT_BORDERSNIFF)  { P_CONST("GACT_BORDERSNIFF");  a &= ~GACT_BORDERSNIFF;  if(a) P_CONST("|"); }
  291.         if(a & GACT_TOGGLESELECT) { P_CONST("GACT_TOGGLESELECT"); a &= ~GACT_TOGGLESELECT; if(a) P_CONST("|"); }
  292.         if(a & GACT_BOOLEXTEND)   { P_CONST("GACT_BOOLEXTEND");   a &= ~GACT_BOOLEXTEND;   if(a) P_CONST("|"); }
  293.         if(a & GACT_STRINGLEFT)   { P_CONST("GACT_STRINGLEFT");   a &= ~GACT_STRINGLEFT;   if(a) P_CONST("|"); }
  294.         if(a & GACT_STRINGCENTER) { P_CONST("GACT_STRINGCENTER"); a &= ~GACT_STRINGCENTER; if(a) P_CONST("|"); }
  295.         if(a & GACT_STRINGRIGHT)  { P_CONST("GACT_STRINGRIGHT");  a &= ~GACT_STRINGRIGHT;  if(a) P_CONST("|"); }
  296.         if(a & GACT_LONGINT)      { P_CONST("GACT_LONGINT");      a &= ~GACT_LONGINT;      if(a) P_CONST("|"); }
  297.         if(a & GACT_ALTKEYMAP)    { P_CONST("GACT_ALTKEYMAP");    a &= ~GACT_ALTKEYMAP;    if(a) P_CONST("|"); }
  298.         if(a & GACT_STRINGEXTEND) { P_CONST("GACT_STRINGEXTEND"); a &= ~GACT_STRINGEXTEND; if(a) P_CONST("|"); }
  299.         if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  300.         if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  301.         if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  302.         if(a) P_NUMVAL(a);
  303.       }
  304.       else P_CONST("NULL");
  305.     }
  306.     END_FIELD("Activation");
  307.  
  308.     BEGIN_FIELD;
  309.     {
  310.       UWORD t= g->GadgetType;
  311.  
  312.       if(t)
  313.       {
  314.         if(t & GTYP_GADGETTYPE)   { P_CONST("GTYP_GADGETTYPE");   t &= ~GTYP_GADGETTYPE;   if(t) P_CONST("|"); }
  315.         if(t & GTYP_SYSGADGET)    { P_CONST("GTYP_SYSGADGET");    t &= ~GTYP_SYSGADGET;    if(t) P_CONST("|"); }
  316.         if(t & GTYP_SCRGADGET)    { P_CONST("GTYP_SCRGADGET");    t &= ~GTYP_SCRGADGET;    if(t) P_CONST("|"); }
  317.         if(t & GTYP_GZZGADGET)    { P_CONST("GTYP_GZZGADGET");    t &= ~GTYP_GZZGADGET;    if(t) P_CONST("|"); }
  318.         if(t & GTYP_REQGADGET)    { P_CONST("GTYP_REQGADGET");    t &= ~GTYP_REQGADGET;    if(t) P_CONST("|"); }
  319.         if(t & GTYP_SIZING)       { P_CONST("GTYP_SIZING");       t &= ~GTYP_SIZING;       if(t) P_CONST("|"); }
  320.         if(t & GTYP_WDRAGGING)    { P_CONST("GTYP_WDRAGGING");    t &= ~GTYP_WDRAGGING;    if(t) P_CONST("|"); }
  321.         if(t & GTYP_SDRAGGING)    { P_CONST("GTYP_SDRAGGING");    t &= ~GTYP_SDRAGGING;    if(t) P_CONST("|"); }
  322.         if(t & GTYP_WUPFRONT)     { P_CONST("GTYP_WUPFRONT");     t &= ~GTYP_WUPFRONT;     if(t) P_CONST("|"); }
  323.         if(t & GTYP_SUPFRONT)     { P_CONST("GTYP_SUPFRONT");     t &= ~GTYP_SUPFRONT;     if(t) P_CONST("|"); }
  324.         if(t & GTYP_WDOWNBACK)    { P_CONST("GTYP_WDOWNBACK");    t &= ~GTYP_WDOWNBACK;    if(t) P_CONST("|"); }
  325.         if(t & GTYP_SDOWNBACK)    { P_CONST("GTYP_SDOWNBACK");    t &= ~GTYP_SDOWNBACK;    if(t) P_CONST("|"); }
  326.         if(t & GTYP_CLOSE)        { P_CONST("GTYP_CLOSE");        t &= ~GTYP_CLOSE;        if(t) P_CONST("|"); }
  327.         if(t & GTYP_BOOLGADGET)   { P_CONST("GTYP_BOOLGADGET");   t &= ~GTYP_BOOLGADGET;   if(t) P_CONST("|"); }
  328.         if(t & GTYP_GADGET0002)   { P_CONST("GTYP_GADGET0002");   t &= ~GTYP_GADGET0002;   if(t) P_CONST("|"); }
  329.         if(t & GTYP_PROPGADGET)   { P_CONST("GTYP_PROPGADGET");   t &= ~GTYP_PROPGADGET;   if(t) P_CONST("|"); }
  330.         if(t & GTYP_STRGADGET)    { P_CONST("GTYP_STRGADGET");    t &= ~GTYP_STRGADGET;    if(t) P_CONST("|"); }
  331.         if(t & GTYP_CUSTOMGADGET) { P_CONST("GTYP_CUSTOMGADGET"); t &= ~GTYP_CUSTOMGADGET; if(t) P_CONST("|"); }
  332.         if(t & GTYP_GTYPEMASK)    { P_CONST("GTYP_GTYPEMASK");    t &= ~GTYP_GTYPEMASK;    if(t) P_CONST("|"); }
  333.         if(t) P_NUMVAL(t);
  334.       }
  335.       else P_CONST("NULL");
  336.     }
  337.     END_FIELD("GadgetType");
  338.  
  339.     BEGIN_FIELD;
  340.       if(g->GadgetRender)
  341.         P_CONST("(APTR)&" GADGETRENDER_NAME);
  342.       else
  343.         P_CONST("NULL");
  344.     END_FIELD("GadgetRender");
  345.  
  346.     BEGIN_FIELD;
  347.       if(g->SelectRender)
  348.         P_CONST("(APTR)&" SELECTRENDER_NAME);
  349.       else
  350.         P_CONST("NULL");
  351.     END_FIELD("SelectRender");
  352.  
  353.     BEGIN_FIELD;
  354.       P_CONST("NULL");
  355.       if(g->GadgetText)
  356.         pout(" /* 0x%lx */",g->GadgetText);
  357.     END_FIELD("GadgetText");
  358.  
  359.     BEGIN_FIELD;
  360.       P_NUMVAL(g->MutualExclude);
  361.     END_FIELD("MutualExclude");
  362.  
  363.     BEGIN_FIELD;
  364.       P_CONST("NULL");
  365.       if(g->SpecialInfo)
  366.         pout(" /* 0x%lx */",g->SpecialInfo);
  367.     END_FIELD("SpecialInfo");
  368.  
  369.     BEGIN_FIELD;
  370.       P_NUMVAL(g->GadgetID);
  371.     END_FIELD("GadgetID");
  372.  
  373.     BEGIN_FIELD;
  374.     {
  375.       LONG ud= (LONG)g->UserData;
  376.       LONG dr= ud & WB_DISKREVISIONMASK;
  377.  
  378.       pout("(APTR)");
  379.  
  380.       if(ud != dr)
  381.       {
  382.         P_NUMVAL(ud);
  383.         if(dr) P_CONST("|");
  384.       }
  385.       if(dr == WB_DISKREVISION)
  386.         P_CONST("WB_DISKREVISION");
  387.       else
  388.         P_NUMVAL(dr);
  389.     }
  390.     END_FIELD("UserData");
  391.  
  392.     if(g->Flags & GFLG_EXTENDED)
  393.     {
  394.       struct ExtGadget *eg= (struct ExtGadget *)g;
  395.  
  396.       BEGIN_FIELD;
  397.       {
  398.         ULONG m= eg->MoreFlags;
  399.  
  400.         if(m)
  401.         {
  402.           if(m & GMORE_BOUNDS)       { P_CONST("GMORE_BOUNDS");       m &= ~GMORE_BOUNDS;       if(m) P_CONST("|"); }
  403.           if(m & GMORE_GADGETHELP)   { P_CONST("GMORE_GADGETHELP");   m &= ~GMORE_GADGETHELP;   if(m) P_CONST("|"); }
  404.           if(m & GMORE_SCROLLRASTER) { P_CONST("GMORE_SCROLLRASTER"); m &= ~GMORE_SCROLLRASTER; if(m) P_CONST("|"); }
  405.           if(m) P_NUMVAL(m);
  406.         }
  407.         else P_CONST("NULL");
  408.       }
  409.       END_FIELD("MoreFlags");
  410.  
  411.       BEGIN_FIELD;
  412.         P_NUMVAL(eg->BoundsLeftEdge);
  413.       END_FIELD("BoundsLeftEdge");
  414.  
  415.       BEGIN_FIELD;
  416.         P_NUMVAL(eg->BoundsTopEdge);
  417.       END_FIELD("BoundsTopEdge");
  418.  
  419.       BEGIN_FIELD;
  420.         P_NUMVAL(eg->BoundsWidth);
  421.       END_FIELD("BoundsWidth");
  422.  
  423.       BEGIN_FIELD;
  424.         P_NUMVAL(eg->BoundsHeight);
  425.       END_FIELD("BoundsHeight");
  426.     }
  427.  
  428.   END_STRUCT;
  429.  
  430.   pout("\n#endif /* UNDEFINED */\n");
  431. }
  432.  
  433. #endif /* DEBUG */
  434.  
  435.  
  436. void p_DrawerData(struct DrawerData *dd, char *name)
  437. {
  438.   struct NewWindow *nw= &dd->dd_NewWindow;
  439.  
  440. #ifdef DEBUG
  441.   if(nw->FirstGadget)
  442.     p_Gadget(nw->FirstGadget, "<unknown>");
  443. #endif /* DEBUG */
  444.  
  445.   BEGIN_STRUCT("DrawerData", name);
  446.  
  447.     BEGIN_FIELD;
  448.       P_NUMVAL(nw->LeftEdge);
  449.     END_FIELD("dd_NewWindow.LeftEdge");
  450.  
  451.     BEGIN_FIELD;
  452.       P_NUMVAL(nw->TopEdge);
  453.     END_FIELD("dd_NewWindow.TopEdge");
  454.  
  455.     BEGIN_FIELD;
  456.       P_NUMVAL(nw->Width);
  457.     END_FIELD("dd_NewWindow.Width");
  458.  
  459.     BEGIN_FIELD;
  460.       P_NUMVAL(nw->Height);
  461.     END_FIELD("dd_NewWindow.Height");
  462.  
  463.     BEGIN_FIELD;
  464.       P_NUMVAL(nw->DetailPen);
  465.     END_FIELD("dd_NewWindow.DetailPen");
  466.  
  467.     BEGIN_FIELD;
  468.       P_NUMVAL(nw->BlockPen);
  469.     END_FIELD("dd_NewWindow.BlockPen");
  470.  
  471.     BEGIN_FIELD;
  472.     {
  473.       ULONG f= nw->IDCMPFlags;
  474.  
  475.       if(f)
  476.       {
  477.         if(f & IDCMP_SIZEVERIFY)     { P_CONST("IDCMP_SIZEVERIFY");     f &= ~IDCMP_SIZEVERIFY;     if(f) P_CONST("|"); }
  478.         if(f & IDCMP_NEWSIZE)        { P_CONST("IDCMP_NEWSIZE");        f &= ~IDCMP_NEWSIZE;        if(f) P_CONST("|"); }
  479.         if(f & IDCMP_REFRESHWINDOW)  { P_CONST("IDCMP_REFRESHWINDOW");  f &= ~IDCMP_REFRESHWINDOW;  if(f) P_CONST("|"); }
  480.         if(f & IDCMP_MOUSEBUTTONS)   { P_CONST("IDCMP_MOUSEBUTTONS");   f &= ~IDCMP_MOUSEBUTTONS;   if(f) P_CONST("|"); }
  481.         if(f & IDCMP_MOUSEMOVE)      { P_CONST("IDCMP_MOUSEMOVE");      f &= ~IDCMP_MOUSEMOVE;      if(f) P_CONST("|"); }
  482.         if(f & IDCMP_GADGETDOWN)     { P_CONST("IDCMP_GADGETDOWN");     f &= ~IDCMP_GADGETDOWN;     if(f) P_CONST("|"); }
  483.         if(f & IDCMP_GADGETUP)       { P_CONST("IDCMP_GADGETUP");       f &= ~IDCMP_GADGETUP;       if(f) P_CONST("|"); }
  484.         if(f & IDCMP_REQSET)         { P_CONST("IDCMP_REQSET");         f &= ~IDCMP_REQSET;         if(f) P_CONST("|"); }
  485.         if(f & IDCMP_MENUPICK)       { P_CONST("IDCMP_MENUPICK");       f &= ~IDCMP_MENUPICK;       if(f) P_CONST("|"); }
  486.         if(f & IDCMP_CLOSEWINDOW)    { P_CONST("IDCMP_CLOSEWINDOW");    f &= ~IDCMP_CLOSEWINDOW;    if(f) P_CONST("|"); }
  487.         if(f & IDCMP_RAWKEY)         { P_CONST("IDCMP_RAWKEY");         f &= ~IDCMP_RAWKEY;         if(f) P_CONST("|"); }
  488.         if(f & IDCMP_REQVERIFY)      { P_CONST("IDCMP_REQVERIFY");      f &= ~IDCMP_REQVERIFY;      if(f) P_CONST("|"); }
  489.         if(f & IDCMP_REQCLEAR)       { P_CONST("IDCMP_REQCLEAR");       f &= ~IDCMP_REQCLEAR;       if(f) P_CONST("|"); }
  490.         if(f & IDCMP_MENUVERIFY)     { P_CONST("IDCMP_MENUVERIFY");     f &= ~IDCMP_MENUVERIFY;     if(f) P_CONST("|"); }
  491.         if(f & IDCMP_NEWPREFS)       { P_CONST("IDCMP_NEWPREFS");       f &= ~IDCMP_NEWPREFS;       if(f) P_CONST("|"); }
  492.         if(f & IDCMP_DISKINSERTED)   { P_CONST("IDCMP_DISKINSERTED");   f &= ~IDCMP_DISKINSERTED;   if(f) P_CONST("|"); }
  493.         if(f & IDCMP_DISKREMOVED)    { P_CONST("IDCMP_DISKREMOVED");    f &= ~IDCMP_DISKREMOVED;    if(f) P_CONST("|"); }
  494.         if(f & IDCMP_WBENCHMESSAGE)  { P_CONST("IDCMP_WBENCHMESSAGE");  f &= ~IDCMP_WBENCHMESSAGE;  if(f) P_CONST("|"); }
  495.         if(f & IDCMP_ACTIVEWINDOW)   { P_CONST("IDCMP_ACTIVEWINDOW");   f &= ~IDCMP_ACTIVEWINDOW;   if(f) P_CONST("|"); }
  496.         if(f & IDCMP_INACTIVEWINDOW) { P_CONST("IDCMP_INACTIVEWINDOW"); f &= ~IDCMP_INACTIVEWINDOW; if(f) P_CONST("|"); }
  497.         if(f & IDCMP_DELTAMOVE)      { P_CONST("IDCMP_DELTAMOVE");      f &= ~IDCMP_DELTAMOVE;      if(f) P_CONST("|"); }
  498.         if(f & IDCMP_VANILLAKEY)     { P_CONST("IDCMP_VANILLAKEY");     f &= ~IDCMP_VANILLAKEY;     if(f) P_CONST("|"); }
  499.         if(f & IDCMP_INTUITICKS)     { P_CONST("IDCMP_INTUITICKS");     f &= ~IDCMP_INTUITICKS;     if(f) P_CONST("|"); }
  500.         if(f & IDCMP_IDCMPUPDATE)    { P_CONST("IDCMP_IDCMPUPDATE");    f &= ~IDCMP_IDCMPUPDATE;    if(f) P_CONST("|"); }
  501.         if(f & IDCMP_MENUHELP)       { P_CONST("IDCMP_MENUHELP");       f &= ~IDCMP_MENUHELP;       if(f) P_CONST("|"); }
  502.         if(f & IDCMP_CHANGEWINDOW)   { P_CONST("IDCMP_CHANGEWINDOW");   f &= ~IDCMP_CHANGEWINDOW;   if(f) P_CONST("|"); }
  503.         if(f & IDCMP_GADGETHELP)     { P_CONST("IDCMP_GADGETHELP");     f &= ~IDCMP_GADGETHELP;     if(f) P_CONST("|"); }
  504.         if(f & IDCMP_LONELYMESSAGE)  { P_CONST("IDCMP_LONELYMESSAGE");  f &= ~IDCMP_LONELYMESSAGE;  if(f) P_CONST("|"); }
  505.         if(f) P_NUMVAL(f);
  506.       }
  507.       else P_CONST("NULL");
  508.     }
  509.     END_FIELD("dd_NewWindow.IDCMPFlags");
  510.  
  511.     BEGIN_FIELD;
  512.     {
  513.       ULONG f= nw->Flags;
  514.       if(f)
  515.       {
  516.         if(f & WFLG_SIZEGADGET)     { P_CONST("WFLG_SIZEGADGET");     f &= ~WFLG_SIZEGADGET;     if(f) P_CONST("|"); }
  517.         if(f & WFLG_DRAGBAR)        { P_CONST("WFLG_DRAGBAR");        f &= ~WFLG_DRAGBAR;        if(f) P_CONST("|"); }
  518.         if(f & WFLG_DEPTHGADGET)    { P_CONST("WFLG_DEPTHGADGET");    f &= ~WFLG_DEPTHGADGET;    if(f) P_CONST("|"); }
  519.         if(f & WFLG_CLOSEGADGET)    { P_CONST("WFLG_CLOSEGADGET");    f &= ~WFLG_CLOSEGADGET;    if(f) P_CONST("|"); }
  520.         if(f & WFLG_SIZEBRIGHT)     { P_CONST("WFLG_SIZEBRIGHT");     f &= ~WFLG_SIZEBRIGHT;     if(f) P_CONST("|"); }
  521.         if(f & WFLG_SIZEBBOTTOM)    { P_CONST("WFLG_SIZEBBOTTOM");    f &= ~WFLG_SIZEBBOTTOM;    if(f) P_CONST("|"); }
  522.         /*if(f & WFLG_REFRESHBITS)    { P_CONST("WFLG_REFRESHBITS");    f &= ~WFLG_REFRESHBITS;    if(f) P_CONST("|"); }*/
  523.         if(f & WFLG_SMART_REFRESH)  { P_CONST("WFLG_SMART_REFRESH");  f &= ~WFLG_SMART_REFRESH;  if(f) P_CONST("|"); }
  524.         if(f & WFLG_SIMPLE_REFRESH) { P_CONST("WFLG_SIMPLE_REFRESH"); f &= ~WFLG_SIMPLE_REFRESH; if(f) P_CONST("|"); }
  525.         if(f & WFLG_SUPER_BITMAP)   { P_CONST("WFLG_SUPER_BITMAP");   f &= ~WFLG_SUPER_BITMAP;   if(f) P_CONST("|"); }
  526.         if(f & WFLG_OTHER_REFRESH)  { P_CONST("WFLG_OTHER_REFRESH");  f &= ~WFLG_OTHER_REFRESH;  if(f) P_CONST("|"); }
  527.         if(f & WFLG_BACKDROP)       { P_CONST("WFLG_BACKDROP");       f &= ~WFLG_BACKDROP;       if(f) P_CONST("|"); }
  528.         if(f & WFLG_REPORTMOUSE)    { P_CONST("WFLG_REPORTMOUSE");    f &= ~WFLG_REPORTMOUSE;    if(f) P_CONST("|"); }
  529.         if(f & WFLG_GIMMEZEROZERO)  { P_CONST("WFLG_GIMMEZEROZERO");  f &= ~WFLG_GIMMEZEROZERO;  if(f) P_CONST("|"); }
  530.         if(f & WFLG_BORDERLESS)     { P_CONST("WFLG_BORDERLESS");     f &= ~WFLG_BORDERLESS;     if(f) P_CONST("|"); }
  531.         if(f & WFLG_ACTIVATE)       { P_CONST("WFLG_ACTIVATE");       f &= ~WFLG_ACTIVATE;       if(f) P_CONST("|"); }
  532.         if(f & WFLG_RMBTRAP)        { P_CONST("WFLG_RMBTRAP");        f &= ~WFLG_RMBTRAP;        if(f) P_CONST("|"); }
  533.         if(f & WFLG_NOCAREREFRESH)  { P_CONST("WFLG_NOCAREREFRESH");  f &= ~WFLG_NOCAREREFRESH;  if(f) P_CONST("|"); }
  534.         if(f & WFLG_NW_EXTENDED)    { P_CONST("WFLG_NW_EXTENDED");    f &= ~WFLG_NW_EXTENDED;    if(f) P_CONST("|"); }
  535.         if(f & WFLG_NEWLOOKMENUS)   { P_CONST("WFLG_NEWLOOKMENUS");   f &= ~WFLG_NEWLOOKMENUS;   if(f) P_CONST("|"); }
  536.         if(f & WFLG_WINDOWACTIVE)   { P_CONST("WFLG_WINDOWACTIVE");   f &= ~WFLG_WINDOWACTIVE;   if(f) P_CONST("|"); }
  537.         if(f & WFLG_INREQUEST)      { P_CONST("WFLG_INREQUEST");      f &= ~WFLG_INREQUEST;      if(f) P_CONST("|"); }
  538.         if(f & WFLG_MENUSTATE)      { P_CONST("WFLG_MENUSTATE");      f &= ~WFLG_MENUSTATE;      if(f) P_CONST("|"); }
  539.         if(f & WFLG_WINDOWREFRESH)  { P_CONST("WFLG_WINDOWREFRESH");  f &= ~WFLG_WINDOWREFRESH;  if(f) P_CONST("|"); }
  540.         if(f & WFLG_WBENCHWINDOW)   { P_CONST("WFLG_WBENCHWINDOW");   f &= ~WFLG_WBENCHWINDOW;   if(f) P_CONST("|"); }
  541.         if(f & WFLG_WINDOWTICKED)   { P_CONST("WFLG_WINDOWTICKED");   f &= ~WFLG_WINDOWTICKED;   if(f) P_CONST("|"); }
  542.         if(f & WFLG_VISITOR)        { P_CONST("WFLG_VISITOR");        f &= ~WFLG_VISITOR;        if(f) P_CONST("|"); }
  543.         if(f & WFLG_ZOOMED)         { P_CONST("WFLG_ZOOMED");         f &= ~WFLG_ZOOMED;         if(f) P_CONST("|"); }
  544.         if(f & WFLG_HASZOOM)        { P_CONST("WFLG_HASZOOM");        f &= ~WFLG_HASZOOM;        if(f) P_CONST("|"); }
  545.         if(f) P_NUMVAL(f);
  546.       }
  547.       else P_CONST("NULL");
  548.     }
  549.     END_FIELD("dd_NewWindow.Flags");
  550.  
  551.     BEGIN_FIELD;
  552.       P_CONST("NULL");
  553.       if(nw->FirstGadget)
  554.       {
  555.         pout(" /* 0x%lx */",nw->FirstGadget);
  556.         oops("DrawerData.dd_NewWindow.FirstGadget",nw->FirstGadget);
  557.       }
  558.     END_FIELD("dd_NewWindow.FirstGadget");
  559.  
  560.     BEGIN_FIELD;
  561.       P_CONST("NULL");
  562.       if(nw->CheckMark)
  563.       {
  564.         pout(" /* 0x%lx */",nw->CheckMark);
  565.         oops("DrawerData.dd_NewWindow.CheckMark",nw->CheckMark);
  566.       }
  567.     END_FIELD("dd_NewWindow.CheckMark");
  568.  
  569.     BEGIN_FIELD;
  570.       P_CONST("NULL");
  571.       if(nw->Title)
  572.       {
  573. #ifdef DEBUG
  574.         pout(" /* ");
  575.         p_strN(80,nw->Title);
  576.         pout(" */");
  577. #endif /* DEBUG */
  578.  
  579.         pout(" /* 0x%lx */",nw->Title);
  580.         oops("DrawerData.dd_NewWindow.Title",nw->Title);
  581.       }
  582.     END_FIELD("dd_NewWindow.Title");
  583.  
  584.     BEGIN_FIELD;
  585.       P_CONST("NULL");
  586.       if(nw->Screen)
  587.       {
  588.         pout(" /* 0x%lx */",nw->Screen);
  589.         oops("DrawerData.dd_NewWindow.Screen",nw->Screen);
  590.       }
  591.     END_FIELD("dd_NewWindow.Screen");
  592.  
  593.     BEGIN_FIELD;
  594.       P_CONST("NULL");
  595.       if(nw->BitMap)
  596.       {
  597.         pout(" /* 0x%lx */",nw->BitMap);
  598.         oops("DrawerData.dd_NewWindow.BitMap",nw->BitMap);
  599.       }
  600.     END_FIELD("dd_NewWindow.BitMap");
  601.  
  602.     BEGIN_FIELD;
  603.       P_NUMVAL(nw->MinWidth);
  604.     END_FIELD("dd_NewWindow.MinWidth");
  605.  
  606.     BEGIN_FIELD;
  607.       P_NUMVAL(nw->MinHeight);
  608.     END_FIELD("dd_NewWindow.MinHeight");
  609.  
  610.     BEGIN_FIELD;
  611.       P_NUMVAL(nw->MaxWidth);
  612.     END_FIELD("dd_NewWindow.MaxWidth");
  613.  
  614.     BEGIN_FIELD;
  615.       P_NUMVAL(nw->MinWidth);
  616.     END_FIELD("dd_NewWindow.MaxHeight");
  617.  
  618.     BEGIN_FIELD;
  619.     {
  620.       UWORD t= nw->Type;
  621.  
  622.       if(t)
  623.       {
  624.         if(t & WBENCHSCREEN) { P_CONST("WBENCHSCREEN"); t &= ~WBENCHSCREEN; if(t) P_CONST("|"); }
  625.         if(t & PUBLICSCREEN) { P_CONST("PUBLICSCREEN"); t &= ~PUBLICSCREEN; if(t) P_CONST("|"); }
  626.         if(t & CUSTOMSCREEN) { P_CONST("CUSTOMSCREEN"); t &= ~CUSTOMSCREEN; if(t) P_CONST("|"); }
  627.         if(t & SHOWTITLE)    { P_CONST("SHOWTITLE");    t &= ~SHOWTITLE;    if(t) P_CONST("|"); }
  628.         if(t & BEEPING)      { P_CONST("BEEPING");      t &= ~BEEPING;      if(t) P_CONST("|"); }
  629.         if(t & CUSTOMBITMAP) { P_CONST("CUSTOMBITMAP"); t &= ~CUSTOMBITMAP; if(t) P_CONST("|"); }
  630.         if(t & SCREENBEHIND) { P_CONST("SCREENBEHIND"); t &= ~SCREENBEHIND; if(t) P_CONST("|"); }
  631.         if(t & SCREENQUIET)  { P_CONST("SCREENQUIET");  t &= ~SCREENQUIET;  if(t) P_CONST("|"); }
  632.         if(t & SCREENHIRES)  { P_CONST("SCREENHIRES");  t &= ~SCREENHIRES;  if(t) P_CONST("|"); }
  633.         if(t & NS_EXTENDED)  { P_CONST("NS_EXTENDED");  t &= ~NS_EXTENDED;  if(t) P_CONST("|"); }
  634.         if(t & AUTOSCROLL)   { P_CONST("AUTOSCROLL");   t &= ~AUTOSCROLL;   if(t) P_CONST("|"); }
  635.         if(t & PENSHARED)    { P_CONST("PENSHARED");    t &= ~PENSHARED;    if(t) P_CONST("|"); }
  636.         if(t) P_NUMVAL(t);
  637.       }
  638.       else P_CONST("NULL");
  639.     }
  640.     END_FIELD("dd_NewWindow.Type");
  641.  
  642.     /**/
  643.  
  644.     BEGIN_FIELD;
  645.       if(dd->dd_CurrentX == NO_ICON_POSITION)
  646.         P_CONST("NO_ICON_POSITION");
  647.       else
  648.         P_NUMVAL(dd->dd_CurrentX);
  649.     END_FIELD("dd_CurrentX");
  650.  
  651.     BEGIN_FIELD;
  652.       if(dd->dd_CurrentY == NO_ICON_POSITION)
  653.         P_CONST("NO_ICON_POSITION");
  654.       else
  655.         P_NUMVAL(dd->dd_CurrentY);
  656.     END_FIELD("dd_CurrentY");
  657.  
  658.     BEGIN_FIELD;
  659.       P_NUMVAL(dd->dd_Flags);
  660.     END_FIELD("dd_Flags");
  661.  
  662.     BEGIN_FIELD;
  663.       P_NUMVAL(dd->dd_ViewModes);
  664.     END_FIELD("dd_ViewModes");
  665.  
  666.   END_STRUCT;
  667.  
  668. };
  669.  
  670.  
  671. void p_ImageData(struct Image *i, char *name)
  672. {
  673.   WORD w,h,d;
  674.   UWORD *p= i->ImageData;
  675.  
  676.   pout("\nUWORD %s_data[] = {\n",name);
  677.  
  678.   for(d=0; d<i->Depth; d++)
  679.   {
  680.     if(i->PlanePick & (1L << d))
  681.     {
  682.       pout("\n\t/* plane %d */\n\n",d);
  683.  
  684.       for(h=0; h<i->Height; h++)
  685.       {
  686.         pout("\t");
  687.         for(w=0; w< (i->Width + 15)/16; w++)
  688.         {
  689.           pout("0x%04x, ", (UWORD)(*p));
  690.           ++p;
  691.         }
  692.         pout("\n");
  693.       }
  694.     }
  695.     else pout("\n\t/* plane %d is set to %d by %s.PlaneOnOff */\n\n",d,
  696.       ( (i->PlaneOnOff & (1L<<d)) >> d ),name);
  697.   }
  698.   pout("};\n");
  699. }
  700.  
  701.  
  702. void p_Image(struct Image *i, char *name)
  703. {
  704.   if(i->ImageData)
  705.     p_ImageData(i,name);
  706.  
  707.   BEGIN_STRUCT("Image", name);
  708.  
  709.     BEGIN_FIELD;
  710.       P_NUMVAL(i->LeftEdge);
  711.     END_FIELD("LeftEdge");
  712.  
  713.     BEGIN_FIELD;
  714.       P_NUMVAL(i->TopEdge);
  715.     END_FIELD("TopEdge");
  716.  
  717.     BEGIN_FIELD;
  718.       P_NUMVAL(i->Width);
  719.     END_FIELD("Width");
  720.  
  721.     BEGIN_FIELD;
  722.       P_NUMVAL(i->Height);
  723.     END_FIELD("Height");
  724.  
  725.     BEGIN_FIELD;
  726.       P_NUMVAL(i->Depth);
  727.     END_FIELD("Depth");
  728.  
  729.     BEGIN_FIELD;
  730.       if(i->ImageData)
  731.         pout("%s_data",name);
  732.       else
  733.         P_CONST("NULL");
  734.     END_FIELD("ImageData");
  735.  
  736.     BEGIN_FIELD;
  737.       P_NUMVAL(i->PlanePick);
  738.       if( i->PlanePick & ~((1L << i->Depth) -1L) )
  739.       {
  740.         pout(" /* illegal */");
  741.         warn("illegal value %d for Image.PlanePick (depth=%d)",i->PlanePick,i->Depth);
  742.       }
  743.     END_FIELD("PlanePick");
  744.  
  745.     BEGIN_FIELD;
  746.       P_NUMVAL(i->PlaneOnOff);
  747.     END_FIELD("PlaneOnOff");
  748.  
  749.     BEGIN_FIELD;
  750.       P_CONST("NULL");
  751.       if(i->NextImage)
  752.       {
  753.         pout(" /* 0x%lx */", i->NextImage);
  754.         oops("Image.NextImage",i->NextImage);
  755.       }
  756.     END_FIELD("NextImage");
  757.  
  758.   END_STRUCT;
  759. }
  760.  
  761.  
  762. void p_ToolTypes(char **tt, char *name)
  763. {
  764.  
  765.   pout("\nchar *%s[] = %s", name, tt ? "{\n" : "(char **)NULL");
  766.  
  767.   if(tt)
  768.   {
  769.     while(*tt)
  770.     {
  771.       pout("\t\"%s\",\n",*tt++);
  772.     }
  773.     pout("\tNULL\n}");
  774.   }
  775.   pout(";\n");
  776. }
  777.  
  778.  
  779. void p_DiskObject(struct DiskObject *icon, char *name)
  780. {
  781.   BEGIN_STRUCT("DiskObject", name);
  782.  
  783.     BEGIN_FIELD;
  784.       if(icon->do_Magic == WB_DISKMAGIC)
  785.         P_CONST("WB_DISKMAGIC");
  786.       else
  787.         P_NUMVAL(icon->do_Magic);
  788.     END_FIELD("do_Magic");
  789.  
  790.     BEGIN_FIELD;
  791.       if(icon->do_Version == WB_DISKVERSION)
  792.         P_CONST("WB_DISKVERSION");
  793.       else
  794.         P_NUMVAL(WB_DISKVERSION);
  795.     END_FIELD("do_Version");
  796.  
  797.     /* do_Gadget */
  798.     {
  799.       struct Gadget *g= &icon->do_Gadget;
  800.  
  801.       BEGIN_FIELD;
  802.         P_CONST("NULL");
  803.         if(g->NextGadget)
  804.         {
  805.           pout(" /* 0x%lx */",g->NextGadget);
  806.           oops("DiskObject.do_Gadget.NextGadget",g->NextGadget);
  807.         }
  808.       END_FIELD("do_Gadget.NextGadget");
  809.  
  810.       BEGIN_FIELD;
  811.         P_NUMVAL(g->LeftEdge);
  812.       END_FIELD("do_Gadget.LeftEdge");
  813.  
  814.       BEGIN_FIELD;
  815.         P_NUMVAL(g->TopEdge);
  816.       END_FIELD("do_Gadget.TopEdge");
  817.  
  818.       BEGIN_FIELD;
  819.         P_NUMVAL(g->Width);
  820.       END_FIELD("do_Gadget.Width");
  821.  
  822.       BEGIN_FIELD;
  823.         P_NUMVAL(g->Height);
  824.       END_FIELD("do_Gadget.Height");
  825.  
  826.       BEGIN_FIELD;
  827.       {
  828.         UWORD f= g->Flags;
  829.  
  830.         if(f)
  831.         {
  832.           /* <workbench/workbench.h> */
  833.           if(f & GADGBACKFILL)      { P_CONST("GADGBACKFILL");      f &= ~GADGBACKFILL;      if(f) P_CONST("|"); }
  834.           /* <intuition/intuition.h> */
  835.           /*if(f & GFLG_GADGHIGHBITS) { P_CONST("GFLG_GADGHIGHBITS"); f &= ~GFLG_GADGHIGHBITS; if(f) P_CONST("|"); }*/
  836.           if(f & GFLG_GADGHCOMP)    { P_CONST("GFLG_GADGHCOMP");    f &= ~GFLG_GADGHCOMP;    if(f) P_CONST("|"); }
  837.           if(f & GFLG_GADGHBOX)     { P_CONST("GFLG_GADGHBOX");     f &= ~GFLG_GADGHBOX;     if(f) P_CONST("|"); }
  838.           if(f & GFLG_GADGHIMAGE)   { P_CONST("GFLG_GADGHIMAGE");   f &= ~GFLG_GADGHIMAGE;   if(f) P_CONST("|"); }
  839.           if(f & GFLG_GADGHNONE)    { P_CONST("GFLG_GADGHNONE");    f &= ~GFLG_GADGHNONE;    if(f) P_CONST("|"); }
  840.           if(f & GFLG_GADGIMAGE)    { P_CONST("GFLG_GADGIMAGE");    f &= ~GFLG_GADGIMAGE;    if(f) P_CONST("|"); }
  841.           if(f & GFLG_RELBOTTOM)    { P_CONST("GFLG_RELBOTTOM");    f &= ~GFLG_RELBOTTOM;    if(f) P_CONST("|"); }
  842.           if(f & GFLG_RELRIGHT)     { P_CONST("GFLG_RELRIGHT");     f &= ~GFLG_RELRIGHT;     if(f) P_CONST("|"); }
  843.           if(f & GFLG_RELWIDTH)     { P_CONST("GFLG_RELWIDTH");     f &= ~GFLG_RELWIDTH;     if(f) P_CONST("|"); }
  844.           if(f & GFLG_RELHEIGHT)    { P_CONST("GFLG_RELHEIGHT");    f &= ~GFLG_RELHEIGHT;    if(f) P_CONST("|"); }
  845.           if(f & GFLG_RELSPECIAL)   { P_CONST("GFLG_RELSPECIAL");   f &= ~GFLG_RELSPECIAL;   if(f) P_CONST("|"); }
  846.           if(f & GFLG_SELECTED)     { P_CONST("GFLG_SELECTED");     f &= ~GFLG_SELECTED;     if(f) P_CONST("|"); }
  847.           if(f & GFLG_DISABLED)     { P_CONST("GFLG_DISABLED");     f &= ~GFLG_DISABLED;     if(f) P_CONST("|"); }
  848.           if(f & GFLG_LABELMASK)    { P_CONST("GFLG_LABELMASK");    f &= ~GFLG_LABELMASK;    if(f) P_CONST("|"); }
  849.           if(f & GFLG_LABELITEXT)   { P_CONST("GFLG_LABELITEXT");   f &= ~GFLG_LABELITEXT;   if(f) P_CONST("|"); }
  850.           if(f & GFLG_LABELSTRING)  { P_CONST("GFLG_LABELSTRING");  f &= ~GFLG_LABELSTRING;  if(f) P_CONST("|"); }
  851.           if(f & GFLG_LABELIMAGE)   { P_CONST("GFLG_LABELIMAGE");   f &= ~GFLG_LABELIMAGE;   if(f) P_CONST("|"); }
  852.           if(f & GFLG_TABCYCLE)     { P_CONST("GFLG_TABCYCLE");     f &= ~GFLG_TABCYCLE;     if(f) P_CONST("|"); }
  853.           if(f & GFLG_STRINGEXTEND) { P_CONST("GFLG_STRINGEXTEND"); f &= ~GFLG_STRINGEXTEND; if(f) P_CONST("|"); }
  854.           if(f & GFLG_IMAGEDISABLE) { P_CONST("GFLG_IMAGEDISABLE"); f &= ~GFLG_IMAGEDISABLE; if(f) P_CONST("|"); }
  855.           if(f & GFLG_EXTENDED)     { P_CONST("GFLG_EXTENDED");     f &= ~GFLG_EXTENDED;     if(f) P_CONST("|"); }
  856.           if(f) P_NUMVAL(f);
  857.         }
  858.         else P_CONST("NULL");
  859.       }
  860.       END_FIELD("do_Gadget.Flags");
  861.  
  862.       BEGIN_FIELD;
  863.       {
  864.         UWORD a= g->Activation;
  865.  
  866.         if(a)
  867.         {
  868.           if(a & GFLG_LABELITEXT)   { P_CONST("GFLG_LABELITEXT");   a &= ~GFLG_LABELITEXT;   if(a) P_CONST("|"); }
  869.           if(a & GACT_RELVERIFY)    { P_CONST("GACT_RELVERIFY");    a &= ~GACT_RELVERIFY;    if(a) P_CONST("|"); }
  870.           if(a & GACT_IMMEDIATE)    { P_CONST("GACT_IMMEDIATE");    a &= ~GACT_IMMEDIATE;    if(a) P_CONST("|"); }
  871.           if(a & GACT_ENDGADGET)    { P_CONST("GACT_ENDGADGET");    a &= ~GACT_ENDGADGET;    if(a) P_CONST("|"); }
  872.           if(a & GACT_FOLLOWMOUSE)  { P_CONST("GACT_FOLLOWMOUSE");  a &= ~GACT_FOLLOWMOUSE;  if(a) P_CONST("|"); }
  873.           if(a & GACT_RIGHTBORDER)  { P_CONST("GACT_RIGHTBORDER");  a &= ~GACT_RIGHTBORDER;  if(a) P_CONST("|"); }
  874.           if(a & GACT_LEFTBORDER)   { P_CONST("GACT_LEFTBORDER");   a &= ~GACT_LEFTBORDER;   if(a) P_CONST("|"); }
  875.           if(a & GACT_TOPBORDER)    { P_CONST("GACT_TOPBORDER");    a &= ~GACT_TOPBORDER;    if(a) P_CONST("|"); }
  876.           if(a & GACT_BOTTOMBORDER) { P_CONST("GACT_BOTTOMBORDER"); a &= ~GACT_BOTTOMBORDER; if(a) P_CONST("|"); }
  877.           if(a & GACT_BORDERSNIFF)  { P_CONST("GACT_BORDERSNIFF");  a &= ~GACT_BORDERSNIFF;  if(a) P_CONST("|"); }
  878.           if(a & GACT_TOGGLESELECT) { P_CONST("GACT_TOGGLESELECT"); a &= ~GACT_TOGGLESELECT; if(a) P_CONST("|"); }
  879.           if(a & GACT_BOOLEXTEND)   { P_CONST("GACT_BOOLEXTEND");   a &= ~GACT_BOOLEXTEND;   if(a) P_CONST("|"); }
  880.           if(a & GACT_STRINGLEFT)   { P_CONST("GACT_STRINGLEFT");   a &= ~GACT_STRINGLEFT;   if(a) P_CONST("|"); }
  881.           if(a & GACT_STRINGCENTER) { P_CONST("GACT_STRINGCENTER"); a &= ~GACT_STRINGCENTER; if(a) P_CONST("|"); }
  882.           if(a & GACT_STRINGRIGHT)  { P_CONST("GACT_STRINGRIGHT");  a &= ~GACT_STRINGRIGHT;  if(a) P_CONST("|"); }
  883.           if(a & GACT_LONGINT)      { P_CONST("GACT_LONGINT");      a &= ~GACT_LONGINT;      if(a) P_CONST("|"); }
  884.           if(a & GACT_ALTKEYMAP)    { P_CONST("GACT_ALTKEYMAP");    a &= ~GACT_ALTKEYMAP;    if(a) P_CONST("|"); }
  885.           if(a & GACT_STRINGEXTEND) { P_CONST("GACT_STRINGEXTEND"); a &= ~GACT_STRINGEXTEND; if(a) P_CONST("|"); }
  886.           if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  887.           if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  888.           if(a & GACT_ACTIVEGADGET) { P_CONST("GACT_ACTIVEGADGET"); a &= ~GACT_ACTIVEGADGET; if(a) P_CONST("|"); }
  889.           if(a) P_NUMVAL(a);
  890.         }
  891.         else P_CONST("NULL");
  892.       }
  893.       END_FIELD("do_Gadget.Activation");
  894.  
  895.       BEGIN_FIELD;
  896.       {
  897.         UWORD t= g->GadgetType;
  898.  
  899.         if(t)
  900.         {
  901.           if(t & GTYP_GADGETTYPE)   { P_CONST("GTYP_GADGETTYPE");   t &= ~GTYP_GADGETTYPE;   if(t) P_CONST("|"); }
  902.           if(t & GTYP_SYSGADGET)    { P_CONST("GTYP_SYSGADGET");    t &= ~GTYP_SYSGADGET;    if(t) P_CONST("|"); }
  903.           if(t & GTYP_SCRGADGET)    { P_CONST("GTYP_SCRGADGET");    t &= ~GTYP_SCRGADGET;    if(t) P_CONST("|"); }
  904.           if(t & GTYP_GZZGADGET)    { P_CONST("GTYP_GZZGADGET");    t &= ~GTYP_GZZGADGET;    if(t) P_CONST("|"); }
  905.           if(t & GTYP_REQGADGET)    { P_CONST("GTYP_REQGADGET");    t &= ~GTYP_REQGADGET;    if(t) P_CONST("|"); }
  906.           if(t & GTYP_SIZING)       { P_CONST("GTYP_SIZING");       t &= ~GTYP_SIZING;       if(t) P_CONST("|"); }
  907.           if(t & GTYP_WDRAGGING)    { P_CONST("GTYP_WDRAGGING");    t &= ~GTYP_WDRAGGING;    if(t) P_CONST("|"); }
  908.           if(t & GTYP_SDRAGGING)    { P_CONST("GTYP_SDRAGGING");    t &= ~GTYP_SDRAGGING;    if(t) P_CONST("|"); }
  909.           if(t & GTYP_WUPFRONT)     { P_CONST("GTYP_WUPFRONT");     t &= ~GTYP_WUPFRONT;     if(t) P_CONST("|"); }
  910.           if(t & GTYP_SUPFRONT)     { P_CONST("GTYP_SUPFRONT");     t &= ~GTYP_SUPFRONT;     if(t) P_CONST("|"); }
  911.           if(t & GTYP_WDOWNBACK)    { P_CONST("GTYP_WDOWNBACK");    t &= ~GTYP_WDOWNBACK;    if(t) P_CONST("|"); }
  912.           if(t & GTYP_SDOWNBACK)    { P_CONST("GTYP_SDOWNBACK");    t &= ~GTYP_SDOWNBACK;    if(t) P_CONST("|"); }
  913.           if(t & GTYP_CLOSE)        { P_CONST("GTYP_CLOSE");        t &= ~GTYP_CLOSE;        if(t) P_CONST("|"); }
  914.           if(t & GTYP_BOOLGADGET)   { P_CONST("GTYP_BOOLGADGET");   t &= ~GTYP_BOOLGADGET;   if(t) P_CONST("|"); }
  915.           if(t & GTYP_GADGET0002)   { P_CONST("GTYP_GADGET0002");   t &= ~GTYP_GADGET0002;   if(t) P_CONST("|"); }
  916.           if(t & GTYP_PROPGADGET)   { P_CONST("GTYP_PROPGADGET");   t &= ~GTYP_PROPGADGET;   if(t) P_CONST("|"); }
  917.           if(t & GTYP_STRGADGET)    { P_CONST("GTYP_STRGADGET");    t &= ~GTYP_STRGADGET;    if(t) P_CONST("|"); }
  918.           if(t & GTYP_CUSTOMGADGET) { P_CONST("GTYP_CUSTOMGADGET"); t &= ~GTYP_CUSTOMGADGET; if(t) P_CONST("|"); }
  919.           if(t & GTYP_GTYPEMASK)    { P_CONST("GTYP_GTYPEMASK");    t &= ~GTYP_GTYPEMASK;    if(t) P_CONST("|"); }
  920.           if(t) P_NUMVAL(t);
  921.         }
  922.         else P_CONST("NULL");
  923.       }
  924.       END_FIELD("do_Gadget.GadgetType");
  925.  
  926.       BEGIN_FIELD;
  927.         if(g->GadgetRender)
  928.           P_CONST("(APTR)&" GADGETRENDER_NAME);
  929.         else
  930.           P_CONST("NULL");
  931.       END_FIELD("do_Gadget.GadgetRender");
  932.  
  933.       BEGIN_FIELD;
  934.         if(g->SelectRender)
  935.           P_CONST("(APTR)&" SELECTRENDER_NAME);
  936.         else
  937.           P_CONST("NULL");
  938.       END_FIELD("do_Gadget.SelectRender");
  939.  
  940.       BEGIN_FIELD;
  941.         P_CONST("NULL");
  942.         if(g->GadgetText)
  943.         {
  944.           pout(" /* 0x%lx */",g->GadgetText);
  945.           oops("DiskObject.do_Gadget.GadgetText",g->GadgetText);
  946.         }
  947.       END_FIELD("do_Gadget.GadgetText");
  948.  
  949.       BEGIN_FIELD;
  950.         P_NUMVAL(g->MutualExclude);
  951.       END_FIELD("do_Gadget.MutualExclude");
  952.  
  953.       BEGIN_FIELD;
  954.         P_CONST("NULL");
  955.         if(g->SpecialInfo)
  956.         {
  957.           pout(" /* 0x%lx */",g->SpecialInfo);
  958.           oops("DiskObject.do_Gadget.SpecialInfo",g->SpecialInfo);
  959.         }
  960.       END_FIELD("do_Gadget.SpecialInfo");
  961.  
  962.       BEGIN_FIELD;
  963.         P_NUMVAL(g->GadgetID);
  964.       END_FIELD("do_Gadget.GadgetID");
  965.  
  966.       BEGIN_FIELD;
  967.       {
  968.         LONG ud= (LONG)g->UserData;
  969.         LONG dr= ud & WB_DISKREVISIONMASK;
  970.  
  971.         pout("(APTR)");
  972.  
  973.         if(ud != dr)
  974.         {
  975.           P_NUMVAL(ud);
  976.           if(dr) P_CONST("|");
  977.         }
  978.         if(dr == WB_DISKREVISION)
  979.           P_CONST("WB_DISKREVISION");
  980.         else
  981.           P_NUMVAL(dr);
  982.       }
  983.       END_FIELD("do_Gadget.UserData");
  984.     }
  985.  
  986.     BEGIN_FIELD;
  987.       switch(icon->do_Type)
  988.       {
  989.         case WBDISK:     P_CONST("WBDISK");       break;
  990.         case WBDRAWER:   P_CONST("WBDRAWER");     break;
  991.         case WBTOOL:     P_CONST("WBTOOL");       break;
  992.         case WBPROJECT:  P_CONST("WBPROJECT");    break;
  993.         case WBGARBAGE:  P_CONST("WBGARBAGE");    break;
  994.         case WBDEVICE:   P_CONST("WBDEVICE");     break;
  995.         case WBKICK:     P_CONST("WBKICK");       break;
  996.         case WBAPPICON:  P_CONST("WBAPPICON");    break;
  997.         default:         P_NUMVAL(icon->do_Type); break;
  998.       }
  999.     END_FIELD("do_Type");
  1000.  
  1001.     BEGIN_FIELD;
  1002.       P_STRVAL(icon->do_DefaultTool);
  1003.     END_FIELD("do_DefaultTool");
  1004.  
  1005.     BEGIN_FIELD;
  1006.       if(icon->do_ToolTypes)
  1007.         P_CONST("&" TTARRAY_NAME "[0]");
  1008.       else
  1009.         P_CONST("NULL");
  1010.     END_FIELD("do_ToolTypes");
  1011.  
  1012.     BEGIN_FIELD;
  1013.       if(icon->do_CurrentX == NO_ICON_POSITION)
  1014.         P_CONST("NO_ICON_POSITION");
  1015.       else
  1016.         P_NUMVAL(icon->do_CurrentX);
  1017.     END_FIELD("do_CurrentX");
  1018.  
  1019.     BEGIN_FIELD;
  1020.       if(icon->do_CurrentY == NO_ICON_POSITION)
  1021.         P_CONST("NO_ICON_POSITION");
  1022.       else
  1023.         P_NUMVAL(icon->do_CurrentY);
  1024.     END_FIELD("do_CurrentY");
  1025.  
  1026.     BEGIN_FIELD;
  1027.       if(icon->do_DrawerData)
  1028.         P_CONST("&" DRAWERDATA_NAME);
  1029.       else
  1030.         P_CONST("NULL");
  1031.     END_FIELD("do_DrawerData");
  1032.  
  1033.     BEGIN_FIELD;
  1034.       P_STRVAL(icon->do_ToolWindow);
  1035.     END_FIELD("do_ToolWindow");
  1036.  
  1037.     BEGIN_FIELD;
  1038.       P_NUMVAL(icon->do_StackSize);
  1039.     END_FIELD("do_StackSize");
  1040.  
  1041.   END_STRUCT;
  1042. }
  1043.  
  1044.  
  1045. /*** MAIN ***/
  1046.  
  1047.  
  1048. int main(int argc, char **argv)
  1049. {
  1050.   struct RDArgs *a;
  1051.   LONG args[3] = { 0,0,0 };  /* args array */
  1052.   int rc= RETURN_OK;
  1053.  
  1054.   whoami= *argv;
  1055.   fout= stdout;
  1056.  
  1057.   if( a= ReadArgs("NAME/A,QUIET/S,TO/K", args, NULL) )
  1058.   {
  1059.     if( iname= (char *)malloc(strlen((char *)args[0])+1) )
  1060.     {
  1061.       strcpy(iname, (char *)args[0]); /* now we may use warn() */
  1062.  
  1063.       if( IconBase= (struct IconBase *)OpenLibrary(ICONNAME,36L) )
  1064.       {
  1065.         struct DiskObject *icon= GetDiskObject(iname);
  1066.  
  1067.         if(!icon)
  1068.         {
  1069.           int x= strlen(iname) - 5;
  1070.           if(x>0 && !stricmp(&(iname[x]),".info"))
  1071.           {
  1072.             iname[x]= '\0';
  1073.             icon= GetDiskObject(iname);
  1074.           }
  1075.         }
  1076.  
  1077.         if(icon)
  1078.         {
  1079.           if(args[2])
  1080.           {
  1081.             fout= fopen((char *)args[2],"w");
  1082.  
  1083.             if(!fout)
  1084.             {
  1085.               PrintFault(rc= IoErr(), (STRPTR)args[2]);
  1086.               fprintf(stderr,"%s: Unable to open output file.\n",whoami);
  1087.             }
  1088.           }
  1089.  
  1090.           if(fout)
  1091.           {
  1092.             quiet= args[1]; /* now warn() might be a no-op */
  1093.  
  1094.             BEGIN_CODE(iname);
  1095.             {
  1096.               struct Gadget *g= &icon->do_Gadget;
  1097.  
  1098.               if(g->Flags & GFLG_GADGIMAGE)
  1099.               {
  1100.                 if(g->GadgetRender)
  1101.                   p_Image(g->GadgetRender, GADGETRENDER_NAME);
  1102.  
  1103.                 if(g->SelectRender)
  1104.                 {
  1105.                   if(g->Flags & GFLG_GADGHIMAGE == 0)
  1106.                     warn("warning: no GFLG_GADGHIMAGE for SelectRender image");
  1107.  
  1108.                   p_Image(g->SelectRender, SELECTRENDER_NAME);
  1109.                 }
  1110.                 else if(g->Flags & GFLG_GADGHIMAGE)
  1111.                   warn("warning: No SelectRender image for GFLG_GADGHIMAGE");
  1112.               }
  1113.               else warn("warning: unset GFLG_GADGIMAGE in DiskObject.do_Gadget.Flags");
  1114.  
  1115.               if(icon->do_ToolTypes)
  1116.                 p_ToolTypes(icon->do_ToolTypes, TTARRAY_NAME);
  1117.  
  1118.               if(icon->do_DrawerData)
  1119.                 p_DrawerData(icon->do_DrawerData, DRAWERDATA_NAME);
  1120.  
  1121.               p_DiskObject(icon, DISKOBJECT_NAME);
  1122.             }
  1123.             END_CODE;
  1124.  
  1125.             if(fout != stdout)
  1126.               fclose(fout);
  1127.           }
  1128.  
  1129.           FreeDiskObject(icon);
  1130.         }
  1131.         else /* !icon */
  1132.         {
  1133.           rc= IoErr();
  1134.           warn("GetDiskObject() failed");
  1135.         }
  1136.         CloseLibrary((struct Library *)IconBase);
  1137.       }
  1138.       else /* !IconBase */
  1139.       {
  1140.         warn("You need %s V36+",ICONNAME);
  1141.         rc= RETURN_ERROR;
  1142.       }
  1143.       free(iname);
  1144.     }
  1145.     else /* !iname -> don't use warn() */
  1146.     {
  1147.       fprintf(stderr,"%s: no memory!\n", argv[0]);
  1148.       rc= ERROR_NO_FREE_STORE;
  1149.     }
  1150.     FreeArgs(a);
  1151.   }
  1152.   else /* !ReadArgs() */
  1153.   {
  1154.     if(argc == 1)
  1155.       display_version_information();
  1156.  
  1157.     if(argc <= 3)
  1158.       printf("%s: required argument missing\n",whoami);
  1159.     else
  1160.       printf("%s: wrong number of arguments\n",whoami);
  1161.  
  1162.     rc= RETURN_FAIL;
  1163.   }
  1164.  
  1165.   exit(rc);
  1166. }
  1167.