OpenCores
URL https://opencores.org/ocsvn/1664/1664/trunk

Subversion Repositories 1664

[/] [1664/] [trunk/] [c/] [lista/] [nM_SPR__cadena.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 mrdmkg
#include "lista.h"
2
#define lista_ajunta__SPR_t lista_ajunta__n8
3
nM nM_SPR__cadena(n1 *cadena, nN cuantia)
4
{
5
 const n1 sinia_no_braso[] = {lista_table_sinia};
6
 const n1 sinia_braso_clui[] = {lista_table_clui};
7
 typedef n8 SPR_t;
8
 nM valua=0;
9
 n1 bool_negativa=0;
10
 
11
 if(*cadena=='-')
12
 {
13
  bool_negativa=1;
14
  cadena++;
15
  cuantia--;
16
 }
17
 
18
 n1 *fini=cadena+cuantia;
19
 nN cuantia_braso;
20
 nN j,k;
21
 struct lista *pila;
22
 nN evalua_braso_cuantia;
23
 SPR_t f,f0,f1;
24
 n8 e0,e1;
25
 n1 *cadena_;
26
 while(cadena<fini)
27
 {
28
 
29
  switch(*cadena)
30
  {
31
   case 0x09:
32
   case ' ':
33
    cadena++;
34
    break;
35
 
36
   case '\"':
37
    cuantia_braso=nN_cuantia_brasetida__cadena(cadena, *cadena, sinia_braso_clui[*cadena]);
38
    cadena+=cuantia_braso;
39
    break;
40
 
41
   case '{': //simboles polsce reversa
42
    pila=lista_nova(sizeof(SPR_t)*8);
43
    evalua_braso_cuantia=nN_cuantia_brasetida__cadena(cadena, *cadena, sinia_braso_clui[*cadena]);
44
 
45
    for(j=1;j<(evalua_braso_cuantia-1);j++)
46
    {
47
 
48
     switch(cadena[j])
49
     {
50
      default:
51
       cadena_=cadena+j;
52
       while(sinia_no_braso[cadena[j]]!=0){ j++; }
53
       f=nM_SPR__cadena(cadena_,(cadena+j)-cadena_);
54
       lista_ajunta__SPR_t(pila, f);
55
       break;
56
 
57
      case 0x09:
58
      case ' ':
59
       break;
60
 
61
      case '{':
62
       k=nN_cuantia_brasetida__cadena(cadena+j, cadena[j], sinia_braso_clui[*cadena]);
63
       f=nM_SPR__cadena(cadena+j, k);
64
       lista_ajunta__SPR_t(pila, f);
65
       j+=k;
66
       break;
67
 
68
      case '.':
69
 
70
       switch(cadena[++j])
71
       {
72
        case '-': //negativa
73
         if((pila->contador/sizeof(SPR_t))>=1)
74
         {
75
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1]=-((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
76
         }
77
         j++;
78
         break;
79
 
80
        case '+': //asoluta
81
         if((pila->contador/sizeof(SPR_t))>=1)
82
         {
83
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
84
          if(f0<0.0) { ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1]=-f0; }
85
         }
86
         j++;
87
         break;
88
 
89
        case '/': //invertida
90
         if((pila->contador/sizeof(SPR_t))>=1)
91
         {
92
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
93
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1]=1.0/f0;
94
         }
95
         j++;
96
         break;
97
 
98
        case 'd': //dupli
99
         if((pila->contador/sizeof(SPR_t))>=1)
100
         {
101
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
102
          lista_ajunta__SPR_t(pila, f0);
103
         }
104
         j++;
105
         break;
106
 
107
        case 'x': //intercambia
108
         if((pila->contador/sizeof(SPR_t))>=2)
109
         {
110
          f1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
111
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
112
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=f0;
113
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1]=f1;
114
         }
115
         j++;
116
         break;
117
 
118
        default:
119
         //zero funsiona
120
         break;
121
       }
122
       break;
123
 
124
      case '>':
125
       switch(cadena[++j])
126
       {
127
        case '>': //loca
128
         if((pila->contador/sizeof(SPR_t))>=2)
129
         {
130
          e1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
131
          e0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
132
          e1>>=e0;
133
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=e1;
134
          pila->contador-=sizeof(SPR_t);
135
         }
136
         j++;
137
         break;
138
 
139
        case '=': //lojica
140
         if((pila->contador/sizeof(SPR_t))>=2)
141
         {
142
          f1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
143
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
144
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=f1>=f0;
145
          pila->contador-=sizeof(SPR_t);
146
         }
147
         break;
148
 
149
        default: //lojica
150
         if((pila->contador/sizeof(SPR_t))>=2)
151
         {
152
          f1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
153
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
154
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=f1>f0;
155
          pila->contador-=sizeof(SPR_t);
156
         }
157
         break;
158
       }
159
       break;
160
 
161
      case '<':
162
       switch(cadena[++j])
163
       {
164
        case '<': //loca
165
         if((pila->contador/sizeof(SPR_t))>=2)
166
         {
167
          e1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
168
          e0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
169
          e1<<=e0;
170
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=e1;
171
          pila->contador-=sizeof(SPR_t);
172
         }
173
         j++;
174
         break;
175
 
176
        case '=': //lojica
177
         if((pila->contador/sizeof(SPR_t))>=2)
178
         {
179
          f1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
180
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
181
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=f1<=f0;
182
          pila->contador-=sizeof(SPR_t);
183
         }
184
         break;
185
 
186
        default: //lojica
187
         if((pila->contador/sizeof(SPR_t))>=2)
188
         {
189
          f1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
190
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
191
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=f1<f0;
192
          pila->contador-=sizeof(SPR_t);
193
         }
194
         break;
195
       }
196
       break;
197
 
198
      case '&':
199
       switch(cadena[++j])
200
       {
201
        default: //bitio
202
         if((pila->contador/sizeof(SPR_t))>=2)
203
         {
204
          e1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
205
          e0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
206
          e1&=e0;
207
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=e1;
208
          pila->contador-=sizeof(SPR_t);
209
         }
210
         break;
211
 
212
        case '&': //lojica
213
         if((pila->contador/sizeof(SPR_t))>=2)
214
         {
215
          e1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
216
          e0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
217
          e1=(nM)e1&&(nM)e0;
218
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=e1;
219
          pila->contador-=sizeof(SPR_t);
220
         }
221
         j++;
222
         break;
223
       }
224
       break;
225
 
226
      case '|':
227
       switch(cadena[++j])
228
       {
229
        default: //bitio
230
         if((pila->contador/sizeof(SPR_t))>=2)
231
         {
232
          e1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
233
          e0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
234
          e1|=e0;
235
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=e1;
236
          pila->contador-=sizeof(SPR_t);
237
         }
238
         break;
239
 
240
        case '|': //lojica
241
         if((pila->contador/sizeof(SPR_t))>=2)
242
         {
243
          e1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
244
          e0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
245
          e1=(nM)e1||(nM)e0;
246
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=e1;
247
          pila->contador-=sizeof(SPR_t);
248
         }
249
         j++;
250
         break;
251
       }
252
       break;
253
 
254
      case '!':
255
       switch(cadena[++j])
256
       {
257
 
258
        case '=': //lojica
259
         if((pila->contador/sizeof(SPR_t))>=2)
260
         {
261
          f1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
262
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
263
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=f1!=f0;
264
          pila->contador-=sizeof(SPR_t);
265
         }
266
         break;
267
 
268
       }
269
       break;
270
 
271
      case '=': //lojica
272
       if((pila->contador/sizeof(SPR_t))>=2)
273
       {
274
        f1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
275
        f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
276
        ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=(f1==f0);
277
        pila->contador-=sizeof(SPR_t);
278
       }
279
       break;
280
 
281
      case '+':
282
       if((pila->contador/sizeof(SPR_t))>=2)
283
       {
284
        ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]+=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
285
        pila->contador-=sizeof(SPR_t);
286
       }
287
       j++;
288
       break;
289
 
290
      case '-':
291
       if(sinia_no_braso[cadena[j+1]]==1)
292
       {
293
        cadena_=cadena+j;
294
        while(sinia_no_braso[cadena[j]]==1) { j++; }
295
        f=nM_SPR__cadena(cadena_,(cadena+j)-cadena_);
296
        lista_ajunta__SPR_t(pila, f);
297
       }
298
       else
299
       {
300
        if((pila->contador/sizeof(SPR_t))>=2)
301
        {
302
         ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]-=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
303
         pila->contador-=sizeof(SPR_t);
304
        }
305
        j++;
306
       }
307
       break;
308
 
309
      case '*':
310
       if((pila->contador/sizeof(SPR_t))>=2)
311
       {
312
        ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]*=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
313
        pila->contador-=sizeof(SPR_t);
314
       }
315
       j++;
316
       break;
317
 
318
      case '/':
319
       if((pila->contador/sizeof(SPR_t))>=2)
320
       {
321
        ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]/=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
322
        pila->contador-=sizeof(SPR_t);
323
       }
