/* $Revision Header built automatically *************** (do not edit) ************
**
** © Copyright by (none)
**
** File 	    : TKal-main.c
** Created on	    : Wednesday, 01.12.93 19:45:08
** Created by	    : Arnold Schommer
** Current revision : V1.3
**
**
** Purpose
** -------
**   - Terminkalender
**
** Revision V1.3
** --------------
** created on Tuesday, 07.12.93 12:50:15  by  Arnold Schommer.	 LogMessage :
**   - verschiedene kleinere C->Assembler - Optimierungen;
**     Sonderversion ohne Assembler-Teil (zur Veröffentlichung)
**
** Revision V1.2
** --------------
** created on Monday, 06.12.93 22:51:19  by  Arnold Schommer.	LogMessage :
**   - WB-Parameter-Auswertung ok
**     Erweiterung: Window-Größe via Parameter
**     eigentlich alles ok, bis auf einen Fehler, siehe v0.3
**
** Revision V1.1
** --------------
** created on Monday, 06.12.93 18:17:19  by  Arnold Schommer.	LogMessage :
**   - Parameterauswertung für CLI-Start läuft
**
** Revision V1.0
** --------------
** created on Sunday, 05.12.93 15:26:29  by  Arnold Schommer.	LogMessage :
**   - Neuschreiben/erweitern der Termindateien läuft
**
** Revision V0.3
** --------------
** created on Sunday, 05.12.93 10:28:22  by  Arnold Schommer.	LogMessage :
**   - Termin-Scrolling funktioniert (oberflächlich getestet) mit
**     einer Ausnahme: bei Terminen, die Worte enthalten, die nicht
**     ganz in eine Zeile passen, hängt sich das Programm "etwas"
**     auf. Es crasht zwar nicht echt, aber das Scrolling (und
**     vielleicht auch noch mehr) läuft erst wieder, wenn das
**     Window entsprechend vergrößert wurde.
**     Ferner kann die Terminanzeige (durch Scrolling behebbar)
**     ausfallen, wenn das Fenster breiter wird und somit mehr
**     anzeigbar wird. Die einfachste Methode, dies zu korrigieren,
**     nämlich einfach bei Window-Veränderungen an den Anfang der
**     Liste zu springen, ist mir äußerst unsympatisch; noch weiß
**     ich aber nichts Anderes und beschließe, mit dem Fehler zu
**     leben.
**
** Revision V0.2
** --------------
** created on Sunday, 05.12.93 08:31:40  by  Arnold Schommer.	LogMessage :
**   - mehrzeilige Termine werden nicht mehr über den unteren
**     Fensterrand hinaus angezeigt
**
** Revision V0.1
** --------------
** created on Friday, 03.12.93 20:35:27  by  Arnold Schommer.	LogMessage :
**   - Zwischenbericht. Status quo:
**     - Fensteraufbau: ok bis auf mehrzeilige Termine [die werden
**	 evtl. auch über den unteren Fensterrand hinaus gezeigt]
**     - Termin-Scrolling: -
**     - Einlesen der Termindatei: ok
**     - Erkennen vergangener Termine: ok
**     - Aktualisieren der Termindatei(en): -
**     - Auswertung von Parametern (Font, neue Termine, ???): -
**     - Beliebige Termindatei via Workbench-TOOL: -
**
** Revision V0.0
** --------------
** created on Wednesday, 01.12.93 19:45:08  by	Arnold Schommer.   LogMessage :
**     --- Initial release ---
**
*********************************************************************************/
#define REVISION "1.3"
#define REVDATE  "07.12.93"
#define REVTIME  "12:50:15"
#define AUTHOR	 "Arnold Schommer"
#define VERNUM	 1
#define REVNUM	 3
#ifdef PRIVATE
char wtitle[]="TKal v"REVISION"p © 1993 by as";
#else
char wtitle[]="TK v"REVISION" © 1993 by as";
#endif

/* nur OS2-fähig ! */

#include <exec/types.h>
#include <exec/lists.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <graphics/text.h>
#include <workbench/startup.h>
#include <workbench/workbench.h>
#include <libraries/tracker.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/graphics_protos.h>
#include <clib/icon_protos.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define INVALID -1  /* speziell für Stunde */
struct Termin { struct Termin *naechster, *voriger;
		short minute, stunde, monat,tag, /* short, damit keine ext's */
		      jahr;
		char  *text;
	      };

