home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 038.lha / DU-VI.c < prev    next >
C/C++ Source or Header  |  1987-05-16  |  40KB  |  1,663 lines

  1. /************************************************************************
  2.  
  3.     Directory Utility VI        By Greg Cunningham
  4.     my study of of AmigaDOS
  5.     2-May-87            Code Size 35456
  6.  
  7.     Lattice 3.10-> | BLink | LC1 -cs | LC2 -v 
  8.     Manx -> SubMain should work as is.
  9.  
  10. *************************************************************************/
  11.  
  12. #include <exec/types.h>
  13. #include <intuition/intuition.h>
  14. #include <libraries/dosextens.h>
  15.  
  16. #define MEMF_PUBLIC    (1<<0) /* Memory Types defs */
  17. #define MEMF_CHIP    (1<<1)
  18. #define MEMF_FAST    (1<<2)
  19. #define MEMF_CLEAR    (1<<16)
  20.  
  21. #define    NAME        "Directory Utility VI      By Greg Cunningham"
  22. #define CONFILE     "Devs:DU.Config" /* Configure filename */
  23. #define ESC        0x1b
  24. #define FBSIZE        (long)(sizeof (struct FileInfoBlock))
  25. #define MAXCHAR        30    /* Buffers & Filename diplay size */
  26. #define MAXCD        80    /* More Buffer sizes */
  27. #define MAXFILE        300    /* DirTable Max & command,command2 buf size */
  28. #define WIDTH        316    /* A&BWindow Width */
  29. #define HEIGHT        133    /* A&BWindow Height & Window top */
  30.  
  31. #define ASLIDE_GADGET    0    /* AWindow Gad */
  32. #define BSLIDE_GADGET    1    /* BWindow Gad */
  33.  
  34. #define ERR_GADGET    2    /* Window Gads */
  35. #define ADIR_GADGET    4
  36. #define BDIR_GADGET    5
  37.  
  38. #define DF0_GADGET    6    /* Window Button Gads */
  39. #define DF2_GADGET    7
  40. #define GETDIR_GADGET    8
  41. #define ALL_GADGET    9
  42. #define FREE_GADGET    10
  43. #define COPY_GADGET    11
  44. #define RENAME_GADGET    12
  45. #define READ_GADGET    13
  46. #define PRINT_GADGET    14
  47. #define ARC_GADGET    15
  48. #define DF1_GADGET    16
  49. #define DH0_GADGET    17
  50. #define PARENT_GADGET    18
  51. #define CLEAR_GADGET    19
  52. #define BYTE_GADGET    20
  53. #define MOVE_GADGET    21
  54. #define LOCK_GADGET    22
  55. #define CONFIG_GADGET    23
  56. #define SHOW_GADGET    24
  57. #define DEARC_GADGET    25
  58. #define RAM_GADGET    26
  59. #define VD0_GADGET    27
  60. #define MAKEDIR_GADGET    28
  61. #define COMMENT_GADGET    29
  62. #define RUN_GADGET    30
  63. #define DELETE_GADGET    31
  64. #define UNLOCK_GADGET    32
  65. #define EDIT_GADGET    33
  66. #define COMMAND_GADGET    34
  67. #define LISTARC_GADGET    35
  68.  
  69. #define FALSE_BUTT    50    /* Requester Gads */
  70. #define TRUE_BUTT    51
  71. #define REQSTR_GADGET    52
  72.  
  73. #define BUT_FIRST    DF0_GADGET
  74. #define FIRST_GADGET    But_gad[LISTARC_GADGET - DF0_GADGET]
  75. #define BUT_LAST    LISTARC_GADGET
  76. #define GADFLAGS    NULL,5,5,56,8,GADGHCOMP|GADGHBOX,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,(APTR)&BUT_BORDER,NULL,NULL,NULL,NULL
  77.  
  78. /*    A&B Window IDCMP Flags */
  79. #define WinIDCMP    CLOSEWINDOW|REFRESHWINDOW|GADGETUP|MOUSEBUTTONS|ACTIVEWINDOW
  80.  
  81. #define GADTEXT     3,2,JAM2,0,0,NULL
  82.  
  83. char    err_buf[MAXCD+1],A_buf[MAXCD+1],B_buf[MAXCD+1],file_name[MAXCHAR+8],
  84.     *argv[MAXCHAR+8],req_buf[MAXCD+1],REQ_COMMENT[MAXCD+1],title[MAXCD],
  85.     COMMAND[MAXCHAR]= "NewCLI",
  86.     SHOW[MAXCHAR] = "Show",
  87.     ARCX[MAXCHAR] = "Arc x",
  88.     ARCL[MAXCHAR] = "Arc v",
  89.     EDITOR[MAXCHAR]="E -f",
  90.     PRINT[MAXCHAR] ="Print",
  91.     window[MAXCHAR] ="CON:0/134/640/66/";
  92.  
  93. /* Button border */
  94. USHORT but_pairs[] = {0,0, 57,0, 57,9, 0,9, 0,0};
  95. struct Border BUT_BORDER = {-1,-1,1,1,JAM1,5,(APTR)&but_pairs,NULL};
  96.  
  97. /* Source,Destination Border */
  98. USHORT str_pairs[] = {-1,0, -1,9, -10,9, -10,0, 291,0, 291,9, -1,9};
  99. struct Border str_border = {-1,-1,1,1,JAM1,7,(APTR)&str_pairs,NULL};
  100.  
  101. /* Current Dir Info */
  102. struct IntuiText Adir_text = {1,2,JAM2,-10,0,NULL,"A",NULL};
  103. struct StringInfo Adir_str={&A_buf,NULL,0,MAXCD+1,0,0,0,0,2,0,NULL,0,NULL};
  104.  
  105. /* Destination Dir Info */
  106. struct IntuiText Bdir_text = {1,2,JAM2,-10,0,NULL,"B",NULL};
  107. struct StringInfo Bdir_str ={&B_buf,NULL,0,MAXCD+1,0,0,0,0,2,0,NULL,0,NULL};
  108.  
  109. /* Error Info*/
  110. struct StringInfo err_str = {&err_buf,NULL,0,MAXCD+1,0,0,0,0,2,0,NULL,0,NULL};
  111.  
  112. /* File Text Info */
  113. struct IntuiText file_text = {2,0,JAM2,3,12,NULL,(UBYTE *)file_name,NULL};
  114.  
  115. /* Requester Comment Info */
  116. struct StringInfo req_str ={&req_buf,NULL,0,MAXCD+1,0,0,0,0,2,0,NULL,0,NULL};
  117. struct IntuiText ReqText = {3,0,JAM2,2,2,NULL,REQ_COMMENT,0};
  118.  
  119. /* Requester String Box */
  120. USHORT reqstr_pairs[] = { 0,0, 236,0, 236,9, 0,9, 0,0};
  121. struct Border reqstr_border = {-1,-1,1,1,JAM1,5,(APTR)&reqstr_pairs,NULL};
  122.  
  123. /* Requester Border */
  124. SHORT ReqPairs[] = {0,0, 246,0, 246,44, 0,44, 0,0};
  125. struct Border req_border={0,0,3,3,JAM2,5,(SHORT *)ReqPairs,NULL};
  126.  
  127. struct IntuiText TRUEtext ={GADTEXT," DO IT ",NULL};
  128. struct IntuiText FALSEtext={GADTEXT,"NO WAY!",NULL};
  129.  
  130. struct Gadget falsebut =
  131. {
  132.     NULL,
  133.     184,34,56,8,
  134.     GADGHCOMP|GADGHBOX,GADGIMMEDIATE|RELVERIFY,
  135.     BOOLGADGET|REQGADGET,
  136.     (APTR)&BUT_BORDER,
  137.     NULL,
  138.     &FALSEtext,NULL,NULL,
  139.     FALSE_BUTT,NULL
  140. };
  141. struct Gadget truebut =
  142. {
  143.     &falsebut,
  144.     6,34,56,8,
  145.     GADGHCOMP|GADGHBOX,GADGIMMEDIATE|RELVERIFY,
  146.     BOOLGADGET|REQGADGET,
  147.     (APTR)&BUT_BORDER,
  148.     NULL,
  149.     &TRUEtext,NULL,NULL,
  150.     TRUE_BUTT,NULL
  151. };
  152. struct Gadget Reqstr_gad =
  153. {
  154.     &truebut,
  155.     6,20,234,9,
  156.     GADGHCOMP,GADGIMMEDIATE|RELVERIFY,
  157.     STRGADGET|REQGADGET,
  158.     (APTR) &reqstr_border,
  159.     NULL,NULL,0,&req_str,
  160.     REQSTR_GADGET,NULL
  161. };
  162. struct Requester req =
  163. {
  164.     NULL,
  165.     40,14,247,46,
  166.     0,0,
  167.     &Reqstr_gad,
  168.     &req_border,
  169.     &ReqText,
  170.     NULL,0,NULL,{NULL},
  171.     {NULL},NULL,{NULL}
  172. };
  173. struct Gadget Err_gad =
  174. {
  175.     NULL,
  176.     2,-8,600,9,
  177.     GADGHCOMP|GRELBOTTOM,GADGIMMEDIATE|RELVERIFY|STRINGCENTER,
  178.     STRGADGET,NULL,NULL,NULL,NULL,
  179.     &err_str,ERR_GADGET,NULL
  180. };
  181. struct Gadget Adir_gad =
  182. {
  183.     &Err_gad,
  184.     15,-18,290,9,
  185.     GADGHCOMP|GRELBOTTOM,GADGIMMEDIATE|RELVERIFY,
  186.     STRGADGET,
  187.     (APTR) &str_border,
  188.     NULL,&Adir_text,0,&Adir_str,
  189.     ADIR_GADGET,
  190.     NULL,
  191. };
  192. struct Gadget Bdir_gad =
  193. {
  194.     &Adir_gad,
  195.     320,-18,290,9,
  196.     GADGHCOMP|GRELBOTTOM,GADGIMMEDIATE|RELVERIFY,
  197.     STRGADGET,
  198.     (APTR) &str_border,
  199.     NULL,&Bdir_text,0,&Bdir_str,
  200.     BDIR_GADGET,
  201.     NULL,
  202. };
  203.  
  204. /*Slide Gadget AWindow */
  205. struct Image Aslide_img;
  206. struct PropInfo Aslide_prop;
  207. struct Gadget ASlide_gad ={
  208.     NULL,
  209.     -15,10,16,-18,    /* Left, Top edge, Width, Height*/
  210.     GRELRIGHT|GRELHEIGHT|GADGHNONE,GADGIMMEDIATE|RELVERIFY,
  211.     PROPGADGET,
  212.     (APTR)&Aslide_img,/*Border definition*/
  213.     NULL,NULL,0,
  214.     (APTR) &Aslide_prop,
  215.     ASLIDE_GADGET,
  216.     NULL,
  217. };
  218.  
  219. /*Slide Gadget BWindow */
  220. struct Image Bslide_img;
  221. struct PropInfo Bslide_prop;
  222. struct Gadget BSlide_gad ={
  223.     NULL,
  224.     -15,10,16,-18,    /* Left, Top edge, Width, Height*/
  225.     GRELRIGHT|GRELHEIGHT|GADGHNONE,GADGIMMEDIATE|RELVERIFY,
  226.     PROPGADGET,
  227.     (APTR)&Bslide_img,/*Border definition*/
  228.     NULL,NULL,0,
  229.     (APTR) &Bslide_prop,
  230.     BSLIDE_GADGET,
  231.     NULL,
  232. };
  233. /*
  234. | DF0:  | DF2:  |GET DIR|  ALL  | FREE  | COPY  |RENAME | READ  | SHOW  |  ARC
  235. | DF1:  | DH0:  |PARENT | CLEAR | BYTE  | MOVE  | LOCK  | EDIT  |COMMAND|DE-ARC 
  236. | RAM:  | VD0:  |MAKEDIR|COMMENT|  RUN  |DELETE |UNLOCK | PRINT |CONFIG |LISTARC
  237.  
  238. Button Gadget Text,IDs */
  239.  
  240. struct IntuiText But_text[] =
  241. {
  242.     GADTEXT," DF0:  ",NULL,
  243.     GADTEXT," DF2:  ",NULL,
  244.     GADTEXT,"GET DIR",NULL,
  245.     GADTEXT,"  ALL  ",NULL,
  246.     GADTEXT," FREE  ",NULL,
  247.     GADTEXT," COPY  ",NULL,
  248.     GADTEXT,"RENAME ",NULL,
  249.     GADTEXT," READ  ",NULL,
  250.     GADTEXT," SHOW  ",NULL,
  251.     GADTEXT,"  ARC  ",NULL,
  252.     GADTEXT," DF1:  ",NULL,
  253.     GADTEXT," DH0:  ",NULL,
  254.     GADTEXT,"PARENT ",NULL,
  255.     GADTEXT," CLEAR ",NULL,
  256.     GADTEXT," BYTE  ",NULL,
  257.     GADTEXT," MOVE  ",NULL,
  258.     GADTEXT," LOCK  ",NULL,
  259.     GADTEXT," EDIT  ",NULL,
  260.     GADTEXT,"COMMAND",NULL,
  261.     GADTEXT,"DE-ARC ",NULL,
  262.     GADTEXT," RAM:  ",NULL,
  263.     GADTEXT," VD0:  ",NULL,
  264.     GADTEXT,"MAKEDIR",NULL,
  265.     GADTEXT,"COMMENT",NULL,
  266.     GADTEXT,"  RUN  ",NULL,
  267.     GADTEXT,"DELETE ",NULL,
  268.     GADTEXT,"UNLOCK ",NULL,
  269.     GADTEXT," PRINT ",NULL,
  270.     GADTEXT,"CONFIG ",NULL,
  271.     GADTEXT,"LISTARC",NULL,
  272. };
  273.  
  274. struct Gadget But_gad[] =
  275. {
  276.     GADFLAGS,DF0_GADGET,NULL,
  277.     GADFLAGS,DF2_GADGET,NULL,
  278.     GADFLAGS,GETDIR_GADGET,NULL,
  279.     GADFLAGS,ALL_GADGET,NULL,
  280.     GADFLAGS,FREE_GADGET,NULL,
  281.     GADFLAGS,COPY_GADGET,NULL,
  282.     GADFLAGS,RENAME_GADGET,NULL,
  283.     GADFLAGS,READ_GADGET,NULL,
  284.     GADFLAGS,SHOW_GADGET,NULL,
  285.     GADFLAGS,ARC_GADGET,NULL,
  286.     GADFLAGS,DF1_GADGET,NULL,
  287.     GADFLAGS,DH0_GADGET,NULL,
  288.     GADFLAGS,PARENT_GADGET,NULL,
  289.     GADFLAGS,CLEAR_GADGET,NULL,
  290.     GADFLAGS,BYTE_GADGET,NULL,
  291.     GADFLAGS,MOVE_GADGET,NULL,
  292.     GADFLAGS,LOCK_GADGET,NULL,
  293.     GADFLAGS,EDIT_GADGET,NULL,
  294.     GADFLAGS,COMMAND_GADGET,NULL,
  295.     GADFLAGS,DEARC_GADGET,NULL,
  296.     GADFLAGS,RAM_GADGET,NULL,
  297.     GADFLAGS,VD0_GADGET,NULL,
  298.     GADFLAGS,MAKEDIR_GADGET,NULL,
  299. /* TOGGLE 'COMMENT' GAD */
  300.     NULL,5,5,56,8,GADGHCOMP|GADGHBOX,GADGIMMEDIATE|RELVERIFY|TOGGLESELECT,
  301.     BOOLGADGET,(APTR)&BUT_BORDER,
  302.     NULL,NULL,NULL,NULL,COMMENT_GADGET,NULL,
  303.  
  304.     GADFLAGS,RUN_GADGET,NULL,
  305.     GADFLAGS,DELETE_GADGET,NULL,
  306.     GADFLAGS,UNLOCK_GADGET,NULL,
  307.     GADFLAGS,PRINT_GADGET,NULL,
  308.     GADFLAGS,CONFIG_GADGET,NULL,
  309.     GADFLAGS,LISTARC_GADGET,NULL,
  310. };
  311.  
  312. /* Window structures */
  313.  
  314. struct NewWindow Duw =
  315. {
  316.     12,HEIGHT,
  317.     615,64,
  318.     0,1,
  319.     CLOSEWINDOW|REFRESHWINDOW|GADGETUP|REQCLEAR,
  320.     WINDOWSIZING|WINDOWDEPTH|WINDOWDRAG|WINDOWCLOSE
  321.         |ACTIVATE|RMBTRAP|SMART_REFRESH,
  322.     &FIRST_GADGET,
  323.     NULL,
  324.     NULL,/* title */
  325.     NULL,
  326.     NULL,
  327.     260,64,615,64,
  328.     WBENCHSCREEN,
  329. };
  330. struct NewWindow Aw =
  331. {
  332.     0,0,
  333.     WIDTH,HEIGHT,
  334.     0,1,
  335.     WinIDCMP,
  336.     WINDOWSIZING|WINDOWDEPTH|WINDOWDRAG|ACTIVATE|RMBTRAP|SIMPLE_REFRESH,
  337.     &ASlide_gad,
  338.     NULL,
  339.     "A",
  340.     NULL,
  341.     NULL,
  342.     WIDTH,20,WIDTH,400,
  343.     WBENCHSCREEN,
  344. };
  345. struct NewWindow Bw =
  346. {
  347.     324,0,
  348.     WIDTH,HEIGHT,
  349.     0,1,
  350.     WinIDCMP,
  351.     WINDOWSIZING|WINDOWDEPTH|WINDOWDRAG|ACTIVATE|RMBTRAP|SIMPLE_REFRESH,
  352.     &BSlide_gad,
  353.     NULL,
  354.     "B",
  355.     NULL,
  356.     NULL,
  357.     WIDTH,20,WIDTH,400,
  358.     WBENCHSCREEN,
  359. };
  360.  
  361. /*Directory Table data*/
  362. struct DirTable
  363. {
  364.     char  dt_fname[MAXCHAR];
  365.     char  dt_comment[MAXCHAR*2];
  366.     short dt_select;
  367.     short dt_dir;
  368.     long  dt_size;
  369. };
  370.  
  371. extern APTR AllocMem();
  372. struct GfxBase        *GfxBase;
  373. struct Gadget        *igad;
  374. struct IntuitionBase    *IntuitionBase;
  375. struct Window        *Window,*AWindow,*BWindow;
  376. struct DirTable     Atable[MAXFILE],Btable[MAXFILE];/*  *CurTable */
  377. struct InfoData     *InfoData;
  378. struct FileLock     *InitDirLock,*CurrentDirLock,*fl,*oldlock;
  379. struct IntuiMessage    *Msg,*GetMsg();
  380.  
  381. LONG    bytes,len2,MAXANAME,MAXBNAME;
  382. ULONG    avail1,avail2,avail3,MessageClass,AvailMem();
  383. USHORT    code;
  384. int    argc,files,numdirA,numdirB,numdirT,cur_indexA,cur_indexB,linecount,
  385.     done,COMMENTMODE=FALSE,REQ=FALSE,dirflag=FALSE,_fmode;
  386. unsigned int index;
  387. unsigned char buffer[80],buf[512],blank[37] = "                                    ";
  388. char    curdir[MAXCD+1],requestedcd[MAXCD+1],command[MAXFILE],
  389.     command2[MAXFILE],r1[2];
  390.  
  391. void    copy(),new_dir(),sel_A(),sel_B(),par_dir(),DoHex(),
  392.     Hprint_to_screen(),Print_to_screen(),MyDone(),
  393.     WaitSpace(),MyClose();
  394.  
  395. /******** CUSTOM SubMain SETUP -FILEHANDLE ************************* TxEd 400 */
  396.  
  397. #define stdin  (&_iob[0])
  398. #define stdout (&_iob[1])
  399. #define stderr (&_iob[2])
  400.  
  401. struct _iobuf
  402. {
  403. struct _iobuf *_next;
  404. unsigned char *_ptr;
  405. int _rcnt;
  406. int _wcnt;
  407. unsigned char *_base;
  408. int _size;
  409. int _flag;
  410. int _file;
  411. unsigned char _cbuff;
  412. };
  413.  
  414. extern struct _iobuf _iob[20];
  415.  
  416. struct UFB{ int ufbflg;
  417.         int ufbfh; };
  418.  
  419. struct FileHandle    *w = NULL,*workfp = NULL,*Open(),*handle;
  420. static struct Process    *process,*FindTask();
  421. extern struct UFB    _ufbs[],*chkufb(int);
  422. _main(line)
  423. char *line;
  424. {
  425. int x;
  426.  while(argc<32){ /* Process Args */
  427.     line++;
  428.     if(*line == '\0') break;
  429.     argv[argc++] = line;
  430.     while((*line != '\0')&&(!isspace(*line))) line++;
  431.     if(*line == '\0') break;
  432.     else *line++ = '\0';
  433.  }
  434. /* Read Config file, if it's there */
  435.  if(fl=Lock(CONFILE,ACCESS_READ)){
  436.    UnLock(fl);
  437.    if(workfp = Open(CONFILE,MODE_OLDFILE)){
  438.     Read(workfp,SHOW,   MAXCHAR);
  439.     Read(workfp,COMMAND,MAXCHAR);
  440.     Read(workfp,ARCX,   MAXCHAR);
  441.     Read(workfp,ARCL,   MAXCHAR);
  442.     Read(workfp,EDITOR, MAXCHAR);
  443.     Read(workfp,PRINT,  MAXCHAR);
  444.     Close(workfp);
  445.     }
  446. }
  447.  
  448. if(argc==0)    /* Running Under WorkBench  */
  449.     {
  450.     _ufbs[0].ufbfh = Open(window,MODE_NEWFILE);
  451.     _ufbs[1].ufbfh = _ufbs[0].ufbfh;
  452.     _ufbs[1].ufbflg= 4;
  453.     _ufbs[2].ufbfh = _ufbs[0].ufbfh;
  454.     _ufbs[2].ufbflg= 4;
  455.     handle=(struct FileHandle *)(_ufbs[0].ufbfh << 2);
  456.     process=FindTask(0);
  457.     process->pr_ConsoleTask = handle->fh_Type;
  458.     x=0;
  459.     }
  460. else        /* Running Under CLI  */
  461.     {
  462.     _ufbs[0].ufbfh=Input();
  463.     _ufbs[1].ufbfh=Output();
  464.     _ufbs[2].ufbfh=Open("*",MODE_OLDFILE);
  465.     x=4;
  466.     }
  467.  
  468. _ufbs[0].ufbflg|=1|0x8000|x;
  469. _ufbs[1].ufbflg|=2|0x8000|x;
  470. _ufbs[2].ufbflg|=1|2|0x8000;
  471.  
  472. x=(_fmode)?0:0x8000;
  473. stdin->_file= _ufbs[0].ufbfh;
  474. stdin->_flag= 1|x;
  475. stdout->_file=_ufbs[1].ufbfh;
  476. stdout->_flag=2|x;
  477. stderr->_file=_ufbs[2].ufbfh;
  478. stderr->_flag=128|x;
  479. /************************ END OF SubMain *************************************/
  480.  
  481. main(argc,argv);
  482. _exit(0);
  483. }
  484.  
  485. /*    Where it starts                             TxEd 466 */
  486. main()
  487. {
  488.  register i;
  489.  struct Gadget        *gad_ptr;
  490.  struct IntuiText    *text_ptr;
  491.  
  492. /* Initialize */
  493.  strcpy(curdir,"SYS:");
  494.  CurrentDirLock = Lock(curdir,ACCESS_READ);
  495.  InitDirLock = CurrentDir(CurrentDirLock);
  496.  
  497.  Aslide_prop.Flags = FREEVERT|AUTOKNOB;
  498.  Aslide_prop.VertBody=0;
  499.  Aslide_prop.VertPot =0x8000;
  500.  
  501.  Bslide_prop.Flags = FREEVERT|AUTOKNOB;
  502.  Bslide_prop.VertBody=0;
  503.  Bslide_prop.VertPot =0x8000;
  504.  
  505.  /*Setup the button gadgets*/
  506.  for (i=0;i<(BUT_LAST-BUT_FIRST)+1;i++){
  507.     gad_ptr=&But_gad[i];
  508.     text_ptr=&But_text[i];
  509.     gad_ptr->LeftEdge=((i%10)*61)+5;
  510.     gad_ptr->TopEdge=((i/10)*11)+12;
  511.     if(i)gad_ptr->NextGadget=&But_gad[i-1];
  512.     else gad_ptr->NextGadget=&Bdir_gad;
  513.     gad_ptr->GadgetText=text_ptr;
  514.     text_ptr->LeftEdge=0;
  515.     text_ptr->TopEdge=0;
  516.  }
  517.  GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0);
  518.  if((IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0))==NULL)
  519.     close_things();
  520.  if((AWindow=(struct Window *)OpenWindow(&Aw))==NULL)
  521.     close_things();
  522.  if((BWindow=(struct Window *)OpenWindow(&Bw))==NULL)          /* TxEd 500 */
  523.     close_things();
  524.  if((Window=(struct Window *)OpenWindow(&Duw))==NULL)
  525.     close_things();
  526.  
  527.  RefreshGadgets(&FIRST_GADGET,Window,NULL);
  528.  RefreshGadgets(&ASlide_gad,AWindow,NULL);
  529.  RefreshGadgets(&BSlide_gad,BWindow,NULL);
  530.  
  531.  MAXANAME=(AWindow->Height-12)/8;
  532.  MAXBNAME=(BWindow->Height-12)/8;
  533.  new_dir();
  534.  dirflag=TRUE; /* TRUE = B Window is in use */
  535.  new_dir();
  536.  dirflag=FALSE;
  537.  
  538. /* Intuimessage process */
  539.  for(;;){
  540.     display_mem();
  541.     while(Msg=GetMsg(BWindow->UserPort)){
  542.         MessageClass = Msg->Class;
  543.         code = Msg->Code;
  544.         ReplyMsg(Msg);
  545.         switch(MessageClass){
  546.             case GADGETUP:
  547.                 do_gadgets(Msg);
  548.                 break;
  549.             case REFRESHWINDOW:
  550.                 ModifyIDCMP(BWindow,0);
  551.                 RefreshGadgets(&BSlide_gad,BWindow,NULL);
  552.                 MAXBNAME=(BWindow->Height-12)/8;
  553.                 if(!dirflag){
  554.                     dirflag=TRUE;
  555.                     new_dir();
  556.                     dirflag=FALSE;
  557.                 }else new_dir();
  558.                 ModifyIDCMP(BWindow,WinIDCMP);
  559.                 break;
  560.             case MOUSEBUTTONS:
  561.                 dirflag=TRUE;
  562.                 if(code==SELECTDOWN) sel_B();
  563.                 break;
  564.             case ACTIVEWINDOW:
  565.                 dirflag=TRUE;
  566.                 break;
  567.             default:
  568.                 break;
  569.         }
  570.         highlight();
  571.     }
  572.     while((Msg=GetMsg(Window->UserPort))||(Msg=GetMsg(AWindow->UserPort))){
  573.         MessageClass = Msg->Class;
  574.         code = Msg->Code;
  575.         ReplyMsg(Msg);
  576.         switch(MessageClass){
  577.             case GADGETUP:
  578.                 do_gadgets(Msg);
  579.                 break;
  580.             case REFRESHWINDOW:
  581.                 ModifyIDCMP(AWindow,0);
  582.                 BeginRefresh(Window); EndRefresh(Window);
  583.                 RefreshGadgets(&ASlide_gad,AWindow,NULL);
  584.                 MAXANAME=(AWindow->Height-12)/8;
  585.                 if(dirflag){
  586.                     dirflag=FALSE;
  587.                     new_dir();
  588.                     dirflag=TRUE;
  589.                 }else new_dir();
  590.                 ModifyIDCMP(AWindow,WinIDCMP);
  591.                 break;
  592.             case CLOSEWINDOW:
  593.                 close_things();
  594.                 break;
  595.             case MOUSEBUTTONS:
  596.                 dirflag=FALSE;
  597.                 if(code==SELECTDOWN) sel_A();
  598.                 break;
  599.             case ACTIVEWINDOW:
  600.                 dirflag=FALSE;
  601.                 break;
  602.             default:
  603.                 break;
  604.         }
  605.         highlight();
  606.     }
  607.  }/*end forever*/
  608. }/* end of life itself */
  609.  
  610. display_mem()    /* RAM Display */
  611. {
  612.     avail1=AvailMem(MEMF_CHIP);
  613.     avail2=AvailMem(MEMF_FAST);
  614.     if(avail1+avail2!=avail3){
  615.      sprintf(title,"%s          RAM: %-7ld",NAME,avail1+avail2);
  616.      SetWindowTitles(Window,title,NAME);
  617.      avail3=avail1+avail2;
  618.     }
  619.     Delay(10); /* save the CPU */
  620.     return(0);
  621. }
  622.  
  623. highlight()    /* Highlight A or B box                  TxEd 600 */
  624. {
  625.     if(dirflag){
  626.         Adir_text.BackPen=2;
  627.         Bdir_text.BackPen=3;
  628.         }
  629.     else{    Adir_text.BackPen=3;
  630.         Bdir_text.BackPen=2;
  631.         }
  632.     RefreshGadgets(&Adir_gad,Window,NULL);
  633.     RefreshGadgets(&Bdir_gad,Window,NULL);
  634.     return(0);
  635. }
  636.  
  637. BytesFree(dir)    /* Disk free mem */
  638. char *dir;
  639. {
  640. InfoData = AllocMem(sizeof(struct InfoData),0);
  641. fl = Lock(dir,ACCESS_READ);
  642. Info(fl,InfoData);
  643. avail3=(((InfoData->id_NumBlocks-InfoData->id_NumBlocksUsed-2)<=0)?0:
  644.  ((InfoData->id_NumBlocks-InfoData->id_NumBlocksUsed-2)*InfoData->id_BytesPerBlock));
  645. FreeMem(InfoData,sizeof(struct InfoData));
  646. UnLock(fl);
  647. return(0);
  648. }
  649.  
  650. do_gadgets(mes)
  651. struct IntuiMessage *mes;
  652. {
  653.     struct FileLock *MakeDirLock;
  654.     unsigned short i;
  655.     int gadgid;
  656.  
  657.     igad=(struct Gadget *) mes->IAddress;
  658.     gadgid=igad->GadgetID;
  659.     switch (gadgid) {
  660.         case ADIR_GADGET:
  661.             ModifyIDCMP(AWindow,0);
  662.             nullterm(A_buf,MAXCD);
  663.             Adir_str.NumChars =strlen(A_buf);
  664.             Adir_str.BufferPos=strlen(A_buf);
  665.             dirflag=FALSE;
  666.             highlight();
  667.             getdir(A_buf);
  668.             new_dir();
  669.             ModifyIDCMP(AWindow,WinIDCMP);
  670.             break;
  671.         case BDIR_GADGET:
  672.             ModifyIDCMP(BWindow,0);
  673.             nullterm(B_buf,MAXCD);
  674.             Bdir_str.NumChars =strlen(B_buf);
  675.             Bdir_str.BufferPos=strlen(B_buf);
  676.             dirflag=TRUE;
  677.             highlight();
  678.             getdir(B_buf);
  679.             new_dir();
  680.             ModifyIDCMP(BWindow,WinIDCMP);
  681.             break;
  682.         case ASLIDE_GADGET:
  683.             dirflag=FALSE;
  684.             rdis_files();
  685.             break;
  686.         case BSLIDE_GADGET:
  687.             dirflag=TRUE;
  688.             rdis_files();
  689.             break;
  690.         case PARENT_GADGET:
  691.             par_dir();
  692.             break;
  693.         case COMMENT_GADGET:
  694.             if(COMMENTMODE) COMMENTMODE=FALSE;
  695.             else COMMENTMODE=TRUE;    /* Toggle insurance */
  696.         case DEARC_GADGET:
  697.         case LISTARC_GADGET:
  698.         case ARC_GADGET:
  699.         case SHOW_GADGET:
  700.         case EDIT_GADGET:
  701.         case COPY_GADGET:
  702.         case RUN_GADGET:
  703.         case DELETE_GADGET:
  704.         case RENAME_GADGET:
  705.         case READ_GADGET:
  706.         case PRINT_GADGET:
  707.         case MOVE_GADGET:
  708.         case LOCK_GADGET:
  709.         case UNLOCK_GADGET:
  710.             action_on_selected(gadgid);
  711.             break;
  712.         case FREE_GADGET:
  713.             if(dirflag) BytesFree(B_buf);
  714.             else BytesFree(A_buf);
  715.             sprintf(command,"%d Bytes free in this dievice",avail3);
  716.             display_error(command,0);
  717.             break;
  718.         case BYTE_GADGET:
  719.             bytes = 0;
  720.             files = 0;
  721.             if(dirflag){ for(i=0;i<numdirB;i++)
  722.               if((Btable[i].dt_select==1)&&(!(Btable[i].dt_dir))){
  723.                 bytes = bytes + Btable[i].dt_size;
  724.                 files++;}
  725.             }
  726.             else for(i=0;i<numdirA;i++)
  727.               if((Atable[i].dt_select==1)&&(!(Atable[i].dt_dir))){
  728.                 bytes = bytes + Atable[i].dt_size;
  729.                 files++;
  730.             } 
  731.             sprintf(command,"%d Bytes in %d Files",bytes,files);
  732.             display_error(command,0);
  733.             break;
  734.         case MAKEDIR_GADGET:
  735.             do_req("Enter Directory","");
  736.             if(REQ){
  737.              if(dirflag) release_and_lock(B_buf);
  738.              else    release_and_lock(A_buf);
  739.              if(MakeDirLock = Lock(req_buf,ACCESS_READ)){
  740.                 UnLock(MakeDirLock);
  741.                 display_error("Dir or File Exists" ,IoErr());
  742.                 break;
  743.              } 
  744.              if(!(MakeDirLock = CreateDir(req_buf))){
  745.                 display_error("CreateDir Failed",IoErr());
  746.                 break;
  747.              }
  748.              UnLock(MakeDirLock);
  749.              if(dirflag) getdir(B_buf);
  750.              else getdir(A_buf);
  751.              new_dir();
  752.             }
  753.             break;
  754.         case DF0_GADGET:
  755.             getdir("DF0:"); new_dir(); break;
  756.         case DF1_GADGET:
  757.             getdir("DF1:"); new_dir(); break;
  758.         case DF2_GADGET:
  759.             getdir("DF2:"); new_dir(); break;
  760.         case RAM_GADGET:
  761.             getdir("RAM:"); new_dir(); break;
  762.         case DH0_GADGET:
  763.             getdir("DH0:"); new_dir(); break;
  764.         case VD0_GADGET:
  765.             getdir("VD0:"); new_dir(); break;
  766.         case GETDIR_GADGET:
  767.             getdir(requestedcd);
  768.             new_dir();
  769.             break;
  770.         case CLEAR_GADGET:
  771.             if(dirflag){
  772.              for(i=0;i<numdirB;i++) Btable[i].dt_select=0;
  773.              dis_files(cur_indexB);
  774.             }else{
  775.              for(i=0;i<numdirA;i++) Atable[i].dt_select=0;
  776.              dis_files(cur_indexA);
  777.             }
  778.             break;
  779.         case ALL_GADGET:
  780.             if(dirflag){
  781.              for(i=0;i<numdirB;i++)
  782.                 if(!Btable[i].dt_dir) Btable[i].dt_select=1;
  783.              dis_files(cur_indexB);
  784.             }else{
  785.              for(i=0;i<numdirA;i++)
  786.                 if(!Atable[i].dt_dir) Atable[i].dt_select=1;
  787.              dis_files(cur_indexA);
  788.             }
  789.             break;
  790.         case COMMAND_GADGET:
  791.             do_req("Command line to Execute.",COMMAND);
  792.             strcpy(COMMAND,req_buf);
  793.             if(REQ){
  794.                 sprintf(command,"Run %s",COMMAND);
  795.                 Execute(command,0,0);}
  796.             break;
  797.         case CONFIG_GADGET:
  798.             save_config();
  799.             break;
  800.         default:
  801.             break;
  802.     }
  803.     return(0);
  804. }
  805.  
  806. /* Multi-file action loop                        TxEd 780 */
  807. action_on_selected(gadgid)
  808. int gadgid;
  809. {
  810.  struct IntuiMessage *message;
  811.  register    i,i1,temp;
  812.  char        filename[MAXCD+MAXCHAR+2];
  813.  char        *ptr;
  814.  ModifyIDCMP(AWindow,MOUSEBUTTONS);
  815.  ModifyIDCMP(BWindow,MOUSEBUTTONS);
  816.  ModifyIDCMP(Window,GADGETUP);
  817.  if(dirflag) numdirT=numdirB;
  818.  else numdirT=numdirA;
  819.  
  820.  for(i=0;i<numdirT;i++){
  821.     if((gadgid!=SHOW_GADGET)&&(message=(struct IntuiMessage *)GetMsg(Window->UserPort))){
  822.         ReplyMsg(message);
  823.         display_error("Operation Aborted: Highlighted Files Remain",0);
  824.         break;}
  825.     if(dirflag){
  826.      if(Btable[i].dt_select){
  827.         ptr=B_buf+strlen(B_buf)-1;
  828.         if(*ptr==':') sprintf(filename,"%s%s",B_buf,Btable[i].dt_fname);
  829.         else         sprintf(filename,"%s/%s",B_buf,Btable[i].dt_fname);
  830.         }else goto END;
  831.     }else if(Atable[i].dt_select){
  832.         ptr = A_buf+strlen(A_buf)-1;
  833.         if(*ptr==':') sprintf(filename,"%s%s",A_buf,Atable[i].dt_fname);
  834.         else         sprintf(filename,"%s/%s",A_buf,Atable[i].dt_fname);
  835.         }else goto END;
  836.     switch(gadgid){
  837.         case DELETE_GADGET:
  838.             sprintf(command2,"Deleting %s",filename);
  839.             display_error(command2,0);
  840.             if(!(DeleteFile(filename)))display_error("Can't Delete",IoErr());
  841.             else    if(dirflag) Btable[i].dt_select=2;
  842.                 else Atable[i].dt_select=2;
  843.             break;
  844.         case COPY_GADGET:
  845.             if(dirflag) copy(filename,A_buf);
  846.             else        copy(filename,B_buf);
  847.             break;
  848.         case SHOW_GADGET:
  849.             do_req("Command [file]",SHOW);
  850.             strcpy(SHOW,req_buf);
  851.             if(REQ){display_error("Now Showing selected pictures",0);
  852.              sprintf(command,"%s %s",SHOW,filename);
  853.              Execute(command,0,0);
  854.             }
  855.             break;
  856.         case DEARC_GADGET:
  857.             do_req("Command [file]",ARCX);
  858.             strcpy(ARCX,req_buf);
  859.             if(REQ){
  860.                 display_error("Wait....doing something",0);
  861.                 if(dirflag)sprintf(command,"CD %s\n %s %s",B_buf,req_buf,Btable[i].dt_fname);
  862.                 else       sprintf(command,"CD %s\n %s %s",A_buf,req_buf,Atable[i].dt_fname);
  863.                 Execute(command,0,0);
  864.             }
  865.             break;
  866.         case ARC_GADGET:
  867.             display_error("Adding Files To Archive",0);
  868.             do_req("Destination Archive","");
  869.             if(REQ){strcpy(command,"");
  870.              if(dirflag){ for(i=0;i<numdirT;i++)
  871.                 if((Btable[i].dt_select)&&(!Btable[i].dt_dir)){
  872.                  sprintf(command,"%s %s",command,Btable[i].dt_fname);
  873.                  Btable[i].dt_select = 0;}
  874.               sprintf(command2,"CD %s\n Arc a %s %s",B_buf,req_buf,command);
  875.              }else{ for(i=0;i<numdirT;i++)
  876.                  if((Atable[i].dt_select)&&(!Atable[i].dt_dir)){
  877.                  sprintf(command,"%s %s",command,Atable[i].dt_fname);
  878.                  Atable[i].dt_select = 0;}
  879.               sprintf(command2,"CD %s\n Arc a %s %s",A_buf,req_buf,command);
  880.               }
  881.              Execute(command2,0,0);
  882.             }
  883.             break;
  884.         case LISTARC_GADGET:
  885.             do_req("Command [file]",ARCL);
  886.             strcpy(ARCL,req_buf);
  887.             if(REQ){display_error("Wait....doing something",0);
  888.                 sprintf(command,"%s %s",ARCL,filename);
  889.                 Execute(command,0,0);}
  890.             break;
  891.         case RUN_GADGET:
  892.             do_req("Argument for selected file","");
  893.             if(REQ){sprintf(command,"Run %s %s",filename,req_buf);
  894.                 Execute(command,0,0);}
  895.             break;
  896.         case READ_GADGET:
  897.             done=FALSE;
  898.             if((workfp=Open(filename,MODE_OLDFILE))==NULL) done=TRUE;
  899.             else{    sprintf(command,"raw:0/0/640/200/Reading file - %s",filename);
  900.                 if((w=Open(command,MODE_NEWFILE))==NULL) done=TRUE;
  901.                 }
  902.             Read(workfp,buf,1);
  903.             Seek(workfp,0,OFFSET_BEGINNING);
  904.             /* Normal Excutable file ----  Info file,ect. ----  Archive = 26 */
  905.             if(((buf[0]&0xf0)==NULL)||((buf[0]&0xf0)>=127))
  906.                 Hprint_to_screen(filename);
  907.             else    Print_to_screen(filename);
  908.             break;
  909.         case EDIT_GADGET:
  910.             do_req("Command [file]",EDITOR);
  911.             strcpy(EDITOR,req_buf);
  912.             if(REQ){display_error("Starting Text Editor",0);
  913.                 sprintf(command,"Run %s %s",EDITOR,filename);
  914.                 Execute(command,0,0);}
  915.             break;
  916.         case PRINT_GADGET:
  917.             do_req("Command [file]",PRINT);
  918.             strcpy(PRINT,req_buf);
  919.             if((REQ)&&(!Atable[i].dt_dir)){
  920.                  sprintf(command2,"%s %s",PRINT,filename);
  921.                  Execute(command2,0,0);}
  922.             break;
  923.         case MOVE_GADGET:
  924.             if(dirflag){
  925.              ptr=A_buf+strlen(A_buf)-1;
  926.              if(*ptr==':')sprintf(command,"%s%s",A_buf,Btable[i].dt_fname);
  927.              else sprintf(command,"%s/%s",A_buf,Btable[i].dt_fname);
  928.              sprintf(command2,"Moving %s to %s",filename,A_buf);
  929.             }else{
  930.              ptr=B_buf+strlen(B_buf)-1;
  931.              if(*ptr==':')sprintf(command,"%s%s",B_buf,Atable[i].dt_fname);
  932.              else sprintf(command,"%s/%s",B_buf,Atable[i].dt_fname);
  933.              sprintf(command2,"Moving %s to %s",filename,B_buf);
  934.             }
  935.             display_error(command2,0);
  936.             if(!(Rename(filename,command))) display_error("Can't move file",IoErr());
  937.             else    if(dirflag)Btable[i].dt_select=2;
  938.                 else       Atable[i].dt_select=2;
  939.             break;
  940.         case RENAME_GADGET:
  941.             if(dirflag) do_req("Rename it to what?",Btable[i].dt_fname);
  942.             else        do_req("Rename it to what?",Atable[i].dt_fname);
  943.             if((REQ)&&(!(Rename(filename,req_buf))))display_error("Can't Rename",IoErr());
  944.             break;
  945.         case LOCK_GADGET:
  946.             SetProtection(filename,5);/* 0101 */
  947.             sprintf(command2,"%s Locked: R-E-",filename);
  948.             display_error(command2,0);
  949.             break;
  950.         case UNLOCK_GADGET:
  951.             SetProtection(filename,0);  /* 0000 */
  952.             sprintf(command2,"%s UnLocked: RWED",filename);
  953.             display_error(command2,0);
  954.             break;
  955.         case COMMENT_GADGET:
  956.             if(COMMENTMODE){
  957.              if(dirflag){
  958.                 sprintf(command2,"Comment for %s",Btable[i].dt_fname);
  959.                  do_req(command2,Btable[i].dt_comment);
  960.              }else{
  961.                 sprintf(command2,"Comment for %s",Atable[i].dt_fname);
  962.                  do_req(command2,Atable[i].dt_comment);
  963.              }
  964.              if(REQ){
  965.                 nullterm(req_buf,MAXCHAR*2);
  966.                 if(!(SetComment(filename,req_buf)))
  967.                     display_error("SetComment Failed",IoErr());
  968.                 else if(dirflag)strcpy(Btable[i].dt_comment,req_buf);
  969.                      else    strcpy(Atable[i].dt_comment,req_buf);
  970.              }
  971.             }
  972.             break;
  973.         default:
  974.             break;
  975.     } /* end of switch */
  976.  
  977. if((gadgid!=DELETE_GADGET)&&(gadgid!=MOVE_GADGET))
  978.     if(dirflag) Btable[i].dt_select=0;
  979.     else    Atable[i].dt_select=0;
  980.  
  981. END: /* goto END - will skip to next file */
  982.  
  983.  } /* end of multi-file loop */
  984.  
  985. if((RENAME_GADGET==gadgid)||(ARC_GADGET==gadgid)||(DEARC_GADGET==gadgid))
  986.     if(dirflag) getdir(B_buf);
  987.     else    getdir(A_buf);
  988. else{
  989.  if(dirflag){
  990.  temp = numdirB;
  991.  for (i1=0;i1<numdirB;i1++)
  992.     if(Btable[i1].dt_select==2){
  993.         strcpy(Btable[i1].dt_fname,"\xff\xff\xff");
  994.         temp--;};
  995.  if(numdirB!=temp)qsort(Btable,numdirB,(sizeof(struct DirTable)));
  996.  numdirB = temp;
  997.  }else{
  998.  temp = numdirA;
  999.  for (i1=0;i1<numdirA;i1++)
  1000.     if(Atable[i1].dt_select==2){
  1001.         strcpy(Atable[i1].dt_fname,"\xff\xff\xff");
  1002.         temp--;};
  1003.  if(numdirA!=temp)qsort(Atable,numdirA,(sizeof(struct DirTable)));
  1004.  numdirA = temp;
  1005.  }
  1006. };
  1007.  
  1008. if((gadgid==MOVE_GADGET)||(gadgid==COPY_GADGET)||
  1009.     ((!strcmp(B_buf,A_buf))&&(gadgid==DELETE_GADGET))){
  1010.  if(dirflag){
  1011.     new_dir();
  1012.     dirflag=FALSE;
  1013.     getdir(A_buf);
  1014.  }else{ new_dir();
  1015.     dirflag=TRUE;
  1016.     getdir(B_buf);}
  1017. }
  1018. new_dir();
  1019. ModifyIDCMP(BWindow,WinIDCMP);
  1020. ModifyIDCMP(AWindow,WinIDCMP);    /* Modify everything */
  1021. ModifyIDCMP(Window,CLOSEWINDOW|REFRESHWINDOW|GADGETUP|REQCLEAR);
  1022. return(0);
  1023. }
  1024.                                 /* TxEd  1000*/
  1025. /* routines for dirs, file display, select */
  1026. getdir(DirToGet)
  1027. char *DirToGet;
  1028. {
  1029.     struct FileLock *filelock;
  1030.     struct FileInfoBlock *fb;
  1031.     char EffectiveDir[MAXCD+1];
  1032.  
  1033.     if(!(*DirToGet)) strcpy(EffectiveDir,":");
  1034.     else strcpy(EffectiveDir,DirToGet);
  1035.  
  1036. TRYAGAIN:
  1037.     if (!(filelock = Lock(EffectiveDir,ACCESS_READ))) {
  1038.         strcpy(EffectiveDir,curdir);
  1039.         display_error("Can't Get Directory",IoErr());
  1040.         if(!(filelock = Lock(EffectiveDir,ACCESS_READ))) {
  1041.             display_error("Can't Get Directory",IoErr());
  1042.             strcpy(EffectiveDir,"RAM:");
  1043.             goto TRYAGAIN;
  1044.         }
  1045.     }
  1046.     /*Allocate the file info block*/
  1047.     fb = AllocMem(FBSIZE,MEMF_CLEAR|MEMF_PUBLIC);
  1048.     if(!Examine(filelock,fb)){
  1049.         FreeMem(fb,FBSIZE);
  1050.         UnLock(filelock);
  1051.         display_error("Bad Info Block:",IoErr());
  1052.         strcpy(EffectiveDir,"RAM:");
  1053.         goto TRYAGAIN;
  1054.     }
  1055.     if(fb->fib_DirEntryType<0){
  1056.         strcpy(EffectiveDir,curdir);
  1057.         FreeMem(fb,FBSIZE);
  1058.         UnLock(filelock);
  1059.         display_error("That's no Directory",IoErr());
  1060.         goto TRYAGAIN;
  1061.     }
  1062.     strcpy(curdir,EffectiveDir);
  1063.     strcpy(requestedcd,EffectiveDir);
  1064.     if(dirflag){
  1065.      strcpy(B_buf,EffectiveDir);
  1066.      Bdir_str.NumChars =strlen(EffectiveDir);
  1067.      Bdir_str.BufferPos=strlen(EffectiveDir);
  1068.      SetWindowTitles(BWindow,B_buf,NAME);
  1069.     }else{
  1070.      strcpy(A_buf,EffectiveDir);
  1071.      Adir_str.NumChars =strlen(EffectiveDir);
  1072.      Adir_str.BufferPos=strlen(EffectiveDir);
  1073.      SetWindowTitles(AWindow,A_buf,NAME);
  1074.     }
  1075.     if(dirflag){
  1076.      cur_indexB=0;
  1077.      numdirB = 0;
  1078.      while(ExNext(filelock,fb)){
  1079.         if(fb->fib_DirEntryType<0) Btable[numdirB].dt_dir=0;
  1080.         else Btable[numdirB].dt_dir= -1;
  1081.         Btable[numdirB].dt_select=0;
  1082.         Btable[numdirB].dt_size=fb->fib_Size;
  1083.         strcpy(Btable[numdirB].dt_fname,fb->fib_FileName);
  1084.         nullterm(Btable[numdirB].dt_fname,MAXCHAR);
  1085.         strcpy(Btable[numdirB].dt_comment,fb->fib_Comment);
  1086.         nullterm(Btable[numdirB].dt_comment,MAXCHAR*2);
  1087.         if(++numdirB == MAXFILE){
  1088.             break;}
  1089.      }
  1090.      qsort(Btable,numdirB,(sizeof (struct DirTable)));
  1091.     }else{
  1092.      cur_indexA=0;
  1093.      numdirA = 0;
  1094.      while (ExNext(filelock,fb)) {
  1095.         if(fb->fib_DirEntryType < 0) Atable[numdirA].dt_dir = 0;
  1096.         else Atable[numdirA].dt_dir = -1;
  1097.         Atable[numdirA].dt_select=0;
  1098.         Atable[numdirA].dt_size=fb->fib_Size;
  1099.         strcpy(Atable[numdirA].dt_fname,fb->fib_FileName);
  1100.         nullterm(Atable[numdirA].dt_fname,MAXCHAR);
  1101.         strcpy(Atable[numdirA].dt_comment,fb->fib_Comment);
  1102.         nullterm(Atable[numdirA].dt_comment,MAXCHAR*2);
  1103.         if(++numdirA == MAXFILE){
  1104.             break;}
  1105.      }
  1106.      qsort(Atable,numdirA,(sizeof (struct DirTable)));
  1107.     }
  1108.  
  1109.     sprintf(command2,"%d Entries in A    %d Entries in B",numdirA,numdirB);
  1110.     display_error(command2,0);
  1111.     FreeMem(fb,FBSIZE);
  1112.     UnLock(filelock);    /*Release new request lock*/
  1113.     release_and_lock(EffectiveDir);
  1114.     return(0);
  1115. }
  1116.  
  1117. release_and_lock(NewDir)
  1118. char    *NewDir;
  1119. {
  1120.     UnLock(CurrentDirLock); /*Release old CD lock */
  1121.     CurrentDirLock=Lock(NewDir);
  1122.     CurrentDir(CurrentDirLock);    /*MAKE IT THE CURRENT DIRECTORY*/
  1123.     return(0);
  1124. }
  1125.  
  1126. /* Redisplay files after slide positioning */
  1127. rdis_files()
  1128. {
  1129.  USHORT Vpot;
  1130.     int numd;
  1131.     int pos=0;
  1132.  
  1133.     if((dirflag)&&(numdirB>MAXBNAME)){
  1134.         Vpot = Bslide_prop.VertPot;
  1135.         Vpot >>= 1;
  1136.         Vpot &= 0x7fff;
  1137.         numd = numdirB - MAXBNAME;
  1138.         pos = ((float) Vpot / (float) 0x7fff) * numd;
  1139.         cur_indexB = pos;
  1140.     }
  1141.     if((!dirflag)&&(numdirA>MAXANAME)){
  1142.         Vpot = Aslide_prop.VertPot;
  1143.         Vpot >>= 1;
  1144.         Vpot &= 0x7fff;
  1145.         numd = numdirA - MAXANAME;
  1146.         pos = ((float) Vpot / (float) 0x7fff) * numd;
  1147.         cur_indexA = pos;
  1148.     }
  1149.     dis_files(pos);
  1150.     return(0);
  1151. }
  1152.  
  1153. /* Move slides to top & display files */ 
  1154. void new_dir()
  1155. {
  1156.     USHORT Vbody;
  1157.  
  1158.     if(dirflag){
  1159.         if(numdirB<=MAXBNAME){
  1160.          Vbody = 0xffff;
  1161.         }else{
  1162.          Vbody = ((float) 0x7fff)/(((float) numdirB)/((float) MAXBNAME));
  1163.          Vbody <<= 1;
  1164.         }
  1165.         cur_indexB = 0;
  1166.         ModifyProp(&BSlide_gad,BWindow,NULL,Bslide_prop.Flags,0,0,0,Vbody);
  1167.  
  1168.     }else{    if(numdirA<=MAXANAME){
  1169.          Vbody = 0xffff;
  1170.         }else{
  1171.          Vbody = ((float) 0x7fff)/(((float) numdirA)/((float) MAXANAME));
  1172.          Vbody <<= 1;
  1173.         }
  1174.         cur_indexA = 0;
  1175.         ModifyProp(&ASlide_gad,AWindow,NULL,Aslide_prop.Flags,0,0,0,Vbody);
  1176.     }
  1177.     dis_files(0);
  1178.     return;
  1179. }
  1180.  
  1181. /* file display loop */
  1182. dis_files(pos)
  1183. int pos;
  1184. {
  1185.     register i;
  1186.  
  1187.     if(dirflag) for(i=0;i<MAXBNAME;i++) dis_B(i+pos,i);
  1188.     else        for(i=0;i<MAXANAME;i++) dis_A(i+pos,i);
  1189.     return(0);
  1190. }
  1191.  
  1192. /* print files on screen, dir,file highlight for A */
  1193. dis_A(file,pos)
  1194. register file,pos;
  1195. {
  1196.     /*Set the top position*/
  1197.     file_text.TopEdge = (pos*8)+11;
  1198.  
  1199.     if(file == -1 || file >= numdirA){
  1200.         sprintf(file_name,"%-37.37s","");
  1201.         file_text.FrontPen=2;
  1202.         file_text.BackPen= 2;  /*black*/
  1203.     }else{
  1204.         if(Atable[file].dt_dir){
  1205.             sprintf(file_name,"%-30.30s %-6.6s",Atable[file].dt_fname,"");
  1206.             if(Atable[file].dt_select){
  1207.                 file_text.FrontPen=2; /*Dir Highlight*/
  1208.                 file_text.BackPen= 3;
  1209.             }else{
  1210.                 file_text.FrontPen=3; /*Dir Normal*/
  1211.                 file_text.BackPen= 2;
  1212.             }
  1213.         }else{
  1214.             sprintf(file_name,"%-30.30s %6ld",Atable[file].dt_fname,Atable[file].dt_size);
  1215.             if(Atable[file].dt_select){
  1216.                 file_text.FrontPen=2; /*File Highlight*/
  1217.                 file_text.BackPen= 1;
  1218.             }else{
  1219.                 file_text.FrontPen=1;/*File Normal*/
  1220.                 file_text.BackPen= 2;
  1221.             }
  1222.         }
  1223.     }
  1224.     PrintIText(AWindow->RPort,&file_text,0,0);
  1225.     return(0);
  1226. }
  1227.  
  1228. /* as above for B */
  1229. dis_B(file,pos)
  1230. register file,pos;
  1231. {
  1232.     /*Set the top position*/
  1233.     file_text.TopEdge=(pos*8)+11;
  1234.  
  1235.     if(file == -1 || file >= numdirB){
  1236.         sprintf(file_name,"%-37.37s","");
  1237.         file_text.FrontPen=2;
  1238.         file_text.BackPen= 2;  /*black*/
  1239.     }else{
  1240.         if(Btable[file].dt_dir){
  1241.             sprintf(file_name,"%-30.30s %-6.6s",Btable[file].dt_fname,"");
  1242.             if(Btable[file].dt_select){
  1243.                 file_text.FrontPen=2; /*Dir Highlight*/
  1244.                 file_text.BackPen= 3;
  1245.             }else{
  1246.                 file_text.FrontPen=3; /*Dir Normal*/
  1247.                 file_text.BackPen= 2;
  1248.             }
  1249.         }else{
  1250.             sprintf(file_name,"%-30.30s %6ld",Btable[file].dt_fname,Btable[file].dt_size);
  1251.             if(Btable[file].dt_select){
  1252.                 file_text.FrontPen=2; /*File Highlight*/
  1253.                 file_text.BackPen= 1;
  1254.             }else{
  1255.                 file_text.FrontPen=1;/*File Normal*/
  1256.                 file_text.BackPen= 2;
  1257.             }
  1258.         }
  1259.     }
  1260.     PrintIText(BWindow->RPort,&file_text,0,0);
  1261.     return(0);
  1262. }
  1263.  
  1264. /* file select for A */
  1265. void sel_A()
  1266. {
  1267.     int file,i;
  1268.     char *ptr;
  1269.  
  1270.     file = Msg->MouseY-11;
  1271.     file /= 8;
  1272.     if((!numdirA)||(file>MAXANAME)||((file+cur_indexA)>numdirA)) return;
  1273.  
  1274.     if(Atable[file+cur_indexA].dt_dir){
  1275.         for(i=0;i<numdirA;i++)
  1276.         if((Atable[i].dt_dir)&&(i != file+cur_indexA))Atable[i].dt_select = 0;
  1277.         ptr = A_buf + strlen(A_buf) - 1;
  1278.         if(Atable[file+cur_indexA].dt_select ^= 1) 
  1279.             sprintf(requestedcd,"%s%s%s",A_buf,((*ptr == ':') ? "":"/"),
  1280.                 Atable[file+cur_indexA].dt_fname);
  1281.         else    strcpy(requestedcd,A_buf);
  1282.         dis_files(cur_indexA);
  1283.         return;
  1284.     }
  1285.     Atable[file+cur_indexA].dt_select ^= 1;
  1286.     dis_A(file+cur_indexA,file);
  1287.     if(COMMENTMODE) display_error(Atable[file+cur_indexA].dt_comment,0);
  1288.     return;
  1289. }
  1290. /* file select for B */
  1291. void sel_B()
  1292. {
  1293.     int file,i;
  1294.     char *ptr;
  1295.  
  1296.     file = Msg->MouseY-11;
  1297.     file /= 8;
  1298.     if((!numdirB)||(file>MAXBNAME)||((file+cur_indexB)>numdirB)) return;
  1299.  
  1300.     if(Btable[file+cur_indexB].dt_dir){
  1301.         for(i=0;i<numdirB;i++)
  1302.         if((Btable[i].dt_dir)&&(i != file+cur_indexB))Btable[i].dt_select = 0;
  1303.         ptr = B_buf + strlen(B_buf) - 1;
  1304.         if(Btable[file+cur_indexB].dt_select ^= 1) 
  1305.             sprintf(requestedcd,"%s%s%s",B_buf,((*ptr == ':') ? "":"/"),
  1306.                 Btable[file+cur_indexB].dt_fname);
  1307.         else    strcpy(requestedcd,B_buf);
  1308.         dis_files(cur_indexB);
  1309.         return;
  1310.     }
  1311.     Btable[file+cur_indexB].dt_select ^= 1;
  1312.     dis_B(file+cur_indexB,file);
  1313.     if(COMMENTMODE) display_error(Btable[file+cur_indexB].dt_comment,0);
  1314.     return;
  1315. }
  1316.  
  1317. void par_dir() /* concat curdir */
  1318. {
  1319.     char *ptr;
  1320.  
  1321.     ModifyIDCMP(AWindow,0);
  1322.     ModifyIDCMP(BWindow,0);
  1323.     if(dirflag) ptr=B_buf+strlen(B_buf)-1;
  1324.     else ptr=A_buf+strlen(A_buf)-1;
  1325.  
  1326.     if(dirflag)for(;ptr >= B_buf;ptr--){
  1327.         if(*ptr == ':'){
  1328.             *(ptr+1)=0;
  1329.             break;}
  1330.         if(*ptr == '/'){
  1331.             *ptr = 0;
  1332.             break;}
  1333.     }else for(;ptr >= A_buf;ptr--){
  1334.         if(*ptr == ':'){
  1335.             *(ptr+1)=0;
  1336.             break;}
  1337.         if(*ptr == '/'){
  1338.             *ptr = 0;
  1339.             break;}
  1340.     }
  1341.     if(dirflag) getdir(B_buf);
  1342.     else getdir(A_buf);
  1343.     new_dir();
  1344.     ModifyIDCMP(AWindow,WinIDCMP);
  1345.     ModifyIDCMP(BWindow,WinIDCMP);
  1346.     return;
  1347. }
  1348.  
  1349. /*compare two directory entries*/
  1350. comp(dt1,dt2)
  1351. struct DirTable *dt1,*dt2;
  1352. {
  1353.     char *ptr1,*ptr2;
  1354.     register c1,c2;
  1355.  
  1356.     for(ptr1=dt1->dt_fname,ptr2=dt2->dt_fname;*ptr1&&*ptr2;ptr1++,ptr2++){
  1357.         c1= *ptr1;
  1358.         c2= *ptr2;
  1359.         c1&= 0xdf;
  1360.         c2&= 0xdf;
  1361.         if(c1>c2) return(-1);
  1362.         if(c1<c2) return(1);
  1363.     }
  1364.     if(*ptr1) return(-1);
  1365.     return(0);
  1366. }
  1367.  
  1368. void copy(s,pc)    /* FileCopy                        TxEd 1345 */
  1369. char *s;
  1370. char *pc;
  1371. {
  1372.     struct FileHandle  *copyin;
  1373.     struct FileHandle  *copyout;
  1374.     int iosize;
  1375.     int actual;
  1376.     char *copybuf;
  1377.     struct FileLock *fl;
  1378.     char *ptr;
  1379.     char *ptr1;
  1380.  
  1381.     if(!(copyin = Open(s,MODE_OLDFILE))) return;
  1382.  
  1383.     if((fl=Lock(pc,ACCESS_READ))){
  1384.         UnLock(fl);
  1385.         ptr = strlen(pc)+pc-1;
  1386.         for(ptr1=s+strlen(s)-1;ptr1 > s;ptr1--){
  1387.             if(*ptr1=='/'||*ptr1==':') break;}
  1388.         if(*ptr1 == '/'||*ptr1 == ':') ptr1++;
  1389.         if(*ptr == ':') sprintf(command,"%s%s",pc,ptr1);
  1390.         else sprintf(command,"%s/%s",pc,ptr1);
  1391.     }
  1392.     sprintf(command2,"Copying %s to %s",s,pc);
  1393.     display_error(command2,0);
  1394.  
  1395.     if(!strcmp(command,s)){
  1396.         display_error("Same Dir Error",0);
  1397.         Close(copyin);
  1398.         return;}
  1399.  
  1400.     if(!(copyout = Open(command,MODE_NEWFILE))){
  1401.         display_error("Can't Write to Requested Path",IoErr());
  1402.         Close(copyin);
  1403.         return;
  1404.     }else{
  1405. /* Determine the length of the file '?' */
  1406.         iosize = Seek(copyin,0,OFFSET_BEGINING);
  1407.         iosize = 12288;
  1408. /* Allocate memory for the copy buffer */
  1409.         do{
  1410.             copybuf = AllocMem(iosize,MEMF_PUBLIC);
  1411.             if(copybuf==0) iosize=iosize/2;
  1412.         }while(copybuf==0 & iosize>512);
  1413.  
  1414. /* A-OK Copy the file */
  1415.         do{    actual = Read(copyin,copybuf,iosize);
  1416.             if(Write(copyout,copybuf,actual)!=actual)
  1417.                 break;} while(actual==iosize);
  1418.  
  1419.         FreeMem(copybuf,iosize);
  1420.         Close(copyout);
  1421.         Close(copyin);
  1422.     }
  1423.     return;
  1424. }
  1425.  
  1426. nullterm(str,len) /* return a str, size of len */
  1427. char *str;
  1428. int len;
  1429. {
  1430.     register i;
  1431.  
  1432.     str[len]=0;
  1433.     for(i=len;len>=0;len--){
  1434.         if(str[i]!=' '&&str[i]) break;
  1435.         str[i]=0;
  1436.     }
  1437.     return(0);
  1438. }
  1439.  
  1440. display_error(errormsg,doserrnum)
  1441. char *errormsg;
  1442. long doserrnum;
  1443. {
  1444.     strcpy(err_buf,errormsg);
  1445.      if(doserrnum){
  1446.         sprintf(err_buf,"%s (%d)",err_buf,doserrnum);
  1447.         DisplayBeep(0);
  1448.     }
  1449.     err_str.NumChars = strlen(err_buf);
  1450.     err_str.BufferPos = strlen(err_buf);
  1451.     RefreshGadgets(&Err_gad,Window,NULL);
  1452.     return(0);
  1453. }
  1454.  
  1455. qsort(v,n,size) /* ASCII sort */
  1456. char *v;
  1457. short n;
  1458. int size;
  1459. {
  1460.     short gap,i,j;
  1461.     register x;
  1462.     char temp, *p1, *p2;
  1463.     for(gap=n/2;gap>0;gap/=2)
  1464.         for(i=gap; i<n; i++)
  1465.             for(j=i-gap; j>=0; j-=gap)
  1466.               if(comp((p1=v+j*size), (p2=v+(j+gap)*size))<0){
  1467.                 /*exchange them*/
  1468.                 for(x=0; x<size; x++){
  1469.                     temp = *p1;
  1470.                     *p1++ = *p2;
  1471.                     *p2++ = temp;
  1472.                 }
  1473.               }
  1474.     return(0);
  1475. }
  1476.  
  1477. /* Read text files */
  1478. void Print_to_screen(ptr)
  1479. char *ptr[];
  1480. {
  1481. register i,len;
  1482. if(!done)
  1483.     do{
  1484.         len=Read(workfp,buf,512);
  1485.         len2=0;
  1486.         while(len2<len&&done==FALSE){
  1487.             for(i=len2;buf[i] != 0x0a&&i<511;i++)
  1488.             if(buf[i] == 0x0c) buf[i] = 0x20;            
  1489.             Write(w,&buf[len2],i-len2+1);
  1490.             len2 = i+1;
  1491.             if (++linecount>21 && buf[i] == 0x0a) WaitSpace();
  1492.         }
  1493.     }while(len == 512 && done == FALSE);
  1494.         MyDone();
  1495.     MyClose();
  1496. }
  1497.  
  1498. /* Hex read files */
  1499. void Hprint_to_screen(ptr)
  1500. char *ptr[];
  1501. {
  1502. register len;
  1503. if(!done)
  1504. strcpy(buffer,"    -                                     ");
  1505. r1[0]=0x00;r1[1]=0x00;
  1506.     do{
  1507.         index = 0;
  1508.         DoHex(r1,2);
  1509.         r1[1] += 16;
  1510.         if(!(r1[1])) r1[0]++;
  1511.         index=6;
  1512.         len = Read(workfp,buf,16);
  1513.         buf[len]=0x0a;
  1514.         DoHex(buf,len,6);
  1515.         if(len){
  1516.             Write(w,&buffer[0],index);
  1517.             if (len!=16) Write(w,&blank[0],42-index);
  1518.             Write(w,&buf[0],len+1);
  1519.         };
  1520.         if(++linecount>21) WaitSpace();
  1521.     }while((len==16)&&(!done));
  1522.     MyDone();
  1523.     MyClose();
  1524.     return;
  1525. }
  1526.  
  1527. /* Convert to hex */
  1528. void DoHex(ptr2,len)
  1529. int len;
  1530. char ptr2[];
  1531. {
  1532.  unsigned char c1,c2;
  1533.  unsigned int i,i2=0;
  1534.  for(i=0;i<len;i++){
  1535.     c1=((ptr2[i]&0xf0)>>4);
  1536.     c2=(ptr2[i]&0x0f);
  1537.         if(c1>9) c1+=87;
  1538.         else     c1+=48;
  1539.         if(c2>9) c2+=87;
  1540.         else     c2+=48; 
  1541.     buffer[index]=c1;
  1542.     buffer[index+1]=c2;
  1543.     if((buf[i]<32)||(buf[i]>127)) buf[i]=46;
  1544.     index+=2;
  1545.     if(++i2==4){
  1546.         index++;
  1547.         i2=0;
  1548.     };
  1549.  }
  1550.  return;
  1551. }
  1552.  
  1553. /* wait prompt for READ */
  1554. void WaitSpace()
  1555. {
  1556. unsigned char c;
  1557.  
  1558.     linecount = 1;
  1559.     Write(w,"\x1b[33mSPACE,RETURN,B,ESC,?> \x1b[0m",31);
  1560.     while(Read(w,&c,1),c!=' '){
  1561.         if(c==ESC){
  1562.          done = TRUE;
  1563.          break;
  1564.         }
  1565.         if(c=='\r'){
  1566.          linecount=21;
  1567.          break;
  1568.         }
  1569.         if(c=='b'){
  1570.          Seek(workfp,0,OFFSET_BEGINNING);
  1571.          len2 = 513;
  1572.          r1[0]=0x00;
  1573.          r1[1]=0x00;
  1574.          Write(w,"\x1bc",2);
  1575.          break;
  1576.         }
  1577.         if(c=='?'){    /* Help menu */
  1578.          strcpy(command,"\r\x1b[32m[SPACE] : Forward one page\n[RETURN]: Forward one line\n[ B ]   : Beginning of file\n[ESC]   : Abort read\n\x1b[0m");
  1579.          Write(w,command,strlen(command));
  1580.          WaitSpace();
  1581.          break;
  1582.         }
  1583.     }
  1584. /*erase over the message*/
  1585. Write(w,"\r                     \r",23);
  1586. }
  1587. void MyDone()
  1588. {
  1589. unsigned char c;
  1590.     Write(w,"\r\x1b[33mEnd. Press SPACE\x1b[0m",26);
  1591.     while(Read(w,&c,1),c!=' ');
  1592. }
  1593. void MyClose()
  1594. {
  1595.     if(workfp) Close(workfp);
  1596.     if(w) Close(w);
  1597. }
  1598.  
  1599. /* Do A request, cmt = BodyText , oldreq = String to change */
  1600. do_req(cmt,oldreq)
  1601. char *cmt,*oldreq;
  1602. {
  1603.  int gadgid,looping=TRUE;
  1604.  strcpy(REQ_COMMENT,cmt);
  1605.  strcpy(req_buf,oldreq);
  1606.  REQ=FALSE;
  1607.  if(Request(&req,Window) == NULL) looping=FALSE;
  1608.  while(looping){
  1609.     display_mem();
  1610.     while((Msg=GetMsg(Window->UserPort))||(Msg=GetMsg(AWindow->UserPort))){
  1611.         MessageClass=Msg->Class;
  1612.         code=Msg->Code;
  1613.         igad=(struct Gadget *)Msg->IAddress;
  1614.         gadgid=igad->GadgetID;
  1615.         ReplyMsg(Msg);
  1616.         looping=FALSE;
  1617.         EndRequest(&req,Window);
  1618.         switch(gadgid){
  1619.              case FALSE_BUTT:
  1620.                 REQ=FALSE;
  1621.                 break;
  1622.             case REQSTR_GADGET:
  1623.                 nullterm(req_buf,MAXCD);
  1624.             case TRUE_BUTT:
  1625.                 REQ=TRUE; 
  1626.                 break;
  1627.             default:
  1628.                 break;
  1629.         }
  1630.     }
  1631.  }
  1632.  return(0);
  1633. } /* Get outa here */
  1634.  
  1635. save_config()
  1636. {
  1637. if(workfp=Open(CONFILE,MODE_NEWFILE))
  1638.     {
  1639.     Write(workfp,SHOW,   MAXCHAR);
  1640.     Write(workfp,COMMAND,MAXCHAR);
  1641.     Write(workfp,ARCX,   MAXCHAR);
  1642.     Write(workfp,ARCL,   MAXCHAR);
  1643.     Write(workfp,EDITOR, MAXCHAR);
  1644.     Write(workfp,PRINT,  MAXCHAR);
  1645.     Close(workfp);
  1646.     }
  1647. return(0);
  1648. }
  1649.  
  1650. close_things()
  1651. {
  1652.     if(BWindow)    CloseWindow(BWindow);
  1653.     if(AWindow)    CloseWindow(AWindow);
  1654.     if(Window)    CloseWindow(Window);
  1655.     if(IntuitionBase) CloseLibrary(IntuitionBase);
  1656.     if(GfxBase)    CloseLibrary(GfxBase);
  1657.     if(InitDirLock){
  1658.         CurrentDir(InitDirLock);
  1659.         UnLock(CurrentDirLock);
  1660.     }
  1661.     _exit();
  1662. }
  1663.