Subversion Repositories wimsdev

Rev

Rev 8185 | 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
 */
8185 bpr 17
 
8136 bpr 18
#include "mathexp.h"
10 reyssat 19
 
20
struct {
21
    char *orig, *reverse;
22
} revtab[]={
8136 bpr 23
    {"=", "!="},
24
    {"!=", "="},
25
    {"==", "!="},
26
    {"<>", "="},
27
    {"<", ">="},
28
    {">", "<="},
29
    {"<=", ">"},
30
    {">=", "<"},
31
    {"and", "or"},
32
    {"or", "and"},
10 reyssat 33
};
34
#define revno (sizeof(revtab)/sizeof(revtab[0]))
35
 
8136 bpr 36
/* p will contain the new exp, and must has a buffer of MAX_LINELEN+1 */
10 reyssat 37
void _not(char *p)
38
{
39
    char buf1[MAX_LINELEN+1], bufr[MAX_LINELEN+1];
40
    char buft[16];
41
    int commas[MAX_COMMAS], cmcnt;
42
    char *pp;
43
    int i, l;
8136 bpr 44
 
10 reyssat 45
    snprintf(buf1,sizeof(buf1),"%s",find_word_start(p));
46
    retype:
8136 bpr 47
    if(buf1[0]==0) {*p=0; return;} /* empty */
10 reyssat 48
    strip_trailing_spaces(buf1);
49
    switch(_type(buf1,commas,&cmcnt)) {
8136 bpr 50
     case exp_paren: {
51
         if(buf1[0]=='(' && find_matching(buf1+1,')')==buf1+strlen(buf1)-1) {
52
           buf1[strlen(buf1)-1]=0; ovlstrcpy(buf1,find_word_start(buf1+1));
53
           goto retype;
54
         }
55
         snprintf(p,MAX_LINELEN,"not %s",buf1); return;
56
     }
57
     case exp_not: {
58
         if(strncasecmp(buf1,"not",3)!=0) error("Syntax error.");
59
         pp=find_word_start(buf1+3);
60
         if(*pp=='(' && find_matching(pp+1,')')==pp+strlen(pp)-1) {
61
          pp++; *(pp+strlen(pp)-1)=0;
62
         }
63
         snprintf(p,MAX_LINELEN,"%s",pp); return;
64
     }
65
     case exp_ineq:
66
     case exp_eq: {
67
         if(cmcnt!=2 || commas[1]-commas[0]>4) error("Syntax error.");
68
         memmove(buft,buf1+commas[0],commas[1]-commas[0]);
69
         buft[commas[1]-commas[0]]=0;
70
         for(i=0;i<revno && strcmp(buft,revtab[i].orig)!=0;i++);
71
         if(i>=revno) error("Software bug: bad sign.");
72
         string_modify(buf1,buf1+commas[0],buf1+commas[1],revtab[i].reverse);
73
         snprintf(p,MAX_LINELEN,"%s",buf1);
74
         return;
75
     }
76
     case exp_and: {
77
         if(cmcnt<2 || (cmcnt&1)!=0) error("Syntax error.");
78
         commas[cmcnt]=strlen(buf1);
79
         memmove(bufr,buf1,commas[0]); bufr[commas[0]]=0;
15780 georgesk 80
         _not(bufr); snprintf(p,MAX_LINELEN+1,"%s",bufr); l=strlen(p);
8136 bpr 81
         for(i=1;i<=cmcnt/2;i++) {
82
          memmove(bufr,buf1+commas[2*i-1],commas[2*i]-commas[2*i-1]);
83
          bufr[commas[2*i]-commas[2*i-1]]=0;
84
          _not(bufr);
85
          snprintf(p+l,MAX_LINELEN-l," or %s",bufr); l=strlen(p);
86
         }
87
         return;
88
     }
89
     case exp_or: {
90
         int commas2[MAX_COMMAS], cmcnt2;
91
         if(cmcnt<2 || (cmcnt&1)!=0) error("Syntax error.");
92
         commas[cmcnt]=strlen(buf1);
93
         memmove(bufr,buf1,commas[0]); bufr[commas[0]]=0;
94
         _not(bufr);
95
         if(_type(bufr,commas2,&cmcnt2)!=exp_or)
15780 georgesk 96
           snprintf(p,MAX_LINELEN+1,"%s",bufr);
97
         else snprintf(p,MAX_LINELEN+3,"(%s)",bufr);
8136 bpr 98
         l=strlen(p);
99
         for(i=1;i<=cmcnt/2;i++) {
100
          memmove(bufr,buf1+commas[2*i-1],commas[2*i]-commas[2*i-1]);
101
          bufr[commas[2*i]-commas[2*i-1]]=0;
102
          _not(bufr);
103
          if(_type(bufr,commas2,&cmcnt2)!=exp_or)
104
            snprintf(p+l,MAX_LINELEN-l," and %s",bufr);
105
          else snprintf(p+l,MAX_LINELEN-l," and (%s)",bufr);
106
          l=strlen(p);
107
         }
108
         return;
109
     }
110
     case exp_imply: {
111
 
112
 
113
     }
114
     case exp_quantifier: {
115
 
116
 
117
     }
118
     default: {
119
         snprintf(p,MAX_LINELEN,"not(%s)",buf1); return;
120
     }
10 reyssat 121
    }
122
}
123
 
8136 bpr 124
/* Logic reverse an expression */
10 reyssat 125
void req_not(void)
126
{
127
    int i;
128
    char *p, *ld;
129
    char nbuf[MAX_LINELEN+1];
130
    if(objlinecnt<2) return;
131
    for(i=1;i<objlinecnt;i++) {
8136 bpr 132
     thisobjline=i; p=find_word_start(objline[i]);
133
     linelogdir=0; ld="";
134
     if(*p=='>') {
135
         if(logdir<0) continue;
136
         ld=">"; p=find_word_start(p+1); linelogdir=1;
137
     }
138
     else if(*p=='<') {
139
         if(logdir>0) continue;
140
         ld="<"; p=find_word_start(p+1); linelogdir=-1;
141
     }
142
     thislinelen=strlen(p); if(thislinelen<=0) continue;
143
     snprintf(nbuf,sizeof(nbuf),"%s",p);
144
     _not(nbuf); printf("%s %s\n",ld, nbuf);
10 reyssat 145
    }
146
}