/****************************** from TKal.c: ******************************/

extern struct TextFont *Font;
extern struct Termin *NeueTermine;
extern char *MainFileName, *OldFileName;
extern BOOL TerminBackup;
extern Tag OWTags[];
#define WTop	OWTags[1]
#define WLeft	OWTags[3]
#define WHeight OWTags[5]
#define WWidth	OWTags[7]

extern BOOL before(struct Termin *t1, struct Termin *t2);
extern void EnQueue(struct Termin **anchor, struct Termin *new),
	    DeQueue(struct Termin **anchor, struct Termin *obsolete),
	    CloseAll(void), BadMsg(char *txt), error(char *txt),
	    OpenLibs(void), kernel(void);
extern char *GetTempString(long len), *CreateExtFileName(char *extender);
extern struct Termin *parse(char **current_ptr);

/**************************************************************************/

#ifdef PRIVATE
extern char *GetStringCopy(char *from);
#else
char *GetStringCopy(char *from)
{   /* kopiert den String *from und liefert die Adresse der Kopie.
       danach kann from [z.B. ToolType] freigegeben werden ! */
    char *to;

    to=GetTempString(strlen(from)+1);
    strcpy(to, from);
    return(to);
}
#endif

void ParseFont(char *name, short size)
{   char *basename,*help;
    struct TextAttr FontDesc;

/* Printf("ParseFont(\"%s\", %ld)\n", name, size); */
    basename=GetTempString(strlen(name)+6);
    strcpy(basename, name);
    if(size)    goto nocombinedname;
    if(help=strrchr(basename, ' '))     goto combinedname;
    if(help=strrchr(basename, '.'))     goto combinedname;
    if(!(help=strrchr(basename, '-')))  goto nocombinedname;
combinedname:
    *(help++)=0;
    size=atoi(help);
nocombinedname:
    if(size==0) size=8;
    strcat(basename,".font");
    FontDesc.ta_Name=(STRPTR)basename;
    FontDesc.ta_YSize=size;
    FontDesc.ta_Style=FS_NORMAL;
    FontDesc.ta_Flags=FPF_ROMFONT;
    if(Font=TRK_OpenDiskFont(&FontDesc))    return;
    if(!(Font=TRK_OpenFont(&FontDesc)))
	BadMsg("Gewünschter Font kann nicht geöffnet werden");
}

/*************************** CLI-Rahmenprogramm ***************************/

int main(void)
{   struct RDArgs *rdargs=NULL;
    char *argarray[10];
    char *tmp, **neuarg, *FontName=NULL;
    struct Termin *neutermin;
    short FontSize=0;

    OpenLibs();

    /* Parameter-Parsing: */
    for(short i=0; i<10; ++i)    argarray[i]=NULL;
    rdargs=ReadArgs("TERMINDATEI,ALTDATEI,NEU/K/M,FONT/K,FONTSIZE/K/N,KEINEALTDATEI/S,LINKS/N,OBEN/N,BREITE/N,HOEHE=HÖHE=HöHE/N",
		    (LONG *)argarray, NULL);
    if(rdargs==NULL) error("Aufruf-Parameter fehlerhaft");
    if(argarray[0]) MainFileName=argarray[0];
    if(argarray[1]) OldFileName=argarray[1];
    if(argarray[2])
	for(neuarg=(char **)argarray[2]; *neuarg; ++neuarg)
	    {
	    tmp=*neuarg;
	    if(neutermin=parse(&tmp))   EnQueue(&NeueTermine, neutermin);
	    }
    if(argarray[3]) FontName=argarray[3];
    if(argarray[4]) FontSize=*((LONG *)argarray[4]);
    if(argarray[5]) TerminBackup=FALSE;
    if(argarray[6]) WLeft=*((LONG *)argarray[6]);
    if(argarray[7]) WTop=*((LONG *)argarray[7]);
    if(argarray[8]) WWidth=*((LONG *)argarray[8]);
    if(argarray[9]) WHeight=*((LONG *)argarray[9]);

    if(FontName)    ParseFont(FontName, FontSize);
    kernel();
    FreeArgs(rdargs);
    CloseAll();
    return(RETURN_OK);
}