324
       j++;
325
       break;
326
 
327
    }
328
    }
329
    if(pila->contador!=0)
330
    {
331
     valua=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
332
    }
333
    cadena+=evalua_braso_cuantia;
334
    lista_libri(pila);
335
    break;
336
 
337
   case '(':
338
    cuantia_braso=nN_cuantia_brasetida__cadena(cadena, *cadena, sinia_braso_clui[*cadena]);
339
    valua=nM_SPR__cadena(cadena+1, cuantia_braso-2);
340
    cadena+=cuantia_braso;
341
    break;
342
 
343
   case '}': // dev
344
   case ']': // dev
345
   case ')':
346
    cadena++;
347
    break;
348
 
349
   case '0':
350
 
351
    if(*(cadena+1)=='x')
352
    {
353
     nN j;
354
     cadena+=2;
355
     for(j=0;(sinia_no_braso[cadena[j]]==1)&&((cadena+j)<fini);j++){}
356
     valua=nM__exadesimal_cadena(cadena, j);
357
     cadena+=j;
358
     break;
359
    }
360
    else if (cuantia>1)
361
    {
362
    //octal
363
    }
364
   case '1':
365
   case '2':
366
   case '3':
367
   case '4':
368
   case '5':
369
   case '6':
370
   case '7':
371
   case '8':
372
   case '9':
373
    for(j=1;(sinia_no_braso[cadena[j]]==1)&&((cadena+j)<fini);j++){}
374
    valua=nM__desimal_cadena(cadena, j);
375
    cadena+=j;
376
    break;
377
 
378
   default:
379
    j++;
380
    break;
381
  }
382
 }
383
 
384
 if(bool_negativa!=0)
385
 {
386
  valua=(-valua);
387
 }
388
 
389
 return valua;
390
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.