home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / amiga / programm / utility / resgrep0.lzh / ResGrep / picker / vers / vers.c < prev    next >
C/C++ Source or Header  |  1992-04-11  |  6KB  |  266 lines

  1. /*
  2.  * Programm zum Anzeigen von der 'vers' Resource.
  3.  *
  4.  * written 11.04.1992 by Andre Florath
  5.  */
  6.  
  7. #include <exec/types.h>
  8. #include <exec/memory.h>
  9. #include <rexx/rxslib.h>
  10. #include <intuition/intuition.h>
  11. #include <clib/exec_protos.h>
  12. #include <clib/rexxsyslib_protos.h>
  13. #include <clib/gadtools_protos.h>
  14.  
  15. #include <string.h>
  16. #include <stdio.h>
  17.  
  18. #include "version.h"
  19.  
  20. #define ONE ((size_t)1)
  21.  
  22. struct RexxSysBase   *RexxSysBase=NULL;
  23. struct GadToolsBase  *GadToolsBase=NULL;
  24. struct IntuitionBase *IntuitionBase=NULL;
  25.  
  26. struct MsgPort         *RexxPort, *MyPort;
  27. struct RexxMsg         *RxMsg;
  28.  
  29. enum stage
  30. {
  31.    develop=0x20, alpha=0x40, beta=0x60, final=0x80
  32. };
  33.  
  34. struct VersionResource
  35. {
  36.    unsigned char MajorRev;
  37.    unsigned char MinorRev:4;
  38.    unsigned char BugFixRev:4;
  39.    unsigned char Stage;
  40.    unsigned char NonRelRev;
  41.    short     CountryCode;
  42.    unsigned char ShortLen;
  43.    char      ShortString[1]; /* Variable len */
  44. /* unsigned char LongLen;
  45.    char      LongString[1]        Variable len */
  46. };
  47.  
  48. unsigned char versbuffer[520]; /* Darein passt's auf jeden Fall. */
  49. unsigned char str1[256], str2[256];
  50.  
  51. struct EasyStruct OutRequest =
  52. {
  53.    sizeof (struct EasyStruct),
  54.    0,
  55.    NULL,
  56.    NULL,
  57.    NULL
  58. };
  59.  
  60. int ReqOut(char *Headline, char *text, char *wahl)
  61. {
  62.    OutRequest.es_Title          = Headline;
  63.    OutRequest.es_TextFormat   = text;
  64.    OutRequest.es_GadgetFormat = wahl;
  65.  
  66.    return EasyRequest(Project0Wnd,&OutRequest,0);
  67. }
  68.  
  69.  
  70. void ResError(char *text)
  71. {
  72.    ReqOut("ResGrep Error",text,"Oh, no!");
  73. }
  74.  
  75. void ResWarning(char *text)
  76. {
  77.    ReqOut("ResGrep Warning",text,"It'll better next time.");
  78. }
  79.  
  80. void ResMessage(char *text)
  81. {
  82.    ReqOut("ResGrep Message",text,"Read it!");
  83. }
  84.  
  85. int ResAsk(char *text, char *wahl)
  86. {
  87.    return ReqOut("ResGrep Message",text,wahl);
  88. }
  89.  
  90.  
  91.  
  92. void DisplayVers(char *filename)
  93. {
  94.    FILE *in;
  95.    int     len, index;
  96.    struct VersionResource *vh;
  97.    unsigned char  *strbeg;
  98.    unsigned char  lenstr2, *stagestr;
  99.  
  100.    if( (in=fopen(filename,"r"))==NULL )
  101.    {
  102.       ResError("Can't open file.");
  103.       return;
  104.    }
  105.    if( (len=fread((void *)versbuffer,520,ONE,in))==EOF )
  106.    {
  107.       ResError("Error while reading data.");
  108.       fclose(in);
  109.       return;
  110.    }
  111.    vh=(struct VersionResource *)versbuffer;
  112.  
  113.    GT_SetGadgetAttrs(Project0Gadgets[GDX_version],Project0Wnd,NULL,GTNM_Number,vh->MajorRev,TAG_DONE);
  114.    GT_SetGadgetAttrs(Project0Gadgets[GDX_Revision],Project0Wnd,NULL,GTNM_Number,vh->MinorRev,TAG_DONE);
  115.    GT_SetGadgetAttrs(Project0Gadgets[GDX_minor],Project0Wnd,NULL,GTNM_Number,vh->BugFixRev,TAG_DONE);
  116.    GT_SetGadgetAttrs(Project0Gadgets[GDX_nrrev],Project0Wnd,NULL,GTNM_Number,vh->NonRelRev,TAG_DONE);
  117.    GT_SetGadgetAttrs(Project0Gadgets[GDX_country],Project0Wnd,NULL,GTNM_Number,vh->CountryCode,TAG_DONE);
  118.  
  119.    switch( vh->Stage )
  120.    {
  121.     case develop:    stagestr="develop"; break;
  122.     case alpha:      stagestr="alpha"; break;
  123.     case beta:         stagestr="beta"; break;
  124.     case final:      stagestr="final"; break;
  125.    }
  126.    GT_SetGadgetAttrs(Project0Gadgets[GDX_stage],Project0Wnd,NULL,GTTX_Text,stagestr,TAG_DONE);
  127.  
  128.    strbeg=(unsigned char *) &(vh->ShortString[0]);
  129.    for(index=0;index<vh->ShortLen;index++)
  130.       str1[index]=*strbeg++;
  131.    str1[index]='\0';
  132.    GT_SetGadgetAttrs(Project0Gadgets[GDX_versstr],Project0Wnd,NULL,GTTX_Text,str1,TAG_DONE);
  133.  
  134.    lenstr2=(unsigned char) *strbeg++;
  135.    for(index=0;index<lenstr2;index++)
  136.       str2[index]=*strbeg++;
  137.    str2[index]='\0';
  138.    GT_SetGadgetAttrs(Project0Gadgets[GDX_reserved],Project0Wnd,NULL,GTTX_Text,str2,TAG_DONE);
  139.  
  140.    fclose(in);
  141.    return;
  142. }
  143.  
  144. void CleanUp(void)
  145. {
  146.    if( RexxSysBase )  CloseLibrary((struct Library *)RexxSysBase);
  147.    if( GadToolsBase ) CloseLibrary((struct Library *)GadToolsBase);
  148.    if( IntuitionBase )CloseLibrary((struct Library *)IntuitionBase);
  149.    if( MyPort )       { RemPort(MyPort); DeleteMsgPort(MyPort); }
  150.    return;
  151. }
  152.  
  153.  
  154. int main(void)
  155. {
  156.    int index;
  157.    struct IntuiMessage     theIMsg, *imsg;
  158.  
  159.    if( (IntuitionBase=(struct IntuitionBase *)
  160.     OpenLibrary("intuition.library",36))==NULL )
  161.    {
  162. /* Was tuen?      printf("Kann 'intuition.library' nicht ÷ffnen.\n"); */
  163.       CleanUp();
  164.       return 1;
  165.    }
  166.    if( (RexxSysBase=(struct RexxSysBase *)
  167.     OpenLibrary("rexxsyslib.library",36))==NULL )
  168.    {
  169.       CleanUp();
  170.       ResError("Can't open 'rexxsyslib.library'.");
  171.       return 1;
  172.    }
  173.  
  174.    if( (GadToolsBase=(struct GadToolsBase *)
  175.     OpenLibrary("gadtools.library",36))==NULL )
  176.    {
  177.       ResError("Can't open 'gadtools.library'.");
  178.       CleanUp();
  179.       return 1;
  180.    }
  181.  
  182.    RexxPort = FindPort("REXX");
  183.    if (!RexxPort)
  184.    {
  185.       ResError("ARexx-Master does not run.");
  186.       return 2;
  187.    }
  188.  
  189.    Forbid();
  190.    {
  191.       /*     Erst mal sehen, ob wir schon irgendwo laufen?    */
  192.       if (FindPort("RESGREP_VERS"))
  193.       {
  194.      Permit();
  195.      CleanUp();
  196.      ResError("ResGrep_Vers is running.");
  197.      return 2;
  198.       }
  199.       MyPort = CreateMsgPort();
  200.       MyPort->mp_Node.ln_Name = "RESGREP_VERS";
  201.       MyPort->mp_Node.ln_Pri  = 0;
  202.       AddPort(MyPort);
  203.    }
  204.    Permit();
  205.  
  206.    if( SetupScreen()!=0 )
  207.    {
  208.       ResError("Can't setup screen.");
  209.       CleanUp();
  210.       return 2;
  211.    }
  212.    if( OpenProject0Window()!=0 )
  213.    {
  214.       ResError("Can't open window.");
  215.       CloseDownScreen();
  216.       CleanUp();
  217.       return 2;
  218.    }
  219.  
  220.    /* Und mal wieder die Main-Event-Loop. */
  221.    for(;;)
  222.    {
  223.  
  224.    Wait( (1UL<<(unsigned long)(Project0Wnd->UserPort->mp_SigBit))
  225.     | (1UL<<(unsigned long)(MyPort->mp_SigBit)) );
  226.    while( RxMsg = (struct RexxMsg *)GetMsg(MyPort) )
  227.    {
  228.       if( strncmp(RxMsg->rm_Args[0],"QUIT",4)==0 )
  229.       {
  230.      RxMsg->rm_Result2 = NULL;
  231.      ReplyMsg((struct Message *)RxMsg);
  232.      CloseProject0Window();
  233.      CloseDownScreen();
  234.      CleanUp();
  235.      return 0;
  236.       }
  237.       else if( strncmp(RxMsg->rm_Args[0],"OPEN",4)==0 )
  238.       {
  239.      DisplayVers(&(RxMsg->rm_Args[0][5]));
  240.       }
  241.  
  242.       RxMsg->rm_Result2 = NULL;
  243.       ReplyMsg((struct Message *)RxMsg);
  244.    }
  245.    while( (imsg=GT_GetIMsg(Project0Wnd->UserPort)) != NULL )
  246.    {
  247.       /* Message kopieren und sofort orginale sofort zurⁿckschicken. */
  248.       theIMsg=*imsg;
  249.       GT_ReplyIMsg(imsg);
  250.       /*  Zuerst einmal alle Messages abfangen, die nicht an ein
  251.       Fenster weitergegeben werden sollen. Dazu zΣhlen z.B. alle
  252.       Menuauswahlen.
  253.        */
  254.       /* Es kann nur eine Meldung ankommen: WindowClose. */
  255.       CloseProject0Window();
  256.       CloseDownScreen();
  257.       CleanUp();
  258.       return 0;
  259.    }
  260.  
  261.    } /* Forever */
  262.    return 0;
  263. }
  264.  
  265.  
  266.