home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / fm2000 / fm.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-02-04  |  16.8 KB  |  611 lines

  1. /*
  2.      Filemaster - Multitasking directory utility.
  3.      Copyright (C) 2000  Toni Wilen
  4.      
  5.      This program is free software; you can redistribute it and/or
  6.      modify it under the terms of the GNU General Public License
  7.      as published by the Free Software Foundation; either version 2
  8.      of the License, or (at your option) any later version.
  9.      
  10.      This program is distributed in the hope that it will be useful,
  11.      but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.      GNU General Public License for more details.
  14.      
  15.      You should have received a copy of the GNU General Public License
  16.      along with this program; if not, write to the Free Software
  17.      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. */
  19.  
  20. /* #define DETACH */
  21.  
  22. #include <proto/all.h>
  23. #include <exec/types.h>
  24. #include <exec/execbase.h>
  25. #include <exec/memory.h>
  26. #include <intuition/intuition.h>
  27. #include <libraries/locale.h>
  28. #include <workbench/workbench.h>
  29. #include <workbench/startup.h>
  30. #include <stdio.h>
  31. #include <strings.h>
  32. #include <graphics/gfxbase.h>
  33. #include <libraries/xfdmaster.h>
  34. #include <datatypes/datatypes.h>
  35. #include "fmnode.h"
  36. #include "child.h"
  37. #include "fmlocale.h"
  38. #include "fmdos.h"
  39.  
  40. void gquit(void);
  41. void gsleep(void);
  42. void gstod(void);
  43. void gconfig(void);
  44. void parse(void);
  45.  
  46. void gdrives(void);
  47. void gparent(void);
  48. void ginvert(void);
  49. void gclear(void);
  50. void operate(void);
  51. void copyfiles(void);
  52. void movefiles(void);
  53. void deletefiles(void);
  54. void createdir(void);
  55. void showtextfile(void);
  56. void showpic(void);
  57. void playmod(void);
  58. void diskinfo(void);
  59. void execute(void);
  60. void disksize(void);
  61. void modinfo(void);
  62. void playsamplefile(void);
  63. void fileedit(void);
  64. void diskedit(void);
  65. void about(void);
  66. /*void registering(void);*/
  67.  
  68. UBYTE doslib[]={"dos.library"};
  69. UBYTE gfxlib[]={"graphics.library"};
  70. UBYTE intlib[]={"intuition.library"};
  71. UBYTE wblib[]={"workbench.library"};
  72. UBYTE gadlib[]={"gadtools.library"};
  73. UBYTE utilib[]={"utility.library"};
  74. UBYTE keylib[]={"keymap.library"};
  75. UBYTE loclib[]={"locale.library"};
  76. UBYTE dflib[]={"diskfont.library"};
  77. UBYTE icolib[]={"icon.library"};
  78. UBYTE verlib[]={"version.library"};
  79. UBYTE reqlib[]={"reqtools.library"};
  80. UBYTE xfdlib[]={"xfdmaster.library"};
  81. UBYTE datlib[]={"datatypes.library"};
  82. UBYTE comlib[]={"commodities.library"};
  83. UBYTE bguilib[]={"bgui.library"};
  84.  
  85. UBYTE auddev[]={"audio.device"};
  86. UBYTE workbench[]={"Workbench"};
  87.  
  88. UBYTE topaz[]={"topaz.font"};
  89.  
  90. void *launchtable[BUILDCOMMANDS+1];
  91.  
  92. void readconfig(void);
  93. void main(void);
  94. void fmclock(void);
  95. static WORD init(void);
  96.  
  97. WORD deloldexe(WORD);
  98. void initexes(WORD);
  99.  
  100. void initpathlist(void);
  101. void freepathlist(void);
  102.  
  103. void event(WORD);
  104. WORD avaanaytto(WORD);
  105. WORD suljenaytto(WORD);
  106. void teeruutu(void);
  107. void clearlisti(struct List*);
  108. void drives(struct FMList*);
  109. void getdir(void);
  110. void stopoldmod(void);
  111. ULONG power2(WORD);
  112. WORD errorreq(WORD,UBYTE*,WORD,WORD);
  113. void recalc(void);
  114.  
  115. UBYTE defcolors[8*3]={
  116.     0xaa,0xaa,0xaa,
  117.     0x00,0x00,0x00,
  118.     0xff,0xff,0xff,
  119.     0x66,0x88,0xbb,
  120.     0xff,0x00,0x00,
  121.     0x00,0xff,0x00,
  122.     0x00,0x00,0xff,
  123.     0xff,0xff,0x00
  124. };
  125.  
  126. extern UBYTE fmname[];
  127. extern UBYTE clockformatstring[];
  128. UBYTE space[]=
  129.  { "                                                                                                                                                                                                   " };
  130. UBYTE nformatstring[20];
  131. UBYTE nformatstring2[20];
  132. struct FMMain fmmain;
  133. struct FMConfig *fmconfig;
  134. struct FMList fmlist[LISTS];
  135.  
  136. struct GfxBase *GfxBase;
  137. struct IntuitionBase *IntuitionBase;
  138. struct Library *LocaleBase;
  139. #ifdef DETACH
  140. struct ExecBase *SysBase;
  141. struct DosLibrary *DOSBase;
  142. #else
  143. extern struct ExecBase *SysBase;
  144. extern struct DosLibrary *DOSBase;
  145. #endif
  146. struct Library *UtilityBase;
  147. struct Library *GadToolsBase;
  148. struct Library *DiskfontBase;
  149. struct Library *KeymapBase;
  150. struct Library *WorkbenchBase;
  151. struct Library *IconBase;
  152. struct Library *TimerBase;
  153. struct Library *DataTypesBase;
  154. struct Library *CxBase;
  155. struct Locale *locale;
  156. struct Catalog *catalog;
  157. struct xfdMasterBase *xfdMasterBase;
  158. struct Library *BGUIBase;
  159.  
  160. void __saveds main(void)
  161. {
  162. WORD aa;
  163. BPTR prevlock;
  164. BPTR handle;
  165. UBYTE *errptr=0;
  166. UBYTE *ptr1;
  167. UBYTE prgname[200];
  168. UBYTE prgname2[100];
  169. struct timerequest tr;
  170. WORD sleep=0;
  171.  
  172. #ifdef DETACH
  173. SysBase=(*((struct ExecBase**)4));
  174. DOSBase=(struct DosLibrary*)OpenLibrary(doslib,0);
  175. #endif
  176.  
  177. GetProgramName(prgname,200);
  178. SetProgramName("FM Main");
  179. fmmain.kick=SysBase->LibNode.lib_Version;
  180. fmmain.myproc=(struct Process*)FindTask(0);
  181. //if(SetTaskPri((struct Task*)fmmain.myproc,5)==4) sleep=1;
  182. #ifndef V39
  183. GfxBase=(struct GfxBase*)OpenLibrary(gfxlib,37);
  184. IntuitionBase=(struct IntuitionBase*)OpenLibrary(intlib,37);
  185. CxBase=OpenLibrary(comlib,37);
  186. UtilityBase=OpenLibrary(utilib,37);
  187. GadToolsBase=OpenLibrary(gadlib,37);
  188. KeymapBase=OpenLibrary(keylib,0);
  189. WorkbenchBase=OpenLibrary(wblib,37);
  190. LocaleBase=OpenLibrary(loclib,38);
  191. if(LocaleBase) locale=OpenLocale(0);
  192. BGUIBase=OpenLibrary(bguilib,41);
  193. #else
  194. GfxBase=(struct GfxBase*)OpenLibrary(gfxlib,39);
  195. IntuitionBase=(struct IntuitionBase*)OpenLibrary(intlib,39);
  196. CxBase=OpenLibrary(comlib,37);
  197. UtilityBase=OpenLibrary(utilib,39);
  198. GadToolsBase=OpenLibrary(gadlib,39);
  199. KeymapBase=OpenLibrary(keylib,0);
  200. WorkbenchBase=OpenLibrary(wblib,37);
  201. if ((LocaleBase=OpenLibrary(loclib,38))) {
  202.     if (!(locale=OpenLocale(0))) {
  203.         errptr="Couldn't open current default locale";
  204.         goto error2;
  205.     }
  206. }
  207. DataTypesBase=OpenLibrary(datlib,39);
  208. BGUIBase=OpenLibrary(bguilib,41);
  209. #endif
  210. fmconfig=allocvec(0,sizeof(struct FMConfig),MEMF_CLEAR|MEMF_PUBLIC);
  211. if(!fmconfig) goto error2;
  212. memseti(&tr,0,sizeof(struct timerequest));
  213. if(OpenDevice("timer.device",UNIT_MICROHZ,(struct IORequest*)&tr,0L)) goto error2;
  214. TimerBase=(struct Library*)tr.tr_node.io_Device;
  215. if(!GfxBase||!IntuitionBase||!UtilityBase||!GadToolsBase||!KeymapBase||!WorkbenchBase) goto error2;
  216.  
  217. if(!BGUIBase) {
  218.     errorreq(MSG_MAIN_WARNING,"No bgui.library v41 or better found",0,MSG_OK);
  219.     goto error2;
  220. }
  221.  
  222. if(FindPort(FMPORTNAME)) {
  223.     if (!errorreq(MSG_MAIN_AREYOUSURE,getstring(MSG_MAIN_FMALREADY),MSG_YES,MSG_NO)) goto error2;
  224. }
  225.  
  226. IconBase=OpenLibrary(icolib,37);
  227. if(IconBase) { 
  228.     strcpy(prgname2,"PROGDIR:");
  229.     strcpy(prgname2+8,FilePart(prgname));
  230.     fmmain.dobj=GetDiskObjectNew(prgname2);
  231. }
  232.  
  233. xfdMasterBase=(struct xfdMasterBase*)OpenLibrary(xfdlib,36);
  234. if(!init()) goto error4;
  235.  
  236. fmmain.fmport=allocvec(0,sizeof(struct FMPort)+32,MEMF_CLEAR|MEMF_PUBLIC);
  237. ptr1=(UBYTE*)(fmmain.fmport+1);
  238. if(!fmmain.fmport) goto error4;
  239. fmmain.fmport->msgport.mp_Node.ln_Type=NT_MSGPORT;
  240. fmmain.fmport->msgport.mp_Node.ln_Pri=5;
  241. fmmain.fmport->msgport.mp_Node.ln_Name=ptr1;
  242. strcpy(ptr1,FMPORTNAME);
  243. fmmain.fmport->msgport.mp_Flags=PA_IGNORE;
  244. fmmain.fmport->msgport.mp_SigTask=fmmain.myproc;
  245. fmmain.fmport->fmmain=&fmmain;
  246. fmmain.fmport->fmconfig=fmconfig;
  247. AddPort(&fmmain.fmport->msgport);
  248.  
  249. if(!sleep) {
  250.     if(!avaanaytto(3)) goto error5;
  251.     if(!fmmain.regname[0]) launch((APTR)&about,getconfignumber(ABOUTCONFIG),0,MSUBPROC);
  252. }
  253. fmconfig->flags|=MSUBPROC|MHSCROLL|MVSCROLL;
  254. fmmain.clock=1;
  255. if(!launch((APTR)&fmclock,0,1,MSUBPROC)) goto error5;
  256. fmmain.clock=-1;
  257. for(;;) {
  258.     event(sleep);
  259.     sleep=0;
  260.     if (suljenaytto(3)) break;
  261. }
  262. error5:
  263. fmmain.kill=1;
  264. if(fmmain.clock<0) {
  265.     fmmain.clock=0;
  266.     while(!fmmain.clock) WaitTOF();
  267. }
  268. stopoldmod();
  269. error4:
  270. if (fmmain.oldcur!=1) {
  271.     prevlock=CurrentDir(fmmain.oldcur);
  272.     if (prevlock) UnLock(prevlock);
  273. }
  274. deloldexe(1);
  275. for(aa=0;aa<LISTS;aa++) clearlist(&fmlist[aa]);
  276. clearlisti((struct List*)&fmmain.dlist);
  277. freepathlist();
  278. if(fmmain.pool) DeletePool(fmmain.pool);
  279. if(fmmain.fmport) {
  280.     RemPort(&fmmain.fmport->msgport);
  281.     freemem(fmmain.fmport);
  282. }
  283. if(fmmain.dobj) FreeDiskObject(fmmain.dobj);
  284. error2:
  285. if(fmconfig) {
  286.     for(aa=0;aa<TOTALCOMMANDS;aa++) freemem(fmconfig->cmenuconfig[aa].moreconfig);
  287.     freemem(fmconfig);
  288. }
  289. CloseLibrary((struct Library*)xfdMasterBase);
  290. if(DataTypesBase) CloseLibrary(DataTypesBase);
  291. if (LocaleBase) {
  292.     CloseLocale(locale);
  293.     CloseCatalog(catalog);
  294.     CloseLibrary(LocaleBase);
  295. }
  296. if(TimerBase) CloseDevice((struct IORequest*)&tr);
  297. CloseLibrary(CxBase);
  298. CloseLibrary(UtilityBase);
  299. CloseLibrary(GadToolsBase);
  300. CloseLibrary((struct Library*)GfxBase);
  301. CloseLibrary((struct Library*)IntuitionBase);
  302. CloseLibrary(KeymapBase);
  303. CloseLibrary(WorkbenchBase);
  304. CloseLibrary(IconBase);
  305. CloseLibrary(DiskfontBase);
  306. CloseLibrary(BGUIBase);
  307. error3:
  308. if (errptr) {
  309.     if (handle=Open("CON:20/100/600/50/Fatal error",1005)) {
  310.         Write(handle,"\n ",2);
  311.         Write(handle,errptr,strlen(errptr));
  312.         Write(handle,"\n",1);
  313.         Delay(200);
  314.         Close(handle);
  315.     }
  316. }
  317. fmmain.myproc->pr_WindowPtr=fmmain.oldwinptr;
  318. #ifdef DETACH
  319. CloseLibrary((struct Library*)DOSBase);
  320. #endif
  321. }
  322.  
  323. void __asm formathook(void);
  324.  
  325. static WORD init(void)
  326. {
  327. APTR winptr;
  328. WORD aa;
  329. UBYTE *ptr1,*ptr3;
  330. struct Screen *wbscr;
  331. UBYTE teststring1[34];
  332. WORD apu1;
  333. WORD height,width;
  334. ULONG screenmode;
  335. UWORD apu2;
  336. struct DateStamp ds;
  337. struct CMenuConfig *cmc;
  338. #ifdef V39
  339. ULONG ctable[3];
  340. #else
  341. LONG apu3;
  342. #endif
  343.  
  344. memseti(launchtable,0,sizeof(launchtable));
  345. launchtable[QUITCONFIG]=(void*)gquit;
  346. launchtable[SLEEPCONFIG]=(void*)gsleep;
  347. launchtable[STODCONFIG]=(void*)gstod;
  348. launchtable[CONFIGCONFIG]=(void*)&gconfig;
  349. launchtable[EXCLUDECONFIG]=(void*)parse;
  350. launchtable[INCLUDECONFIG]=(void*)parse;
  351. launchtable[PARSECONFIG]=(void*)parse;
  352. launchtable[DRIVESCONFIG]=(void*)gdrives;
  353. launchtable[PARENTCONFIG]=(void*)gparent;
  354. launchtable[INVERTCONFIG]=(void*)ginvert;
  355. launchtable[CLEARCONFIG]=(void*)gclear;
  356. launchtable[OPERATECONFIG]=(void*)operate;
  357. launchtable[COPYCONFIG]=(void*)copyfiles;
  358. launchtable[COPYASCONFIG]=(void*)copyfiles;
  359. launchtable[MOVECONFIG]=(void*)movefiles;
  360. launchtable[DELETECONFIG]=(void*)deletefiles;
  361. launchtable[MAKEDIRCONFIG]=(void*)createdir;
  362. launchtable[SHOWASCCONFIG]=(void*)showtextfile;
  363. launchtable[SHOWHEXCONFIG]=(void*)showtextfile;
  364. launchtable[SHOWPICCONFIG]=(void*)showpic;
  365. launchtable[PLAYMODCONFIG]=(void*)playmod;
  366. launchtable[DISKINFOCONFIG]=(void*)diskinfo;
  367. launchtable[EXECUTECONFIG]=(void*)execute;
  368. launchtable[DISKSIZECONFIG]=(void*)disksize;
  369. launchtable[MODINFOCONFIG]=(void*)modinfo;
  370. launchtable[HEARCONFIG]=(void*)playsamplefile;
  371. launchtable[FILEEDITCONFIG]=(void*)fileedit;
  372. launchtable[DISKEDITCONFIG]=(void*)diskedit;
  373. launchtable[ABOUTCONFIG]=(void*)about;
  374. launchtable[REGISTERCONFIG]=0; /*(void*)registering;*/
  375. launchtable[EMPTYCONFIG]=0;
  376.  
  377. DateStamp(&ds);
  378. for(aa=0;aa<LISTS;aa++) {
  379.     NewList((struct List*)&fmlist[aa]);
  380.     fmlist[aa].listnumber=aa;
  381. }
  382. NewList((struct List*)&fmmain.dlist);
  383. InitSemaphore(&fmmain.gfxsema);
  384. InitSemaphore(&fmmain.msgsema);
  385. InitSemaphore(&fmmain.poolsema);
  386.  
  387. fmmain.version=fmname[4];fmmain.revision=fmname[5];
  388. fmmain.betaversion=fmname[6];fmmain.betarevision=fmname[7];
  389.  
  390. fmmain.sourcedir=&fmlist[0];
  391. fmmain.destdir=&fmlist[1];
  392. fmmain.oldcur=1;
  393.  
  394. CopyMem(defcolors,fmconfig->colors,8*3);
  395. fmconfig->mainscreen.depth=2;
  396. fmconfig->mainscreen.overscan=1;
  397. if(wbscr=LockPubScreen(workbench)) {
  398.     screenmode=GetVPModeID(&wbscr->ViewPort);
  399.     if(screenmode==INVALID_ID) screenmode=0;
  400.     height=wbscr->Height;
  401.     width=wbscr->Width;
  402.     fmconfig->mainscreen.depth=wbscr->BitMap.Depth>4?4:wbscr->BitMap.Depth;
  403.     if(wbscr->Flags&AUTOSCROLL) fmconfig->mainscreen.autoscroll=1;
  404.     apu2=0;
  405.     for(apu1=0;apu1<power2(fmconfig->mainscreen.depth);apu1++) {
  406. #ifdef V39
  407.         GetRGB32(wbscr->ViewPort.ColorMap,apu1,1,ctable);
  408.         fmconfig->colors[apu2++]=ctable[0]>>24;
  409.         fmconfig->colors[apu2++]=ctable[1]>>24;
  410.         fmconfig->colors[apu2++]=ctable[2]>>24;
  411. #else
  412.         apu3=GetRGB4(wbscr->ViewPort.ColorMap,apu1);
  413.         fmconfig->colors[apu2++]=(apu3>>4)&0xf0;
  414.         fmconfig->colors[apu2++]=(apu3)&0xf0;
  415.         fmconfig->colors[apu2++]=(apu3<<4)&0xf0;
  416. #endif
  417.     }
  418.     UnlockPubScreen(0,wbscr);
  419. } else {
  420.     width=640;
  421.     height=256;
  422.     screenmode=HIRES_KEY|PAL_MONITOR_ID;
  423.     if((fmmain.kick<39&&GfxBase->DisplayFlags&NTSC)||(fmmain.kick>=39&&!(GfxBase->DisplayFlags&REALLY_PAL))) {
  424.         height=200;
  425.         screenmode=HIRES_KEY|NTSC_MONITOR_ID;
  426.     }
  427. }
  428. fmconfig->mainscreen.height=height;
  429. fmconfig->mainscreen.width=width;
  430. fmconfig->mainscreen.screenmode=screenmode;
  431. fmconfig->windowwidth=width;
  432. fmconfig->windowheight=height;
  433. fmconfig->textscreen.height=height;
  434. fmconfig->textscreen.width=width;
  435. fmconfig->textscreen.screenmode=screenmode;
  436. fmconfig->textscreen.depth=2;
  437. strcpy(fmconfig->listfontname,topaz);
  438. fmconfig->listfontattr.ta_YSize=8;
  439. strcpy(fmconfig->txtfontname,topaz);
  440. fmconfig->txtfontattr.ta_YSize=8;
  441. strcpy(fmconfig->txtshowfontname,topaz);
  442. fmconfig->txtshowfontattr.ta_YSize=8;
  443. strcpy(fmconfig->reqfontname,topaz);
  444. fmconfig->reqfontattr.ta_YSize=8;
  445. strcpy(fmconfig->smallfontname,"topaz.font");
  446. fmconfig->smallfontattr.ta_YSize=5;
  447. fmmain.tattr.ta_Name=topaz;
  448. fmmain.tattr.ta_YSize=8;
  449.  
  450. fmmain.filelen=30;
  451. fmmain.commlen=80;
  452.  
  453. fmconfig->spaceh=3;
  454. fmconfig->sliderh=7;
  455. fmconfig->dirpen=2;
  456. fmconfig->devicepen=1;
  457. fmconfig->filepen=1;
  458. fmconfig->txtpen=1;
  459. fmconfig->hilipen=3;
  460. fmconfig->backpen=0;
  461. fmconfig->blackpen=1;
  462. fmconfig->whitepen=2;
  463. fmconfig->backfillpen=0;
  464. fmconfig->mainbackfillpen=3;
  465. fmconfig->sourcepen=3;
  466. fmconfig->destpen=6;
  467. fmconfig->sliderpen=3;
  468. fmconfig->stringpen=1;
  469. fmconfig->screentype=1;
  470. fmconfig->mainpriority=2;
  471. fmconfig->subpriority=-1;
  472. fmconfig->pri[0]=-1;
  473. fmconfig->pri[1]=0;
  474. fmconfig->pri[2]=1;
  475. fmconfig->dosbuffersize=10000;
  476. fmconfig->doubleclick=25;
  477. strcpy(fmconfig->pubscreen,"Workbench");
  478.  
  479. fmconfig->useexecutedt=1;
  480. fmconfig->usesampledt=1;
  481.  
  482. fmconfig->listinfo[0][0]=100;
  483. fmconfig->listinfo[0][1]=100;
  484.  
  485. fmconfig->listinfo[1][0]=100;
  486. fmconfig->listinfo[1][1]=100|0x80;
  487.  
  488. fmconfig->cmenuposition=1;
  489. fmconfig->cmenucolumns=1;
  490.  
  491. ptr1=fmmain.cmenuptr=getstring(MSG_MAIN_CMENUTXT);
  492. ptr3=getstring(MSG_MAIN_CMENUKEYS);
  493. for(apu2=0;apu2<TOTALCOMMANDS;apu2++) {
  494.     cmc=&fmconfig->cmenuconfig[apu2];
  495.     cmc->position=0xff;
  496.     cmc->frontpen=fmconfig->txtpen;
  497.     cmc->backpen=fmconfig->backpen;
  498.     cmc->priority=1;
  499. }
  500. cmc=&fmconfig->cmenuconfig[0];
  501. for(apu2=0;apu2<BUILDCOMMANDS;apu2++) {
  502.     if(apu2<7) cmc->position=2; else cmc->position=1;
  503.     cmc->cmenucount=apu2+1;
  504.     strcpy(cmc->label,ptr1);
  505.     strcpy(cmc->shortcut,ptr3);
  506.     ptr3+=strlen(ptr3)+1;
  507.     cmc++;
  508.     ptr1+=strlen(ptr1)+1;
  509. }
  510. initexes(BUILDCOMMANDS);
  511.  
  512. winptr=fmmain.myproc->pr_WindowPtr;
  513. fmmain.myproc->pr_WindowPtr=(APTR)-1;
  514. if(LocaleBase) catalog=OpenCatalog(0,"FileMaster.catalog",OC_BuiltInLanguage,"english",TAG_DONE);
  515. readconfig();
  516.  
  517. fmmain.myproc->pr_WindowPtr=winptr;
  518. fmconfig->txtfontattr.ta_Name=fmconfig->txtfontname;
  519. fmconfig->listfontattr.ta_Name=fmconfig->listfontname;
  520. fmconfig->reqfontattr.ta_Name=fmconfig->reqfontname;
  521. fmconfig->txtshowfontattr.ta_Name=fmconfig->txtshowfontname;
  522. fmconfig->smallfontattr.ta_Name=fmconfig->smallfontname;
  523. SetTaskPri((struct Task*)fmmain.myproc,fmconfig->mainpriority);
  524.  
  525. fmmain.datelen=32;
  526. longtodatestring(teststring1,(6523L*24L*60L+11*60+11L)*60L+11);
  527. fmmain.datelen=strlen(teststring1);
  528.  
  529. if(fmmain.kick>=39) fmmain.pool=CreatePool(MEMF_PUBLIC|MEMF_CLEAR,sizeof(struct FMNode)*64,sizeof(struct FMNode)*64);
  530.  
  531. recalc();
  532.  
  533. if(!fmconfig->dl[0].width) {
  534.     fmconfig->dl[0].width=fmmain.filelen;
  535.     fmconfig->dl[0].type=1;
  536.     fmconfig->dl[1].width=fmmain.lenlen;
  537.     fmconfig->dl[1].type=0;
  538.     fmconfig->dl[1].rightlock=1;
  539.     fmconfig->dl[1].rightaligned=1;
  540.     fmconfig->dl[2].width=fmmain.protlen;
  541.     fmconfig->dl[2].type=2;
  542.     fmconfig->dl[3].width=fmmain.datelen;
  543.     fmconfig->dl[3].type=3;
  544.     fmconfig->dl[4].width=fmmain.commlen;
  545.     fmconfig->dl[4].type=4;
  546. }
  547. fmmain.maxdirlistwidth=fmconfig->dl[0].width+fmconfig->dl[1].width+fmconfig->dl[2].width+fmconfig->dl[3].width+fmconfig->dl[4].width+4;
  548.  
  549. strcpy(fmmain.regname,"Everyone");
  550.  
  551. #ifdef V39
  552. if(fmmain.betaversion)
  553.     sformat(fmmain.fmtitle,"FileMaster %ld.%ld Beta %ld '020",fmmain.version,fmmain.revision,fmmain.betaversion);
  554.     else
  555.     sformat(fmmain.fmtitle,"FileMaster %ld.%ld '020",fmmain.version,fmmain.revision);
  556. #else
  557. if(fmmain.betaversion)
  558.     sformat(fmmain.fmtitle,"FileMaster %ld.%ld Beta %ld",fmmain.version,fmmain.revision,fmmain.betaversion);
  559.     else
  560.     sformat(fmmain.fmtitle,"FileMaster %ld.%ld",fmmain.version,fmmain.revision);
  561. #endif
  562. if(fmmain.regname[0])
  563.     sformat(fmmain.fmtitlename,"%s %s %s",fmmain.fmtitle,getstring(MSG_MAIN_REGISTERED),fmmain.regname);
  564.     else
  565.     sformat(fmmain.fmtitlename,"%s %s",fmmain.fmtitle,getstring(MSG_MAIN_UNREGISTERED));
  566. longtodatestring(fmmain.fmdate,*((ULONG*)&fmname[8]));
  567.  
  568. return(1);
  569. }
  570.  
  571. void recalc(void)
  572. {
  573. WORD aa;
  574. UBYTE *ptr1;
  575. UBYTE teststring1[34];
  576.  
  577. for(aa=0;aa<LISTS;aa++) clearlist(&fmlist[aa]);
  578. freepathlist();
  579.  
  580. Forbid();
  581.  
  582. sformat(teststring1,"%lU",100000000);
  583. fmmain.lenlen=strlen(teststring1);
  584. fmmain.memmeterlen=fmmain.lenlen-1;
  585. ptr1=nformatstring;
  586. *ptr1++='%';
  587. if(fmmain.lenlen>=10) *ptr1++='1';
  588. *ptr1++=fmmain.lenlen%10+'0';
  589. *ptr1++='l';*ptr1++='U';
  590. *ptr1=0;
  591. ptr1=nformatstring2;
  592. *ptr1++='%';
  593. if(fmmain.memmeterlen>=10) *ptr1++='1';
  594. *ptr1++=fmmain.memmeterlen%10+'0';
  595. *ptr1++='l';*ptr1++='U';
  596. *ptr1=0;
  597.  
  598. fmmain.protlen=8;
  599. fmmain.leftoffset=fmmain.lenoffset=sizeof(struct FMNode);
  600. fmmain.fileoffset=fmmain.lenoffset+fmmain.lenlen+1;
  601. fmmain.protoffset=fmmain.fileoffset+fmmain.filelen+1;
  602. fmmain.dateoffset=fmmain.protoffset+fmmain.protlen+1;
  603. fmmain.commoffset=fmmain.dateoffset+fmmain.datelen+1;
  604. fmmain.totnodelen=(fmmain.commoffset+fmmain.commlen+1+3)&(~0x03);
  605.  
  606. Permit();
  607.  
  608. initpathlist();
  609.  
  610. }
  611.