home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************
- * Extract.c *
- * *
- * Chas A. Wyndham 15th May 1992. *
- * *
- * Compiles under Lattice 5 and links with Decomp.o to make Hextract, a *
- * programme for accessing header-file data. *
- * *
- * This code is Freeware like Hextract itself. You are welcome to improve *
- * it - but please send me a copy. *
- * *
- ****************************************************************************/
-
- #include "exec/types.h"
- #include "exec/memory.h"
- #include "graphics/gfxbase.h"
- #include "libraries/dos.h"
- #include "intuition/intuition.h"
- #include "intuition/intuitionbase.h"
- #include "string.h"
- #include "stdio.h"
-
- struct IntuitionBase *IntuitionBase ;
- struct GfxBase *GfxBase ;
- struct Screen *screendata ;
- FILE *fe ;
- struct FileHandle *window, *fi, *fo ;
- char buffer[100], line[256] ;
- int size, setcase = 0, found = 0, located = 0 ;
- USHORT chip ptrImage[] = {
- 0x0000, 0x0000,
- 0x6018, 0x0000,
- 0xc00c, 0x0000,
- 0xc30c, 0x0000,
- 0xc78c, 0x0000,
- 0xcccc, 0x0000,
- 0x7878, 0x0000,
- 0x3030, 0x0000,
- 0x0000, 0x0000, };
-
- struct FileLock *lock ;
- void search(), showlib() ;
- int cleanup() ;
-
- main(argc, argv)
- int argc ;
- char *argv[] ;
- {
- char ch = NULL, header[2], *ibuf, path[100] ;
- int form, i = 0, result = 0, length ;
-
-
- IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0) ;
- GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0) ;
-
- screendata = (struct Screen *)AllocMem(30, MEMF_PUBLIC) ;
- GetScreenData (screendata, 30, WBENCHSCREEN, NULL) ;
-
- stcgfp (path, argv[0]) ;
- strcat (path, "headers.z") ;
-
- form = GfxBase->NormalDisplayRows ;
- if (screendata->Height > 511)
- window = (struct FileHandle *)Open("CON:0/0/640/512/Hextract V1.1", MODE_NEWFILE) ;
- else if (screendata->Height >399)
- window = (struct FileHandle *)Open("CON:0/0/640/400/Hextract V1.1", MODE_NEWFILE) ;
- else if (screendata->Height >255)
- window = (struct FileHandle *)Open("CON:0/0/640/256/Hextract V1.1", MODE_NEWFILE) ;
- else
- window = (struct FileHandle *)Open("CON:0/0/640/200/Hextract V1.1", MODE_NEWFILE) ;
-
- if ((fi = (struct FileHandle *)Open(path, MODE_OLDFILE)) == NULL)
- { puts ("No headers.z file\n") ;
- cleanup() ;
- }
-
- if ((fo = (struct FileHandle *)Open ("ram:headers.t", MODE_NEWFILE)) == NULL)
- { puts ("Can't create ram: file\n") ;
- Close(fi) ;
- cleanup() ;
- }
-
- Read(fi, header, 2) ;
-
- if ((header[0] != 'L') || (header[1] != 'H'))
- {
- if((ibuf = (char *)AllocMem(4096, MEMF_PUBLIC)) == NULL)
- cleanup() ;
- do
- { length = Read (fi, ibuf, 4096) ;
- Write (fo, ibuf, length) ;
- } while (length) ;
- FreeMem (ibuf, 4096) ;
- }
-
- else result = decompress (fi, fo) ;
-
- Close (fi) ;
- Close (fo) ;
- if (result == 1) puts ("Decompression failed\n") ;
- else if (result == 2) puts ("Out of memory\n") ;
-
- fe = fopen("ram:headers.t", "r+") ;
- Write (window, " Enter 'quit' to exit\n\n", 41) ;
- Write (window, " Enter symbol\n\n ", 18) ;
- onbreak(&cleanup) ;
-
- while (1)
- { if (WaitForChar (window, 999999999))
- { Read (window, &ch, 1) ;
- buffer[i++] = ch ;
- if (!strcmp (buffer, "quit")) break ;
- if (ch == '\n')
- {
- buffer[--i] = '\0' ;
- if (i)
- { SetPointer (IntuitionBase->ActiveWindow, &ptrImage, 7, 16, -4, -4) ;
- search () ;
- memset (buffer, '\0', 100) ;
- ClearPointer(IntuitionBase->ActiveWindow) ;
- Write (window, "\n Enter symbol\n\n ", 19) ;
- }
- i = 0 ;
- }
- }
- }
- cleanup() ;
- }
-
-
- int cleanup ()
- {
- if (fe) { fclose (fe) ; fe = 0 ; }
- DeleteFile ("ram:headers.t") ;
- if (lock) UnLock(lock) ;
- if (window) Close (window) ;
- if (GfxBase != NULL) CloseLibrary(GfxBase);
- if (IntuitionBase != NULL) CloseLibrary(IntuitionBase);
- exit(0);
- }
-
-
- fgts(buf)
- char *buf ;
- {
- register char c ;
- register int i = 0 ;
-
- memset (buf, '\0', 256) ;
- c = getc (fe) ;
- while ((c != '\n') && (c != EOF))
- { buf[i++] = c ;
- c = getc (fe) ;
- }
- buf [i] = '\n' ;
- if (c == EOF) return(0);
- else return(1) ;
- }
-
-
- void search()
- {
- char *tok, *tok2, temp[250], *match, *buf1, source[40], change = 0 ;
- int numbrackets = 0, libh = 0 ;
-
- size = 0 ; located = 0 ;
- while (fgts (line) != 0)
- { buf1 = stpblk(line) ;
- if (!change)
- if (stcpma (buf1, "FFFFFF")) change = 1 ;
- if (change)
- { if (stcpm (buffer, ".resource", &match) || stcpm (buffer, ".device", &match)
- || stcpm (buffer, ".library", &match))
- { showlib() ;
- break ;
- }
- if (stcpm (buf1, ".resource", &match) || stcpm (buf1, ".device", &match)
- || stcpm (buf1, ".library", &match))
- { tok = strtok (buf1, " \n") ;
- strcpy (source, tok) ;
- libh = 1 ;
- continue ;
- } }
-
- strcpy (temp, buf1) ;
- tok = strtok (temp, " \n") ;
- if (astcsma(temp, buffer))
- { located = 1 ;
- strcpy (temp, line) ;
- tok = strtok (line, " \n") ;
- tok2 = strtok (NULL, "\n") ;
- Write (window, "\n ", 4) ;
- Write (window, tok2, strlen(tok2)) ;
- if (libh)
- { Write (window, " ", 2) ;
- Write (window, source, strlen(source)) ;
- }
- Write (window, "\n", 1) ;
-
- if (stcpm (temp, "struct", &match))
- { fgts (temp) ;
- if (strchr (temp, '{'))
- { numbrackets++ ;
- Write (window, " ", 4) ;
- Write (window, temp, strlen(temp)) ;
- while (numbrackets)
- { fgts(temp) ;
-
- if (strchr (temp, '{'))
- { numbrackets++ ;
- Write (window, " ", 4) ;
- Write (window, temp, strlen(temp)) ;
- continue ;
- }
- else if (strchr (temp, '}'))
- { numbrackets-- ;
- Write (window, temp, strlen(temp)) ;
- continue ;
- }
-
- tok = strtok (temp, " \0") ;
- tok2 = strtok (NULL, " \0") ;
- Write (window, " ", 4) ;
- Write (window, tok2, strlen(tok2)) ;
-
- do
- { tok2 = strtok (NULL, " \0") ;
- if (stcpm (tok2, "struct", &match))
- { Write (window, "\n", 1) ;
- break ;
- }
- Write (window, " ", 1) ;
- Write (window, tok2, strlen(tok2)) ;
- } while (tok2) ;
- } }
- }
-
- tok = strtok (line, " \n") ;
- tok2 = strtok (NULL, "\n") ;
- Write (window, "\n ", 8) ;
- Write (window, tok2, strlen(tok2)) ;
- } }
-
- if (!located) Write (window, " Not found\n", 18) ;
- rewind (fe) ;
- }
-
-
- void showlib()
- {
- char *tok1, *tok2, buf[256] ;
- int num, i ;
-
- while (!stcpma (line, buffer))
- fgts (line) ;
- tok1 = strtok (line, " \n") ;
- tok2 = strtok (NULL, " \n") ;
- num = atoi (tok2) ;
- for (i = 0 ; i < num ; ++i)
- { fgts (buf) ;
- tok1 = strtok (buf, " \n") ;
- tok2 = strtok (NULL, "\0") ;
- Write (window, " ", 3) ;
- Write (window, tok2, strlen(tok2)) ;
- }
- located = 1 ;
- }
-