//--------------------------------------------------------------
// CODIZY.C
// Creado:    1998 - Esau R.O.
// IDE:     Borland C++ 3.1
//--------------------------------------------------------------
// Este programa surge a raiz de un asignacion en la UNFV
// del curso de Sistemas de comunicacion. Su objetivo es
// encriptar y desencriptar un archivo que se encuentre en [A:]
// (yo le agregue la capacidad de partir y reunir archivos)
// Actualmente no tiene ninguna utilidad a menos que quieras
// transportar archivos a una laptop antigua que solo tenga DOS
// con lectora de CD malograda como una vez me sucedi0...
// o estes buscando un ejemplo de como se usaban las funciones
// fopen(), fclose()... en esos arcanos tiempos  ;]
// Mi metodo de encriptacion resulto ser muy debil, una vez
// que tienes el algoritmo lo rompes en dos patadas pues el
// universo de claves resulto mas peque�o de lo que creia debido
// a un problema de periodicidad del que no me di cuenta
// entonces, ademas aqui lo he probado solo con archivos texto.
//--------------------------------------------------------------
// http://www.geocities.com/planeta_dev  [[email protected]]
//--------------------------------------------------------------

#include "codizy.h"


FILE *fpn;
char linea[81];
char archivo[81];
char debris[81];
long cod;
int ord;
int v_cod[128];
int v_ord[NC];


//-------------------------------
// FUNCIONES DE PANTALLA
//
void cuadro(int color)
{
  _cuadro(3,3,77,23,color);
}

void cuadro1(void)
{
  cuadro(13);
  _pon("    PROGRAMA CODIFICADOR",27,5,14);
  _pon("MENU PRINCIPAL",8,8,14);
  _pon("1:  SALIR",8,10,14);       _pon("SALE DEL MENU",30,10,12);
  _pon("2:  CREAR",8,11,14);       _pon("CREA UN NUEVO ARCHIVO CODIFICADO",30,11,12);
  _pon("3:  LEER",8,12,14);        _pon("LEE UN ARCHIVO DECODIFICANDOLO",30,12,12);
  _pon("4:  BORRAR",8,13,14);      _pon("ELIMINA UN ARCHIVO DEFINITIVAMENTE",30,13,12);
  _pon("5:  CODIFICAR",8,14,14);   _pon("CODIFICA UN ARCHIVO SIN MOSTRARLO",30,14,12);
  _pon("6:  OBSERVAR",8,15,14);    _pon("LEE UN ARCHIVO SIN DECODIFICARLO",30,15,12);
  _pon("7:  FRAGMENTAR",8,16,14);  _pon("DIVIDE UN ARCHIVO EN OTROS PEQUE�OS",30,16,12);
  _pon("8:  DEFRAGMENTAR",8,17,14);_pon("AGRUPA UN ARCHIVO EN VARIOS",30,17,12);
  _pon("CERCIORATE DE TENER UN DISKETT EN LA UNIDAD: A",8,21,13+BLINK);
  _pon("INGRESE NUMERO DE OPCION >",8,19,14);
}

void cuadro2()
{
  _cuadro(9,9,72,19,12);
  _pon("EJM:  (A:ARCHI.DAT)",19,15,12);
  _pon("NOMBRE DEL ARCHIVO> ",19,14,11);
}

//-------------------------------
// FUNCIONES CODIFICADORAS
//
void ordig(int n,int opi,int v[128],int d)
{
  int v_t[128], i, t;

  if (opi)  // (opi==1) ordena v_cod
  {
    v_t[0] = v[n-1];

    for(i=1;i<n;i++)
    {
      v_t[i]=v[(i*(2*d+1))%n-1];
    }
  }
  else    // ordena v_ord
  {
    if (d==0)  return;
    v_t[0]=v[n-1];
    for(i=1;i<n;i++)
    {
      v_t[i]=v[(i*d)%n-1];
    }
  }

  for(i=0;i<n;i++)
  {
    v[i]=v_t[i];
  }
}

