[gnu.gcc.bug] New gcc.com for VMS

angel@FLIPPER.MIAMI.EDU (angel li) (09/01/89)

At the end of this message is a new version of gcc.com for VMS.  The previous
version of gcc.com would mis-parse a define token with an embedded comma, i.e.

    $ gcc /def=("TFMPATH="",/tex_fonts""", "PKDIR="",/tex_fonts""") search.c

Isn't writing DCL procedures fun!?

Angel Li
University of Miami/RSMAS Remote Sensing Group

Internet: angel@flipper.miami.edu			UUCP: ncar!umigw!angel

$ Verifying:= 'f$verify(0)'
$!
$!	GNU "CC" Compiler command file
$!
$!	Invoked from the GCC compile driver via LIB$DO_COMMAND:
$!		P1 = File to compile
$!		P2 = Options: O - Optimize
$!			      D - Debug
$!			      M - Produce Machine Code
$!			      V - Be verbose during compilation
$!		P3 = "," separated Defines
$!		P4 = "," separated Undefines
$!		P5 = "," separated Include directories
$!		P6 = CC1 compilation phase options, including:
$!			-mdont-save-r2-r5	(PCC style register saving)
$!			-mpcc-alignment		(PCC style struct align)
$!
$!
$!  Constants:
$!
$ Version:='f$trnlnm("GNU_CC_VERSION")'
$ gcc_cpp="$GNU_CC:[000000]GCC-CPP"
$ gcc_cc1="$GNU_CC:[000000]GCC-CC1"
$ gcc_as= "$GNU_CC:[000000]GCC-AS ""-vGNU CC  V''Version'"""
$!
$!  Parse the options
$!  -----------------
$ P2_Length = f$length(P2)	! So we only have to calculate it once
$ Optimize = ""			!    Default = No Optimize
$ Debug = ""			!    Default = No Debug
$ Machine_Code = 0		!    Default = No Machine Code
$ Quiet = " -quiet"		!    Default = Silent
$ if f$locate("O",p2) .ne. P2_Length then Optimize = " -opt"
$ if f$locate("D",p2) .ne. P2_Length then Debug = " ""-G"""
$ if f$locate("M",p2) .ne. P2_Length then Machine_Code = 1
$ if f$locate("V",p2) .ne. P2_Length then Quiet = ""
$ Temp_File = ""		! For Control_Y abort check
$ On Control_Y then Goto Ctly_Abort
$!
$!	Do the CC1 compilation phase options
$!
$ CC1_Options = P6
$ Save_R2_R5 = ""
$ if f$locate("-mdont-save-r2-r5",P6) .eq. f$length(P6) then goto 10$
$ Save_R2_R5 = " -fcall-used-r2 -fcall-used-r3 -fcall-used-r4 -fcall-used-r5"
$ l = f$locate("-mdont-save-r2-r5",P6)
$ l1 = l + 17
$ CC1_Options = "''f$extract(0,l,P6)'''f$extract(l1,255,P6)'"
$ 10$:
$ Alignment = " -mvaxc-alignment"
$ if f$locate("-mpcc-alignment",P6) .eq. f$length(P6) then goto 20$
$ Alignment = ""
$ Alignment_Define = " ""-DPCC_ALIGNMENT"""
$ l = f$locate("-mpcc-alignment",CC1_Options)
$ l1 = l + 15
$ CC1_Options = "''f$extract(0,l,CC1_Options)'''f$extract(l1,255,CC1_Options)'"
$ 20$:
$!
$!  Do the filename (default to ".C")
$!
$ Filename:='p1'
$ Extension:='f$parse(p1,,,"TYPE","SYNTAX_ONLY")'
$ if Extension .eqs. "." then Filename:='p1'.C
$!
$!	Do the object file
$!
$ Object_File:='f$parse(p1,,,"NAME","SYNTAX_ONLY")'
$!
$!	Start the pre-processor invocation string
$!
$ cpp_args=""
$!
$!	Do any defines
$!
$ inArg = p3
$ if inArg .nes. "" then gosub parseList
$!
$!	Do any undefines
$!
$ inArg = p4
$ if inArg .nes. "" then gosub parseList
$!
$!	Do any include directories
$!
$ Includes_Loop:
$ if p5 .eqs. "" then goto Includes_Done
$ l = f$locate(",",p5)
$ l1 = l
$ arg = f$extract(0,l,p5)
$ l1 = l1 + 1
$ p5 = f$extract(l1,255,p5)
$ l = l + 5
$ gosub doubleQuotes
$ cpp_args = cpp_args + " ""-I" + arg + """"
$ goto Includes_Loop
$!
$ Includes_Done:
$!
$!	Calculate the Temp file name
$!
$ Temp_File:=GCC_'f$getjpi(0,"PID")'
$!
$!	Do the "C" pre-processor
$!
$ if Quiet .eqs. "" then set verify
$ gcc_cpp 'cpp_args''Alignment_Define' 'Filename' 'Temp_File'.CPP
$ Status=$status
$ l = 'f$verify(0)'
$ if Status .nes. "%X00000001" then goto CPP_Error
$!
$!	Do the "C" compilation
$!
$ Assembly_File:='Temp_File'.S
$ if Machine_Code then Assembly_File:='Object_File'.S
$ if Quiet .eqs. "" then set verify
$ gcc_cc1 'Temp_File'.CPP'Quiet' -dumpbase 'Filename''Optimize''Debug' -mgnu 'CC1_Options''Save_R2_R5''Alignment' -o 'Assembly_File'
$ Status=$status
$ l = 'f$verify(0)'
$ delete/nolog/noconfirm 'Temp_File'.CPP;
$ if Status .nes. "%X00000001" then goto CC1_Error
$!
$!	Do the assembly
$!
$ if Machine_Code then goto Exit
$ if Quiet .eqs. "" then set verify
$ gcc_as 'Temp_File'.S -o 'Object_File'.OBJ
$ Status=$status
$ l = 'f$verify(0)'
$ delete/nolog/noconfirm 'Assembly_File';
$ if Status .nes. "%X00000001" then goto Gas_Error
$ goto Exit
$!
$!	ERRORS:
$!	------
$ Ctly_Abort:
$ if Temp_File .eqs. "" then exit 4
$
$ Gas_Error:
$ delete/nolog/noconfirm 'Temp_File'.OBJ;
$ if verifying then set verify
$ exit Status	! Error in Assembly phase
$ CC1_Error:
$ delete/nolog/noconfirm 'Assembly_File';
$ if verifying then set verify
$ exit Status	! Error in "C" Compilation phase
$ CPP_Error:
$ delete/nolog/noconfirm 'Temp_File'.CPP;
$ if verifying then set verify
$ exit Status	! Error in "C" Pre-Processor phase
$!
$!	Done
$!
$ Exit:
$ if verifying then set verify
$ exit 1
$!
$!	Double up them double quotes
$!
$doubleQuotes:
$ k = f$length(arg)
$ if k .eq. 0 then goto noQuotes
$ j = 0
$ newArg = ""
$ dq1$:
$  c = f$extract(j,1,arg)
$  if c .eqs. """" then newArg = newArg + """"
$  newArg = newArg + c
$  j = j+1
$  if j .lt. k then goto dq1$
$ arg = newArg
$ noQuotes:
$ return
$!
$!	Parse a list of comma-separated tokens
$!
$!	inArg = input string
$!
$parseList:
$!echo = "write sys$output"
$ DQUOTE = """"
$ i = 0
$ len = f$length(inArg)
$ arg = ""
$ 1$:
$   if i .ge. len then goto noMoreDefines
$   c = f$extract(i, 1, inArg)
$   if c .eqs. DQUOTE then goto quotedString
$   if c .eqs. "," then goto OneDefineDone
$     arg = arg + c
$     goto 4$
$   quotedString:
$     arg = arg + c
$     i = i+1
$     2$:
$       if i .ge. len then goto noMoreDefines
$       c = f$extract(i, 1, inArg)
$       if c .nes. DQUOTE then goto 3$
$       if f$extract(i+1, 1, inArg) .eqs. DQUOTE then goto 2a$
$       arg = arg + c
$       goto 4$
$     2a$:
$       arg = arg + c
$       i = i+1
$     3$:
$       arg = arg + c
$	i = i+1
$    goto 2$
$    OneDefineDone:
$      gosub doubleQuotes
$!     echo "arg: ", arg
$      cpp_args = cpp_args + " ""-D" + arg + """
$      arg = ""
$      goto 4$
$    4$:
$      i = i+1
$      goto 1$
$ noMoreDefines:
$  if arg .eqs. "" then goto Defines_Done
$  gosub doubleQuotes
$! echo "arg: ", arg
$  cpp_args = cpp_args + " " + DQUOTE + "-D" + arg + DQUOTE
$!
$ Defines_Done:
$! echo "cpp_args: ", cpp_args
$  return