/*********************************************************************
	>>>>>  Chars.c   Sortier/Mustersuch-Routinen von `TaskDrive`.

	Autor: Rudolf Gierlinger   A - 4692 Niederthalheim 50

	Verwendung und Verbreitung fuer NICHTKOMMERZIELLEN Gebrauch
	erlaubt, solange der Autorenvermerk nicht geloescht wird !

						Dezember 1988
 *********************************************************************/
#include "Chars.H"

/*=== FUNCTION  Zahl2Digits ===*/
/* Erzeugt aus einer Binär-Zahl eine Ascii-Zahl.
   Führt auch Korrektur durch, damit pos. und neg. Zahl auf selber Pos. sind.
*/
char *Zahl2Digits(Puff,Zahl)
	char *Puff;
	int  Zahl;
{
   sprintf (Puff,"%3.3d",Zahl);
   if (Zahl>=0)
   {  Puff[3]=Puff[2];  Puff[2]=Puff[1];
      Puff[1]=Puff[0];  Puff[0]=' ';
   }
   return (Puff);
}

/*=== FUNCTION  Cap ===*/
/*** in Grossbuchstaben wandeln. (Umlaute werden beruecksichtigt!) ***/
char Cap(ch)
	char ch;
{
   if ((ch>='a') && (ch<='z'))  ch -= ('a'-'A');
   else
      switch(ch)
      {	case 'ä': ch = 'Ä'; break;
	case 'ö': ch = 'Ö'; break;
	case 'ü': ch = 'Ü'; break;
      }
   return (ch);
}

/*=== FUNCTION  strcmp_ic ===*/
/*** Stringvergleich - case insensitive ****/
strcmp_ic (s1,s2)
	char *s1,*s2;
{
	register int i;

   for (i=0;
	s1[i] && ( Cap(s1[i]) == Cap(s2[i]) );
	i++ )
      ;
   if  (! (s1[i] || s2[i]) )		return(0);
   if  ( Cap(s1[i]) < Cap(s2[i]) ) 	return(-1);
   return(1);
}

/*=== FUNCTION  SortEintr ===*/
/*** Eintraege sortieren: `Sortieren durch Auswahl` ****/
VOID SortEintr()
{
	struct TaskEintr *ePuffer;
	int  		min; 		/* zum Swappen der Farben */
	REGISTER int 	i,j;

   /* Sortieren. (ignoriert Gross/Kleinschreibung) */
   for (i=0; i <= Anzahl; i++)
   {
	min=i;
	for (j=i+1; j<Anzahl; j++)
	    if  (strcmp_ic(EintrPtr[ j ]->Name,EintrPtr[min]->Name) == -1)
		min=j;

	ePuffer       = EintrPtr[i]; 	/* Namen tauschen */
	EintrPtr[i]   = EintrPtr[min];
	EintrPtr[min] = ePuffer;
   }
}

/*=== FUNCTION   ===*/
/* Sucht Muster "DasSuche" im String "SuchHier" (Musterstring in Grosschrift!)
   RESULT: BOOL MusterGefunden ja/nein.
*/
BOOL MusterGefunden(SuchHier,DasSuche)
	char  	*SuchHier, *DasSuche;

{	int 	Hier, Das, HierDrin;
	BOOL 	obGefunden = FALSE;

   for (Das=0, Hier=0;  SuchHier[Hier]; Hier++)
   {
	for ( Das=0, HierDrin=Hier; DasSuche[Das];  Das++, HierDrin++ )
		if (  (SuchHier[HierDrin]=='\0')
		   || (Cap(SuchHier[HierDrin]) != DasSuche[Das])
		   ) 	break;
	if (DasSuche[Das]=='\0') obGefunden = TRUE;
   }
   return (obGefunden);
}

/*=== FUNCTION  WirklichZeigen ===*/
/* RESULT: WirklichZeigen!, falls foldendes NICHT gilt:
    System-bzw. CLI-Tasks-Ausblendung gewuenscht (entspr.Gadget "ON")
    UND Task-Name enthaelt ein Muster aus der Musterliste
*/
BOOL WirklichZeigen(Idx)
	int 		Idx; /* Index im EintrPtr-Feld */
{
	REGISTER int 	i;
	BOOL  		Gefunden;

/* eventuelle doppelte Eintraege (woher kommen die???) aussortieren */
for (i=Idx+1; i<Anzahl; i++)
	if (EintrPtr[Idx]->MyID==EintrPtr[i]->MyID)
	{	KorrekturAnz++;
		return(FALSE); /* nicht zeigen */
	}

   /* ev. Taskeintraege nicht anzeigen ('ausblenden') */
   for (i=0, Gefunden=FALSE;   /* CLI-Tasks */
	i < CLIM_ANZ;
	i++) 	if (MusterGefunden(EintrPtr[Idx]->Name,CLIMuster[i]))
			Gefunden=TRUE;
   if (Gefunden)
   { 	CliTskAnz++;
	if (CLIoff) return(FALSE); /* keine Anzeige der CLI-Tasks */
   }

   for (i=0, Gefunden=FALSE;   /* System-Tasks */
	i < SYSM_ANZ;
	i++) 	if (MusterGefunden(EintrPtr[Idx]->Name,SysMuster[i]))
			Gefunden=TRUE;
   if (Gefunden)
   { 	SysTskAnz++; 
	if (SYSoff) return (FALSE); /* keine Anzeige der SYS-Tasks */
   }

   return(TRUE); /* Nicht 'zensuriert'. Zeigen! */
}
