home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Hot Shareware 32
/
hot34.iso
/
ficheros
/
VDOC
/
NOME6.ZIP
/
REGALOS
/
NEORIP.ARJ
/
NEORIP
/
NEORIP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1997-12-31
|
7KB
|
245 lines
/*
---------------------------------------------------------------------
| |
| Autor.: Luis Arriaga Sanchez (Psi5). |
| |
| NeoBook es una marca registrada de NeoSoft Corp. |
| |
| Este programa es freeware; puedes utilizarlo y copiarlo; |
| siempre que lo hagas en su forma original (tal y como lo |
| recibiste) y no cobres nada por él. |
| |
| Aclaracion.: El autor de este programa no se hace |
| responsable (en caso de producirse) de los daños directos |
| o indirectos de cualquier tipo causados por su uso o |
| manipulacion. |
| |
| Aquellos que esten interesados pueden contactar conmigo |
| por E-Mail en.: luarsan@canaldinamic.es o por correo |
| normal en.: |
| |
| Via Tarpeya. Urb. Valdecabas Nº32 |
| 45007 TOLEDO |
| |
---------------------------------------------------------------------
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <pc.h>
#include <keys.h>
#define MENSLNG 8
typedef struct
{
char nombre[13];
int despl;
int longitud;
char flag;
} fichreg;
fichreg *ficheros;
char *cadena_magica="Copyright (c) Genus Microprogramming, Inc.";
char *mensaje[MENSLNG]=
{
" Utilice las teclas de movimiento ",
" del cursor y el espacio para ",
" seleccionar los ficheros que desee. ",
" ",
" Una vez realizada/s su/s seleccion/es ",
" pulse 'G' para guardar los ficheros. ",
" ",
" Si quiere abortar pulse F10. "
};
int actpos=0, actlin=0, numfichs=0;
void actualiza_listado(void);
int fbusca_cadena(char *cadena, FILE *fichero);
main(int argc, char *argv[])
{
FILE *entrada, *salida;
int fichact, ultecl=0, i, desplaz, endval=0;
char *buffer;
if(argc<2)
{
puts("Error: Debe especificar el fichero a procesar.");
exit(-1);
}
if((entrada=fopen(argv[1], "rb"))==NULL)
{
printf("Error: No se pudo abrir el fichero \"%s\"\n", argv[1]);
exit(-1);
}
/*Comprobamos si el fichero está hecho o no con NeoBook*/
desplaz = fbusca_cadena(cadena_magica, entrada);
if(desplaz<0)
{
printf("Error: El fichero %s no es procesable por NEORIP (lo siento).\n", argv[1]);
fclose(entrada);
exit(-1);
}
/*Contamos los ficheros*/
fseek(entrada, desplaz+126+26-2, SEEK_SET);
i=0;
fread(&i, 2, 1, entrada);
while(i==0)
{
++numfichs;
fseek(entrada, 26-2, SEEK_CUR);
fread(&i, 2, 1, entrada);
}
/*Cargamos la información de los ficheros*/
ficheros=malloc(sizeof(fichreg)*numfichs);
fseek(entrada, desplaz+127, SEEK_SET);
for(i=0; i<numfichs; ++i)
{
fread(&ficheros[i].nombre, 13, 1, entrada);
fread(&ficheros[i].despl, 4, 1, entrada);
fread(&ficheros[i].longitud, 4, 1, entrada);
ficheros[i].flag=0;
ficheros[i].despl+=desplaz-2;
fseek(entrada, 5, SEEK_CUR);
}
/*Mostramos el mensaje*/
clrscr();
_setcursortype(_NOCURSOR);
for(i=0; i<MENSLNG; ++i)
{
ScreenPutString(mensaje[i], LIGHTGRAY, 39, i+12-MENSLNG/2);
}
/*Comienza la selección*/
actualiza_listado();
while(ultecl!='g' && ultecl!='G')
{
ultecl=getkey();
switch(ultecl)
{
case K_Space:
ficheros[actpos+actlin].flag = !ficheros[actpos+actlin].flag;
if(++actlin==25)
{
--actlin;
if(++actpos==numfichs-25) --actpos;
}
break;
case K_Up:
if(--actlin<0)
{
++actlin;
if(--actpos<0) ++actpos;
}
break;
case K_Down:
if(++actlin==25)
{
--actlin;
if(++actpos==numfichs-25) --actpos;
}
break;
case K_F10:
clrscr();
_setcursortype(_NORMALCURSOR);
puts("Abortando...");
exit(-1);
break;
}
actualiza_listado();
}
/*Escribimos los ficheros*/
clrscr();
for(i=0; i<numfichs; ++i)
{
if(ficheros[i].flag)
{
if((salida=fopen(ficheros[i].nombre, "wb"))==NULL)
{
printf("Error: No se pudo escribir el fichero \"%s\"\n", ficheros[i].nombre);
_setcursortype(_NORMALCURSOR);
exit(-1);
}
fseek(entrada, ficheros[i].despl, SEEK_SET);
buffer=malloc(ficheros[i].longitud);
fread(buffer, 1, ficheros[i].longitud, entrada);
fwrite(buffer, 1, ficheros[i].longitud, salida);
free(buffer);
fclose(salida);
}
}
/*Adiós*/
clrscr();
_setcursortype(_NORMALCURSOR);
ScreenPutString("Este programa es FREEWARE.", WHITE, 0, 0);
ScreenPutString("Programado por Psi5 (1998).", WHITE, 0, 1);
ScreenPutString("Si quieres contactar conmigo... luarsan@canaldinamic.es", WHITE, 0, 2);
gotoxy(0, 3);
fclose(entrada);
return(0);
}
void actualiza_listado(void)
{
char tmp[80];
int atributo, i;
for(i=0; i<26; ++i)
ScreenPutString(" ", BLACK, 0, i);
for(i=0; i<26 && actpos+i<numfichs; ++i)
{
if(actpos+i == actpos+actlin)
atributo=((WHITE<<4) | BLACK) & 0x7f;
else atributo=LIGHTGRAY;
if(ficheros[actpos+i].flag)
ScreenPutString("* ", atributo, 1, i);
else
ScreenPutString(" ", atributo, 1, i);
sprintf(tmp, "%12s %9d bytes |", ficheros[actpos+i].nombre, ficheros[actpos+i].longitud);
ScreenPutString(tmp, atributo, 3, i);
}
}
int fbusca_cadena(char *cadena, FILE *fichero)
{
int i=0, tamcad;
char tmp;
tamcad=strlen(cadena);
while(i<tamcad)
{
tmp=fgetc(fichero);
if(cadena[i]==tmp) ++i;
else if (i!=0)
{
i=0;
ungetc(tmp, fichero);
}
}
if(i==tamcad)
return(ftell(fichero)-tamcad);
else return(-1);
}