/*GuruStatistix V1.0 by Steffen Clemenz
  E-Mail: clemenz@zedat.fu-berlin.de   */

/*Reading Locales and Preferences from GuruStatistix.catalog*/

CALL OPEN out,"ENV:gurustatistix.prefs",read
 CALL READLN out
 locale=RESULT
 CALL READLN out
 gurudat=RESULT
 CALL READLN out
 textanzeiger=RESULT
 CALL READLN out
 guruhistory=RESULT
CALL CLOSE out

CALL OPEN out,locale||"/gurustatistix.catalog",read
 DO i=1 TO 13
  CALL READLN out
  string.i=RESULT
 END

CALL CLOSE out

SAY string.13
SAY string.10||" "||time()

ADDRESS command
gcounter=0

/*Reading of GuruHistory-file*/
CALL OPEN out,gurudat,read
 DO WHILE EOF(out)~=1
 CALL READLN out
 gurudat.gcounter=RESULT
 gcounter=gcounter+1
END

CALL CLOSE out

/*Now copying guruhistory to ram: because its much faster to analyse there*/
IF ~EXISTS('ram:guru') THEN DO
                      'copy '||guruhistory||' TO ram:guru'
                            END

/*Now opening the ram:guru-file*/
CALL OPEN out,"ram:guru",read

/*Definitions*/
counter=0
counterA=0
counterB=0
firstdatum=0
c=0

/*Searching for the important words*/
DO WHILE EOF(out)~=1

  CALL READLN out
  IF UPPER(WORD(RESULT,1))=UPPER("Task") THEN CALL Task
  IF UPPER(WORD(RESULT,1))=UPPER("Date") THEN CALL Datum
  IF UPPER(WORD(RESULT,1))=UPPER("error") THEN CALL Error

END

raus1:
CALL CLOSE out
CALL ordnen

EXIT

/*Collect and count the entries to a list*/
Task:

 buf=WORD(RESULT,4)
 wort=STRIP(buf,'B','"')

 i=0

 DO i=0 TO counter
 IF UPPER(wort)=UPPER(wort.i) THEN LEAVE
 END

 IF i>counter THEN DO
                     counter=counter+1
                     wort.counter=wort
                     wortzahl.counter=1
                    END
              ELSE
                   DO
                     wortzahl.i=(wortzahl.i)+1
                   END

RETURN

Datum:

 datum=WORD(RESULT,4)
 IF firstdatum=0 THEN firstdatum=datum

 i=0

 DO i=0 TO counterA
 IF UPPER(datum)=UPPER(datum.i) THEN LEAVE
 END

 IF i>counterA THEN DO
                     counterA=counterA+1
                     datum.counterA=datum
                     datumzahl.counterA=1
                    END
              ELSE
                   DO
                     datumzahl.i=(datumzahl.i)+1
                   END

RETURN

Error:

 error=WORD(RESULT,3)

 i=0

 DO i=0 TO counterB
 IF UPPER(error)=UPPER(error.i) THEN LEAVE
 END

 IF i>counterB THEN DO
                     counterB=counterB+1
                     error.counterB=error
                     errorzahl.counterB=1
                    END
              ELSE
                   DO
                     errorzahl.i=(errorzahl.i)+1
                   END

RETURN

/*Assoziate Errorcodenumber and understandable text*/
Errorname:

 IF UPPER(LEFT(error.i,1))=UPPER("8") THEN error.i="0"||RIGHT(error.i,LENGTH(error.i)-1)

 DO d=0 TO gcounter
  IF UPPER(error.i)=UPPER(WORD(gurudat.d,1)) THEN LEAVE
 END

 IF d>gcounter THEN error.i=error.i||" "||string.9
               ELSE error.i=gurudat.d
RETURN

