home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 247.lha / pd.c < prev    next >
C/C++ Source or Header  |  1989-05-21  |  17KB  |  994 lines

  1. #include    "stdio.h"
  2. #include    "functions.h"
  3. #include    "exec/types.h"
  4. #include    "exec/nodes.h"
  5. #include    "exec/lists.h"
  6. #include    "exec/libraries.h"
  7. #include    "exec/ports.h"
  8. #include    "exec/interrupts.h"
  9. #include    "exec/io.h"
  10. #include    "exec/memory.h"
  11. #include    "exec/types.h"
  12. #include    "intuition/intuition.h"
  13. #include    "intuition/intuitionbase.h"
  14. #include    "libraries/dos.h"
  15. #include    "libraries/dosextens.h"
  16. #include        "graphics/GfxBase.h"
  17.  
  18. long _stack = 8000;
  19. long _priority = 0;
  20. long _BackGroundIO = 0;
  21. char *_procname = "Greetings_from_C&P";
  22.  
  23. #undef  BADDR
  24. #define BADDR(x)        ((APTR)((LONG)x << 2))
  25.  
  26. struct DosList {
  27.     BPTR                dol_Next;        /* bptr to next device list */
  28.     LONG                dol_Type;        /* see DLT below */
  29.     struct MsgPort     *dol_Task;        /* ptr to handler task */
  30.     BPTR                dol_Lock;
  31.     union {
  32.     struct {
  33.         BSTR            *dol_Handler;
  34.         LONG            dol_StackSize;
  35.         LONG            dol_Priority;
  36.         ULONG            dol_Startup;
  37.         BPTR                dol_SegList;
  38.         BPTR                dol_GlobVec;
  39.     } dol_handler;
  40.  
  41.        struct {
  42.         struct DateStamp        dol_VolumeDate;  /* creation date */
  43.         BPTR                    dol_LockList;    /* outstanding locks */
  44.         LONG                    dol_DiskType;    /* 'DOS', etc */
  45.     } dol_volume;
  46.  
  47.     } dol_misc;
  48.  
  49.     BSTR                *dol_Name;        /* bptr to bcpl name */
  50. };
  51.  
  52. struct FileSysStartupMsg {
  53. ULONG       fssm_Unit;      /* exec unit number for this device */
  54. BSTR        fssm_Device;    /* null terminated bstring to the device name */
  55. BPTR        fssm_Environ;   /* ptr to environment table (see above) */
  56. ULONG       fssm_Flags;     /* flags for OpenDevice() */
  57. };
  58.  
  59. extern struct Library *DOSBase;
  60.  
  61. struct FileLock        *lock, *Lock();        /* Used for legal check */
  62. FILE    *rf, *wf;
  63.  
  64. struct IntuitionBase *IntuitionBase;
  65. struct GfxBase *GfxBase;
  66. struct Window *Wdw;
  67. short    mx,my, endit = 0;
  68. int    ret;
  69. char    buffer[80], *dr[8];
  70. UBYTE    *tit = (UBYTE *)"PD LIST MAKER ©1988 by C&P Software";
  71.  
  72.  
  73. SHORT BorderVectors1[] = {
  74.     0,0,
  75.     35,0,
  76.     35,10,
  77.     0,10,
  78.     0,0
  79. };
  80. struct Border Border1 = {
  81.     -1,-1,
  82.     0,0,JAM2,
  83.     5,
  84.     BorderVectors1,
  85.     NULL
  86. };
  87.  
  88. struct IntuiText IText1 = {
  89.     1,0,JAM2,
  90.     2,1,
  91.     NULL,
  92.     (UBYTE *)"NONE",
  93.     NULL
  94. };
  95.  
  96. struct Gadget Gadget10 = {
  97.     NULL,
  98.     265,14,
  99.     34,9,
  100.     NULL,
  101.     RELVERIFY,
  102.     BOOLGADGET,
  103.     (APTR)&Border1,
  104.     NULL,
  105.     &IText1,
  106.     NULL,
  107.     NULL,
  108.     NULL,
  109.     NULL
  110. };
  111.  
  112. SHORT BorderVectors2[] = {
  113.     0,0,
  114.     35,0,
  115.     35,10,
  116.     0,10,
  117.     0,0
  118. };
  119. struct Border Border2 = {
  120.     -1,-1,
  121.     0,0,JAM2,
  122.     5,
  123.     BorderVectors2,
  124.     NULL
  125. };
  126.  
  127. struct IntuiText IText2 = {
  128.     1,0,JAM2,
  129.     2,1,
  130.     NULL,
  131.     (UBYTE *)"NONE",
  132.     NULL
  133. };
  134.  
  135. struct Gadget Gadget9 = {
  136.     &Gadget10,
  137.     223,14,
  138.     34,9,
  139.     NULL,
  140.     RELVERIFY,
  141.     BOOLGADGET,
  142.     (APTR)&Border2,
  143.     NULL,
  144.     &IText2,
  145.     NULL,
  146.     NULL,
  147.     NULL,
  148.     NULL
  149. };
  150.  
  151. SHORT BorderVectors3[] = {
  152.     0,0,
  153.     35,0,
  154.     35,10,
  155.     0,10,
  156.     0,0
  157. };
  158. struct Border Border3 = {
  159.     -1,-1,
  160.     0,0,JAM2,
  161.     5,
  162.     BorderVectors3,
  163.     NULL
  164. };
  165.  
  166. struct IntuiText IText3 = {
  167.     1,0,JAM2,
  168.     2,1,
  169.     NULL,
  170.     (UBYTE *)"NONE",
  171.     NULL
  172. };
  173.  
  174. struct Gadget Gadget8 = {
  175.     &Gadget9,
  176.     181,14,
  177.     34,9,
  178.     NULL,
  179.     RELVERIFY,
  180.     BOOLGADGET,
  181.     (APTR)&Border3,
  182.     NULL,
  183.     &IText3,
  184.     NULL,
  185.     NULL,
  186.     NULL,
  187.     NULL
  188. };
  189.  
  190. SHORT BorderVectors4[] = {
  191.     0,0,
  192.     35,0,
  193.     35,10,
  194.     0,10,
  195.     0,0
  196. };
  197. struct Border Border4 = {
  198.     -1,-1,
  199.     0,0,JAM2,
  200.     5,
  201.     BorderVectors4,
  202.     NULL
  203. };
  204.  
  205. struct IntuiText IText4 = {
  206.     1,0,JAM2,
  207.     2,1,
  208.     NULL,
  209.     (UBYTE *)"NONE",
  210.     NULL
  211. };
  212.  
  213. struct Gadget Gadget7 = {
  214.     &Gadget8,
  215.     139,14,
  216.     34,9,
  217.     NULL,
  218.     RELVERIFY,
  219.     BOOLGADGET,
  220.     (APTR)&Border4,
  221.     NULL,
  222.     &IText4,
  223.     NULL,
  224.     NULL,
  225.     NULL,
  226.     NULL
  227. };
  228.  
  229. SHORT BorderVectors5[] = {
  230.     0,0,
  231.     35,0,
  232.     35,10,
  233.     0,10,
  234.     0,0
  235. };
  236. struct Border Border5 = {
  237.     -1,-1,
  238.     0,0,JAM2,
  239.     5,
  240.     BorderVectors5,
  241.     NULL
  242. };
  243.  
  244. struct IntuiText IText5 = {
  245.     1,0,JAM2,
  246.     2,1,
  247.     NULL,
  248.     (UBYTE *)"NONE",
  249.     NULL
  250. };
  251.  
  252. struct Gadget Gadget6 = {
  253.     &Gadget7,
  254.     97,14,
  255.     34,9,
  256.     NULL,
  257.     RELVERIFY,
  258.     BOOLGADGET,
  259.     (APTR)&Border5,
  260.     NULL,
  261.     &IText5,
  262.     NULL,
  263.     NULL,
  264.     NULL,
  265.     NULL
  266. };
  267.  
  268. SHORT BorderVectors6[] = {
  269.     0,0,
  270.     35,0,
  271.     35,10,
  272.     0,10,
  273.     0,0
  274. };
  275. struct Border Border6 = {
  276.     -1,-1,
  277.     0,0,JAM2,
  278.     5,
  279.     BorderVectors6,
  280.     NULL
  281. };
  282.  
  283. struct IntuiText IText6 = {
  284.     1,0,JAM2,
  285.     2,1,
  286.     NULL,
  287.     (UBYTE *)"NONE",
  288.     NULL
  289. };
  290.  
  291. struct Gadget Gadget5 = {
  292.     &Gadget6,
  293.     55,14,
  294.     34,9,
  295.     NULL,
  296.     RELVERIFY,
  297.     BOOLGADGET,
  298.     (APTR)&Border6,
  299.     NULL,
  300.     &IText6,
  301.     NULL,
  302.     NULL,
  303.     NULL,
  304.     NULL
  305. };
  306.  
  307. SHORT BorderVectors7[] = {
  308.     0,0,
  309.     37,0,
  310.     37,10,
  311.     0,10,
  312.     0,0
  313. };
  314. struct Border Border7 = {
  315.     -1,-1,
  316.     0,0,JAM2,
  317.     5,
  318.     BorderVectors7,
  319.     NULL
  320. };
  321.  
  322. struct IntuiText IText7 = {
  323.     1,0,JAM2,
  324.     2,1,
  325.     NULL,
  326.     (UBYTE *)"SORT",
  327.     NULL
  328. };
  329.  
  330. struct Gadget Gadget4 = {
  331.     &Gadget5,
  332.     349,14,
  333.     36,9,
  334.     NULL,
  335.     RELVERIFY,
  336.     BOOLGADGET,
  337.     (APTR)&Border7,
  338.     NULL,
  339.     &IText7,
  340.     NULL,
  341.     NULL,
  342.     NULL,
  343.     NULL
  344. };
  345.  
  346. SHORT BorderVectors8[] = {
  347.     0,0,
  348.     35,0,
  349.     35,10,
  350.     0,10,
  351.     0,0
  352. };
  353. struct Border Border8 = {
  354.     -1,-1,
  355.     0,0,JAM2,
  356.     5,
  357.     BorderVectors8,
  358.     NULL
  359. };
  360.  
  361. struct IntuiText IText8 = {
  362.     1,0,JAM2,
  363.     2,1,
  364.     NULL,
  365.     (UBYTE *)"NONE",
  366.     NULL
  367. };
  368.  
  369. struct Gadget Gadget3 = {
  370.     &Gadget4,
  371.     13,14,
  372.     34,9,
  373.     NULL,
  374.     RELVERIFY,
  375.     BOOLGADGET,
  376.     (APTR)&Border8,
  377.     NULL,
  378.     &IText8,
  379.     NULL,
  380.     NULL,
  381.     NULL,
  382.     NULL
  383. };
  384.  
  385. UBYTE Gadget2SIBuff[100] = "RAM:PD.LIST";
  386.  
  387. struct StringInfo Gadget2SInfo = {
  388.     Gadget2SIBuff,
  389.     NULL,
  390.     0,
  391.     100,
  392.     0,
  393.     0,0,0,0,0,
  394.     0,
  395.     0,
  396.     NULL
  397. };
  398. SHORT BorderVectors9[] = {
  399.     0,0,
  400.     371,0,
  401.     371,9,
  402.     0,9,
  403.     0,0
  404. };
  405. struct Border Border9 = {
  406.     -1,-1,
  407.     3,0,JAM1,
  408.     5,
  409.     BorderVectors9,
  410.     NULL
  411. };
  412.  
  413. struct IntuiText IText9 = {
  414.     1,0,JAM1,
  415.     145,1,
  416.     NULL,
  417.     (UBYTE *)"RAM:PD.LIST",
  418.     NULL
  419. };
  420.  
  421. struct Gadget Gadget2 = {
  422.     &Gadget3,
  423.     14,38,
  424.     370,8,
  425.     NULL,
  426.     RELVERIFY+STRINGCENTER,
  427.     STRGADGET,
  428.     (APTR)&Border9,
  429.     NULL,
  430.     &IText9,
  431.     NULL,
  432.     (APTR)&Gadget2SInfo,
  433.     NULL,
  434.     NULL
  435. };
  436. UBYTE Gadget99SIBuff[100] = "RAM:TPD.LIST";
  437.  
  438. struct StringInfo Gadget99SInfo = {
  439.     Gadget99SIBuff,
  440.     NULL,
  441.     0,
  442.     100,
  443.     0,
  444.     0,0,0,0,0,
  445.     0,
  446.     0,
  447.     NULL
  448. };
  449.  
  450. SHORT BorderVectors99[] = {
  451.     0,0,
  452.     371,0,
  453.     371,9,
  454.     0,9,
  455.     0,0
  456. };
  457. struct Border Border99 = {
  458.     -1,-1,
  459.     3,0,JAM1,
  460.     5,
  461.     BorderVectors99,
  462.     NULL
  463. };
  464.  
  465. struct IntuiText IText99 = {
  466.     1,0,JAM1,
  467.     145,1,
  468.     NULL,
  469.     (UBYTE *)"RAM:TPD.LIST",
  470.     NULL
  471. };
  472.  
  473. struct Gadget Gadget99 = {
  474.     &Gadget2,
  475.     14,59,
  476.     370,8,
  477.     NULL,
  478.     RELVERIFY+STRINGCENTER,
  479.     STRGADGET,
  480.     (APTR)&Border99,
  481.     NULL,
  482.     &IText99,
  483.     NULL,
  484.     (APTR)&Gadget99SInfo,
  485.     NULL,
  486.     NULL
  487. };
  488.  
  489. SHORT BorderVectors10[] = {
  490.     0,0,
  491.     35,0,
  492.     35,10,
  493.     0,10,
  494.     0,0
  495. };
  496. struct Border Border10 = {
  497.     -1,-1,
  498.     0,0,JAM2,
  499.     5,
  500.     BorderVectors10,
  501.     NULL
  502. };
  503.  
  504. struct IntuiText IText10 = {
  505.     1,0,JAM2,
  506.     2,1,
  507.     NULL,
  508.     (UBYTE *)"NONE",
  509.     NULL
  510. };
  511.  
  512. struct Gadget Gadget1 = {
  513.     &Gadget99,
  514.     307,14,
  515.     34,9,
  516.     NULL,
  517.     RELVERIFY,
  518.     BOOLGADGET,
  519.     (APTR)&Border10,
  520.     NULL,
  521.     &IText10,
  522.     NULL,
  523.     NULL,
  524.     NULL,
  525.     NULL
  526. };
  527.  
  528. #define GadgetList1 Gadget1
  529.  
  530. struct NewWindow MyWindow = {
  531.     115,68,
  532.     396,71,
  533.     0,1,
  534.     GADGETUP+CLOSEWINDOW,
  535.     WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+SIMPLE_REFRESH,
  536.     &Gadget1,
  537.     NULL,
  538.     (UBYTE *)"PD LIST MAKER ©1988 by C&P Software",
  539.     NULL,
  540.     NULL,
  541.     5,5,
  542.     640,200,
  543.     WBENCHSCREEN
  544. };
  545.  
  546. main()
  547. {
  548. int    disk_no;
  549. int    x, y;
  550.  
  551.     dr[0] = &buffer[0];  dr[1] = &buffer[10];
  552.     dr[2] = &buffer[20]; dr[3] = &buffer[30];
  553.     dr[4] = &buffer[40]; dr[5] = &buffer[50];
  554.     dr[6] = &buffer[60]; dr[7] = &buffer[70];
  555.      strcpy(dr[0],"\0"); strcpy(dr[1],"\0");
  556.     strcpy(dr[2],"\0"); strcpy(dr[3],"\0");
  557.     strcpy(dr[4],"\0"); strcpy(dr[5],"\0");
  558.     strcpy(dr[6],"\0"); strcpy(dr[7],"\0");
  559.     getdevs();
  560.     if(*dr[0])
  561.         strcpy(IText8.IText,dr[0]);
  562.     if(*dr[1])
  563.         strcpy(IText6.IText,dr[1]);
  564.     if(*dr[2])
  565.         strcpy(IText5.IText,dr[2]);
  566.     if(*dr[3])
  567.         strcpy(IText4.IText,dr[3]);
  568.     if(*dr[4])
  569.         strcpy(IText3.IText,dr[0]);
  570.     if(*dr[5])
  571.         strcpy(IText2.IText,dr[1]);
  572.     if(*dr[6])
  573.         strcpy(IText1.IText,dr[2]);
  574.     if(*dr[7])
  575.         strcpy(IText10.IText,dr[3]);
  576.     disk_no = setup();
  577.     if(!*dr[0])
  578.         OffGadget(&Gadget3,Wdw,0L);
  579.     if(!*dr[1])
  580.         OffGadget(&Gadget5,Wdw,0L);
  581.     if(!*dr[2])
  582.         OffGadget(&Gadget6,Wdw,0L);
  583.     if(!*dr[3])
  584.         OffGadget(&Gadget7,Wdw,0L);
  585.     if(!*dr[4])
  586.         OffGadget(&Gadget8,Wdw,0L);
  587.     if(!*dr[5])
  588.         OffGadget(&Gadget9,Wdw,0L);
  589.     if(!*dr[6])
  590.         OffGadget(&Gadget10,Wdw,0L);
  591.     if(!*dr[7])
  592.         OffGadget(&Gadget1,Wdw,0L);
  593.     disk_no = do_list(disk_no);
  594.     cleanup(disk_no);
  595. }
  596.  
  597. setup()
  598. {
  599. int    x;
  600. char    no[10];
  601.     x = 1;
  602.     rf = fopen("s:PD.cfg","r");
  603.     if(rf){
  604.         fgets(&Gadget2SIBuff[0],80,rf);
  605.         fgets(&Gadget99SIBuff[0],80,rf);
  606.         x = strlen(&Gadget2SIBuff[0]);
  607.         Gadget2SIBuff[x-1] = 0;
  608.         x = strlen(&Gadget99SIBuff[0]);
  609.         Gadget99SIBuff[x-1] = 0;
  610.         fgets(&no[0],80,rf);
  611.         x = atoi(&no[0]);
  612.         fclose(rf);
  613.     }
  614.     wf = fopen(&Gadget2SIBuff[0],"a");
  615.     if(!wf) exit(0);
  616.     IntuitionBase = (struct IntuitionBase *)
  617.         OpenLibrary("intuition.library",0);
  618.     GfxBase = (struct GfxBase *)
  619.         OpenLibrary("graphics.library",0);
  620.     Wdw = (struct Window *)OpenWindow(&MyWindow);
  621.     Move(Wdw->RPort,139,34); Text(Wdw->RPort,"Old PD List File",16);
  622.     Move(Wdw->RPort,139,55); Text(Wdw->RPort,"New PD List File",16);
  623.     return(x);
  624. }
  625.  
  626. do_list(no)
  627. int    no;
  628. {
  629. char    string[2][50];
  630. char    *temp = &string[1][0], *temp2 = &string[0][0];
  631. struct    Gadget    *gotit;
  632.  
  633.     while(!endit){
  634.         gotit = (struct Gadget *)0;
  635.         switch(ServiceMessages()){
  636.             case 1:                /* Read Drive 1    */
  637.                 sprintf(temp2,"Relabel %s \"PDDISK %d\"",dr[0],no);
  638.                 Execute(temp2,0L,0L);
  639.                 dodir(dr[0],no);
  640.                 no++;
  641.                 break;
  642.             case 2:                /* READ DRIVE 2    */
  643.                 sprintf(temp2,"Relabel %s \"PDDISK %d\"",dr[1],no);
  644.                 Execute(temp2,0L,0L);
  645.                 dodir(dr[1],no);
  646.                 no++;
  647.                 break;
  648.             case 3:                /* READ DRIVE 3    */
  649.                 sprintf(temp2,"Relabel %s \"PDDISK %d\"",dr[2],no);
  650.                 Execute(temp2,0L,0L);
  651.                 dodir(dr[2],no);
  652.                 no++;
  653.                 break;
  654.             case 4:                /* Read Drive 4    */
  655.                 sprintf(temp2,"Relabel %s \"PDDISK %d\"",dr[3],no);
  656.                 Execute(temp2,0L,0L);
  657.                 dodir(dr[3],no);
  658.                 no++;
  659.                 break;
  660.             case 5:                /* Read Drive 5    */
  661.                 sprintf(temp2,"Relabel %s \"PDDISK %d\"",dr[4],no);
  662.                 Execute(temp2,0L,0L);
  663.                 dodir(dr[4],no);
  664.                 no++;
  665.                 break;
  666.             case 6:                /* READ DRIVE 6    */
  667.                 sprintf(temp2,"Relabel %s \"PDDISK %d\"",dr[5],no);
  668.                 Execute(temp2,0L,0L);
  669.                 dodir(dr[5],no);
  670.                 no++;
  671.                 break;
  672.             case 7:                /* READ DRIVE 7    */
  673.                 sprintf(temp2,"Relabel %s \"PDDISK %d\"",dr[6],no);
  674.                 Execute(temp2,0L,0L);
  675.                 dodir(dr[6],no);
  676.                 no++;
  677.                 break;
  678.             case 8:                /* Read Drive 8    */
  679.                 sprintf(temp2,"Relabel %s \"PDDISK %d\"",dr[7],no);
  680.                 Execute(temp2,0L,0L);
  681.                 dodir(dr[7],no);
  682.                 no++;
  683.                 break;
  684.             case 9:                /* Sort/Save List */
  685.                 SetWindowTitles(Wdw,"Sorting Database...",-1);
  686.                 fflush(wf);
  687.                 fclose(wf);
  688.                 wf = 0;
  689.                 sort(&Gadget2SIBuff[0],&Gadget99SIBuff[0]);
  690.                 SetWindowTitles(Wdw,tit,-1);
  691.                 break;
  692.             case 10:            /* New File name */
  693.                 break;
  694.             case 11:
  695.                 break;
  696.             default:
  697.                 ;
  698.         }
  699.     }
  700.     return(no);
  701. }
  702.  
  703. ServiceMessages()
  704. {
  705. struct IntuiMessage *message;
  706. APTR    Address;
  707.  
  708.     Wait(1<<Wdw->UserPort->mp_SigBit);
  709.     while(message = (struct IntuiMessage *)GetMsg(Wdw -> UserPort)){
  710.         if(message->Class == CLOSEWINDOW){
  711.             endit = 1; ReplyMsg(message);
  712.             return(0);
  713.         }
  714.         else if(message->Class == GADGETUP){
  715.             Address = message->IAddress;
  716.             ReplyMsg(message);
  717.             if(Address == &Gadget3) return(1);    /* DISK0: */
  718.             else if(Address == &Gadget5) return(2);    /* DISK1: */
  719.             else if(Address == &Gadget6) return(3);    /* DISK2: */
  720.             else if(Address == &Gadget7) return(4);    /* DISK3: */
  721.             else if(Address == &Gadget8) return(5);    /* DISK4: */
  722.             else if(Address == &Gadget9) return(6);    /* DISK5: */
  723.             else if(Address == &Gadget10) return(7);/* DISK6: */
  724.             else if(Address == &Gadget1) return(8); /* DISK7: */
  725.             else if(Address == &Gadget4) return(9); /* SORT   */
  726.             else if(Address == &Gadget2) return(10);/* STRING */
  727.             else if(Address == &Gadget99) return(11);/* STRING2 */
  728.         }
  729.         ReplyMsg(message);
  730.     }
  731.     return(99);
  732. }
  733.  
  734. dodir(drive,no)
  735. char    *drive;
  736. int    no;
  737. {
  738. struct    FileLock *lock, *Lock();
  739. struct    FileInfoBlock *f_info;
  740.  
  741.     if((lock=(struct FileLock *)
  742.         AllocMem(sizeof(struct FileLock),MEMF_CHIP|MEMF_CLEAR)) == 0)
  743.         return();
  744.  
  745.     if((f_info=(struct FileInfoBlock *)
  746.         AllocMem(sizeof(struct FileInfoBlock),MEMF_CHIP|MEMF_CLEAR)) == 0)
  747.         return();
  748.  
  749.     if((lock=Lock(drive,ACCESS_READ))==0)
  750.         return();
  751.  
  752.     if((Examine(lock,f_info))==0)
  753.         return();
  754.  
  755.     while((ExNext(lock,f_info)) != 0)
  756.         spill_the_beans(f_info,no);
  757.  
  758.     UnLock(lock);
  759. }
  760.  
  761. spill_the_beans(info,dno)
  762. struct    FileInfoBlock *info;
  763. int    dno;
  764. {
  765. char    line[80], temp2[25], temp1[15];
  766.  
  767.     protect(&temp1[0],info->fib_Protection);
  768.     dates(&temp2[0],&info->fib_Date);
  769.     if(info->fib_DirEntryType < 0)
  770.         sprintf(&line[0],\
  771.             "%-24s %7d %8s %18s  PDDISK %d\n",\
  772.             info->fib_FileName,info->fib_Size,&temp1[0],&temp2[0],dno);
  773.     else
  774.         sprintf(&line[0],\
  775.             "%-24s %7s %8s %18s  PDDISK %d\n",\
  776.             info->fib_FileName,"<Dir>",&temp1[0],&temp2[0],dno);
  777.     fputs(&line[0],wf);
  778. }
  779.  
  780. dates(s,dss)
  781. char    *s;
  782. struct DateStamp *dss;
  783. {
  784. LONG    year,month,day,hours,minutes,secs,tempo;
  785. static char dpm[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
  786. static char *mo[12] = {
  787.         "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
  788.         "Aug", "Sep", "Oct", "Nov", "Dec"
  789. };
  790.     year = 1978;
  791.     day = dss->ds_Days;
  792.     while (day >= 366) {
  793.         if ((year-1976) % 4 == 0) {
  794.             day -= 366;
  795.             year++;
  796.         }
  797.         else{
  798.             if ((year-1976) % 4 != 0 && day >= 365) {
  799.                 day -= 365;
  800.                 year++;
  801.             }
  802.         }
  803.     }
  804.     if ((year-1976) % 4 == 0) {
  805.         day = day % 366;
  806.         dpm[2] = 29;
  807.         }
  808.     else {
  809.         day = day % 365;
  810.         dpm[2] = 28;
  811.         }
  812.     for (month = 0; day > dpm[month]; month++)
  813.         day -= dpm[month];
  814.     minutes = dss->ds_Minute; hours = 0;
  815.     while(minutes > 59){
  816.         hours++; minutes = minutes - 60L;
  817.     }
  818.     tempo = dss->ds_Tick; secs = 0;
  819.     while(tempo > 49){
  820.         secs++; tempo = tempo - 50L;
  821.     }
  822.     sprintf(s,"%02d-%03s-%02d %02d:%02d:%02d\0",
  823.         day,mo[month],year-1900,hours,minutes,secs);
  824. }
  825.  
  826. protect(s,prot)
  827. char    *s;
  828. LONG    prot;
  829. {
  830.     strcpy(s,"--------");
  831.  
  832.     if(!(prot & 0x00000001))
  833.         *(s+7) = 'd';
  834.     if(!(prot & 0x00000002))
  835.         *(s+6) = 'e';
  836.     if(!(prot & 0x00000004))
  837.         *(s+5) = 'w';
  838.     if(!(prot & 0x00000008))
  839.         *(s+4) = 'r';
  840.  
  841.     if(prot & 0x00000010)
  842.         *(s+3) = 'a';
  843.     if(prot & 0x00000020)
  844.         *(s+2) = 'p';
  845.     if(prot & 0x00000040)
  846.         *(s+1) = 's';
  847.     if(prot & 0x00000080)
  848.         *s = 'h';
  849. }
  850.  
  851. getdevs()
  852. {
  853. int    x;
  854. char    *devicename;
  855. ULONG    type;
  856. char    buff[80], *name;
  857. char    tmp[10];
  858. struct  DosList      *DevInfo;
  859. struct  DosLibrary   *dosLibrary;
  860. struct  RootNode     *RootNode;
  861. struct  DosInfo      *dosInfo;
  862. struct  FileSysStartupMsg *startup;
  863.  
  864.     x = 1;
  865.     name = &buff[0];
  866.     dosLibrary = (struct DosLibrary *)DOSBase;
  867.     RootNode = (struct RootNode *)dosLibrary->dl_Root;
  868.     dosInfo = (struct DosInfo *)BADDR(RootNode->rn_Info);
  869.     DevInfo = (struct DosList *)BADDR(dosInfo->di_DevInfo);
  870.     Forbid();
  871.     while(DevInfo != NULL){ 
  872.         if(DevInfo->dol_misc.dol_handler.dol_Startup > 2) {
  873.             startup=(struct FileSysStartupMsg *)
  874.                BADDR(DevInfo->dol_misc.dol_handler.dol_Startup);
  875.             devicename  = (char *)BADDR(startup->fssm_Device)+1;
  876.             type = DevInfo->dol_Type;
  877.             if((type == DLT_DEVICE) && (!strcmp(devicename,"trackdisk.device"))){
  878.                 name = (char *)BADDR(DevInfo->dol_Name)+1;
  879.                        strcpy(dr[x-1],name);
  880.                        strcat(dr[x-1],":");
  881.                        x = x + 1;
  882.             }
  883.         }
  884.         if(x > 8) break;
  885.             DevInfo = (struct DosList *)BADDR(DevInfo->dol_Next);
  886.     }
  887.     Permit();
  888.     strcpy(&tmp[0],dr[0]); strcpy(dr[0],dr[7]); strcpy(dr[7],&tmp[0]);
  889.     strcpy(&tmp[0],dr[1]); strcpy(dr[1],dr[6]); strcpy(dr[6],&tmp[0]);
  890.     strcpy(&tmp[0],dr[2]); strcpy(dr[2],dr[5]); strcpy(dr[5],&tmp[0]);
  891.     strcpy(&tmp[0],dr[3]); strcpy(dr[3],dr[4]); strcpy(dr[4],&tmp[0]);
  892.     while(!(*dr[0])){
  893.         strcpy(dr[0],dr[1]); strcpy(dr[1],dr[2]); strcpy(dr[2],dr[3]); 
  894.         strcpy(dr[3],dr[4]); strcpy(dr[4],dr[5]); strcpy(dr[5],dr[6]); 
  895.         strcpy(dr[6],dr[7]); strcpy(dr[7],"\0");
  896.     }
  897. }
  898.  
  899. errors(er)
  900. char    *er;
  901. {
  902.     SetWindowTitles(Wdw,er,-1);
  903.     Delay(100);
  904.     SetWindowTitles(Wdw,tit,-1);
  905. }
  906.  
  907. cleanup(disk)
  908. int    disk;
  909. {
  910.     if(wf){
  911.         fflush(wf);
  912.         fclose(wf);
  913.     }    
  914.     wf = fopen("s:PD.cfg","w");
  915.     if(wf){
  916.         fprintf(wf,"%s\n%s\n%d\n",&Gadget2SIBuff[0],&Gadget99SIBuff[0],disk);
  917.         fclose(wf);
  918.     }
  919.     CloseWindow(Wdw);
  920.     CloseLibrary(IntuitionBase);
  921.     CloseLibrary(GfxBase);
  922. }
  923. /**************************************************************************
  924.  *
  925.  *            QSORT of the file
  926.  *
  927.  **************************************************************************/
  928.  
  929. #define    MAXLINES    10000
  930. #define LINESIZE    80
  931.  
  932. char    temp[81], *lines[MAXLINES], *malloc();
  933. int    i, numlines;
  934.  
  935. sort(in,out)
  936. char    *in, *out;
  937. {
  938.     openfiles(in,out);
  939.     tsort();
  940.     write();
  941.     closefiles();
  942. }
  943.  
  944. openfiles(i,o)
  945. char    *i, *o;
  946. {
  947.     rf = fopen(i,"r");
  948.     wf = fopen(o,"w");
  949. }
  950.  
  951. tsort()
  952. {
  953.     for(numlines=0;numlines<MAXLINES;numlines++){
  954.         if(fgets(&temp[0],80,rf) == NULL) break;
  955.         lines[numlines] = (char *)malloc(LINESIZE);
  956.         strcpy(lines[numlines],&temp[0]);
  957.     }
  958.     qs_string(&lines,0,numlines);
  959.     for(i=0;i<=numlines;i++){
  960.         fputs(lines[i],wf);
  961.         free(lines[i]);
  962.     }
  963. }
  964.  
  965. qs_string(item,left,right)
  966. char    *item[];
  967. int    left,right;
  968. {
  969. register int    i, j;
  970. char    *x, *y;
  971.     i = left; j = right;
  972.     x = item[(left+right)/2];
  973.  
  974.     do{
  975.         while(strcmp(item[i],x)<0 && i<right) i++;
  976.         while(strcmp(item[j],x)>0 && j>left) j--;
  977.         if(i<=j){
  978.             y = item[i];
  979.             item[i] = item[j];
  980.             item[j] = y;
  981.             i++; j--;
  982.         }
  983.     }while(i<=j);
  984.  
  985.     if(left<j) qs_string(item,left,j);
  986.     if(i<right) qs_string(item,i,right);
  987. }
  988.  
  989. closefiles()
  990. {
  991.     fclose(rf);
  992.     fclose(wf);
  993. }
  994.