(* *****************************************************************
** File    : IAR_C.PAS
** Created : 10.12.99
** Author  : M.Breunig, support for IAR AVR C- Compiler
**
** Macroset for FoldMaster
**
********************************************************************
** Version     Date      Change
** 1.47        10.12.99  Creation
** 1.50        27.07.01  Reworked
** **************************************************************-**)
PROGRAM iar_c;

(*{{{  Konstanten*)
const
     AVR_C   = 'IAR AVR C Compiler';
     AVR_ASM = 'IAR AVR Assembler';
     AVR_LNK = 'IAR AVR Linker';
(*}}}*)
(*{{{  Variablen *)
var  TransferString : String;
     ErrorFile      : String;
     ErrorMessage   : String;
     ErrorPosition  : Integer;
     ErrorLine      : Integer;
     ErrorColum     : Integer;
     InstPath       : String;
(*}}}*)

(*{{{  procedure TxAVRCCompile(s:string);*)
{ Die Fehlermeldungen des IAR Compilers koennen aus einer oder auch
  drei Zeilen bestehen. Zeilen ohne einen Dateinamen am Anfang werden
  in der Ausgabe unterdrueckt. Die Position innerhalb einer Zeile stimmt
  nur bei dreizeiligen Fehlermeldungen und muss deshalb nicht in jeder
  Zeile stimmen!
}
procedure TxAVRCCompile(s:string);
var code  : Integer;
    count : Integer;
begin
   if (pos('"',s) <> 1) then begin  { Zeile beginnt nicht mit Dateinamen}
      { auswerten auf die Fehlerposition innerhalb der Zeile }
      ErrorColum := pos('^',s);
   end else begin { Zeile beginnt mit Dateinamen, Fehlermeldung wird erzeugt}
      { "Warning[27]: Size of "x" object "y" is unknown" unterdruecken }
      count := pos('Warning[27]',s);
      if (count = 0) then begin
         {"Dateiname", Zeile  Art: Text}
         count := pos('"',s);
         delete (s,1,count);
         count := pos('"',s);
         if (count > 0) then begin
            ErrorFile := copy(s, 1, count-1);   {Dateinamen sichern}
            count := pos(',',s);
            delete(s,1,count);                  {Dateinamen loeschen}
            Val(s,ErrorLine,code);              {Fehlerzeile ermitteln}
            count := 1;
            { Zeilenzahl auskommentieren }
            if (code > 0) then ErrorMessage := copy(s, code, 255);  {Fehlermeldung sichern}
         end;

         {Ausgabestring loeschen, schreiben und ausgeben}
         TransferString := '';
         swrite(TransferString, FileNameGetNameExt(ErrorFile),
                '(', ErrorLine, ',', ErrorColum, '):', ErrorMessage);
         MessageAddMessage('IAR AVR C Compiler', ErrorFile,
                          TransferString, ErrorLine, ErrorColum);
      end; { keine Warnung 27}
   end;

end;
(*}}}*)

(*{{{  procedure insert_avr_variables;*)
{ Unterprogramm
}
procedure insert_avr_variables;
begin
   InsertVariable('Version',     '001');
   InsertVariable('AVR_C_OPT',   '-f $DRIVEDIR($PRONAME)\AVRC_cmd -S');
   InsertVariable('AVR_ASM_OPT', '-v3 -s+ -M<> -w+ -S');
   InsertVariable('AVR_LINK_OPT','-f $DRIVEDIR($PRONAME)\LINK_cmd');
   InsertVariable('LINKER_HEX',  '$Target$(Version).hex');
   InsertVariable('LINKER_MAP',  '$Target$(Version).map');
end;
(*}}}*)
(*{{{  procedure insert_linker_call;*)
{ Fuegt einen Aufruf des Linkers in die Projektdatei ein
}
procedure insert_linker_call;
begin
   if (IsProject) then ToolInsert(AVR_LNK);
end;
(*}}}*)

(*{{{  procedure define_avr_c_compiler;*)
{ Definiert AVR C- Compiler Tool
}
procedure define_avr_c_compiler;
begin
   ToolDefine       (AVR_C, InstPath+'\icca90.exe', '$DRIVEDIR($EDNAME)',
                            '$NAME($EDNAME)$EXT($EDNAME) $VAR(AVR_C_OPT)');
   ToolDefineType   (AVR_C, '*.c', '*.r90', 'C/C++', 2);
   ToolDefineMode   (AVR_C, 'IAR_C/txavrccompile', 3);
   ToolDefineConnect(AVR_C, '', 0);
   ToolDefineOptions(AVR_C, 0, 0);
end;
(*}}}*)
(*{{{  procedure define_avr_assembler;*)
{ Definiert AVR Assembler Tool
}
procedure define_avr_assembler;
begin
   ToolDefine       (AVR_ASM, InstPath+'\Aa90.exe', '$DRIVEDIR($EDNAME)',
                              '$NAME($EDNAME)$EXT($EDNAME) $VAR(AVR_ASM_OPT)');
   ToolDefineType   (AVR_ASM, '*.s90', '*.r90', 'Ateml AVR', 2);
   ToolDefineMode   (AVR_ASM, '', 2);
   ToolDefineConnect(AVR_ASM, '', 0);
   ToolDefineOptions(AVR_ASM, 0, 0);
end;
(*}}}*)
(*{{{  procedure define_avr_linker;*)
{ Definiert AVR Assembler Tool
}
procedure define_avr_linker;
begin
   ToolDefine       (AVR_LNK, InstPath+'\xlink.exe', '$DRIVEDIR($PRONAME)',
                              '$(AVR_LINK_OPT) -o $(LINKER_HEX) -l $(LINKER_MAP)');
   ToolDefineType   (AVR_LNK, '', '', '', 0);
   ToolDefineMode   (AVR_LNK, '', 2);
   ToolDefineConnect(AVR_LNK, '', 0);
   ToolDefineOptions(AVR_LNK, 0, 0);
end;
(*}}}*)


BEGIN
   (*{{{  Installationspfade bestimmen*)
   { ----------------------------------------------------- }
   { Installationspfad bestimmen }
   { ----------------------------------------------------- }
   { pruefen ob Variable AVR_INSTPATH vorhanden ist wenn nicht,
     dann nach dem Installations- Verzeichnis suchen lassen }
   InstPath := GetVarValue('AVR_INSTPATH');
   if (InstPath = '') then begin
      { Nach Pfad suchen }
      Beep;
      if (DirectoryInput ('AVR- Installations Pfad', InstPath)) then begin
         SetGlobalVar('AVR_INSTPATH', InstPath);
      end;
   end;
   (*}}}*)

   { ----------------------------------------------------- }
   { Compiler- Tools definieren }
   { ----------------------------------------------------- }
   if (NOT ToolAvail(AVR_C))   then define_avr_c_compiler;
   if (NOT ToolAvail(AVR_ASM)) then define_avr_assembler;
   if (NOT ToolAvail(AVR_LNK)) then define_avr_linker;

   MacroMenuAdd('insert_avr_variables');
   MacroMenuAdd('insert_linker_call');
END.

