/* do not edit automatically generated by mc from mcPreprocess. */
/* This file is part of GNU Modula-2.
GNU Modula-2 is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GNU Modula-2 is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see
. */
#include "config.h"
#include "system.h"
#include
# if !defined (PROC_D)
# define PROC_D
typedef void (*PROC_t) (void);
typedef struct { PROC_t proc; } PROC;
# endif
#define _mcPreprocess_C
#include "GmcPreprocess.h"
# include "GSYSTEM.h"
# include "GDynamicStrings.h"
# include "Glibc.h"
# include "Galists.h"
# include "GM2RTS.h"
# include "GFIO.h"
# include "GmcPrintf.h"
# include "GmcOptions.h"
static alists_alist listOfFiles;
/*
preprocessModule - preprocess a file, filename, returning the new filename
of the preprocessed file.
Preprocessing will only occur if requested by the user.
If no preprocessing was requested then filename is returned.
If preprocessing occurs then a temporary file is created
and its name is returned.
All temporary files will be deleted when the compiler exits.
*/
extern "C" DynamicStrings_String mcPreprocess_preprocessModule (DynamicStrings_String filename);
/*
makeTempFile -
*/
static DynamicStrings_String makeTempFile (DynamicStrings_String ext);
/*
onExitDelete -
*/
static DynamicStrings_String onExitDelete (DynamicStrings_String filename);
/*
removeFile - removes a single file, s.
*/
static void removeFile (void * a);
/*
removeFiles -
*/
static void removeFiles (void);
/*
makeTempFile -
*/
static DynamicStrings_String makeTempFile (DynamicStrings_String ext)
{
return DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "/tmp/mctemp.", 12), ext);
/* static analysis guarentees a RETURN statement will be used before here. */
__builtin_unreachable ();
}
/*
onExitDelete -
*/
static DynamicStrings_String onExitDelete (DynamicStrings_String filename)
{
alists_includeItemIntoList (listOfFiles, reinterpret_cast (DynamicStrings_Dup (filename)));
return filename;
/* static analysis guarentees a RETURN statement will be used before here. */
__builtin_unreachable ();
}
/*
removeFile - removes a single file, s.
*/
static void removeFile (void * a)
{
DynamicStrings_String s;
s = static_cast (a);
if ((libc_unlink (DynamicStrings_string (s))) != 0)
{} /* empty. */
}
/*
removeFiles -
*/
static void removeFiles (void)
{
alists_foreachItemInListDo (listOfFiles, (alists_performOperation) {(alists_performOperation_t) removeFile});
}
/*
preprocessModule - preprocess a file, filename, returning the new filename
of the preprocessed file.
Preprocessing will only occur if requested by the user.
If no preprocessing was requested then filename is returned.
If preprocessing occurs then a temporary file is created
and its name is returned.
All temporary files will be deleted when the compiler exits.
*/
extern "C" DynamicStrings_String mcPreprocess_preprocessModule (DynamicStrings_String filename)
{
DynamicStrings_String tempfile;
DynamicStrings_String command;
DynamicStrings_String commandLine;
unsigned int pos;
command = mcOptions_getCppCommandLine ();
if (DynamicStrings_EqualArray (command, (const char *) "", 0))
{
return filename;
}
else
{
tempfile = DynamicStrings_InitStringCharStar (reinterpret_cast (makeTempFile (DynamicStrings_InitString ((const char *) "cpp", 3))));
commandLine = DynamicStrings_Dup (command);
commandLine = DynamicStrings_ConCat (DynamicStrings_ConCat (DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_Dup (commandLine), ' '), filename), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) " -o ", 4))), tempfile);
if (mcOptions_getVerbose ())
{
mcPrintf_fprintf1 (FIO_StdOut, (const char *) "%s\\n", 4, (const unsigned char *) &commandLine, (sizeof (commandLine)-1));
}
if ((libc_system (DynamicStrings_string (commandLine))) != 0)
{
mcPrintf_fprintf1 (FIO_StdErr, (const char *) "C preprocessor failed when preprocessing %s\\n", 45, (const unsigned char *) &filename, (sizeof (filename)-1));
libc_exit (1);
}
commandLine = DynamicStrings_KillString (commandLine);
return onExitDelete (tempfile);
}
/* static analysis guarentees a RETURN statement will be used before here. */
__builtin_unreachable ();
}
extern "C" void _M2_mcPreprocess_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
{
listOfFiles = alists_initList ();
if (! (M2RTS_InstallTerminationProcedure ((PROC ) {(PROC_t) removeFiles})))
{
M2RTS_HALT (-1);
__builtin_unreachable ();
}
}
extern "C" void _M2_mcPreprocess_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
{
}