long  cody(char archivo[81],int op)
{
  int  i ,j ,k ,s=0 ,p=0 ,nord ,tord;
  long l=0L, ncod;
  char c, cad[NC+1], c_t[NC+1];
  FILE *f1, *f2;

  //-------------------------------
  ncod=cod;  nord=ord;  tord=ord;

  if ((f2=fopen("A:TEMP$$","wb")) == NULL)
  {
    _pon("NO SE PUDO CREAR>  A:TEMP$$",19,15,13); return(0);
  }
  else
  {
    if ((f1=fopen(archivo,"rb")) == NULL)
    {
      _pon("NO SE PUEDE LEER ARCHIVO",19,15,13); return(0);
    }
    else
    {
      for(i=0;i<128;i++)  v_cod[i]=i+32;
      for(i=0;i<NC;i++)   v_ord[i]=i;

      do
      {
        i=ncod%10;
        ordig(128,1,v_cod,i);
        ncod=ncod/10;

      } while (ncod > 0);

      do
      {
        i=nord%10;
        ordig(NC,0,v_ord,i);
        nord=nord/10;

      } while (nord > 0);

      do
      {
        i=0;

        do
        {
          c=fgetc(f1);
          cad[i]=c;
          l++;i++;
          if (c==EOF) {s=1;break;}

        } while (i<NC);

        cad[NC]='\0';

        if(s)                // No reordenamos la ultima cadena.
        {
          for (i=0;i<NC;i++)
          {
            c=cad[i];
            if (c==EOF)
            {
              fputc(c,f2); fclose(f1); fclose(f2); return(l);
            }
            else
            {
              k = c_i(c);
              if ((k>31) && (k<160))     //Evitamos tocar '\0' - '\31'
              {
                if (op)           //debido a tener algunos caracteres
                {
                  c=v_cod[(k-32+p)%128];  //de control ('\26')
                }
                else
                {
                  for (j=0;j<128;j++) 
                  {
                    if (c==(char)v_cod[j]) break;
                  }

                  if (j<p)
                  {
                    c=160+j-p;
                  }
                  else
                  {
                    c=j+32-p;
                  }
                }
              }
            }

            fputc(c,f2);
          }
        }
        else        // Reordenamos la cadena
        {
          for (i=0;i<NC;i++)
          {
            if (op)
            {
              c_t[i]=cad[v_ord[i]];
            }
            else
            {
              c_t[v_ord[i]]=cad[i];
            }
          }

          c_t[NC]=cad[NC]='\0';    // !

          strcpy(cad,c_t);
          tord= tord+(tord/100)+(tord%100)/10+(tord%10);
          nord=tord%10;
          ordig(NC,0,v_ord,nord);  // Recalculamos v_ord

          if (tord>10000)
          {
            tord=ord;
          }

          for (i=0;i<NC;i++)
          {
            c=cad[i];
            k=c_i(c);

            if ((k>31) && (k<160))     //Evitamos tocar '\0' - '\31'
            {
              if (op)           //debido a tener algunos caracteres
              {
                c=v_cod[(k-32+p)%128];  //de control ('\26')
              }
              else
              {
                for (j=0;j<128;j++)
                {
                  if (c==(char)v_cod[j]) break;
                }

                if (j<p)
                {
                  c=160+j-p;
                }
                else
                {
                  c=j+32-p;
                }
              }
            }
            fputc(c,f2);
          }

          p++;

          if (p>128) p=0;
        }
      } while(1);
    }
  }
}

//-------------------------------
// Borrar archivo
//
void borrar_archivo(char archivo[81],long tam)
{
  long l;

  if ((fpn = fopen(archivo,"wb")) != NULL)
  {
    for (l=0L; l<tam; l++)
    {
      fputc('X',fpn);
    }

    fclose(fpn);
    remove(archivo);
  }
}

