Subversion Repositories wimsdev

Rev

Rev 11124 | 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
int nopart=0, nonesting=0, nocomma=0, nocoord=0, _estart;
21
 
22
void extrout(char *pb, char *pe, int dist, int commas[], int *commacnt)
23
{
24
    int i;
25
    if(pe-pb<thislinelen && nopart) return;
26
    while(pe>pb && isspace(*(pe-1))) pe--;
27
    if(pe<=pb) return;
28
    if(regexcnt>0 && pe-pb<MAX_LINELEN) {
8136 bpr 29
     char buf[MAX_LINELEN+1];
30
     memmove(buf,pb,pe-pb); buf[pe-pb]=0;
31
     if(!checkregex(buf)) return;
10 reyssat 32
    }
33
    if(!nocoord)
3813 kbelabas 34
      printf("%d %d %d, ",thisobjline,dist+_estart,(int)(pe-pb)+dist+_estart);
10 reyssat 35
    while(*commacnt>0 && commas[*commacnt-1]>pe-pb) (*commacnt)--;
36
    if(*commacnt>0 && !nocomma) {
8136 bpr 37
     fwrite(pb,1,commas[0],stdout); putchar(',');
38
     for(i=1;i<*commacnt;i++) {
39
         fwrite(pb+commas[i-1],1,commas[i]-commas[i-1],stdout); putchar(',');
40
     }
41
     pb+=commas[*commacnt-1];
10 reyssat 42
    }
43
    fwrite(pb,1,pe-pb,stdout); printf("\n");
44
    *commacnt=0;
45
}
46
 
47
void _extract(char *p, int dist)
48
{
49
    int i,l,got,lt;
50
    char *p1, *p2, *p3, *p4;
51
    char buf[MAX_LINELEN+1];
52
    int commas[MAX_COMMAS];
53
    int commacnt;
54
 
55
    if(dist>0 && (nonesting || nopart)) return;
56
    commacnt=0;
57
    if(expl1<=0) got=1; else got=0;
58
    for(p1=find_word_start(p), p2=p1; *p2; p2=find_word_start(p3)) {
8136 bpr 59
     if(*p2=='.' || isdigit(*p2)) {
60
         (void)strtod(p2,&p3); continue;
61
     }
62
     if(*p2=='(') {
63
         p3=find_matching(p2+1,')'); lt=exp_paren;
64
         paren: if(p3==NULL) error("Unmatched parentheses.");
65
         p2++; memmove(buf,p2,p3-p2); buf[p3-p2]=0;
66
         _extract(buf,p2-p+dist);
67
         if(expl2==lt) extrout(p2,p3,dist+p2-p,commas,&commacnt);
68
         p3++; continue;
69
     }
70
     if(*p2=='[') {
71
         p3=find_matching(p2+1,']'); lt=exp_matrix; goto paren;
72
     }
73
     if(*p2=='{') {
74
         p3=find_matching(p2+1,'}'); lt=exp_set; goto paren;
75
     }
76
     if(isalpha(*p2)) {
77
         for(p3=p2; *p3=='_' || isalnum(*p3); p3++);
78
         if(p3-p2>=16) goto notdefined;
79
         memmove(buf,p2,p3-p2); buf[p3-p2]=0;
80
         for(i=0;i<opalphano && strcmp(buf,opalpha[i].name)!=0; i++);
81
         if(i<opalphano) {
82
          l=opalpha[i].lvl; if(l>expl2) {
83
              if(got) extrout(p1,p2,dist+p1-p,commas,&commacnt);
11124 georgesk 84
              if(expl1>0) got=0;
11132 bpr 85
              p1=find_word_start(p3);
8136 bpr 86
          }
87
          if(l>=expl1 && l<=expl2) {
88
              got=1;
89
              if(l>0 && commacnt<MAX_COMMAS-2) {
90
               commas[commacnt++]=p2-p1;
91
               commas[commacnt++]=p3-p1;
92
              }
93
          }
94
          continue;
95
         }
96
         notdefined: p4=find_word_start(p3);
97
         if(*p4=='(') {
98
          p3=find_matching(p4+1,')');
99
          if(p3==NULL) error("Unmatched parentheses.");
100
          p4++; memmove(buf,p4,p3-p2); buf[p3-p4]=0;
101
          _extract(buf,p2-p+dist);
102
          p3++;
103
          if(expl2==exp_fn) extrout(p2,p3,dist+p2-p,commas,&commacnt);
104
         }
105
         else if(expl2==exp_variable) extrout(p2,p3,dist+p2-p,commas,&commacnt);
106
         continue;
107
     }
108
     for(i=0;i<oppunctno && strncmp(p2,oppunct[i].name,strlen(oppunct[i].name))!=0; i++);
109
     if(i>=oppunctno) error("Unknown operator.");
110
     p3=p2+strlen(oppunct[i].name); l=oppunct[i].lvl;
111
     if(l>expl2) {
112
         if(got) extrout(p1,p2,dist+p1-p,commas,&commacnt);
11124 georgesk 113
         if(expl1>0) got=0;
114
         p1=find_word_start(p3);
8136 bpr 115
     }
116
     if(l>=expl1 && l<=expl2) {
117
         got=1;
118
         if(l>0 && commacnt<MAX_COMMAS-2) {
119
          commas[commacnt++]=p2-p1;
120
          commas[commacnt++]=p3-p1;
121
         }
122
     }
123
  }
124
  if(got) extrout(p1,p1+strlen(p1),dist+p1-p,commas,&commacnt);
10 reyssat 125
}
126
 
127
void req_extract(void)
128
{
129
    int i;
130
    char *p;
131
 
132
    if(objlinecnt<2) return;
133
    if(*reqtype==0) error("Missing extraction type.");
134
    for(i=0;i<exptypeno && strcmp(reqtype,exptype[i].name)!=0; i++);
135
    if(i>=exptypeno) error("Bad extraction type.");
136
    if(logdir!=0) nopart=1;
137
    while((p=wordchr(objline[0],"nopart"))!=NULL) {
8136 bpr 138
     nopart=1; ovlstrcpy(p,p+strlen("nopart"));
10 reyssat 139
    }
140
    while((p=wordchr(objline[0],"nonesting"))!=NULL) {
8136 bpr 141
     nonesting=1; ovlstrcpy(p,p+strlen("nonesting"));
10 reyssat 142
    }
143
    while((p=wordchr(objline[0],"nocomma"))!=NULL) {
8136 bpr 144
     nocomma=1; ovlstrcpy(p,p+strlen("nocomma"));
10 reyssat 145
    }
146
    getregex(objline[0]);
147
    expl1=exptype[i].lvl1; expl2=exptype[i].lvl2;
148
    for(i=1;i<objlinecnt;i++) {
8136 bpr 149
     thisobjline=i; p=find_word_start(objline[i]);
150
     linelogdir=0;
151
     if(*p=='>') {
152
         if(logdir<0) continue;
153
         p=find_word_start(p+1); linelogdir=1;
154
     }
155
     else if(*p=='<') {
156
         if(logdir>0) continue;
157
         p=find_word_start(p+1); linelogdir=-1;
158
     }
159
     thislinelen=strlen(p); if(thislinelen<=0) continue;
160
     _estart=p-objline[i]; _extract(p, 0);
10 reyssat 161
    }
162
}
163
 
164
void req_cut(void)
165
{
166
    nocoord=1; req_extract();
167
}
168