/* $Revision Header *** Header built automatically - do not edit! ***********
 *
 *	(C) Copyright 1992 by Metalworx
 *
 *	Name .....: increv.c
 *	Created ..: Sat 03-Oct-92 13:17
 *	Revision .: 0
 *
 *	Date		Author		Comment
 *	=========	========	====================
 *	12-Aug-91	Mtwx		Created this file!
 *
 * $Revision Header ********************************************************/
 #define REVISION 0

/***************************************************************************
* increv.c : automatic update of version and revision numbers		   *
*									   *
*      File rev.c must have the following format:			   *
*									   *
*      char ProgId[]="...";                                                *
*      char Version[]="...";                                               *
*      int Revision = x;						   *
*      char UserId[]="...";                                                *
*      char RDate[]="...";                                                 *
*									   *
*	 where ... may be any character 				   *
*	 and   x   *MUST* be a number					   *
*									   *
*	 each line *MUST NOT* contain more than 79 characters		   *
*									   *
***************************************************************************/

/* ------------------------------- includes ----------------------------- */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#if defined(__MSDOS__) || defined(OS2)
#include "ansi.h"
#else
#include <ansi.h>
#endif

#include "increv.h"

/* ------------------------------- global references -------------------- */

/* ------------------------------- external references ------------------ */

extern char ProgId[],Version[];
extern int Revision;

/* ------------------------------- prototypes --------------------------- */

void readerror(void), usage(void);

/* ------------------------------- routines ----------------------------- */

