/*************************************
 ** programma make , per E          **
 ** si limita ad attaccare i file   **
 ** indicati uno dietro l'altro e   **
 ** li compila.                     **
 *************************************
 ** By BIANCA HARD&SOFT (c) 1994    **
 ** Version : 1.00                  **
 *************************************/

/****************************************************************
 ** DESCRIZIONE FORMATO <makefile>  (file ascii)   :
 ** Le linee che iniziano con un carattere "#"
 ** sono considerate commenti, e sono ignorate.
 ** La prima linea non commento deve essere il nome del file
 ** eseguibile che si otterra'.
 ** Le altre linee (sempre non commenti)
 ** se cominciano per $ indicheranno le opzioni da usare
 ** nella compilazione, devono essere nello stesso ordine e
 ** formato che si aspetta il compilatore (Max: 80 caratteri)
 ** (se piu' di una sara' considerata solo l'ultima)
 ** Altrimenti saranno i nomi (inclusa l'estensione) dei moduli
 ** da compilare, nello stesso ordine in cui appaiono nel file
 ** NOTA : le righe vuote o con tutti spazzi sono ignorate.
 *********************************************************+
 ** FORMATO COMANDO :
 ** emake nome_file(.make)
 ** dove nome_file e' il nome del makefile da usare, deve avere
 ** l'estensione .make ma non va indicato
 ***********************************************************
 ** NOTA : makefile deve essere nella directory corrente
 ** inoltre nelle directory del path di ricerca devono essere
 ** presenti i comandi COPY e ovviamente EC
 ******************************************************************/


PROC main()
DEF   i:LONG
DEF   f:LONG
DEF   m:LONG
DEF  ct:LONG
DEF   c:LONG
DEF  c1:LONG
DEF out:LONG
DEF nom:PTR TO CHAR
DEF  l2:PTR TO CHAR
DEF lin[300]:STRING
DEF  l1[300]:STRING
DEF nex[300]:STRING
DEF opz[82]:STRING
DEF buf:PTR TO CHAR


opz:=''  /* default opzioni : nessun opzione */

l2:=TrimStr(arg)
IF StrLen(l2) = NIL
   WriteF ('FORMATO:EMake nome_file(.make)\n')
   RETURN 19
ENDIF

StringF(l1,'\s.make',l2)

buf:=New(30000)
IF buf=NIL
   WriteF('Memoria insufficente!\n')
   RETURN 20
ENDIF

IF (m:=Open(l1,OLDFILE)) <= NIL
   WriteF('Non posso aprire il file di definizione :\s!\n',l1)
   RETURN 21
ENDIF

IF (out:=Open('t:sorg.e',NEWFILE)) <= NIL
   WriteF('Non posso aprire il file d''uscita :t:sorg.e !\n')
   Close(m)
   RETURN 22
ENDIF

WriteF('Make for E compiler Ver:1.00 \nby Bianca HARD&SOFT 1994\n\n')

/* carico nome file eseguibile risultante */
REPEAT
   Fgets(m,l1,290)
   nom:=TrimStr(l1)
   i:=StrLen(nom)
   nom[i-1]:=0       /* elimino il LF finale */
UNTIL((nom[0]<>"#") AND StrLen(nom) > 0 )

/* se esiste gia' il file ne cambia il nome in .old */
IF (i:=Open(nom,OLDFILE)) > 0
   Close(i)
   StringF(nex,'\s.old',nom)
   DeleteFile(nex)
   Rename(nom,nex)
ENDIF

ct:=1

WHILE( (f:=Fgets(m,lin,290)) > 0)

   i:=StrLen(lin)
   lin[i-1]:=0   /* elimino il LF finale */

   l2:=TrimStr(lin)
/* test se opzioni di programmazione */
   IF l2[0]="$"
      StringF(opz,'\s(0,80)',l2+1)

/* test se commento */
   ELSEIF (l2[0]<>"#") AND (StrLen(l2) > 0)

/* carico nome file da attaccare */
      IF (i:=Open(l2,OLDFILE)) <= NIL
         WriteF('Non posso leggere il file:\s !\n',l2)
         Close(m)
         Close(out)
         RETURN 23
      ENDIF

      WriteF('Il file<\s> comincia dalla linea:\d \n',l2,ct)

      WHILE ((c:=Read(i,buf,29990)) > 0 )
         Write(out,buf,c)
      /* calcolo n# linee caricate */
         FOR c1:=0 TO c-1 DO IF buf[c1] = $0A THEN ct++
      ENDWHILE

      Close(i)
   ENDIF

ENDWHILE

WriteF('\n')

Close(m)
Close(out)

StringF(lin,'ec \s t:sorg',opz)

Execute(lin,NIL,NIL)

StringF(lin,'copy t:sorg \s',nom)

Execute(lin,NIL,NIL)

DeleteFile('t:sorg')
DeleteFile('t:sorg.e')

ENDPROC

