Blame src/testmain.c

Packit Service 8bf002
/*
Packit Service 8bf002
 * testmain.c: A sample source to show how to use mcpp as a subroutine.
Packit Service 8bf002
 * 2006/11  Contributed by Juergen Mueller.
Packit Service 8bf002
 * Refer to mcpp-porting.html section 3.12 for compiling mcpp as a subroutine.
Packit Service 8bf002
 *
Packit Service 8bf002
 * 2007/03  Updated to enable testing of memory buffer output.
Packit Service 8bf002
 * 2008/04  The macro MCPP_LIB is no longer necessary.
Packit Service 8bf002
 */
Packit Service 8bf002
Packit Service 8bf002
#include <stdio.h>
Packit Service 8bf002
#include <stdlib.h>
Packit Service 8bf002
#include <time.h>
Packit Service 8bf002
Packit Service 8bf002
#include "mcpp_lib.h"
Packit Service 8bf002
Packit Service 8bf002
int main(int argc, char *argv[])
Packit Service 8bf002
{
Packit Service 8bf002
    int     i, j;
Packit Service 8bf002
    char ** tmp_argv;
Packit Service 8bf002
Packit Service 8bf002
    tmp_argv = (char **) malloc(sizeof(char *) * (argc + 1));
Packit Service 8bf002
Packit Service 8bf002
    if (tmp_argv == NULL) {
Packit Service 8bf002
        return(0);
Packit Service 8bf002
    }
Packit Service 8bf002
Packit Service 8bf002
    /*
Packit Service 8bf002
     * assume strict order: <options, ...> <files, ...> and
Packit Service 8bf002
     * each option and its argument are specified without intervening spaces
Packit Service 8bf002
     * such as '-I/dir' or '-otmp.i' (not '-I /dir' nor '-o tmp.i').
Packit Service 8bf002
     */
Packit Service 8bf002
    for (i = 0; i < argc; ++i) {
Packit Service 8bf002
        tmp_argv[i] = argv[i];              /* copy options */
Packit Service 8bf002
Packit Service 8bf002
        if (       (*argv[i] != '-')
Packit Service 8bf002
                && (*argv[i] != '/')
Packit Service 8bf002
                && (i > 0)) {
Packit Service 8bf002
            break;
Packit Service 8bf002
        }
Packit Service 8bf002
    }
Packit Service 8bf002
Packit Service 8bf002
    /* this works only if called function does not manipulate pointer array! */
Packit Service 8bf002
    /*
Packit Service 8bf002
     * Note that mcpp no longer uses freopen() since 2008/04/20, so you can 
Packit Service 8bf002
     * output multiple input to different files, though this sample output
Packit Service 8bf002
     * to stdout, which may be redirected.
Packit Service 8bf002
     */
Packit Service 8bf002
    for (j = i; i < argc; ++i) {
Packit Service 8bf002
        int     retval;
Packit Service 8bf002
        char *  result;
Packit Service 8bf002
        clock_t start, finish;
Packit Service 8bf002
Packit Service 8bf002
        tmp_argv[j] = argv[i];              /* process each file    */
Packit Service 8bf002
        fprintf(stderr, "\n%s\n", argv[i]);
Packit Service 8bf002
Packit Service 8bf002
        start = clock();                    /* get start time       */
Packit Service 8bf002
#if OUT2MEM         /* Use memory buffer    */
Packit Service 8bf002
        mcpp_use_mem_buffers( 1);           /* enable memory output */
Packit Service 8bf002
        retval = mcpp_lib_main(j + 1, tmp_argv);    /* call MCPP    */
Packit Service 8bf002
        result = mcpp_get_mem_buffer( OUT); /* get the output       */
Packit Service 8bf002
        if (result)
Packit Service 8bf002
            fputs( result, stdout);
Packit Service 8bf002
        result = mcpp_get_mem_buffer( ERR); /* get the diagnostics  */
Packit Service 8bf002
        if (result)
Packit Service 8bf002
            fputs( result, stderr);
Packit Service 8bf002
#if 0   /* debug output is the same with normal output by default   */
Packit Service 8bf002
        result = mcpp_get_mem_buffer( DBG); /* get the debug output */
Packit Service 8bf002
        if (result)
Packit Service 8bf002
            fputs( result, stdout);         /* appended to output   */
Packit Service 8bf002
#endif
Packit Service 8bf002
#else               /* Normal output to file    */
Packit Service 8bf002
        retval = mcpp_lib_main(j + 1, tmp_argv);
Packit Service 8bf002
#endif
Packit Service 8bf002
        finish = clock();                   /* get finish time      */
Packit Service 8bf002
Packit Service 8bf002
        fprintf(stderr, "\nReturned status:%d, Elapsed time: %.3f seconds.\n",
Packit Service 8bf002
                retval, (double)(finish - start) / (double)CLOCKS_PER_SEC);
Packit Service 8bf002
    }
Packit Service 8bf002
Packit Service 8bf002
    free(tmp_argv);
Packit Service 8bf002
Packit Service 8bf002
    return(0);
Packit Service 8bf002
}