- char *complete_program = 0;
- int complete_size = 0;
- int current_shader = 0;
-
- va_list list;
- va_start(list, x);
-
- while(1)
- {
- char *text = va_arg(list, char*);
- if(!text) break;
-
-// Replace one occurrance in each source of main() with a unique id.
- char main_replacement[BCTEXTLEN];
- sprintf(main_replacement, "main%03d()", current_shader);
-//printf("VFrame::make_shader %s %s\n", text, main_replacement);
- char *source_replacement = new char[strlen(text) + strlen(main_replacement) + 1];
- char *ptr = strstr(text, "main()");
-
- if(ptr)
- {
- memcpy(source_replacement, text, ptr - text);
- source_replacement[ptr - text] = 0;
- strcat(source_replacement, main_replacement);
- ptr += strlen("main()");
- strcat(source_replacement, ptr);
- current_shader++;
- }
- else
- {
- memcpy(source_replacement, text, strlen(text));
- source_replacement[strlen(text)] = 0;
- }
-
- if(!complete_program)
- {
- complete_size = strlen(source_replacement) + 1;
- complete_program = (char*)malloc(complete_size);
- strcpy(complete_program, source_replacement);
- }
- else
- {
- complete_size += strlen(source_replacement);
- complete_program = (char*)realloc(complete_program, complete_size);
- strcat(complete_program, source_replacement);
- }
-
- delete [] source_replacement;
- }
- va_end(list);
-
-// Add main() function which calls all the unique main replacements in order
- char main_function[BCTEXTLEN];
- sprintf(main_function,
- "\n"
- "void main()\n"
- "{\n");
-
- for(int i = 0; i < current_shader; i++)
- {
- char main_replacement[BCTEXTLEN];
- sprintf(main_replacement, "\tmain%03d();\n", i);
- strcat(main_function, main_replacement);
- }
-
- strcat(main_function, "}\n");
- if(!complete_program)
- {
- complete_size = strlen(main_function) + 1;
- complete_program = (char*)malloc(complete_size);
- strcpy(complete_program, main_function);