Rev 10 | Rev 8136 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
10 | reyssat | 1 | /* Copyright (C) 2002-2003 XIAO, Gang of Universite de Nice - Sophia Antipolis |
2 | * |
||
3 | * This program is free software; you can redistribute it and/or modify |
||
4 | * it under the terms of the GNU General Public License as published by |
||
5 | * the Free Software Foundation; either version 2 of the License, or |
||
6 | * (at your option) any later version. |
||
7 | * |
||
8 | * This program is distributed in the hope that it will be useful, |
||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
11 | * GNU General Public License for more details. |
||
12 | * |
||
13 | * You should have received a copy of the GNU General Public License |
||
14 | * along with this program; if not, write to the Free Software |
||
15 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
||
16 | */ |
||
17 | |||
18 | struct { |
||
19 | char *orig, *reverse; |
||
20 | } revtab[]={ |
||
21 | {"=", "!="}, |
||
22 | {"!=", "="}, |
||
23 | {"==", "!="}, |
||
24 | {"<>", "="}, |
||
25 | {"<", ">="}, |
||
26 | {">", "<="}, |
||
27 | {"<=", ">"}, |
||
28 | {">=", "<"}, |
||
29 | {"and", "or"}, |
||
30 | {"or", "and"}, |
||
31 | }; |
||
32 | #define revno (sizeof(revtab)/sizeof(revtab[0])) |
||
33 | |||
34 | /* p will contain the new exp, and must has a buffer of MAX_LINELEN+1 */ |
||
35 | void _not(char *p) |
||
36 | { |
||
37 | char buf1[MAX_LINELEN+1], bufr[MAX_LINELEN+1]; |
||
38 | char buft[16]; |
||
39 | int commas[MAX_COMMAS], cmcnt; |
||
40 | char *pp; |
||
41 | int i, l; |
||
42 | |||
43 | snprintf(buf1,sizeof(buf1),"%s",find_word_start(p)); |
||
44 | retype: |
||
45 | if(buf1[0]==0) {*p=0; return;} /* empty */ |
||
46 | strip_trailing_spaces(buf1); |
||
47 | switch(_type(buf1,commas,&cmcnt)) { |
||
48 | case exp_paren: { |
||
49 | if(buf1[0]=='(' && find_matching(buf1+1,')')==buf1+strlen(buf1)-1) { |
||
3718 | reyssat | 50 | buf1[strlen(buf1)-1]=0; ovlstrcpy(buf1,find_word_start(buf1+1)); |
10 | reyssat | 51 | goto retype; |
52 | } |
||
53 | snprintf(p,MAX_LINELEN,"not %s",buf1); return; |
||
54 | } |
||
55 | case exp_not: { |
||
56 | if(strncasecmp(buf1,"not",3)!=0) error("Syntax error."); |
||
57 | pp=find_word_start(buf1+3); |
||
58 | if(*pp=='(' && find_matching(pp+1,')')==pp+strlen(pp)-1) { |
||
59 | pp++; *(pp+strlen(pp)-1)=0; |
||
60 | } |
||
61 | snprintf(p,MAX_LINELEN,"%s",pp); return; |
||
62 | } |
||
63 | case exp_ineq: |
||
64 | case exp_eq: { |
||
65 | if(cmcnt!=2 || commas[1]-commas[0]>4) error("Syntax error."); |
||
66 | memmove(buft,buf1+commas[0],commas[1]-commas[0]); |
||
67 | buft[commas[1]-commas[0]]=0; |
||
68 | for(i=0;i<revno && strcmp(buft,revtab[i].orig)!=0;i++); |
||
69 | if(i>=revno) error("Software bug: bad sign."); |
||
70 | string_modify(buf1,buf1+commas[0],buf1+commas[1],revtab[i].reverse); |
||
71 | snprintf(p,MAX_LINELEN,"%s",buf1); |
||
72 | return; |
||
73 | } |
||
74 | case exp_and: { |
||
75 | if(cmcnt<2 || (cmcnt&1)!=0) error("Syntax error."); |
||
76 | commas[cmcnt]=strlen(buf1); |
||
77 | memmove(bufr,buf1,commas[0]); bufr[commas[0]]=0; |
||
78 | _not(bufr); snprintf(p,MAX_LINELEN,"%s",bufr); l=strlen(p); |
||
79 | for(i=1;i<=cmcnt/2;i++) { |
||
80 | memmove(bufr,buf1+commas[2*i-1],commas[2*i]-commas[2*i-1]); |
||
81 | bufr[commas[2*i]-commas[2*i-1]]=0; |
||
82 | _not(bufr); |
||
83 | snprintf(p+l,MAX_LINELEN-l," or %s",bufr); l=strlen(p); |
||
84 | } |
||
85 | return; |
||
86 | } |
||
87 | case exp_or: { |
||
88 | int commas2[MAX_COMMAS], cmcnt2; |
||
89 | if(cmcnt<2 || (cmcnt&1)!=0) error("Syntax error."); |
||
90 | commas[cmcnt]=strlen(buf1); |
||
91 | memmove(bufr,buf1,commas[0]); bufr[commas[0]]=0; |
||
92 | _not(bufr); |
||
93 | if(_type(bufr,commas2,&cmcnt2)!=exp_or) |
||
94 | snprintf(p,MAX_LINELEN,"%s",bufr); |
||
95 | else snprintf(p,MAX_LINELEN,"(%s)",bufr); |
||
96 | l=strlen(p); |
||
97 | for(i=1;i<=cmcnt/2;i++) { |
||
98 | memmove(bufr,buf1+commas[2*i-1],commas[2*i]-commas[2*i-1]); |
||
99 | bufr[commas[2*i]-commas[2*i-1]]=0; |
||
100 | _not(bufr); |
||
101 | if(_type(bufr,commas2,&cmcnt2)!=exp_or) |
||
102 | snprintf(p+l,MAX_LINELEN-l," and %s",bufr); |
||
103 | else snprintf(p+l,MAX_LINELEN-l," and (%s)",bufr); |
||
104 | l=strlen(p); |
||
105 | } |
||
106 | return; |
||
107 | } |
||
108 | case exp_imply: { |
||
109 | |||
110 | |||
111 | } |
||
112 | case exp_quantifier: { |
||
113 | |||
114 | |||
115 | } |
||
116 | default: { |
||
117 | snprintf(p,MAX_LINELEN,"not(%s)",buf1); return; |
||
118 | } |
||
119 | } |
||
120 | } |
||
121 | |||
122 | /* Logic reverse an expression */ |
||
123 | void req_not(void) |
||
124 | { |
||
125 | int i; |
||
126 | char *p, *ld; |
||
127 | char nbuf[MAX_LINELEN+1]; |
||
128 | if(objlinecnt<2) return; |
||
129 | for(i=1;i<objlinecnt;i++) { |
||
130 | thisobjline=i; p=find_word_start(objline[i]); |
||
131 | linelogdir=0; ld=""; |
||
132 | if(*p=='>') { |
||
133 | if(logdir<0) continue; |
||
134 | ld=">"; p=find_word_start(p+1); linelogdir=1; |
||
135 | } |
||
136 | else if(*p=='<') { |
||
137 | if(logdir>0) continue; |
||
138 | ld="<"; p=find_word_start(p+1); linelogdir=-1; |
||
139 | } |
||
140 | thislinelen=strlen(p); if(thislinelen<=0) continue; |
||
141 | snprintf(nbuf,sizeof(nbuf),"%s",p); |
||
142 | _not(nbuf); printf("%s %s\n",ld, nbuf); |
||
143 | } |
||
144 | |||
145 | } |
||
146 |