/* ReSize ©1995 P.Marquardt, crippled SUXX-WARE */

#define __USE_SYSBASE

#include <stdlib.h>
#include <string.h>
#include <clib/dos_protos.h>
#include <clib/alib_stdio_protos.h>
#include <clib/graphics_protos.h>
#include <intuition/intuitionbase.h>
#include <proto/dos.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include "version.h"

CHARVERSTAG;

struct ReSizeArgs {
  LONG Local,Global,Save,Verbose;
};

char *Template = "SET/S,SETENV/S,SAVE/S,VERBOSE=V/S";

char *Options[] = {
	"set local",
	"set global ENV:",
	"save in ENVARC:",
	"be verbose"
};

char *Errlist[] = {
	"n/a"
};

char *cols_name = "COLS";
char *rows_name = "LINES";
char *mode_name = "SCREENMODE";
char *enva_name = "ENVARC:";

static void Help(int err)
{
  if (!err) {
	char *p,**o;
	Printf("Purpose: show/set/save $%s/$%s/$%s vars\n",cols_name,rows_name,mode_name);
	Printf("Usage:\nReSize %s\n",Template);
	o=&Options[0];
	for (p=strtok(Template,",");p;p=strtok(NULL,","))
		Printf("%12s %s\n",p,*o++);
  }
  else
	Printf("Error: %s\n",Errlist[err-1]);
}

void DoVar(char *Where, char *Var, char *Fmt, LONG SetTo, ULONG flag)
{
	char VarBuf[64];
    char NameBuf[64];

    sprintf(NameBuf,"%s%s",Where,Var);
	sprintf(VarBuf,Fmt,SetTo);
	SetVar(NameBuf,VarBuf,-1,flag);
}

LONG __saveds main(void)
{
  struct Window *win;
  struct Screen *scr;
  ULONG m;
  WORD rows , cols;
  LONG ret;

  struct RDArgs *RDArgs;
  struct ReSizeArgs Args = {0};
  LONG NoArg = NULL;

  if ((RDArgs=ReadArgs(Template,(LONG *)&Args,NULL))==NULL) {
	PrintFault (IoErr(),NULL);
	ret = 1;
	goto quit;
  }

  ret = 0;

  NoArg = !(Args.Local || Args.Global || Args.Save);

  if (NoArg && !Args.Verbose) {
	FreeArgs (RDArgs);
	Help(0);
	goto quit;
  }

  win = IntuitionBase->ActiveWindow;
  scr = IntuitionBase->FirstScreen;
  m   = GetVPModeID(&scr->ViewPort);

  rows = (win->Height - win->BorderTop  - win->BorderBottom) / (win->RPort->Font->tf_YSize);
  cols = (win->Width  - win->BorderLeft - win->BorderRight)  / (win->RPort->Font->tf_XSize);

  if (Args.Verbose) {
    Printf ("%s=%ld\n%s=%ld\n%s=0x%lx\n",rows_name,rows,cols_name,cols,mode_name,m);
  }

  if (!NoArg) {
    ULONG flag = NULL;
	char loops = 1;
	char *funky = "";

	if (Args.Local) flag = GVF_LOCAL_ONLY;
	if (Args.Global || Args.Save) flag |= GVF_GLOBAL_ONLY;
	if (Args.Save) loops = 2;

	while (loops) {
	  DoVar(funky,rows_name,"%ld",rows,flag);
	  DoVar(funky,cols_name,"%ld",cols,flag);
	  DoVar(funky,mode_name,"0x%lx",m,flag);
	  loops--;
	  funky=enva_name;
	}
  }

  FreeArgs (RDArgs);
quit:
  return ret;
}