/*************************** WB-Rahmenprogramm ***************************/

struct Library *IconBase;

int wbmain(struct WBStartup *wbmsg)
{   struct DiskObject *myself;
    char *tt_font,*arg;
    short FontSize=0;

    OpenLibs();
/*     SelectOutput(TRK_Open("CON:", MODE_NEWFILE)); */

    /* Parameter-Parsing: */
    if(!(IconBase=TRK_OpenStdLibrary(STDLIB_ICON,0)))
	error("icon.library nicht vefügbar !?!");
    if(wbmsg->sm_NumArgs<2)
	{
	CurrentDir(wbmsg->sm_ArgList->wa_Lock);
	myself=GetDiskObject(wbmsg->sm_ArgList->wa_Name);
	/* das Terminfile darf nur bei Aufruf des Programmes selbst
	   spezifiziert werden ! */
	if(myself)
	    if(arg=(char *)FindToolType(myself->do_ToolTypes,"TERMINDATEI"))
		MainFileName=GetStringCopy(arg);
	}
    else{
	CurrentDir(wbmsg->sm_ArgList[1].wa_Lock);
	MainFileName=wbmsg->sm_ArgList[1].wa_Name;
	myself=GetDiskObject(wbmsg->sm_ArgList[1].wa_Name);
	}
    if(!myself) error("eigenes Icon nicht verfügbar !?!");
    if(arg=(char *)FindToolType(myself->do_ToolTypes,"ALTDATEI"))
	OldFileName=GetStringCopy(arg);
    if(arg=(char *)FindToolType(myself->do_ToolTypes,"FONT"))
	tt_font=arg;
    if(arg=(char *)FindToolType(myself->do_ToolTypes,"FONTSIZE"))
	FontSize=atoi(arg);
    if(tt_font) ParseFont(tt_font, FontSize);
    if(FindToolType(myself->do_ToolTypes,"KEINEALTDATEI"))
	TerminBackup=FALSE;
    if(arg=(char *)FindToolType(myself->do_ToolTypes,"LINKS"))
	WLeft=atoi(arg);
    if(arg=(char *)FindToolType(myself->do_ToolTypes,"OBEN"))
	WTop=atoi(arg);
    if(arg=(char *)FindToolType(myself->do_ToolTypes,"BREITE"))
	WWidth=atoi(arg);
    if(!(arg=(char *)FindToolType(myself->do_ToolTypes,"HOEHE")))
	if(!(arg=(char *)FindToolType(myself->do_ToolTypes,"HÖHE")))
	    arg=(char *)FindToolType(myself->do_ToolTypes,"HöHE");
    if(arg) WHeight=atoi(arg);

    if(FindToolType(myself->do_ToolTypes,"NEU"))
	{
	char **tt_copy,**this;
	struct Termin *neutermin;
	short cnt, tt_num;

	for(tt_num=0; *(myself->do_ToolTypes+tt_num); ++tt_num);
	tt_copy=GetTempString((tt_num+1)*sizeof(char *));
	for(cnt=0, this=tt_copy; cnt<tt_num; ++cnt)
	    {
	    *this=*(myself->do_ToolTypes+cnt);
	    if(strnicmp(*this, "NEU=", 4)==0)
		{
		arg=GetStringCopy(*this+4);
		if(neutermin=parse(&arg)) EnQueue(&NeueTermine, neutermin);
		}
	    else ++this;
	    }
	*this=NULL;
	this=myself->do_ToolTypes;
	myself->do_ToolTypes=tt_copy;
	PutDiskObject((wbmsg->sm_NumArgs<2) ? wbmsg->sm_ArgList->wa_Name :
					      wbmsg->sm_ArgList[1].wa_Name,
		      myself);
	myself->do_ToolTypes=this;
	TRK_FreeMem(tt_copy);
	}

    FreeDiskObject(myself);
    TRK_CloseLibrary(IconBase);

    kernel();
    CloseAll();
    return(RETURN_OK);
}
