home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d9xx / d924 / wb-version.lha / WB-Version / WB-Version.e < prev    next >
Text File  |  1993-10-07  |  6KB  |  230 lines

  1. /* This program gives you a version command with requesters requires V37+  */
  2. /*
  3.   Don't take this code as some sort of prime example of how to code E please,
  4.   it's my first attempt at this language and isn't very pretty
  5. */
  6.  
  7. OPT OSVERSION=37
  8.  
  9. /* Misc exceptions */
  10. ENUM   NONE, ERR_READFAIL, ERR_MATCHFAIL, ERR_OPENFILE, ERR_ARGS
  11.  
  12. MODULE 'dos/dos', 'dos/dosextens', 'exec/resident', 'exec/nodes', 'intuition/intuition'
  13.  
  14. DEF program[50]:STRING, version[10]:STRING, date[12]:STRING, author[50]:STRING
  15. DEF fname[32]:STRING
  16. DEF myargs:PTR TO LONG
  17.  
  18.  
  19. PROC find_digit(start:PTR TO CHAR)
  20. /* Look for digits in the string */
  21. CONST LOW="0",HIGH="9"
  22. DEF result
  23.  
  24.   MOVE.L    start,A0    /* start POINTER */
  25.   MOVE.L    A0,D0
  26.   next_chr:
  27.     CMPI.B    #LOW,(A0)    /* <"0" char ? */
  28.     BLT.S    no_digit
  29.     CMPI.B    #HIGH,(A0)    /* >"9" char ? */
  30.     BGT.S    no_digit
  31.     SUB.L    A0,D0
  32.     NEG.L    D0
  33.     MOVE.L    D0,result    /* A1 Ptr to string start */
  34.     RETURN    result        /* And return it */
  35.     no_digit:
  36.     TST.B    (A0)+
  37.   BNE.S        next_chr
  38.   RETURN     -1
  39. ENDPROC
  40.  
  41. PROC display_info(vinfo)
  42.   ENUM MIN_INFO, MED_INFO, MAX_INFO
  43.   DEF pos,pos2,display_kind=MIN_INFO
  44.   DEF s[1]:STRING
  45.  
  46.   s:=' '        /* Assume blanks as separators */
  47.   IF (pos2:=find_digit(vinfo))> (pos:=InStr(vinfo,' ',1)) THEN pos:=pos2-1
  48.  
  49.   IF pos<>-1
  50.   /* Extract date and version strings */
  51.     StrCopy(program,vinfo,pos)
  52.     pos2:=InStr(vinfo,' ',pos+1)        /* find next blank */
  53.     MidStr(version,vinfo,pos+1,pos2-pos-1)      /* extract version string */
  54.     pos:=pos2
  55.     IF pos<>-1
  56.       /* Try to extract a date */
  57.       IF (pos2:=InStr(vinfo,'(',pos+1))<>-1
  58.         pos:=pos2;
  59.         s:=')'        /* if we discover a '(' use ')' as separator instead */
  60.       ENDIF
  61.       IF (pos2:=InStr(vinfo,s,pos+1))<>-1
  62.         MidStr(date,vinfo,pos+1,pos2-pos-1)
  63.         date:=TrimStr(date)
  64.         IF StrCmp(date,'',ALL)<>TRUE
  65.           display_kind:=MED_INFO
  66.         ENDIF
  67.       ENDIF
  68.  
  69.       IF ((pos:=InStr(vinfo,s,pos+1))<>-1)
  70.         /* if there is any author info extract it too */
  71.         MidStr(author,vinfo,pos+1,ALL)
  72.         author:=TrimStr(author)
  73.     IF StrCmp(author,'',ALL)<>TRUE
  74.           display_kind:=MAX_INFO
  75.     ENDIF
  76.       ENDIF
  77.     ENDIF
  78.   ENDIF
  79.   EasyRequestArgs(0,[20,0,'WB-Version request',
  80.     ListItem(['File: \s\n\nName: \s\nVersion: \s\n',
  81.           'File: \s\n\nName: \s\nVersion: \s\nDate: \s\n',
  82.           'File: \s\n\nName: \s\nVersion: \s\nDate: \s\nAuthor: \s\n'],display_kind),
  83.             'OK'],0,[fname,program,version,date,author])
  84.  
  85. ENDPROC
  86.  
  87. PROC display_error(error)
  88.   IF (error<>NONE)
  89.     EasyRequestArgs(0,[20,0,'WB-Version request',ListItem(['',
  90.     'File: \s\nError while reading from file !\n',
  91.     'File: \s\nNo version string found !\n',
  92.     'File: \s\nCoudn''t open file !\n',
  93.     'Usage: CLI> WB-Version FILE/A\n'],error),
  94.     'OK'],0,[fname])
  95.   ENDIF
  96.   Raise(error)
  97. ENDPROC
  98.  
  99. PROC find_ver(start:PTR TO CHAR,size)
  100. /* Look for version string in the defined memory */
  101. CONST VER_STR=$5645523A        /* VER: */
  102. DEF result
  103.  
  104.   MOVE.L    start,A0    /* Start pointer */
  105.   MOVE.L    size,D0        /* Size */
  106.   SUBQ.L    #5,D0        /* The string must fit */
  107.   next_char:
  108.     CMPI.B    #$24,(A0)+    /* a $ sign ? */
  109.     BNE.S    no_match
  110.       MOVE.L    A0,A1
  111.       MOVE.B    (A1)+,D2    /* copy a longword */
  112.       LSL.L    #8,D2
  113.       MOVE.B    (A1)+,D2
  114.       LSL.L    #8,D2
  115.       MOVE.B    (A1)+,D2
  116.       LSL.L    #8,D2
  117.       MOVE.B    (A1)+,D2
  118.  
  119.       MOVE.L    D2,result
  120.       CMP.L    #VER_STR,D2
  121.       BNE.S    no_match
  122.       MOVE.L    A1,result    /* A1 Ptr to string start */
  123.       RETURN    result        /* And return it */
  124.     no_match:
  125.     SUBQ.L    #1,D0
  126.   BGE.S        next_char
  127.   RETURN     -1
  128. ENDPROC
  129.  
  130. PROC find_rtc_matchword(base:PTR TO rt,size)
  131. /* Look for rom tags in the defined memory */
  132. CONST ROMTAG_SIZE=26
  133. DEF done=FALSE
  134.   size:=size-ROMTAG_SIZE    /* make sure that the romtag actualy fits */
  135.   WHILE (done=FALSE) AND (size>1)
  136.     done:=(base.matchword=RTC_MATCHWORD) AND (base.matchtag=base) AND ((base.type=NT_DEVICE) OR (base.type=NT_LIBRARY))
  137.     IF done<>TRUE
  138.       base:=base+2        /* Look for romtag structure */
  139.       size:=size-2
  140.     ENDIF
  141.   ENDWHILE
  142.   IF done THEN RETURN base
  143.   RETURN NIL
  144. ENDPROC
  145.  
  146. PROC main() HANDLE
  147.   CONST BUFFSIZE=2048
  148.  
  149.   DEF count, c, oldwindow, seg, size, rdargs
  150.   DEF base:PTR TO rt
  151.   DEF str_base:PTR TO CHAR
  152.   DEF str[4]:STRING, vinfo[256]:STRING
  153.   DEF firstseg=NIL, instream=NIL
  154.   DEF me:PTR TO process
  155.  
  156.   VOID '$VER: WB-Version 1.3 (28.08.93) (C) Håkan Hellberg'
  157.  
  158.   myargs:=[0]
  159.   fname:='No file selected'
  160.  
  161.   me:=FindTask(NIL)            /* Make the requester popup on the default public screen */
  162.   oldwindow:=me.windowptr
  163.   me.windowptr:=NIL
  164.  
  165.   IF rdargs:=ReadArgs('FILE/A',myargs,NIL)
  166.     fname:=FilePart(myargs[0])
  167.  
  168.     /* Try segloading */
  169.     seg:=LoadSeg(myargs[0])         /* seg is a BPTR ! */
  170.     firstseg:=seg            /* save the pointer for unloading later */
  171.     WHILE seg<>NIL
  172.       base:=Shl(seg,2)+4        /* BPTR Conversion and adjustment for seglist */
  173.       str_base:=base
  174.       size:=Long(base-8)-8        /* Get segment size and adjust for seglist */
  175.  
  176.       IF ((base:=find_rtc_matchword(base,size))<>NIL)
  177.     /* We will end up here if the file includes a library or a device ROMTAG */
  178.         StrCopy(vinfo,base.idstring,ALL)
  179.         display_info(vinfo)
  180.         Raise(NONE)
  181.       ELSE
  182.         IF (base:=find_ver(str_base,size))<>-1
  183.       /* We will end up here if the segment didn't include a ROMTAG */
  184.           StrCopy(vinfo,base,ALL)
  185.           display_info(vinfo)
  186.           Raise(NONE)
  187.         ENDIF
  188.       ENDIF
  189.       seg:=Long(Shl(seg,2))        /* Next segment */
  190.     ENDWHILE
  191.     IF firstseg<>NIL THEN display_error(ERR_MATCHFAIL)
  192.  
  193.     IF ((instream:=Open(myargs[0],MODE_OLDFILE))<>NIL)
  194.       /* Segloading failed try another method */
  195.       WHILE ((c:=FgetC(instream))<>-1)
  196.         IF (c="$")
  197.           /* Found the leading '$' sign check for 'VER:' */
  198.           IF (count:=Fread(instream,str,4,1))=1
  199.         IF StrCmp(str,'VER:',4)
  200.         /* Found $VER: go ahead and pick up the remaining string */
  201.           IF (Fgets(instream,vinfo,256)<>NIL)
  202.             display_info(vinfo)
  203.             Raise(NONE)
  204.           ELSE
  205.         display_error(ERR_READFAIL)
  206.           ENDIF
  207.         ELSE
  208.           /* No 'VER:' revind back to our old position */
  209.           Seek(instream,-4,OFFSET_CURRENT)
  210.             ENDIF
  211.           ENDIF
  212.         ENDIF
  213.       ENDWHILE
  214.       display_error(ERR_MATCHFAIL)
  215.     ELSE
  216.       display_error(ERR_OPENFILE)
  217.     ENDIF
  218.   ENDIF
  219.   display_error(ERR_ARGS)
  220.  
  221. EXCEPT
  222.   FreeArgs(rdargs)
  223.   IF firstseg<>NIL
  224.     UnLoadSeg(firstseg)
  225.   ENDIF
  226.   IF instream<>NIL
  227.     Close(instream)
  228.   ENDIF
  229.   me.windowptr:=oldwindow
  230. ENDPROC