home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d8xx
/
d887
/
segtextmaster.lha
/
SegTextMaster
/
Examples
/
example.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-16
|
3KB
|
215 lines
/*
** example.c
**
** written in 1993 by Titus v. Kraft
**
** compiler: maxon-c++
**
**
**
** routines:
**
** GetTextSeg (Segment-Numer, Segment-Base, [Password-String])
**
** DecodeTextSeg (Segment-Number, Segment-Base, Password-String)
**
** MakeTextSegPtrs (Segment-Base)
**
*/
#define EORKEY 0x98
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "exec/types.h"
#include "exec/memory.h"
#include "dos/dos.h"
#include "dos/dosextens.h"
#include "pragma/exec_lib.h"
#include "pragma/dos_lib.h"
void DecodeTextSeg(ULONG DTSeg, ULONG *DTBase,UBYTE *DTPassword)
{
char *DTText;
unsigned long count = 0L, count2 = 0L;
if (DTBase[1] >= DTSeg)
{
DTText = (char *)DTBase[4+DTSeg-1];
if (DTText)
{
do
{
DTText[count] --;
DTText[count] = DTText[count] ^ EORKEY;
DTText[count] = DTText[count]+DTPassword[count2];
count++; count2++;
if (!(DTPassword[count2+1])) count2 = 0L;
} while (DTText[count-1]);
};
};
}
void MakeTextSegPtrs(unsigned long *MSBase)
{
unsigned long von = 0;
unsigned long help = (unsigned long)&MSBase[0];
unsigned long bis = MSBase[1];
MSBase = &MSBase[4];
for (von=0; von<bis; von++)
{
if (MSBase[von]!=0L)
{
MSBase[von]=MSBase[von]+help;
};
};
}
char *GetTextSeg(ULONG GTSeg,ULONG *GTBase,UBYTE *GTPassword)
{
char *SegPtr;
if (GTBase[1] >= GTSeg)
{
if (GTBase[2] && 1)
{
DecodeTextSeg(GTSeg,GTBase,GTPassword);
};
SegPtr=(char *)GTBase[4+GTSeg-1];
}
else
{
SegPtr="segment-number too great.";
};
return(&SegPtr[0]);
}
main(int argc,char *argv[])
{
BPTR fh = NULL;
APTR mem = NULL;
ULONG size = NULL;
BPTR flock;
struct FileInfoBlock *fib;
char fname[256];
ULONG Seg = NULL;
ULONG *Base = NULL;
char *TextSeg = NULL;
char *Password = "Mr. Spock Lives On Vulcan";
char stfbuff[4];
if (argv[2]) Seg = (ULONG)atoi(argv[2]);
if ((!(argv[1])) || (!(Seg)))
{
printf("USAGE: %s File Segment-Number\n", argv[0]); exit(NULL);
}
else
{
strcpy(fname,argv[1]);
};
flock = Lock(fname,ACCESS_READ);
if (flock)
{
fib = (struct FileInfoBlock *)AllocMem((ULONG)
(sizeof(struct FileInfoBlock)),MEMF_PUBLIC);
if (fib)
{
Examine(flock,fib);
if (size=(fib->fib_Size))
{
fh = Open(fname,MODE_OLDFILE);
if (fh)
{
Read(fh,stfbuff,4);
if (strcmp("STF",stfbuff)==NULL)
{
Seek(fh,0,OFFSET_BEGINNING); /* correct fileptr */
mem = AllocMem(size,MEMF_PUBLIC);
if (mem)
{
Read(fh,mem,size);
/*
offsets to pointers
*/
Base = (ULONG *)mem;
MakeTextSegPtrs(Base);
/*
get pointer to the text-segment and
put out segment
*/
TextSeg = GetTextSeg(Seg,Base,Password);
if (TextSeg)
{
printf("\n%s\n",TextSeg)
}
else
{
printf("emty slot.\n");
};
FreeMem(mem,size);
}
else
{
printf("not enought memory.\n");
};
}
else
{
printf("this is not a sft-file.\n");
};
Close(fh);
}
else
{
printf("cannot open %s.\n",argv[1]);
};
};
FreeMem(fib,sizeof(struct FileInfoBlock));
}
else
{
printf("not enought memory.\n");
};
UnLock(flock);
}
else
{
printf("file not found.\n");
};
return(NULL);
} /* end of main */