//-------------------------------
// Fragmentador
//
void fragmentar()
{
  long int tam, i, salir=0, p=0;
  int num_archi=1, dat=0, nch;  short int sh;
  FILE *f1, *f2, *f3;
  char ch, ch1, *pch, archivodatos[81], archivoini[81];

  clrscr();
  printf("\n\n   -----------------------------------------------------");
  printf("\n   INGRESE EL CAMINO Y NOMBRE DEL ARCHIVO A FRAGMENTARSE\n    : ");
  l_cad(archivo);
  if ((f1=fopen(archivo,"rb"))==NULL)
  {
    printf("\n   NO SE PUDO ABRIR  ARCHIVO %s\n   <PRESIONA CUALQUIER TECLA> ",archivo);
    getch();
    return;
  }
  else
  {
    strcpy(archivoini,archivo);
    pch=strchr(archivo,'.');
    if(pch!=NULL)
      *pch='\0';
    strcat(archivo,".$$$");
    strcpy(archivodatos,archivo);

    if ((f3=fopen(archivodatos,"wb"))==NULL)
    {
      printf("\n   NO SE PUDO ABRIR  ARCHIVO %s\n   <NO SE GUARDARAN LOS NOMBRES DE LOS ARCHIVOS FRAGMENTADOS> ",archivodatos);
      getch();
      return;
    }
    else
    {
      dat=1;
      strcpy(archivodatos,archivo);
      fprintf(f3,"ARCHIVO ORIGEN>>%s\nHACIA:\n",archivoini);
    }
    
    do
    {
      do
      {
        printf("\n   INGRESA EL NOMBRE DEL ARCHIVO DESTINO NUMERO: %d\n    : ",num_archi);
        l_cad(archivo);
        if ((f2=fopen(archivo,"wb"))==NULL)
        {
          printf("\n   NO SE PUDO CREAR ARCHIVO %s",archivo);
          printf("\n   REINTENTAR? (S/N)  :   ");
          ch=getche();
          if (ch=='S'||ch=='s')
            continue;
          else
          {
            fclose(f1);
            if (dat)
              fclose(f3);
            return;
          }
        }
        else
          break;
      }while(ch=='s'||ch=='S');
      
      printf("\n   INGRESA EL TAMA�O DEL ARCHIVO  (EN KBYTES)\n    : ");
      l_cad(linea);
      tam=atol(linea);
      printf("\n   QUIERES GUARDAR EL ARCHIVO : ""%s"" DE %ld KBYTES?  (S/N):   ",archivo,tam);
      ch=getche();
      if (ch=='n'||ch=='N')
      {
        fclose(f1);
        fclose(f2);
        if(dat) 
          fclose(f3);
        return;
      }

      tam*=1000L;
      for(i=0;i<tam;i++)
      {
        nch=fgetc(f1);  //Lee un caracter del archivo
        p++;      //numero de caracteres leidos
        if(feof(f1))
        {
          salir=1;
          break;
        }
        fputc(nch,f2);
      }

      fclose(f2);
      fprintf(f3,"ARCHIVO NUMERO:%d\nNOMBRE>>%s\n",num_archi,archivo);
      num_archi++;
    }while(!salir);

    printf("\n   LA FRAGMENTACION SE HA LLEVADO A CABO\n");
    if (dat) printf("   ARCHIVO DE AYUDA:%s\n   <PULSE ENTER>",archivodatos);
    fclose(f3);
    fclose(f1);
    getch();
  }
}

