home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / prt_util / printfls.lha / Source.lha / Source / prf.h < prev    next >
C/C++ Source or Header  |  1992-06-16  |  17KB  |  510 lines

  1. /* prf.h V091 */
  2. /* 9-3-92 */
  3.  
  4. #include <devices/printer.h>
  5. /*
  6. #define DEUTSCH
  7.  */
  8.             /* to create an english executable remove the line above */
  9.  
  10. #ifdef DEUTSCH
  11. #include "prf.deutsch.h"
  12. #else
  13. #include "prf.english.h"
  14. #endif
  15. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  16. /* Define's */
  17. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  18.  
  19. #define SYSTEM_VERSION    37L
  20. #define STR_SIZE         256
  21. #define SWD_WIDTH        338
  22. #define SWD_HEIGHT       180
  23. #define DEFAULT_LINES     66L
  24. #define DEFAULT_LMARGIN    0L
  25. #define DEFAULT_RMARGIN  128L
  26. #define DEFAULT_QUALITY    0L
  27. #define DEFAULT_PITCH      1L
  28. #define DEFAULT_CPI        2L
  29. #define FILE_UNKNOWN       0L
  30. #define FILE_TEXT          1L
  31. #define FILE_ILBM          2L
  32. #define FILE_FTXT          3L
  33. #define FILE_PROG          4L
  34. #define FILE_ICON          5L
  35. #define FILE_DIR           6L
  36.  
  37.  
  38. #define TOOLTYPE_WD        "WINDOW"
  39. #define TOOLTYPE_FLAGS     "FLAGS"
  40. #define TOOLTYPE_HEAD      "HEADLINE"
  41. #define TOOLTYPE_FOOT      "FOOTLINE"
  42. #define TOOLTYPE_LINES     "LINES"
  43. #define TOOLTYPE_RMARGIN   "RMARGIN"
  44. #define TOOLTYPE_LMARGIN   "LMARGIN"
  45.  
  46. /* iconinfo */
  47.  
  48. #define ITYPE_TOOL        " Tool     "
  49. #define ITYPE_DISK        " Disk     "
  50. #define ITYPE_DRAWER      " Drawer   "
  51. #define ITYPE_PROJECT     " Project  "
  52. #define ITYPE_GARBAGE     " Trashcan "
  53. #define ITYPE_DEVICE      " Device   "
  54. #define ITYPE_APP         " AppIcon  "
  55. #define ITYPE_UNKNOWN     " Unknown  "
  56.  
  57. #define CLI_WD               'w'
  58. #define CLI_DRAFT            'a'
  59. #define CLI_LQ               'q'
  60. #define CLI_PAGE             'p'
  61. #define CLI_DATE             'd'
  62. #define CLI_LINE             'l'
  63. #define CLI_FF               'f'
  64. #define CLI_FFPAGE           'c'
  65. #define CLI_10CPI            '0'
  66. #define CLI_12CPI            '2'
  67. #define CLI_15CPI            '5'
  68. #define CLI_PITCH6           '6'
  69. #define CLI_PITCH8           '8'
  70. #define CLI_FILE             'n'
  71. #define CLI_TIME             't'
  72.  
  73.  
  74. #define CMD_NEUTRAL         0L
  75. #define CMD_PRINT           1L
  76. #define CMD_CHANGEAPP       2L
  77. #define CMD_QUIT            3L
  78. #define CMD_INSERTHEAD      4L
  79. #define CMD_INSERTTAIL      5L
  80. #define CMD_REMOVE          6L
  81. #define CMD_FILEREQ         7L
  82. #define CMD_DISPLAY         8L
  83. #define CMD_STR_INSERT      9L
  84. #define CMD_OPENPWD        10L
  85. #define CMD_CLOSEPWD       11L
  86. #define CMD_ABOUT          12L
  87. #define CMD_HEAD           13L
  88. #define CMD_FOOT           14L
  89. #define CMD_DATE_ON        15L
  90. #define CMD_TIME_ON        16L
  91. #define CMD_NAME_ON        17L
  92. #define CMD_FF_ON          18L
  93. #define CMD_FFPAGE_ON      19L
  94. #define CMD_PAGE_ON        20L
  95. #define CMD_LINE_ON        21L
  96. #define CMD_PITCH6         22L
  97. #define CMD_PITCH8         23L
  98. #define CMD_HEADL          24L
  99. #define CMD_FOOTL          25L
  100. #define CMD_RESETALL       26L
  101. #define CMD_CLEARLIST      27L
  102. #define CMD_OPENWD         28L
  103. #define CMD_CLOSEWD        29L
  104. #define CMD_RXQUIT         30L
  105. #define CMD_10CPI          31L
  106. #define CMD_12CPI          32L
  107. #define CMD_15CPI          33L
  108. #define CMD_LINES          34L
  109. #define CMD_DRAFT          35L
  110. #define CMD_LQ             36L
  111. #define CMD_LMARGIN        37L
  112. #define CMD_RMARGIN        38L
  113. #define CMD_DATE_OFF       39L
  114. #define CMD_TIME_OFF       40L
  115. #define CMD_NAME_OFF       41L
  116. #define CMD_FF_OFF         42L
  117. #define CMD_FFPAGE_OFF     43L
  118. #define CMD_PAGE_OFF       44L
  119. #define CMD_LINE_OFF       45L
  120. #define CMD_SAVEPREFS      46L
  121. #define CMD_STATUS         47L
  122. #define CMD_VERSION        48L
  123. #define CMD_SP_FILES_ON    49L
  124. #define CMD_SP_RESET_ON    50L
  125. #define CMD_SP_WINDOW_ON   51L
  126. #define CMD_SP_COMMENT_ON  52L
  127. #define CMD_SP_PRINT_ON    53L
  128. #define CMD_SP_FILES_OFF   54L
  129. #define CMD_SP_RESET_OFF   55L
  130. #define CMD_SP_WINDOW_OFF  56L
  131. #define CMD_SP_COMMENT_OFF 57L
  132. #define CMD_SP_PRINT_OFF   58L
  133. #define CMD_SP_START_OFF   59L
  134. #define CMD_SP_START_ON    60L
  135. #define CMD_SP_ICON_OFF    61L
  136. #define CMD_SP_ICON_ON     62L
  137. #define CMD_ICONINFO       63L
  138. #define CMD_ICONGFX        64L
  139. #define CMD_ICONNONE       65L
  140. #define CMD_PROGINFO       66L
  141. #define CMD_PROGICON       67L
  142. #define CMD_PROGNONE       68L
  143. #define CMD_ICONALL        69L
  144. #define CMD_PROGALL        70L
  145. #define CMD_CLOSEPRINTER   71L
  146. #define CMD_SP_LINES_ON    72L
  147. #define CMD_SP_LINES_OFF   73L
  148.  
  149.  
  150.  
  151. /* rexx commands */
  152. #define RXPORTNAME         "PRINTFILES"
  153. #define RX_ERRORLEVEL      5L
  154. #define RX_VERSION_STR     T_PRF T_VERSION
  155.  
  156. #define T_RX_AD            "address " RXPORTNAME " "
  157. #define T_RX_RESET         "reset"
  158. #define T_RX_CLEAR         "clear"
  159. #define T_RX_INSFILE       "insfile"
  160. #define T_RX_REMFILE       "remfile"
  161. #define T_RX_OPENWINDOW    "openwindow"
  162. #define T_RX_CLOSEWINDOW   "closewindow"
  163. #define T_RX_QUIT          "quit"
  164. #define T_RX_PAGE          "page"
  165. #define T_RX_FILE          "filename"
  166. #define T_RX_TIME          "time"
  167. #define T_RX_DATE          "date"
  168. #define T_RX_LINE          "line"
  169. #define T_RX_FF            "ff"
  170. #define T_RX_FFPAGE        "fpage"
  171. #define T_RX_HEAD          "headline"
  172. #define T_RX_FOOT          "footline"
  173. #define T_RX_LINES         "lines"
  174. #define T_RX_RMARGIN       "rmargin"
  175. #define T_RX_LMARGIN       "lmargin"
  176. #define T_RX_DRAFT         "draft"
  177. #define T_RX_LQ            "lq"
  178. #define T_RX_PITCH6        "6li"
  179. #define T_RX_PITCH8        "8li"
  180. #define T_RX_10CPI         "10cpi"
  181. #define T_RX_12CPI         "12cpi"
  182. #define T_RX_15CPI         "15cpi"
  183. #define T_RX_ON            "on"
  184. #define T_RX_OFF           "off"
  185. #define T_RX_CONTROL       "control"
  186. #define T_RX_PREFS         "prefs"
  187. #define T_RX_PRINT         "print"
  188. #define T_RX_SAVEPREFS     "saveprefs"
  189. #define T_RX_STATUS        "status"
  190. #define T_RX_VERSION       "version"
  191. #define T_RX_ERROR         "Unknown command"
  192. #define T_RX_PMSG          "printing"
  193. #define T_RX_WMSG          "waiting"
  194. #define T_RX_ICON          "icon"
  195. #define T_RX_INFO          "text"
  196. #define T_RX_GFX           "icon"
  197. #define T_RX_ALL           "all"
  198. #define T_RX_PROG          "prog"
  199. #define T_RX_CGFX          "image"
  200. #define T_RX_IGNORE        "ignore"
  201.  
  202.  
  203. #define RX_CMD_NEUTRAL     0
  204. #define RX_CMD_ON          1
  205.  
  206. #define GD_PwdButton                           0
  207. #define GD_About                               1
  208. #define GD_Headline                            2
  209. #define GD_Footline                            3
  210. #define GD_Date                                4
  211. #define GD_Time                                5
  212. #define GD_Filename                            6
  213. #define GD_Pagenumber                          7
  214. #define GD_Linenumber                          8
  215. #define GD_FFPAGE                              9
  216. #define GD_FF                                  10
  217. #define GD_Gadget11                            11
  218. #define GD_List                                12
  219. #define GD_Filereq                             13
  220. #define GD_Remove                              14
  221. #define GD_Print                               15
  222. #define GD_quit                                16
  223.  
  224. #define GD_Quality                             17
  225. #define GD_Pitch                               18
  226. #define GD_cpi                                 19
  227. #define GD_Linesperpage                        20
  228. #define GD_Lmargin                             21
  229. #define GD_Rmargin                             22
  230. #define GD_Icons                               23
  231. #define GD_Progs                               24
  232. #define GD_Saveprefs                           25
  233. #define GD_PPrint                              26
  234. #define GD_include_comment                     27
  235. #define GD_include_files                       28
  236. #define GD_include_window                      29
  237. #define GD_include_reset                       30
  238. #define GD_include_print                       31
  239. #define GD_include_start                       32
  240. #define GD_include_icon                        33
  241. #define GD_include_lines                       34
  242.  
  243. #define PGD GD_Quality
  244.  
  245. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  246. /* Data structure definition */
  247. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  248.  
  249. union PrinterIO
  250.       {
  251.        struct IOStdReq     ios;
  252.        struct IODRPReq     iodrp;
  253.        struct IOPrtCmdReq  iopc;
  254.       };
  255.  
  256. struct FileNameNode
  257.        {
  258.         struct Node fnn_Node;
  259.         char        fnn_Name[STR_SIZE];
  260.        };
  261.  
  262. struct BitMapHeader
  263.         {
  264.          UWORD w, h;
  265.          UWORD x, y;
  266.          UBYTE nPlanes;
  267.          UBYTE masking;
  268.          UBYTE compression;
  269.          UBYTE pad1;
  270.          UWORD transparentColor;
  271.          UBYTE xAspect, yAspect;
  272.          WORD pageWidth, pageHeight;
  273.         };
  274.  
  275. struct ILBM_info
  276.         {
  277.          struct RastPort     rp;
  278.          struct BitMapHeader header;
  279.          struct BitMap       bmap;
  280.          ULONG  camg;
  281.          struct ColorMap *cm;
  282.          UWORD  cmap[256];
  283.         };
  284.  
  285.  
  286. struct prf_info
  287.        {
  288.         struct Screen       *PubScr;
  289.         APTR                 VisualInfo;
  290.         struct Window       *Swd;
  291.         struct Window       *Pwd;
  292.         struct IntuiMessage *imsg;
  293.         struct AppMessage   *amsg;
  294.         struct RexxMsg      *rmsg;
  295.         union  PrinterIO    *PIO;
  296.         struct MsgPort      *rexxPort;
  297.         struct MsgPort      *appPort;
  298.         struct MsgPort      *prtPort;
  299.         struct AppWindow    *aWnd;
  300.         struct AppIcon      *aicon;
  301.         struct AppMenuItem  *amenu;
  302.         struct Gadget       *SGlist;
  303.         struct Gadget       *PGlist;
  304.         struct Gadget       *SGadgets[17];
  305.         struct Gadget       *PGadgets[20];
  306.         struct List          FileList;
  307.         ULONG                Lines;
  308.         ULONG                Lmargin;
  309.         ULONG                Rmargin;
  310.         ULONG                Columns;
  311.         ULONG                signals;
  312.         struct
  313.              {
  314.               unsigned  date       :1;
  315.               unsigned  time       :1;
  316.               unsigned  file       :1;
  317.               unsigned  page       :1;
  318.               unsigned  line       :1;
  319.               unsigned  ffpage     :1;
  320.               unsigned  ff         :1;
  321.               unsigned  print      :1;
  322.               unsigned  draft      :1;
  323.               unsigned  lq         :1;
  324.               unsigned  immediate  :1;
  325.               unsigned  openwindow :1;
  326.               unsigned  display    :1;
  327.               unsigned  sp_files   :1;
  328.               unsigned  sp_reset   :1;
  329.               unsigned  sp_window  :1;
  330.               unsigned  sp_comment :1;
  331.               unsigned  sp_print   :1;
  332.               unsigned  sp_start   :1;
  333.               unsigned  sp_icon    :1;
  334.               unsigned  sp_lines   :1;
  335.               unsigned  icon       :2;
  336.               unsigned  prog       :2;
  337.               unsigned  pitch      :2;
  338.               unsigned  cpi        :2;
  339.              }flags;
  340.         ULONG                BarHeight;
  341.         UBYTE                Headline[STR_SIZE];
  342.         UBYTE                Footline[STR_SIZE];
  343.         UBYTE                Statusline[STR_SIZE];
  344.         UBYTE                Insertline[STR_SIZE];
  345.         APTR                 Special1;
  346.         APTR                 Special2;
  347.         APTR                 Special3;
  348.         APTR                 Special4;
  349.         struct ILBM_info     ilbm;
  350.         ULONG                device;
  351.         UBYTE                FileReqDir[STR_SIZE];
  352.         UBYTE                SaveReqDir[STR_SIZE];
  353.         UWORD                fw,fh;
  354.        };
  355.  
  356. union wbstart
  357.       {
  358.        char **args;
  359.        struct WBStartup *msg;
  360.       };
  361.  
  362.  
  363.  
  364. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  365. /* prf_main.c  */
  366. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  367.  
  368. /* protos */
  369. void  main(int,union wbstart);
  370. long  __regargs OpenLibs(struct prf_info *);
  371. void  __regargs CloseLibs(struct prf_info *);
  372. void  __regargs Prf_Reset(struct prf_info *);
  373. void  __regargs SetPrfSignals(struct prf_info *);
  374. long  __regargs HandleMsgs(struct prf_info *);
  375.  
  376.  
  377. /* vars */
  378. extern long                  _stack;
  379. extern char                 *_procname;
  380. extern long                   priority;
  381. extern long                  _BackGroundIO;
  382. extern BPTR                  _Backstdout;
  383. extern struct GfxBase       *GfxBase;
  384. extern struct IntuitionBase *IntuitionBase;
  385. extern struct Library       *WorkBenchBase;
  386. extern struct Library       *GadToolsBase;
  387. extern struct Library       *AslBase;
  388. extern struct Library       *IconBase;
  389. extern struct RxsLib        *RexxSysBase;
  390. extern struct TextAttr       topaz8;
  391. extern char                 *dayname[];
  392. extern char                 *monthname[];
  393.  
  394.  
  395.  
  396. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  397. /* prf_apphandler.c */
  398. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  399. /* protos */
  400.  
  401. long __regargs OpenApp(struct prf_info *);
  402. void __regargs CloseApp(struct prf_info *);
  403. long __regargs HandleAmsg(struct prf_info *);
  404. void __regargs ChangeApp(struct prf_info *);
  405.  
  406. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  407. /* prf_imsghandler.c */
  408. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  409. /* protos */
  410.  
  411. long __regargs HandleImsg(struct prf_info *);
  412.  
  413. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  414. /* prf_swd.c */
  415. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  416. /* protos */
  417.  
  418. long __regargs OpenSwd(struct prf_info *);
  419. void __regargs CloseSwd(struct prf_info *);
  420. long __regargs OpenPwd(struct prf_info *);
  421. void __regargs  ClosePwd(struct prf_info *);
  422. void __regargs RefreshSwd(struct prf_info *);
  423. void __regargs RefreshPwd(struct prf_info *);
  424.  
  425. /* vars */
  426. extern struct TagItem    SwdTags[];
  427. extern struct TagItem    PwdTags[];
  428.  
  429.  
  430. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  431. /* prf_list.c */
  432. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  433. /* protos */
  434.  
  435. void __regargs InsertName(struct prf_info *);
  436. void __regargs RemoveName(struct prf_info *);
  437. void __regargs AttachList(struct prf_info *);
  438. void __regargs DetachList(struct prf_info *);
  439.  
  440.  
  441.  
  442. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  443. /* prf_docommand.c */
  444. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  445. /* protos */
  446.  
  447. long __regargs DoCommand(struct prf_info *,long);
  448.  
  449. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  450. /* prf_filereq.c */
  451. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  452. /* protos */
  453.  
  454. void __regargs Prf_FileReq(struct prf_info *);
  455. void __regargs Prf_SavePrefs(struct prf_info *,UBYTE *);
  456.  
  457. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  458. /* prf.rexx.c */
  459. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  460. /* protos */
  461.  
  462. long __regargs HandleRexxMsg(struct prf_info *);
  463. void __regargs AttemptOpenRexx(struct prf_info *);
  464. void __regargs CloseRexx(struct prf_info *);
  465.  
  466. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  467. /* prf_print.c */
  468. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  469. /* protos */
  470. void __regargs PrintQueue(struct prf_info *);
  471. void __regargs PrintSettings(struct prf_info *, FILE *);
  472. long __regargs BuildStatusline(struct prf_info *,UBYTE *);
  473.  
  474. /* vars */
  475. extern char                 *dayname[];
  476. extern char                 *monthname[];
  477.  
  478.  
  479. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  480. /* prf_gfx.c */
  481. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  482. /* protos */
  483.  
  484. long __regargs PrintIconGfx(struct prf_info *,UBYTE *);
  485. long __regargs PrintGfxGfx(struct prf_info  *,UBYTE *);
  486. long __regargs OpenPrinter(struct prf_info *);
  487. void __regargs ClosePrinter(struct prf_info *);
  488. void __regargs free_planes(struct prf_info *);
  489. long __regargs get_planes(struct prf_info *);
  490.  
  491. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  492. /* prf.info.c */
  493. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  494. /* protos */
  495.  
  496. long __regargs PrintProgInfo(struct prf_info *,UBYTE *);
  497. long __regargs PrintIconInfo(struct prf_info *,UBYTE *);
  498.  
  499. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  500. /* prf_saveprefs.c */
  501. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  502. /* protos */
  503. void  __regargs SavePreferences(struct prf_info *,UBYTE *);
  504.  
  505. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  506. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  507. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  508. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  509.  
  510.