/*To build the GuruCharts-File I use sort-program from Amiga-DOS*/
/*#####################################Fehler################################################*/
ordnen:
 string="                                               "
 null="0000000000"
 stern="**************************************************************************************"

 /*------------------------------------Tasks------------------------------------------------*/

 CALL OPEN mak,"ram:Charts1",write
 gesamtWort=0

 sterne=LEFT(stern,LENGTH(string.1))
 
 DO i=1 TO counter
 zeile=LEFT(null,6-LENGTH(wortzahl.i))||STRIP(wortzahl.i)||"   "||wort.i
 gesamtWort=gesamtWort+wortzahl.i
 CALL WRITELN mak,zeile
 END


 CALL CLOSE mak

 gesamtWort=LEFT(null,6-LENGTH(gesamtWort))||STRIP(gesamtWort)||"   "||string.2

 ADDRESS command
 'c:sort ram:Charts1 ram:Charts'

 datum=string.3||" "||date()
 firstdatum=string.5||" "||firstdatum

 CALL OPEN mak,"ram:anfang",write
 CALL WRITELN mak,firstdatum
 CALL WRITELN mak,datum
 CALL WRITELN mak,sterne
 CALL WRITELN mak,string.1
 CALL WRITELN mak,sterne
 CALL CLOSE mak

 CALL OPEN mak,"ram:charts",append
 CALL WRITELN mak," "
 CALL WRITELN mak,gesamtWort
 CALL WRITELN mak," "
 CALL WRITELN mak," "
 CALL CLOSE mak


 /*------------------------------------Date-------------------------------------------------*/
 sterne=LEFT(stern,LENGTH(string.4))

 CALL OPEN mak,"ram:datum1",write

 DO i=1 TO counterA
 zeile=LEFT(null,6-LENGTH(datumzahl.i))||STRIP(datumzahl.i)||"   "||datum.i
 CALL WRITELN mak,zeile
 END

 CALL CLOSE mak

 gesamtDatum=LEFT(null,6-LENGTH(counterA))||STRIP(counterA)||"   "||string.6

 'c:sort ram:datum1 ram:datum'

 CALL OPEN mak,"ram:anfang1",write
 CALL WRITELN mak,sterne
 CALL WRITELN mak,string.4
 CALL WRITELN mak,sterne
 CALL CLOSE mak

 CALL OPEN mak,"ram:datum",append
 CALL WRITELN mak," "
 CALL WRITELN mak,gesamtDatum
 CALL WRITELN mak," "
 CALL WRITELN mak," "
 CALL CLOSE mak

 /*------------------------------------Error--------------------------------------------------*/
 sterne=LEFT(stern,LENGTH(string.7))

 CALL OPEN mak,"ram:error1",write

 DO i=1 TO counterB
 CALL Errorname
 zeile=LEFT(null,6-LENGTH(errorzahl.i))||STRIP(errorzahl.i)||"   "||error.i
 CALL WRITELN mak,zeile
 END

 CALL CLOSE mak

 'c:sort ram:error1 ram:error'

 CALL OPEN mak,"ram:anfang2",write
 CALL WRITELN mak,sterne
 CALL WRITELN mak,string.7
 CALL WRITELN mak,sterne
 CALL WRITELN mak,string.12
 CALL CLOSE mak

 CALL OPEN mak,"ram:error",append
 CALL WRITELN mak," "
 CALL WRITELN mak,string.8

 CALL CLOSE mak

 'JOIN ram:anfang ram:charts ram:anfang1 ram:datum ram:anfang2 ram:error TO ram:GuruCharts'

 'delete >NIL: ram:anfang'
 'delete >NIL: ram:anfang1'
 'delete >NIL: ram:anfang2'
 'delete >NIL: ram:charts'
 'delete >NIL: ram:datum1'
 'delete >NIL: ram:datum'
 'delete >NIL: ram:Charts1'
 'delete >NIL: ram:error'
 'delete >NIL: ram:error1'

 'run >NIL: '||textanzeiger||' ram:GuruCharts'
 SAY string.11||" "||time()
RETURN
