elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  problema con archivo de texto
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: problema con archivo de texto  (Leído 1,487 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
problema con archivo de texto
« en: 23 Marzo 2014, 23:50 pm »

Saludos tengo el siguiente archivo de texto que dice:

;ejemplo con errores
Et12_xyz123     ADCA      1,PC
%ET3        LDAA      #$90
Netq%23        RMB      556
etv1
XYZ        Ldaaxyz   4
        %XYZ
        a.c.      %1111000
Abc        SWI%

y el codigo me tiene que imprimir esto

COMENTARIO

ETIQUETA = Et12_xyz123
CODOP =ADCA
OPERANDO = 1,PC
.....
....
....
 
y asi con todas las lineas, pero me imprime

COMENTARIO

NO SE ENCONTRO CODOP

y no entiendo por que imprime esto ultimo si solo en las lineas que no son comentarios me tiene que verificar si se encontro el codop o no

el codigo es este:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #define LONG_ETIQUETA 8
  6. #define LONG_CODOP 5
  7. #define COMENTARIO ';'
  8. #define TABULADOR '\t'
  9. #define ESPACIOS_ ' '
  10. #define MAX 8
  11. #define MAXIMO 40
  12.  
  13. typedef enum {FALSO,VERDADERO} booleano;
  14. typedef enum {ETIQUETA,CODOP,OPERANDO} linea;
  15. typedef enum {INS,OP,DIR,MAQ,CALCULADO,CALCULAR,TOTAL} tabla;
  16.  
  17. typedef struct nodo
  18. {
  19.    char *instruccion;
  20.    char *operando;
  21.    char **modo_direccionamiento;
  22.    char **codigo_maquina;
  23.    char **bytes_calculados;
  24.    char **bytes_x_calcular;
  25.    char **suma_bytes;
  26.    int tipo_linea;
  27.    struct nodo *sig;
  28. }COD;
  29.  
  30. void imprimirInfo(COD *p);
  31. int verificarCombinacion(FILE *fd);
  32. booleano esComentario(FILE *fd);
  33. char *Etiqueta_Codop_Operando(FILE *fd,int linea);
  34. char *_Codop_Operando(FILE *fd,int linea);
  35. void ultimaLinea(char *codop);
  36. void erroresEtiqueta(char *etiqueta);
  37. void erroresCodop(char *codop);
  38. void buscarFinLinea(FILE *fd);
  39. void ignorarEspacios(FILE *fd);
  40. void listaTABOP(COD **cabeza);
  41. COD *ultimoElemento(COD **cabeza);
  42. COD *crearNodo(char *ins,char *op,char **dir,char **maq,char **cal,char **x_cal,char **sum,int n);
  43. void insertarFinal(char *ins,char *op,char **dir,char **maq,char **cal,char **x_cal,char **sum,COD *ultimo,int n);
  44. char *Tabla_Operandos(FILE *hc12,int tabla);
  45. COD *buscarCodop(COD *cabeza,char *codop);
  46. void quitarSaltosLinea(char *cadena);
  47. booleano esNumero(char caracter);
  48. booleano esLetra(char caracter);
  49. void verificarOperando(COD *encontrado,char *operando);
  50.  
  51. int main()
  52. {
  53.    FILE *fd;
  54.    int car,combinacion;
  55.    COD *cabeza = NULL,*encontrado = NULL;
  56.    char nombre[MAXIMO],archivo[MAXIMO],respuesta,*etiqueta,*codop,*operando;
  57.    listaTABOP(&cabeza);
  58.    do
  59.    {
  60.        printf("\nQue archivo quieres abrir: ");
  61.        fgets(nombre,sizeof(nombre),stdin);
  62.        quitarSaltosLinea(nombre);
  63.        sprintf(archivo,"%s.txt",nombre);
  64.        if((fd = fopen(archivo,"r"))!= NULL)
  65.        {
  66.            while((car = fgetc(fd))!= EOF)
  67.            {
  68.                switch(car)
  69.                {
  70.                    case COMENTARIO:
  71.                       if(esComentario(fd))
  72.                          printf("COMENTARIO\n\n");
  73.                       else
  74.                          buscarFinLinea(fd);
  75.                       break;
  76.                    case ESPACIOS_:
  77.                    case TABULADOR:
  78.                       etiqueta = "null";
  79.                       printf("ETIQUETA = %s\n",etiqueta);
  80.                       ignorarEspacios(fd);
  81.                       codop = Etiqueta_Codop_Operando(fd,CODOP);
  82.                       printf("CODOP = %s\n",codop);
  83.                       erroresCodop(codop);
  84.                       combinacion = verificarCombinacion(fd);
  85.                       if(combinacion == 2)
  86.                       {
  87.                           operando = "null";
  88.                           printf("OPERANDO = %s\n\n",operando);
  89.                       }
  90.                       else
  91.                       {
  92.                           ignorarEspacios(fd);
  93.                           operando = Etiqueta_Codop_Operando(fd,OPERANDO);
  94.                           printf("OPERANDO = %s\n\n",operando);
  95.                       }
  96.                       break;
  97.                    default:
  98.                       etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA);
  99.                       printf("ETIQUETA = %s\n",etiqueta);
  100.                       erroresEtiqueta(etiqueta);
  101.                       combinacion = verificarCombinacion(fd);
  102.                       if(combinacion == 2)
  103.                       {
  104.                           codop = "null";
  105.                           printf("CODOP = %s\n",codop);
  106.                           erroresCodop(codop);
  107.                           operando = "null";
  108.                           printf("OPERANDO = %s\n\n",operando);
  109.                       }
  110.                       else
  111.                       {
  112.                           ignorarEspacios(fd);
  113.                           codop = Etiqueta_Codop_Operando(fd,CODOP);
  114.                           printf("CODOP = %s\n",codop);
  115.                           erroresCodop(codop);
  116.                           combinacion = verificarCombinacion(fd);
  117.                           if(combinacion == 2)
  118.                           {
  119.                               operando = "null";
  120.                               printf("OPERANDO = %s\n\n",operando);
  121.                           }
  122.                           else
  123.                           {
  124.                               ignorarEspacios(fd);
  125.                               operando = Etiqueta_Codop_Operando(fd,OPERANDO);
  126.                               printf("OPERANDO = %s\n\n",operando);
  127.                           }
  128.                       }
  129.                       break;
  130.                }
  131.                if((strcmp(codop,"null"))!= 0)
  132.                {
  133.                    if((encontrado = buscarCodop(cabeza,codop)) == NULL)
  134.                       printf("NO SE ENCONTRO EL CODOP DE OPERACION\n\n");
  135.                    else
  136.                    {
  137.                        verificarOperando(encontrado,operando);
  138.                        imprimirInfo(encontrado);
  139.                    }
  140.                }
  141.  
  142.            }
  143.            ultimaLinea(codop);
  144.        }
  145.        else
  146.           printf("No se pudo abrir el archivo");
  147.        printf("Quieres abrir otro archivo S/N: ");
  148.        fgets(nombre,MAX,stdin);
  149.        sscanf(nombre,"%c",&respuesta);
  150.        system("cls");
  151.    }while(respuesta == 'S' || respuesta == 's');
  152.    return 0;
  153. }
  154.  
  155. booleano esComentario(FILE *fd)
  156. {
  157.    int car;
  158.    while((car = fgetc(fd))!= '\n')
  159.    {
  160.        if(car == ';')
  161.           return 0;
  162.    }
  163.    return 1;
  164. }
  165.  
  166. void buscarFinLinea(FILE *fd)
  167. {
  168.    int car;
  169.    while((car = fgetc(fd))!= '\n')
  170.        ;
  171. }
  172.  
  173. void ignorarEspacios(FILE *fd)
  174. {
  175.    int car;
  176.    do
  177.    {
  178.        car = fgetc(fd);
  179.    }while(car == '\t' || car == ' ');
  180. }
  181.  
  182. int verificarCombinacion(FILE *fd)
  183. {
  184.    int car,combinacion;
  185.    fseek(fd,-1,SEEK_CUR);
  186.    if((car = fgetc(fd))== '\n')
  187.       combinacion = 2;
  188.    else
  189.       combinacion = 1;
  190.    return combinacion;
  191. }
  192.  
  193. booleano esLetra(char caracter)
  194. {
  195.    if((caracter >= 'A' && caracter <= 'Z')||(caracter >= 'a' && caracter <= 'z'))
  196.       return 1;
  197.    else
  198.       return 0;
  199. }
  200.  
  201. booleano esNumero(char caracter)
  202. {
  203.    if(caracter >= '0' && caracter <= '9')
  204.       return 1;
  205.    else
  206.       return 0;
  207. }
  208.  
  209. char *Etiqueta_Codop_Operando(FILE *fd,int linea)
  210. {
  211.    int car,lon = 0,pos;
  212.    char *cadena;
  213.    fseek(fd,-1,SEEK_CUR);
  214.    pos = ftell(fd);
  215.    if((linea == ETIQUETA)||(linea == CODOP))
  216.    {
  217.        do
  218.        {
  219.            car = fgetc(fd);
  220.            lon++;
  221.        }while(car != '\t' && car != ' ' && car != '\n');
  222.    }
  223.    else
  224.    {
  225.        do
  226.        {
  227.            car = fgetc(fd);
  228.            lon++;
  229.        }while(car != '\n');
  230.    }
  231.    cadena = (char*)calloc((lon+1),sizeof(char));
  232.    fseek(fd,pos,SEEK_SET);
  233.    fgets(cadena,lon+1,fd);
  234.    quitarSaltosLinea(cadena);
  235.    return cadena;
  236. }
  237.  
  238. void erroresEtiqueta(char *etiqueta)
  239. {
  240.    int tam,i = 0,esEtiqueta = 1;
  241.    tam = strlen(etiqueta);
  242.    if(tam > LONG_ETIQUETA)
  243.       printf("\tError:la longitud maxima de una etiqueta es de 8 caracteres\n");
  244.    if(!esLetra(etiqueta[i]))
  245.       printf("\tError:la etiqueta debe iniciar con letra\n");
  246.    else
  247.    {
  248.        for(i = 0;(i < tam)&&(esEtiqueta);i++)
  249.        {
  250.           if((!esLetra(etiqueta[i]))&&(!esNumero(etiqueta[i]))&&(etiqueta[i] != '_'))
  251.              esEtiqueta = 0;
  252.        }
  253.        if(!esEtiqueta)
  254.           printf("\tError:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n");
  255.    }
  256. }
  257.  
  258. void erroresCodop(char *codop)
  259. {
  260.    int tam,i = 0,esCodop = 1,punto = 0;
  261.    tam = strlen(codop);
  262.    if(tam > LONG_CODOP)
  263.       printf("\tError:la longitud maxima de un codigo de operacion es de 5 caracteres\n");
  264.    if((strcmp(codop,"null"))== 0)
  265.       printf("\tError:siempre debe de haber un codigo de operacion\n");
  266.    else
  267.    {
  268.        if(!esLetra(codop[i]))
  269.        printf("\tError:los codigos de operacion deben iniciar con letra\n");
  270.        else
  271.        {
  272.            for(i = 1;(i < tam)&&(esCodop)&&(punto>=0&&punto<=1);i++)
  273.            {
  274.                if((!esLetra(codop[i]))&&(codop[i] != '.'))
  275.                   esCodop = 0;
  276.                else if(codop[i] == '.')
  277.                   punto++;
  278.            }
  279.            if(!esCodop)
  280.               printf("\tError:los caracteres validos en un codigo de operacion son letras y el caracter punto\n");
  281.            if(punto > 1)
  282.               printf("\tError:los codigos de operacion no pueden tener mas de un punto\n");
  283.        }
  284.    }
  285. }
  286.  
  287. void ultimaLinea(char *codop)
  288. {
  289.    int lon1,lon2,i;
  290.    lon1 = strlen(codop);
  291.    lon2 = strlen("end");
  292.    if(lon1 != lon2)
  293.       printf("Error: No se encontro el END.\n");
  294.    else
  295.    {
  296.        for(i = 0;codop[i];i++)
  297.           codop[i] = tolower(codop[i]);
  298.        if((strcmp(codop,"end")) != 0)
  299.           printf("Error: No se encontro el END.\n");
  300.    }
  301. }
  302.  
  303. void quitarSaltosLinea(char *cadena)
  304. {
  305.    char *ptr;
  306.    if(((ptr=strchr(cadena,'\n'))!=NULL)||((ptr=strchr(cadena,'\t'))!=NULL)||((ptr=strchr(cadena,' '))!=NULL))
  307.       *ptr = '\0';
  308. }
  309.  
  310. void listaTABOP(COD **cabeza)
  311. {
  312.    int car,i,pos,n;
  313.    FILE *hc12;
  314.    COD *ultimo = NULL;
  315.    char *ins,*op,**dir,**maq,**cal,**x_cal,**sum;
  316.    if((hc12 = fopen("TABOP.txt","r"))!= NULL)
  317.    {
  318.        while((car = fgetc(hc12))!= EOF)
  319.        {
  320.            i = 0;
  321.            ins = Tabla_Operandos(hc12,INS);
  322.            ignorarEspacios(hc12);
  323.            op = Tabla_Operandos(hc12,OP);
  324.            pos = ftell(hc12);
  325.            buscarFinLinea(hc12);
  326.            if((car = fgetc(hc12)) != '\t')
  327.            {
  328.                n = 0;
  329.                fseek(hc12,pos,SEEK_SET);
  330.                ignorarEspacios(hc12);
  331.                dir = (char**)malloc(sizeof(char*));
  332.                dir[i] = Tabla_Operandos(hc12,DIR);
  333.                ignorarEspacios(hc12);
  334.                maq = (char**)malloc(sizeof(char*));
  335.                maq[i] = Tabla_Operandos(hc12,MAQ);
  336.                ignorarEspacios(hc12);
  337.                cal = (char**)malloc(sizeof(char*));
  338.                cal[i] = Tabla_Operandos(hc12,CALCULADO);
  339.                ignorarEspacios(hc12);
  340.                x_cal = (char**)malloc(sizeof(char*));
  341.                x_cal[i] = Tabla_Operandos(hc12,CALCULAR);
  342.                ignorarEspacios(hc12);
  343.                sum = (char**)malloc(sizeof(char*));
  344.                sum[i] = Tabla_Operandos(hc12,TOTAL);
  345.                buscarFinLinea(hc12);
  346.            }
  347.            else
  348.            {
  349.                n = 1;
  350.                fseek(hc12,pos,SEEK_SET);
  351.                dir = (char**)malloc(MAX*sizeof(char*));
  352.                maq = (char**)malloc(MAX*sizeof(char*));
  353.                cal = (char**)malloc(MAX*sizeof(char*));
  354.                x_cal = (char**)malloc(MAX*sizeof(char*));
  355.                sum = (char**)malloc(MAX*sizeof(char*));
  356.                do
  357.                {
  358.                    ignorarEspacios(hc12);
  359.                    dir[i] = Tabla_Operandos(hc12,DIR);
  360.                    ignorarEspacios(hc12);
  361.                    maq[i] = Tabla_Operandos(hc12,MAQ);
  362.                    ignorarEspacios(hc12);
  363.                    cal[i] = Tabla_Operandos(hc12,CALCULADO);
  364.                    ignorarEspacios(hc12);
  365.                    x_cal[i] = Tabla_Operandos(hc12,CALCULAR);
  366.                    ignorarEspacios(hc12);
  367.                    sum[i] = Tabla_Operandos(hc12,TOTAL);
  368.                    buscarFinLinea(hc12);
  369.                    i++;
  370.                }while((car = fgetc(hc12)) == '\t');
  371.                fseek(hc12,-1,SEEK_CUR);
  372.            }
  373.            if(*cabeza == NULL)
  374.               *cabeza = crearNodo(ins,op,dir,maq,cal,x_cal,sum,n);
  375.            else
  376.            {
  377.                ultimo = ultimoElemento(cabeza);
  378.                insertarFinal(ins,op,dir,maq,cal,x_cal,sum,ultimo,n);
  379.            }
  380.        }
  381.    }
  382.    else
  383.       printf("No se pudo abrir el archivo");
  384. }
  385.  
  386. COD *ultimoElemento(COD **cabeza)
  387. {
  388.    COD *ptr;
  389.    ptr = *cabeza;
  390.    while(ptr->sig != NULL)
  391.       ptr = ptr->sig;
  392.    return ptr;
  393. }
  394.  
  395. char *Tabla_Operandos(FILE *hc12,int tabla)
  396. {
  397.    int car,lon = 0,pos;
  398.    char *cadena;
  399.    fseek(hc12,-1,SEEK_CUR);
  400.    pos = ftell(hc12);
  401.    if((tabla==INS)||(tabla==OP)||(tabla==DIR)||(tabla==MAQ)||(tabla==CALCULADO)||(tabla==CALCULAR))
  402.    {
  403.        do
  404.        {
  405.            car = fgetc(hc12);
  406.            lon++;
  407.        }while(car != '\t' && car != EOF);
  408.    }
  409.    else
  410.    {
  411.        do
  412.        {
  413.            car = fgetc(hc12);
  414.            lon++;
  415.        }while(car != '\n' && car != EOF);
  416.        lon--;
  417.    }
  418.    fseek(hc12,pos,SEEK_SET);
  419.    cadena = (char*)calloc((lon+1),sizeof(char));
  420.    fgets(cadena,lon+1,hc12);
  421.    quitarSaltosLinea(cadena);
  422.    return cadena;
  423. }
  424.  
  425. COD *buscarCodop(COD *cabeza,char *codop)
  426. {
  427.    int i;
  428.    COD *ptr;
  429.    for(i = 0;codop[i];i++)
  430.       codop[i] = toupper(codop[i]);
  431.    for(ptr = cabeza;ptr != NULL;ptr = ptr->sig)
  432.    {
  433.        if((strcmp(ptr->instruccion,codop)) == 0)
  434.           return ptr;
  435.    }
  436.    return NULL;
  437. }
  438.  
  439. void insertarFinal(char *ins,char *op,char **dir,char **maq,char **cal,char **x_cal,char **sum,COD *ultimo,int n)
  440. {
  441.    ultimo->sig = crearNodo(ins,op,dir,maq,cal,x_cal,sum,n);
  442.    ultimo->sig->sig = NULL;
  443.    ultimo = ultimo->sig;
  444. }
  445.  
  446. COD *crearNodo(char *ins,char *op,char **dir,char **maq,char **cal,char **x_cal,char **sum,int n)
  447. {
  448.    int tam,tam1,tam2,tam3,i;
  449.    COD *x;
  450.    x = (COD*)malloc(sizeof(COD));
  451.    tam = strlen(ins);
  452.    tam1 = strlen(op);
  453.    x->instruccion = (char*)malloc((tam+1)*sizeof(char));
  454.    x->operando = (char*)malloc((tam1+1)*sizeof(char));
  455.    strcpy(x->instruccion,ins);
  456.    strcpy(x->operando,op);
  457.    x->tipo_linea = n;
  458.    if(n == 1)
  459.    {
  460.        x->modo_direccionamiento = (char**)malloc(MAX*sizeof(char*));
  461.        x->codigo_maquina = (char**)malloc(MAX*sizeof(char*));
  462.        x->bytes_calculados = (char**)malloc(MAX*sizeof(char*));
  463.        x->bytes_x_calcular = (char**)malloc(MAX*sizeof(char*));
  464.        x->suma_bytes = (char**)malloc(MAX*sizeof(char*));
  465.        for(i = 0;i < MAX;i++)
  466.        {
  467.            tam2 = strlen(dir[i]);
  468.            x->modo_direccionamiento[i] = (char*)malloc((tam2+1)*sizeof(char));
  469.            strcpy(x->modo_direccionamiento[i],dir[i]);
  470.            tam3 = strlen(maq[i]);
  471.            x->codigo_maquina[i] = (char*)malloc((tam3+1)*sizeof(char));
  472.            strcpy(x->codigo_maquina[i],maq[i]);
  473.            x->bytes_calculados[i] = (char*)malloc(sizeof(char));
  474.            strcpy(x->bytes_calculados[i],cal[i]);
  475.            x->bytes_x_calcular[i] = (char*)malloc(sizeof(char));
  476.            strcpy(x->bytes_x_calcular[i],x_cal[i]);
  477.            x->suma_bytes[i] = (char*)malloc(sizeof(char));
  478.            strcpy(x->suma_bytes[i],sum[i]);
  479.        }
  480.    }
  481.    else
  482.    {
  483.        x->modo_direccionamiento = (char**)malloc(sizeof(char*));
  484.        x->codigo_maquina = (char**)malloc(sizeof(char*));
  485.        x->bytes_calculados = (char**)malloc(sizeof(char*));
  486.        x->bytes_x_calcular = (char**)malloc(sizeof(char*));
  487.        x->suma_bytes = (char**)malloc(sizeof(char*));
  488.        tam2 = strlen(dir[0]);
  489.        x->modo_direccionamiento[0] = (char*)malloc((tam2+1)*sizeof(char));
  490.        strcpy(x->modo_direccionamiento[0],dir[0]);
  491.        tam3 = strlen(maq[0]);
  492.        x->codigo_maquina[0] = (char*)malloc((tam3+1)*sizeof(char));
  493.        strcpy(x->codigo_maquina[0],maq[0]);
  494.        x->bytes_calculados[0] = (char*)malloc(sizeof(char));
  495.        strcpy(x->bytes_calculados[0],cal[0]);
  496.        x->bytes_x_calcular[0] = (char*)malloc(sizeof(char));
  497.        strcpy(x->bytes_x_calcular[0],x_cal[0]);
  498.        x->suma_bytes[0] = (char*)malloc(sizeof(char));
  499.        strcpy(x->suma_bytes[0],sum[0]);
  500.    }
  501.    x->sig = NULL;
  502.    return x;
  503. }
  504.  
  505. void verificarOperando(COD *encontrado,char *operando)
  506. {
  507.    if((strcmp(encontrado->operando,"SI")) == 0)
  508.    {
  509.        if((strcmp(operando,"null")) == 0)
  510.           printf("EL CODOP DEBE TENER OPERANDO\n");
  511.    }
  512.    else if((strcmp(encontrado->operando,"NO")) == 0)
  513.    {
  514.        if(!(strcmp(operando,"null")) == 0)
  515.           printf("EL CODOP NO DEBE TENER OPERANDO\n");
  516.    }
  517. }
  518.  
  519. void imprimirInfo(COD *p)
  520. {
  521.    int i,num_lineas;
  522.    printf("\n%s ",p->instruccion);
  523.    if(p->tipo_linea == 1)
  524.       num_lineas = MAX;
  525.    else
  526.       num_lineas = 1;
  527.    for(i = 0;i < num_lineas;i++)
  528.    {
  529.        printf("\t%s\t",p->modo_direccionamiento[i]);
  530.        printf("%s\t",p->codigo_maquina[i]);
  531.        printf("%s\t",p->bytes_calculados[i]);
  532.        printf("%s\t",p->bytes_x_calcular[i]);
  533.        printf("%s\n",p->suma_bytes[i]);
  534.    }
  535. }
  536.  

gracias de antemano


En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: problema con archivo de texto
« Respuesta #1 en: 24 Marzo 2014, 18:45 pm »

Estoy viendo que el fichero de entrada tiene:

Et12_xyz123     ADCA      1,PC
%ET3        LDAA      #$90
Netq%23        RMB      556
etv1
XYZ        Ldaaxyz   4
        %XYZ
        a.c.      %1111000
Abc        SWI%

y sólo en la primera línea empieza con "Et" (por cierto, 'E' en mayúsculas, 't' en minúsculas, ¿no tendrá eso que ver?). Lo que pregunto es si sólo las líneas que comiencen con la frase clave "ET", o "Et" se descomponen en ETIQUETA, CODOP y OPERANDO.


En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines