home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / fm2000 / parse.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-02-04  |  8.6 KB  |  339 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. #include <proto/all.h>
  21. #include <exec/types.h>
  22. #include <exec/memory.h>
  23. #include <strings.h>
  24. #include <stdarg.h>
  25. #include <dos.h>
  26. #include "fmnode.h"
  27. #include "fmlocale.h"
  28. #include "fmgui.h"
  29. #include "child.h"
  30. #include "fmdos.h"
  31.  
  32. void offgadget(struct Gadget*,WORD);
  33. void ongadget(struct Gadget*,WORD);
  34.  
  35. extern struct FMMain fmmain;
  36. extern struct FMConfig *fmconfig;
  37.  
  38. WORD checkmatch(UBYTE *token1,UBYTE *token2,UBYTE *token3,struct FMNode *node,struct Match *match,WORD matchtype)
  39. {
  40. WORD newnode=0,matched=0,ret=0;
  41. UBYTE apuflags[16];
  42.  
  43. if(match->mcase) {
  44.     if(match->mcase==2) {
  45.         if(MatchPattern(token2,NDFILE(node))) newnode=1;
  46.     } else {
  47.         if(MatchPatternNoCase(token1,NDFILE(node))) newnode=1;
  48.     }
  49. }
  50. if(match->mflags) {
  51.     siirran(apuflags,NDPROT(node),fmmain.protlen);
  52.     apuflags[fmmain.protlen]=0;
  53.     if(MatchPatternNoCase(token3,apuflags)) newnode=1;
  54. }
  55. if(match->msize&&(node->flags&NFILE)) {
  56.     switch(match->msize)
  57.     {
  58.     case 1: //same
  59.     if(node->numlen==match->patsize) newnode=1;
  60.     break;
  61.     case 2: //notsame
  62.     if(node->numlen!=match->patsize) newnode=1;
  63.     break;
  64.     case 3: //smaller
  65.     if(node->numlen<match->patsize) newnode=1;
  66.     break;
  67.     case 4: //larger
  68.     if(node->numlen>match->patsize) newnode=1;
  69.     break;
  70.     case 5: //between
  71.     if(node->numlen>=match->patsize&&node->numlen<=match->patsize2) newnode=1;
  72.     break;
  73.     case 6: //notbetween
  74.     if(node->numlen<match->patsize||node->numlen>match->patsize2) newnode=1;
  75.     break;
  76.     }
  77. }
  78. if(match->mdate) {
  79.     switch(match->mdate)
  80.     {
  81.     case 1: //older
  82.     if(node->numdate<match->patdate) newnode=1;
  83.     break;
  84.     case 2: //newer
  85.     if(node->numdate>match->patdate) newnode=1;
  86.     break;
  87.     case 3: //between
  88.     if(node->numdate>=match->patdate&&node->numdate<=match->patdate) newnode=1;
  89.     break;
  90.     case 4: //notbetween
  91.     if(node->numdate<match->patdate||node->numdate>match->patdate) newnode=1;
  92.     break;
  93.     }
  94. }
  95. if(node->flags&NFILE&&(match->mfiles==1||(match->mfiles==0&&newnode))) matched=1;
  96. if(node->flags&NDIRECTORY&&(match->mdirs==1||(match->mdirs==0&&newnode))) matched=1;
  97.  
  98. switch(matchtype)
  99. {
  100. case 0:
  101. node->flags&=~NMATCHED;
  102. if((node->flags&(NDEVICE|NASSIGN|NBUFFER))||matched) {
  103.     node->flags|=NMATCHED;
  104.     ret=1;
  105. }
  106. break;
  107. case 10:
  108. if(matched) {
  109.     node->flags|=NSELECTED;
  110.     ret=1;
  111. }
  112. break;
  113. case 20:
  114. if(matched) {
  115.     node->flags&=~NSELECTED;
  116.     ret=1;
  117. }
  118. break;
  119. }
  120. if(!(node->flags&NMATCHED)) node->flags&=~NSELECTED;
  121. return(ret);
  122. }
  123.  
  124. void parselist(struct FMList *list,WORD matchtype)
  125. {
  126. struct FMNode *node;
  127. UBYTE *token1,*token2,*token3;
  128. UBYTE *ptr1,*ptr2;
  129. struct Match *match;
  130. UBYTE patname[PATTERN];
  131. UBYTE patflags[32];
  132.  
  133. if(!list->li) return;
  134. token1=allocvec(list,3000,0);
  135. if(!token1) goto parseend;
  136. token2=token1+1000;
  137. token3=token1+1000;
  138. if(matchtype<10) match=getconfignumber(PARSECONFIG)->moreconfig;
  139. if(matchtype>=10&&matchtype<19) match=getconfignumber(INCLUDECONFIG)->moreconfig;
  140. if(matchtype>=20) match=getconfignumber(EXCLUDECONFIG)->moreconfig;
  141.  
  142. if(fmmain.kick<39&&match->mcase) {
  143.     ptr1=match->patname;
  144.     ptr2=patname;
  145.     while(*ptr1) *ptr2++=ToUpper(*ptr1++);
  146.     *ptr2=0;
  147. } else {
  148.     strcpy(patname,match->patname);
  149. }
  150. strcpy(patflags,match->patflags);
  151.  
  152. ParsePatternNoCase(patname,token1,1000);
  153. ParsePattern(patname,token2,1000);
  154. ParsePatternNoCase(patflags,token3,1000);
  155. for(node=list->head;node->succ;node=node->succ) {
  156.     checkmatch(token1,token2,token3,node,match,matchtype);
  157. }
  158. parseend:
  159. freemem(token1);
  160. }
  161.  
  162. WORD parsematch(struct FMList *list,struct CMenuConfig *cmc)
  163. {
  164. struct GUIBase *gb;
  165. WORD c,pc;
  166. WORD ccase,cfiles,cdirs,csize,cdate,cflags,ccomm,csortby,csortud,cmix,cdfirst;
  167. LONG sizeis,sizeis2;
  168. UBYTE patdate[32];
  169. UBYTE patdate2[32];
  170. UBYTE titlestr[80];
  171. struct Match *match;
  172.  
  173. match=getconfig(cmc);
  174. if(cmc->cmenucount==PARSECONFIG) pc=1; else pc=0;
  175. sformat(titlestr,"%s (%ld)",findbuildstring(cmc),(WORD)list->li->linumber);
  176.  
  177. gb=getguibase(titlestr);
  178.  
  179. setconnectgroup(gb,14,0,0);
  180.  
  181. setconnectgroup(gb,1,1,14);
  182. reqinfomsg(gb,MSG_PARSE_NAMEMATCH,100,guiUC|guiLEFT);
  183. reqinfomsg(gb,MSG_PARSE_SIZEMATCH,101,guiUC|guiLEFT);
  184. reqinfomsg(gb,MSG_PARSE_DATEMATCH,102,guiUC|guiLEFT);
  185. reqinfomsg(gb,MSG_PARSE_PROTMATCH,103,guiUC|guiLEFT);
  186. reqinfomsg(gb,MSG_PARSE_COMMENTMATCH,104,guiUC|guiLEFT);
  187. if(pc) reqinfomsg(gb,MSG_PARSE_SORTBY,105,guiUC|guiLEFT);
  188.  
  189. setconnectgroup(gb,2,1,14);
  190. reqstring(gb,100,match->patname,sizeof(match->patname));
  191.  
  192. setconnectgroup(gb,3,0,2);
  193. sizeis=match->patsize;
  194. reqinteger(gb,101,&sizeis,0,999999999);
  195. sizeis2=match->patsize2;
  196. reqinteger(gb,101,&sizeis2,0,999999999);
  197. setconnectgroup(gb,4,0,2);
  198. longtodatestring(patdate,match->patdate);
  199. longtodatestring(patdate2,match->patdate2);
  200. reqstring(gb,102,patdate,sizeof(patdate));
  201. reqstring(gb,102,patdate2,sizeof(patdate2));
  202. setguigroup(gb,2,0);
  203. reqstring(gb,103,match->patflags,sizeof(match->patflags));
  204. reqstring(gb,104,match->patcomm,sizeof(match->patcomm));
  205. if(pc) {
  206.     csortby=match->msortby;
  207.     reqcyclemsg(gb,106,&csortby,MSG_PARSE_NAMEMATCH,MSG_PARSE_SIZEMATCH,MSG_PARSE_DATEMATCH,MSG_PARSE_COMMENTMATCH,0);
  208. }
  209.  
  210. setconnectgroup(gb,5,1,14);
  211. ccase=match->mcase;
  212. reqcyclemsg(gb,100,&ccase,MSG_CONFIG_OFF,MSG_PARSE_CASEINSENSITIVE,MSG_PARSE_CASESENSITIVE,0);
  213. csize=match->msize;
  214. reqcyclemsg(gb,101,&csize,MSG_CONFIG_OFF,MSG_PARSE_SIZEEQUAL,MSG_PARSE_SIZENOEQUAL,MSG_PARSE_SIZESMALLER,MSG_PARSE_SIZELARGER,MSG_PARSE_BETWEEN,MSG_PARSE_NOTBETWEEN,0);
  215. cdate=match->mdate;
  216. reqcyclemsg(gb,102,&cdate,MSG_CONFIG_OFF,MSG_PARSE_DATEOLDER,MSG_PARSE_DATENEWER,MSG_PARSE_BETWEEN,MSG_PARSE_NOTBETWEEN,0);
  217. cflags=match->mflags;
  218. reqcyclemsg(gb,103,&cflags,MSG_CONFIG_OFF,MSG_CONFIG_ON,0);
  219. ccomm=match->mcomm;
  220. reqcyclemsg(gb,104,&ccomm,MSG_CONFIG_OFF,MSG_CONFIG_ON,0);
  221. if(pc) {
  222.     csortud=match->msortud;
  223.     reqcyclemsg(gb,105,&csortud,MSG_PARSE_SORTUP,MSG_PARSE_SORTDOWN,0);
  224. }
  225.  
  226. setconnectgroup(gb,13,0,0);
  227.  
  228. setconnectgroup(gb,6,1,13);
  229. if(pc) reqinfomsg(gb,MSG_PARSE_MIX,110,guiUC|guiLEFT);
  230. reqinfomsg(gb,MSG_PARSE_FILES,111,guiUC|guiLEFT);
  231. setconnectgroup(gb,7,1,13);
  232. if(pc) {
  233.     cmix=match->mmix;
  234.     reqcycle2msg(gb,110,&cmix);
  235. }
  236. cfiles=match->mfiles;
  237. reqcyclemsg(gb,111,&cfiles,MSG_PARSE_TYPE1,MSG_PARSE_TYPE2,MSG_PARSE_TYPE3,0);
  238. setconnectgroup(gb,8,1,13);
  239. if(pc) reqinfomsg(gb,MSG_PARSE_DRAWERS,120,guiUC|guiLEFT);
  240. reqinfomsg(gb,MSG_PARSE_DIRS,121,guiUC|guiLEFT);
  241. setconnectgroup(gb,9,1,13);
  242. if(pc) {
  243.     cdfirst=match->mdrawersfirst;
  244.     reqcycle2msg(gb,120,&cdfirst);
  245. }
  246. cdirs=match->mdirs;
  247. reqcyclemsg(gb,121,&cfiles,MSG_PARSE_TYPE1,MSG_PARSE_TYPE2,MSG_PARSE_TYPE3,0);
  248.  
  249. buttonbarmsg(gb,MSG_OK,1,MSG_CANCEL,0,0);
  250.  
  251. c=quickreq(gb);
  252.  
  253. if(c) {
  254.     match->mcase=ccase;
  255.     match->mfiles=cfiles;
  256.     match->mdirs=cdirs;
  257.     match->msize=csize;
  258.     match->mdate=cdate;
  259.     match->mflags=cflags;
  260.     match->mcomm=ccomm;
  261.     if(pc) {
  262.         match->msortby=csortby;
  263.         match->msortud=csortud;
  264.         match->mmix=cmix;
  265.         match->mdrawersfirst=cdfirst;
  266.     }
  267.     match->patsize=sizeis;
  268.     match->patsize2=sizeis2;
  269.     match->patdate=datestringtolong(patdate);
  270.     match->patdate2=datestringtolong(patdate2);
  271.     if(match->patdate==0xffffffff) {
  272.         match->patdate=0;
  273.         match->mdate=0;
  274.     }
  275.     if(match->patdate2==0xffffffff) {
  276.         match->patdate2=0;
  277.         match->mdate=0;
  278.     }
  279.     return(1);
  280. }
  281. return(0);
  282. }
  283.  
  284. void __saveds parse(void)
  285. {
  286. struct ProcMsg *pm;
  287. struct FMList *list;
  288.  
  289. pm=sinitproc();
  290. list=fmmain.sourcedir;
  291. if(!(setalloc(list,1))) {
  292.     initproc(0,0); 
  293.     goto endi;
  294. }
  295. offgadget(&list->li->taskgadget,LISTGADGETS);
  296. initproc(list,pm->cmc->label);
  297. if(parsematch(list,pm->cmc)) {
  298.     csortlist(list);
  299.     switch(pm->cmc->cmenucount)
  300.     {
  301.     case INCLUDECONFIG:
  302.     parselist(list,10);
  303.     break;
  304.     case EXCLUDECONFIG:
  305.     parselist(list,20);
  306.     break;
  307.     case PARSECONFIG:
  308.     parselist(list,0);
  309.     break;
  310.     }
  311.     outputlist(list);
  312.     endofdirtxt(list,0);
  313. }
  314. ongadget(&list->li->taskgadget,LISTGADGETS);
  315. endproc(list);
  316. endi:
  317. deinitproc(pm);
  318. }
  319.  
  320. void *parseconfigdefault(struct CMenuConfig *cmc)
  321. {
  322. struct Match *config;
  323. WORD ret;
  324. struct DateStamp ds;
  325. LONG date;
  326.  
  327. ret=allocconfig(cmc,sizeof(struct Match));
  328. if(ret<0) return(cmc->moreconfig);
  329. if(!ret) return(0);
  330. DateStamp(&ds);
  331. date=dstolong(&ds);
  332. config=cmc->moreconfig;
  333. config->mcase=1;
  334. config->patname[0]='#';
  335. config->patname[1]='?';
  336. config->patdate=date;
  337. return(cmc->moreconfig);
  338. }
  339.