home *** CD-ROM | disk | FTP | other *** search
/ Hot Shareware 32 / hot34.iso / ficheros / VDOC / NOME6.ZIP / REGALOS / NEORIP.ARJ / NEORIP / NEORIP.C < prev    next >
C/C++ Source or Header  |  1997-12-31  |  7KB  |  245 lines

  1. /*
  2. ---------------------------------------------------------------------
  3. |                                                                   |
  4. |    Autor.: Luis Arriaga Sanchez (Psi5).                        |
  5. |                                                                   |
  6. |       NeoBook es una marca registrada de NeoSoft Corp.            |
  7. |                                                                   |
  8. |    Este programa es freeware; puedes utilizarlo y copiarlo;    |
  9. |    siempre que lo hagas en su forma original (tal y como lo    |
  10. |    recibiste) y no cobres nada por él.                |
  11. |                                                                   |
  12. |    Aclaracion.: El autor de este programa no se hace           |
  13. |    responsable (en caso de producirse) de los daños directos   |
  14. |    o indirectos de cualquier tipo causados por su uso o        |
  15. |    manipulacion.                                               |
  16. |                                                                   |
  17. |    Aquellos que esten interesados pueden contactar conmigo     |
  18. |    por E-Mail en.: luarsan@canaldinamic.es o por correo        |
  19. |       normal en.:                                                 |
  20. |                                                                   |
  21. |    Via Tarpeya. Urb. Valdecabas Nº32                           |
  22. |    45007 TOLEDO                                                |
  23. |                                                                   |
  24. ---------------------------------------------------------------------
  25. */
  26.  
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <string.h>
  30. #include <conio.h>
  31. #include <pc.h>
  32. #include <keys.h>
  33.  
  34. #define    MENSLNG    8
  35.  
  36. typedef    struct
  37.     {
  38.     char     nombre[13];
  39.     int    despl;
  40.     int    longitud;
  41.     char    flag;
  42.     } fichreg;
  43.  
  44. fichreg *ficheros;
  45.  
  46. char *cadena_magica="Copyright (c) Genus Microprogramming, Inc.";
  47.  
  48. char *mensaje[MENSLNG]=
  49.     {
  50.     "    Utilice las teclas de movimiento     ",
  51.     "      del cursor y el espacio para       ",
  52.     "   seleccionar los ficheros que desee.   ",
  53.     "                                         ",
  54.     "  Una vez realizada/s su/s seleccion/es  ",
  55.     "   pulse 'G' para guardar los ficheros.  ",
  56.         "                                         ",
  57.         "       Si quiere abortar pulse F10.      "
  58.     };
  59.  
  60. int actpos=0, actlin=0, numfichs=0;
  61.  
  62. void actualiza_listado(void);
  63. int fbusca_cadena(char *cadena, FILE *fichero);
  64.  
  65. main(int argc, char *argv[])
  66. {
  67. FILE *entrada, *salida;
  68. int fichact, ultecl=0, i, desplaz, endval=0;
  69. char *buffer;
  70.  
  71. if(argc<2)
  72.     {
  73.     puts("Error: Debe especificar el fichero a procesar.");
  74.     exit(-1);
  75.     }
  76. if((entrada=fopen(argv[1], "rb"))==NULL)
  77.     {
  78.     printf("Error: No se pudo abrir el fichero \"%s\"\n", argv[1]);
  79.     exit(-1);
  80.     }
  81.  
  82. /*Comprobamos si el fichero está hecho o no con NeoBook*/
  83. desplaz = fbusca_cadena(cadena_magica, entrada);
  84. if(desplaz<0)
  85.         {
  86.         printf("Error: El fichero %s no es procesable por NEORIP (lo siento).\n", argv[1]);
  87.         fclose(entrada);
  88.         exit(-1);
  89.         }
  90.  
  91. /*Contamos los ficheros*/
  92. fseek(entrada, desplaz+126+26-2, SEEK_SET);
  93. i=0;
  94. fread(&i, 2, 1, entrada);
  95. while(i==0)
  96.     {
  97.     ++numfichs;
  98.     fseek(entrada, 26-2, SEEK_CUR);
  99.         fread(&i, 2, 1, entrada);
  100.     }
  101.  
  102. /*Cargamos la información de los ficheros*/
  103. ficheros=malloc(sizeof(fichreg)*numfichs);
  104. fseek(entrada, desplaz+127, SEEK_SET);
  105. for(i=0; i<numfichs; ++i)
  106.     {
  107.     fread(&ficheros[i].nombre, 13,    1, entrada);
  108.         fread(&ficheros[i].despl, 4,    1, entrada);
  109.         fread(&ficheros[i].longitud, 4,    1, entrada);
  110.     ficheros[i].flag=0;
  111.     ficheros[i].despl+=desplaz-2;
  112.     fseek(entrada, 5, SEEK_CUR);
  113.     }
  114.  
  115. /*Mostramos el mensaje*/
  116. clrscr();
  117. _setcursortype(_NOCURSOR);
  118. for(i=0; i<MENSLNG; ++i)
  119.     {
  120.     ScreenPutString(mensaje[i], LIGHTGRAY, 39, i+12-MENSLNG/2);
  121.     }
  122.  
  123. /*Comienza la selección*/
  124. actualiza_listado();
  125. while(ultecl!='g' && ultecl!='G')
  126.     {
  127.     ultecl=getkey();
  128.     switch(ultecl)
  129.         {
  130.         case K_Space:
  131.             ficheros[actpos+actlin].flag = !ficheros[actpos+actlin].flag;
  132.                         if(++actlin==25)
  133.                                 {
  134.                                 --actlin;
  135.                                 if(++actpos==numfichs-25) --actpos;
  136.                                 }
  137.             break;
  138.  
  139.         case K_Up:
  140.             if(--actlin<0)
  141.                                 {
  142.                     ++actlin;
  143.                                 if(--actpos<0) ++actpos;
  144.                                 }
  145.             break;
  146.  
  147.                 case K_Down:
  148.                         if(++actlin==25)
  149.                                 {
  150.                                 --actlin;
  151.                                 if(++actpos==numfichs-25) --actpos;
  152.                                 }
  153.                         break;
  154.  
  155.                 case K_F10:
  156.                         clrscr();
  157.                         _setcursortype(_NORMALCURSOR);
  158.                         puts("Abortando...");
  159.                         exit(-1);
  160.                         break;
  161.  
  162.                 }
  163.         actualiza_listado();
  164.         }
  165.  
  166. /*Escribimos los ficheros*/
  167. clrscr();
  168. for(i=0; i<numfichs; ++i)
  169.          {
  170.          if(ficheros[i].flag)
  171.                 {
  172.                 if((salida=fopen(ficheros[i].nombre, "wb"))==NULL)
  173.                         {
  174.                         printf("Error: No se pudo escribir el fichero \"%s\"\n", ficheros[i].nombre);
  175.                         _setcursortype(_NORMALCURSOR);
  176.                         exit(-1);
  177.                         }
  178.  
  179.                 fseek(entrada, ficheros[i].despl, SEEK_SET);
  180.                 buffer=malloc(ficheros[i].longitud);
  181.                 fread(buffer, 1, ficheros[i].longitud, entrada);
  182.                 fwrite(buffer, 1, ficheros[i].longitud, salida);
  183.                 free(buffer);
  184.                 fclose(salida);
  185.                 }
  186.          }
  187.  
  188. /*Adiós*/
  189. clrscr();
  190. _setcursortype(_NORMALCURSOR);
  191. ScreenPutString("Este programa es FREEWARE.",  WHITE, 0, 0);
  192. ScreenPutString("Programado por Psi5 (1998).", WHITE, 0, 1);
  193. ScreenPutString("Si quieres contactar conmigo... luarsan@canaldinamic.es", WHITE, 0, 2);
  194. gotoxy(0, 3);
  195. fclose(entrada);
  196. return(0);
  197. }
  198.  
  199. void actualiza_listado(void)
  200. {
  201. char tmp[80];
  202. int atributo, i;
  203.  
  204. for(i=0; i<26; ++i)
  205.          ScreenPutString("   ", BLACK, 0, i);
  206.  
  207. for(i=0; i<26 && actpos+i<numfichs; ++i)
  208.          {
  209.          if(actpos+i == actpos+actlin)
  210.                 atributo=((WHITE<<4) | BLACK) & 0x7f;
  211.          else   atributo=LIGHTGRAY;
  212.  
  213.          if(ficheros[actpos+i].flag)
  214.                 ScreenPutString("* ", atributo, 1, i);
  215.          else
  216.                 ScreenPutString("  ", atributo, 1, i);
  217.  
  218.          sprintf(tmp, "%12s  %9d bytes   |", ficheros[actpos+i].nombre, ficheros[actpos+i].longitud);
  219.          ScreenPutString(tmp, atributo, 3, i);
  220.          }
  221. }
  222.  
  223. int fbusca_cadena(char *cadena, FILE *fichero)
  224. {
  225. int i=0, tamcad;
  226. char tmp;
  227.  
  228. tamcad=strlen(cadena);
  229. while(i<tamcad)
  230.         {
  231.         tmp=fgetc(fichero);
  232.         if(cadena[i]==tmp) ++i;
  233.         else if (i!=0)
  234.                 {
  235.                 i=0;
  236.                 ungetc(tmp, fichero);
  237.                 }
  238.         }
  239.  
  240. if(i==tamcad)
  241.         return(ftell(fichero)-tamcad);
  242.  
  243. else    return(-1);
  244. }
  245.