//-------------------------------
// Defragmentador
//
void defragmentar()
{
  long int tam, i, salir=0, p=0;
  int num_archi=1, nch;  short int sh;
  FILE *f1, *f2;
  char ch, ch1, *pch, archivodatos[81], archivoini[81];

  clrscr();
  printf("\n\n   -----------------------------------------------------");
  printf("\n   INGRESE NOMBRE DEL ARCHIVO QUE SE FORMARA\n    : ");
  l_cad(archivo);
  if ((f1=fopen(archivo,"wb"))==NULL)
  {
    printf("\n   NO SE PUDO CREAR ARCHIVO %s\n   <PRESIONA CUALQUIER TECLA> ",archivo);
    getch();
    return;
  }
  else
  {
    do
    {
      do
      {
        printf("\n   INGRESA EL NOMBRE DEL ARCHIVO ORIGEN NUMERO: %d\n    : ",num_archi);
        l_cad(archivo);
        if(!strcmp(archivo,"<fin>"))
        {
          fclose(f1);
          return;
        }

        if ((f2=fopen(archivo,"rb"))==NULL)
        {
          printf("\n   NO SE PUDO LEER ARCHIVO %s",archivo);
          printf("\n   REINTENTAR? (S/N)  :   ");
          ch=getche();
          if (ch=='S'||ch=='s')
            continue;
          else
          {
            fclose(f1);
            return;
          }
        }
        else
          break;
      }while(ch=='s'||ch=='S');

      do
      {
        nch=fgetc(f2); //Lee un caracter del archivo
        p++;          //numero de caracteres leidos
        if(feof(f2))
        {
          break;
        }
        fputc(nch, f1);
      }while(nch!=EOF);

      fclose(f2);
      num_archi++;

    }while(!salir);

    printf("\n   LA DEFRAGMENTACION SE HA LLEVADO A CABO\n");
    fclose(f1);
    getch();
  }
}

//-------------------------------
//FUNCIONES DEL MENU
//
void crear()
{
  long l;

  strcpy(archivo,"");
  cuadro2();
  gotoxy(40,14);  l_cad(archivo);
  gotoxy(40,14);

  if ((fpn=fopen(archivo,"wt"))==NULL)
  {
    _pon("NO SE PUDO CREAR ARCHIVO",19,15,12);
    getch();
    return;
  }
  else
  {
    clrscr();
    _pon("                    A CONTINUACION ESCRIBE EL MENSAJE",3,3,11);
    _pon("                    (ESCRIBE:  <FIN>  PARA  TERMINAR)",3,4,12);
    _pon("  -----------------------------------------------------------------------",3,5,12);
    putchar('\n');

    while(1)
    {
      printf("    ");
      gets(linea);
      fprintf(fpn,"%s\n",linea);

      if (strcmpi(linea,"<FIN>")==0)
      {
        break;
      }
    }

    puts("\n    EL ARCHIVO ESTA HECHO");
    gotoxy(5,wherey()-1);
    fclose(fpn);
    l=cody(archivo,1);
    printf("\n    SE HAN CODIFICADO: %ld  CARACTERES",l);
    printf("\n    PRESIONA <ENTER>");
    borrar_archivo(archivo,l);
    rename("A:TEMP$$",archivo);
    getch();
  }
}

