On 7/7/06, Marvin Humphrey <[EMAIL PROTECTED]> wrote:

On Jul 6, 2006, at 2:47 PM, Marvin Humphrey wrote:

> I can think of some functions I'd like to add

In the initial prototype, it's not possible to write a Charmonizer
executable.  We need to add a couple functions to make that possible:
CH_run_module(), and CH_finish().

Here's how a Charmonizer app that writes lucyport.h might look:

   CH_api_version('0');

   /* start _charmonize.c */
   CH_append_raw(CH_q

       #include <stdio.h>

       #define TYPEDEF_PREFIX "lucy_"
       #define CONSTANT_PREFIX "LUCY_"
       #define MACRO_PREFIX "Lucy_"

       int main()
       {
           printf("/* Header file auto-generated by Charmonizer. */\n
\n");

     CH_q
   );

   /* most of these haven't been written yet */
   CH_run_module('modules/integers.charm');
   CH_run_module('modules/floats.charm');
   CH_run_module('modules/large_files.charm');
   CH_run_module('modules/malloc_macros.charm');

   /* close _charmonize.c */
   CH_append_raw(CH_q
       return 0;
     }
     CH_q
   );

   /* run _charmonize.c and capture output to lucyport.h */
   CH_finish('lucyport.h');

Portable file path handling is a problem, but I think we can punt on
that and just have our various build scripts write the Charmonizer
script dynamically.

This is just an idea, but it might be worth doing away with the DSL
idea and just doing it all in C, Maybe  just having a perl script to
generate the .charm files. I imagine it would look something like
this;

+++ charmonizer.c +++

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TYPEDEF_PREFIX "lucy_"
#define CONSTANT_PREFIX "LUCY_"
#define MACRO_PREFIX "Lucy_"

#define INC_STDLIB "#include <stdlib.h>\n"
#define INC_STDIO "#include <stdio.h>\n"

#define MAIN_START \
"int main(int argc, char *argv[])\n"\
"{\n"
#define MAIN_END \
"    return 0;\n"\
"}\n"

static void run(char *code)
{
   FILE *f = fopen("_charmonizer.c", "w");
   fwrite(code, sizeof(char), strlen(code), f);
   fclose(f);
   system("gcc _charmonizer.c; a.out");
   remove("_charmonizer.c");
}

int main(int argc, char *argv[])
{
   (void)argc;
   (void)argv;

#include "modules/integers.charm"
#include "modules/floats.charm"
#include "modules/large_files.charm"
#include "modules/malloc_macros.charm"
#include "modules/endian.charm"

   return 0;
}



+++ modules/integers.charm +++

/* Check for inttypes.h */
run(INC_STDIO
   "#include <inttypes.h>\n"
   MAIN_START
   "   printf(\"#define "CONSTANT_PREFIX"HAS_INT_TYPES 1\\n\");\n"
   MAIN_END);

/* Check for long long */
run(INC_STDIO
   MAIN_START
   "    long long ll = 1;\n"
   "    printf(\"#define "CONSTANT_PREFIX"HAS_LONG_LONG 1\\n\");\n"
   "    printf(\"#define "CONSTANT_PREFIX"SIZEOF_LONG_LONG %d\\n\","
   "           sizeof(long long));\n"
   MAIN_END);

printf("#define "CONSTANT_PREFIX"SIZEOF_CHAR %d\n", sizeof(char));
printf("#define "CONSTANT_PREFIX"SIZEOF_SHORT %d\n", sizeof(short));
printf("#define "CONSTANT_PREFIX"SIZEOF_INT %d\n", sizeof(int));
printf("#define "CONSTANT_PREFIX"SIZEOF_LONG %d\n", sizeof(long));
printf("#define "CONSTANT_PREFIX"SIZEOF_PTR %d\n", sizeof(void *));

printf("\n");
printf("/* 8 bit integers */\n");
printf("#if SIZEOF_CHAR == 1\n");
printf("    typedef char "TYPEDEF_PREFIX"i8_t;\n");
printf("    typedef unsigned char "TYPEDEF_PREFIX"u8_t;\n");
printf("#else\n");
printf(" #error \"No 8-bit integer type available\"\n");
printf("#endif\n");
printf("\n");
printf("/* 16-bit integers */\n");
printf("#if SIZEOF_SHORT == 2\n");
printf("    typedef short "TYPEDEF_PREFIX"i16_t;\n");
printf("    typedef unsigned short "TYPEDEF_PREFIX"u16_t;\n");
printf("#else\n");
printf(" #error \"No 16-bit integer type available\"\n");
printf("#endif\n");
printf("\n");
printf("/* 32-bit integers */\n");
printf("#if SIZEOF_INT == 4\n");
printf("    typedef int "TYPEDEF_PREFIX"i32_t;\n");
printf("    typedef unsigned int "TYPEDEF_PREFIX"u32_t;\n");
printf("#elif SIZEOF_LONG == 4\n");
printf("    typedef long "TYPEDEF_PREFIX"i32_t;\n");
printf("    typedef unsigned long "TYPEDEF_PREFIX"u32_t;\n");
printf("#else\n");
printf(" #error \"No 32-bit integer type available\"\n");
printf("#endif\n");
printf("\n");
printf(" /* 64-bit integers */\n");
printf("#if SIZEOF_LONG == 8\n");
printf("    typedef long "TYPEDEF_PREFIX"i64_t;\n");
printf("    typedef unsigned long "TYPEDEF_PREFIX"u64_t;\n");
printf("#elif defined HAS_LONG_LONG\n");
printf(" #if SIZEOF_LONG_LONG == 8\n");
printf("    typedef long long "TYPEDEF_PREFIX"i64_t;\n");
printf("    typedef unsigned long long "TYPEDEF_PREFIX"u64_t;\n");
printf(" #else\n");
printf("  #error \"No 64-bit integer type available\"\n");
printf(" #endif\n");
printf("#endif\n");
printf("\n");
printf("/* pointers */\n");
printf("#if SIZEOF_PTR == SIZEOF_INT\n");
printf("    typedef int "TYPEDEF_PREFIX"iptr_t;\n");
printf("    typedef unsigned int "TYPEDEF_PREFIX"uptr_t;\n");
printf("#elif SIZEOF_PTR == SIZEOF_LONG\n");
printf("    typedef long "TYPEDEF_PREFIX"ptr_t;\n");
printf("    typedef unsigned long "TYPEDEF_PREFIX"uptr_t;\n");
printf("#elif defined HAS_LONG_LONG\n");
printf(" #if SIZEOF_PTR == SIZEOF_LONG_LONG\n");
printf("    typedef long long "TYPEDEF_PREFIX"iptr_t;\n");
printf("    typedef unsigned long long "TYPEDEF_PREFIX"uptr_t;\n");
printf(" #else\n");
printf("  #error \"Couldn't find integer type with same size as pointer\"\n");
printf(" #endif\n");
printf("#endif\n");

Reply via email to