main(int argc, char *argv[])
{
  FILE *datei,*datei2;
  char dummy[80],*pdummy;
  char ProgramId[80],VersionId[80], Revisionnr[80], UserId[80],
       Datum[80];
  char new_ProgId[80],new_Version[80],new_Revision[80],new_UserId[80],
       new_Date[80];	  /* contain updated strings */
  char NewId[80];	  /* contains user desired ProgId */
  char NewVersion[80];	  /* contains user desired Version no */
  char *newuserid;	  /* contains user desired UserId */
  char Filename[FILENAME_LENGTH+1]; /* contains (optional) filename */
  int i,rev,new_rev;
  unsigned int Params=0;

#if defined(AMIGA)
  printf("\n%s%s V%s/%d (%s version)%s - %s   (C) 1991, 1992 Metalworx\n",
	 WB_COLOR2,ProgId, Version, Revision, SYSTEM,WB_COLOR1,__DATE__);
#elif defined (__MSDOS__) || defined(OS2)
  printf("\n%s%s V%s/%d (%s version) - %s   (C) 1991, 1992 Metalworx%s\n",
	 ANSIHIYELLOW_ON_RED, ProgId,Version, Revision, SYSTEM,__DATE__,
	 ANSINORMAL);
#else
  printf("\n%s V%s/%d (%s version) - %s   (C) 1991, 1992 Metalworx\n",
	 ProgId,Version,Revision, SYSTEM,__DATE__);
#endif

  if(argc>1)
  {
    if(argv[1][0]=='?')
    {
      usage();
      exit(0);
    }
    for(i=1;i<argc;i++)
    {
      switch(argv[i][1])
      {
	case 'c':
	  Params|=CREATE_FILE;
	  puts("Create new rev file");
	  if(strlen(argv[i])>2)   /* optional filename ? */
	    strcpy(Filename,&argv[i][2]);
	  break;
	case 'v':
	  Params|=NEW_VERSION;
	  strcpy(NewVersion,&argv[i][2]);
	  break;
	case 'r':
	  Params|=NEW_REVISION;
	  new_rev=atoi(&argv[i][2]);
	  break;
	case 'u':
	  Params|=NEW_USER;
	  newuserid=&argv[i][2];
	  break;
	case 'i':
	  Params|=NEW_ID;
	  strcpy(NewId,&argv[i][2]);
	  break;
	case '?':
	  usage();
	  exit(0);
	default :
	  printf("Unknown option %s\n",argv[i]);
	  usage();
	  exit(1);
      }
    }
  }


/* read input file */

  datei=fopen("rev.c","r");
  if(datei)
  {
    fgets(ProgramId,79,datei);

    /* check & print Programm-ID */
    pdummy=strchr(ProgramId,'=');
    if(pdummy)
      printf("Programm-ID                    : %s",pdummy+1);
    else readerror();

    fgets(VersionId,79,datei);

    /* check & print Version-No. */
    pdummy=strchr(VersionId,'=');
    if (pdummy)
      printf("Version-No                     : %s",pdummy+1);
    else readerror();

    fgets(Revisionnr,79,datei);

    fgets(UserId,79,datei);

    /* check & print UserID */
    pdummy=strchr(UserId,'=');
    if (pdummy)
      printf("UserId                         : %s",pdummy+1);
    else readerror();

    fgets(Datum,79,datei);

    /* check & print Date */
    pdummy=strchr(Datum,'=');
    if (pdummy)
      printf("latest update                  : %s",pdummy+1);
    else readerror();

    fclose(datei);
    puts("----------------------------------------------------------");


/* updating lines */

    if(Params & NEW_ID)
    {
      strcpy(new_ProgId,ProgramId);
      *(strchr(new_ProgId,'=')+1)='\0';
      sprintf(dummy,"\"%s\";\n",NewId);
      strcat(new_ProgId,dummy);
      printf("new program-id                 : %s",dummy);
    }
    else
      strcpy(new_ProgId,ProgramId);

    if(Params & NEW_VERSION)
    {
      strcpy(new_Version,VersionId);
      *(strchr(new_Version,'=')+1)='\0';
      sprintf(dummy,"\"%s\";\n",NewVersion);
      strcat(new_Version,dummy);
      printf("new Version-No                 : %s",dummy);
    }
    else
      strcpy(new_Version,VersionId);

    /* get & update revision number */
    rev=atoi(strchr(Revisionnr,'=')+1);
    if(Params & NEW_REVISION)
      rev=new_rev;
    else
    {
      if(Params & NEW_VERSION)    /* set Revision no. back to 1 */
	rev=0;
      rev++;
    }
    printf("updating to new revision-no.   :%d\n",rev);
    strcpy(new_Revision,Revisionnr);
    *(strchr(new_Revision,'=')+1)='\0';
    sprintf(dummy,"%d;",rev);
    strcat(new_Revision,dummy);

    strcpy(new_UserId,UserId);
    /* update UserId, if ENV-Variable exists! */
    if(!(Params & NEW_USER)) /* get env-variable if not -u */
      newuserid=getenv("USERNAME");
    if(newuserid!=NULL)
    {
      if(Params & NEW_USER)
	printf("updating UserId (set by -u )   : %s\n",newuserid);
      else
#ifdef AMIGA
	printf("updating UserId (set by SETENV): %s\n",newuserid);
#endif
#if defined(__MSDOS__) || defined(UNIX) || defined (OS2)
	printf("updating UserId (set by SET)   : %s\n",newuserid);
#endif
      sprintf(dummy,"\"%s\";\n",newuserid);
      strcpy(strchr(new_UserId,'=')+1,dummy);
    }

    /* simply copy date line */
    strcpy(new_Date,Datum);

    /* write file */
    datei2=fopen("rev.c","w");
    if(datei2)
    {
      fprintf(datei2,"%s",new_ProgId);
      fprintf(datei2,"%s",new_Version);
      fprintf(datei2,"%s\n",new_Revision);
      fprintf(datei2,"%s",new_UserId);
      fprintf(datei2,"%s",new_Date);
      fclose(datei2);
    }
    else puts("Error while opening write file!");
  }
  else
  {
    puts("File rev.c not found!");
    readerror();
  }
}

void readerror(void)
{
  puts("\nError reading input-file (rev.c)!");
  puts("Programm terminated by error!");
  exit(1);
}

void usage(void)
{
#if defined(__MSDOS__) || defined(OS2)
	printf("%sUsage: increv [[-]?] [-i<ID>] [-r<No.>] [-u<USER>] [-v<No.>]\n",
				 ANSIHIRED);
	printf("%sOptions:  -?       displays this text\n",ANSIHICYAN);
#endif
#if AMIGA || UNIX
	puts("Usage: increv [[-]?] [-i<ID>] [-r<No.>] [-u<USER>] [-v<No.>]");
  puts("Options:  -?       displays this text");
#endif
/*	puts("          -c[FILE] create new rev file. Filename will be FILE or");
	puts("                   rev.c on default.");  for later use */
  puts("          -i<ID>   update ProgId with ID, can be any text");
  puts("          -r<No.>  update revision no. with No.");
  puts("                   No. must be an integer!");
  puts("          -u<USER> update UserId with USER, can be any text");
  puts("          -v<No.>  update version with No.");
#if defined(__MSDOS__) || defined(OS2)
	printf("                   No. can be any text%s\n",ANSINORMAL);
#endif
#if AMIGA || UNIX
	puts("                   No. can be any text");
#endif
}