void leer()
{
  char c;
  char archivo_guardado[81];
  int i=1;long l;

  strcpy(archivo,"");
  cuadro2();
  gotoxy(40,14);  l_cad(archivo);
  gotoxy(40,14);

  if ((fpn=fopen(archivo,"rt"))==NULL)
  {
    _pon("NO SE PUDO ABRIR EL ARCHIVO.",19,15,13);
    getch();
    return;
  }
  else
  {
    fclose(fpn);

    if ((l=cody(archivo,0)) != 0)
    {
      if ((fpn=fopen("A:TEMP$$","rt"))==NULL)
      {
        _pon("NO SE PUDO ABRIR EL ARCHIVO TEMPORAL.",19,15,13);
        getch();
        return;
      }

      do
      {
        clrscr();
        _pon("                   A CONTINUACION SE DA EL MENSAJE",3,3,14);
        _pon("  ----------------------------------------------------------------------",3,4,12);
        textcolor(15);
        putchar('\n');

        c='s';
        while (c=='s'||c=='S')
        {
          cprintf("    ");i++;

          if (fgets(linea,81,fpn) == NULL)
          {
            goto SALIR;
          }

          cprintf("%s\r",linea);

          if (strcmpi (linea,"<FIN>\n") == 0)
          {
            goto SALIR;
          }

          if ((i % 17) == 0)
          {
            _pon("�QUIERES SEGUIR? (S/N) ",27,24,7);
            c = getche();
            if (c=='N'||c=='n')
            {
              goto SALIR;
            }
            else
            {
              i = 17;
              break;
            }
          }
        }

      } while (1);
SALIR:
      _pon("FINAL DEL ARCHIVO. PRESIONA CUALQUIER TECLA.",18,24,7);
      getch();

      cuadro2();
      _pon("                        ",19,15,14);
      _pon("�QUIERES GUARDAR ESTE ARCHIVO EN EL DISKETT? (S/N)>  ",15,14,14);
      c=getche();

      if (c=='s'||c=='S')
      {
        _pon("�CON QUE NOMBRE?  (A:ARCHI:TXT)  >> ",15,15,14);
        l_cad(archivo_guardado);
        gotoxy(15,15);
        fclose(fpn);
        i = rename("A:TEMP$$.",archivo_guardado);
        if (i == 0)
        {
          _pon("SE HA GUARDADO EL ARCHIVO: ",15,16,14);
          puts(archivo_guardado);gotoxy(42,16);
          getch();
        }
        else
        {
          _pon("NOMBRE NO VALIDO.   NO SE GUARDO EL ARCHIVO",15,16,15);
          borrar_archivo("A:TEMP$$",l);
          getch();
        }
      }
      else
      {
        _pon("PRESIONA CUALQUIER TECLA.",15,15,15);
        gotoxy(15,14);
        fclose(fpn);
        borrar_archivo("A:TEMP$$",l);
        getch();
      }
    }
  }
}

void borrar()
{
  char c;long l=0L;

  strcpy(archivo,"");
  _cuadro(9,9,72,19,12);
  _pon("NOMBRE DEL ARCHIVO>",19,12,11);
  gotoxy(40,12);
  
  l_cad(archivo);

  _pon("ESTAS SEGURO QUE QUIERES BORRAR: ",19,13,12);
  _pon(archivo,19,14,15);
  _pon("(S/N)>> ",19,15,12);

  c=getche();

  if (c=='S')
  {
    if ((fpn = fopen(archivo,"rb")) == NULL)
    {
      _pon("NO SE PUDO ABRIR DICHO ARCHIVO.",19,16,13);
      getch();
      return ;
    }
    else
    {
      while ((c = fgetc(fpn)) != EOF ) 
      {
        l++ ;
      }

      fclose(fpn);

      puts("  SE BORRARA EL ARCHIVO.");
      _pon("NUMERO DE CARACTERES A BORRARSE: ",19,16,12) ;
      printf("%ld",l);
      _pon("�ESTAS SEGURO DE HACERLO? (S/N)>>",19,17,13);

      c=getche();

      if (c=='S')
      {
        borrar_archivo(archivo,l);
        _pon("ARCHIVO BORRADO.",19,18,13);
        getch();
      }
      else
      {
        _pon("NO SE HA BORRADO NINGUN ARCHIVO.",19,18,13);
        getch();
      }
    }
  }
  else
  {
    _pon("NO SE BORRARA NINGUN ARCHIVO.",19,16,13);
    getch();
  }
}

void codificar()
{
  long l; int n, b;  char archivo2[81];

  strcpy(archivo,"");
  cuadro2();
  gotoxy(40,14);
  
  l_cad(archivo);

  gotoxy(40,14);

  if ((fpn = fopen(archivo,"rb")) == NULL)
  {
    _pon("NO SE PUDO LEER ARCHIVO",19,15,12);
    getch();return;
  }
  else
  {
    fclose(fpn);
    l=cody(archivo,1);
    _pon("SE HAN CODIFICADO:  ",19,15,13);printf("%ld CARACTERES",l);
    do
    {
      n=0;
      _pon("NOMBRE DEL ARCHIVO DE DESTINO: ",19,16,12);
      _pon("                                          ",19,17,12);
      _pon("PARA SALIR:    <x>",19,18,12);
      gotoxy(19,17);

      l_cad(archivo2);

      if (!strcmpi ("x",archivo2))
      {
        n=1;break;
      }

      b=rename("A:TEMP$$",archivo2);

    } while( b!=0 );

    _pon("PRESIONA CUALQUIER TECLA.",19,18,12);
    if (n==1)
    {
      remove("A:TEMP$$");
    }
    getch();
  }
}

