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

Subversion Repositories 1664

[/] [1664/] [trunk/] [c/] [lista/] [nM_SPR__cadena.c] - Rev 2

Compare with Previous | Blame | View Log

#include "lista.h"
#define lista_ajunta__SPR_t lista_ajunta__n8
nM nM_SPR__cadena(n1 *cadena, nN cuantia)
{
 const n1 sinia_no_braso[] = {lista_table_sinia};
 const n1 sinia_braso_clui[] = {lista_table_clui};
 typedef n8 SPR_t;
 nM valua=0;
 n1 bool_negativa=0;
 
 if(*cadena=='-')
 {
  bool_negativa=1;
  cadena++;
  cuantia--;
 }
 
 n1 *fini=cadena+cuantia;
 nN cuantia_braso;
 nN j,k;
 struct lista *pila;
 nN evalua_braso_cuantia;
 SPR_t f,f0,f1;
 n8 e0,e1;
 n1 *cadena_;
 while(cadena<fini)
 {
 
  switch(*cadena)
  {
   case 0x09:
   case ' ':
    cadena++;
    break;
 
   case '\"':
    cuantia_braso=nN_cuantia_brasetida__cadena(cadena, *cadena, sinia_braso_clui[*cadena]);
    cadena+=cuantia_braso;
    break;
 
   case '{': //simboles polsce reversa
    pila=lista_nova(sizeof(SPR_t)*8);
    evalua_braso_cuantia=nN_cuantia_brasetida__cadena(cadena, *cadena, sinia_braso_clui[*cadena]);
 
    for(j=1;j<(evalua_braso_cuantia-1);j++)
    {
 
     switch(cadena[j])
     {
      default:
       cadena_=cadena+j;
       while(sinia_no_braso[cadena[j]]!=0){ j++; }
       f=nM_SPR__cadena(cadena_,(cadena+j)-cadena_);
       lista_ajunta__SPR_t(pila, f);
       break;
 
      case 0x09:
      case ' ':
       break;
 
      case '{':
       k=nN_cuantia_brasetida__cadena(cadena+j, cadena[j], sinia_braso_clui[*cadena]);
       f=nM_SPR__cadena(cadena+j, k);
       lista_ajunta__SPR_t(pila, f);
       j+=k;
       break;
 
      case '.':
 
       switch(cadena[++j])
       {
        case '-': //negativa
         if((pila->contador/sizeof(SPR_t))>=1)
         {
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1]=-((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
         }
         j++;
         break;
 
        case '+': //asoluta
         if((pila->contador/sizeof(SPR_t))>=1)
         {
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          if(f0<0.0) { ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1]=-f0; }
         }
         j++;
         break;
 
        case '/': //invertida
         if((pila->contador/sizeof(SPR_t))>=1)
         {
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1]=1.0/f0;
         }
         j++;
         break;
 
        case 'd': //dupli
         if((pila->contador/sizeof(SPR_t))>=1)
         {
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          lista_ajunta__SPR_t(pila, f0);
         }
         j++;
         break;
 
        case 'x': //intercambia
         if((pila->contador/sizeof(SPR_t))>=2)
         {
          f1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=f0;
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1]=f1;
         }
         j++;
         break;
 
        default:
         //zero funsiona
         break;
       }
       break;
 
      case '>':
       switch(cadena[++j])
       {
        case '>': //loca
         if((pila->contador/sizeof(SPR_t))>=2)
         {
          e1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
          e0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          e1>>=e0;
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=e1;
          pila->contador-=sizeof(SPR_t);
         }
         j++;
         break;
 
        case '=': //lojica
         if((pila->contador/sizeof(SPR_t))>=2)
         {
          f1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=f1>=f0;
          pila->contador-=sizeof(SPR_t);
         }
         break;
 
        default: //lojica
         if((pila->contador/sizeof(SPR_t))>=2)
         {
          f1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=f1>f0;
          pila->contador-=sizeof(SPR_t);
         }
         break;
       }
       break;
 
      case '<':
       switch(cadena[++j])
       {
        case '<': //loca
         if((pila->contador/sizeof(SPR_t))>=2)
         {
          e1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
          e0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          e1<<=e0;
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=e1;
          pila->contador-=sizeof(SPR_t);
         }
         j++;
         break;
 
        case '=': //lojica
         if((pila->contador/sizeof(SPR_t))>=2)
         {
          f1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=f1<=f0;
          pila->contador-=sizeof(SPR_t);
         }
         break;
 
        default: //lojica
         if((pila->contador/sizeof(SPR_t))>=2)
         {
          f1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=f1<f0;
          pila->contador-=sizeof(SPR_t);
         }
         break;
       }
       break;
 
      case '&':
       switch(cadena[++j])
       {
        default: //bitio
         if((pila->contador/sizeof(SPR_t))>=2)
         {
          e1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
          e0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          e1&=e0;
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=e1;
          pila->contador-=sizeof(SPR_t);
         }
         break;
 
        case '&': //lojica
         if((pila->contador/sizeof(SPR_t))>=2)
         {
          e1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
          e0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          e1=(nM)e1&&(nM)e0;
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=e1;
          pila->contador-=sizeof(SPR_t);
         }
         j++;
         break;
       }
       break;
 
      case '|':
       switch(cadena[++j])
       {
        default: //bitio
         if((pila->contador/sizeof(SPR_t))>=2)
         {
          e1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
          e0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          e1|=e0;
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=e1;
          pila->contador-=sizeof(SPR_t);
         }
         break;
 
        case '|': //lojica
         if((pila->contador/sizeof(SPR_t))>=2)
         {
          e1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
          e0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          e1=(nM)e1||(nM)e0;
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=e1;
          pila->contador-=sizeof(SPR_t);
         }
         j++;
         break;
       }
       break;
 
      case '!':
       switch(cadena[++j])
       {
 
        case '=': //lojica
         if((pila->contador/sizeof(SPR_t))>=2)
         {
          f1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
          f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
          ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=f1!=f0;
          pila->contador-=sizeof(SPR_t);
         }
         break;
 
       }
       break;
 
      case '=': //lojica
       if((pila->contador/sizeof(SPR_t))>=2)
       {
        f1=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2];
        f0=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
        ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]=(f1==f0);
        pila->contador-=sizeof(SPR_t);
       }
       break;
 
      case '+':
       if((pila->contador/sizeof(SPR_t))>=2)
       {
        ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]+=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
        pila->contador-=sizeof(SPR_t);
       }
       j++;
       break;
 
      case '-':
       if(sinia_no_braso[cadena[j+1]]==1)
       {
        cadena_=cadena+j;
        while(sinia_no_braso[cadena[j]]==1) { j++; }
        f=nM_SPR__cadena(cadena_,(cadena+j)-cadena_);
        lista_ajunta__SPR_t(pila, f);
       }
       else
       {
        if((pila->contador/sizeof(SPR_t))>=2)
        {
         ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]-=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
         pila->contador-=sizeof(SPR_t);
        }
        j++;
       }
       break;
 
      case '*':
       if((pila->contador/sizeof(SPR_t))>=2)
       {
        ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]*=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
        pila->contador-=sizeof(SPR_t);
       }
       j++;
       break;
 
      case '/':
       if((pila->contador/sizeof(SPR_t))>=2)
       {
        ((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-2]/=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
        pila->contador-=sizeof(SPR_t);
       }
       j++;
       break;
 
    }
    }
    if(pila->contador!=0)
    {
     valua=((SPR_t *)(pila->datos))[(pila->contador/sizeof(SPR_t))-1];
    }
    cadena+=evalua_braso_cuantia;
    lista_libri(pila);
    break;
 
   case '(':
    cuantia_braso=nN_cuantia_brasetida__cadena(cadena, *cadena, sinia_braso_clui[*cadena]);
    valua=nM_SPR__cadena(cadena+1, cuantia_braso-2);
    cadena+=cuantia_braso;
    break;
 
   case '}': // dev
   case ']': // dev
   case ')':
    cadena++;
    break;
 
   case '0':
 
    if(*(cadena+1)=='x')
    {
     nN j;
     cadena+=2;
     for(j=0;(sinia_no_braso[cadena[j]]==1)&&((cadena+j)<fini);j++){}
     valua=nM__exadesimal_cadena(cadena, j);
     cadena+=j;
     break;
    }
    else if (cuantia>1)
    {
    //octal
    }
   case '1':
   case '2':
   case '3':
   case '4':
   case '5':
   case '6':
   case '7':
   case '8':
   case '9':
    for(j=1;(sinia_no_braso[cadena[j]]==1)&&((cadena+j)<fini);j++){}
    valua=nM__desimal_cadena(cadena, j);
    cadena+=j;
    break;
 
   default:
    j++;
    break;
  }
 }
 
 if(bool_negativa!=0)
 {
  valua=(-valua);
 }
 
 return valua;
}

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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