void observar()
{  
  int i, j, pg=0; char c ;

  strcpy(archivo,"");
  cuadro2();
  gotoxy(40,14);  
  
  l_cad(archivo);
  
  gotoxy(40,14);
  
  if ((fpn = fopen(archivo,"rb")) == NULL)
  {
    _pon("NO SE PUDO ABRIR EL ARCHIVO.",19,15,13);
    getch(); return;
  }
  else
  {
    do
    {
      clrscr();
      pg++;

      for (i=0; i<15; i++)
      {
        printf("\n\n    ESTA ES LA RELACION DE CARACTERES EN EL ARCHIVO>  %s\n",archivo);
        printf("    ---------------------PAGINA : %d ---------------\n\n    ",pg);

        for (j=0; j<75; j++)
        {
          c=fgetc(fpn);

          putchar(c);

          if (c == '\n') {i++;printf("    ");j=0;}

          if (c == EOF) break;

          if (i > 14)  break;
        }

        if (c == EOF)
        {
          printf("\n    FINAL. PRESIONE CUALQUIER TECLA.");
          getch();
          return;
        }

        printf("\n    ");
      }

      printf("\n\n    �SEGUIR?  (S/N)");
      c=getche();

    } while ( (c=='s')||(c=='S') );

    fclose(fpn);
    printf("    PRESIONE CUALQUIER TECLA.");
    getch();
  }
}

int  caratula()
{
  int i; long l;

  cuadro(LIGHTGREEN);

  for (i=1; i<12; i++) _pon("PROGRAMA CODIFICADOR",30,4+i,GREEN+BLINK);

  _pon("PROGRAMA CODIFICADOR",30,16,YELLOW);
  _pon("INGRESE CODIGO :",25,18,14);

  while(1)
  {
    _pon("                     ",44,18,10);
    gotoxy(44,18);
    l_cad(linea);

    if (strlen(linea) <= 9)
    {
      if ((l = atol(linea)) != 0)
      {
        if ((cod = l/1000) >= 100000)
        {
          if ((ord = l % 1000) >= 100)
          {
            _pon("TU CODIGO HA SIDO ACEPTADO!!",25,19,LIGHTGREEN);
            _pon("PRESIONA CUALQUIER TECLA.",25,20,RED);
            getch();
            gotoxy(44,18);
            return(1);
          }
        }
       }
    }

    _pon("EL CODIGO NO ES VALIDO!!",25,19,LIGHTRED);
    _pon("(NUMERO DE NUEVE CIFRAS)",25,20,LIGHTRED);
  }
}

//-------------------------------
// FUNCION PRINCIPAL
//
void main()
{
  int c=0;

  if (caratula())
  {
    while (1)
    {
      cuadro1();

      do
      {
        _pon("                          ",34,19,10);
        gotoxy(34,19);
        l_cad(linea);

        if (strlen (linea) > 2)
        {
          c=0; continue;
        }

        c = atoi(linea);

      } while ((c < 1) || (c > 8));

      gotoxy(34,19);

      switch(c)
      {
        case 1:exit(1);       break;
        case 2:crear();       break;
        case 3:leer();        break;
        case 4:borrar();      break;
        case 5:codificar();   break;
        case 6:observar();    break;
        case 7:fragmentar();  break;
        case 8:defragmentar();  break;
      }
    }
  }
}
Hosted by www.Geocities.ws

1