/* cl-wrap.c Copyright (C) 2006-2007 Codemist Ltd */ /* * This code may be used and modified, and redistributed in binary * or source form, subject to the "CCL Public License", which should * accompany it. This license is a variant on the BSD license, and thus * permits use of code derived from this in either open and commercial * projects: but it does require that updates to this code be made * available back to the originators of the package. * Before merging other code in with this or linking this code * with other packages or libraries please check that the license terms * of the other material are compatible with those of this. */ /* Signature: 42dde825 13-Aug-2007 */ /* * This is a rather trivial wrapper program that maps Unix-style * "-o" options to a compiler onto the corresponding forms that * Microsoft's compiler wants. As of early 2006 the Microsoft compilers * in their SDK still support "-o", but they flag it as deprecated and * not liable to be supported in some future versions, so the treatment * here is for future-proofing not a matter of immediate urgency. * * This arises because the GNU "automake" tools insert "-o" at places * in their generated Makefile and it is not clear how to make them * use some other form. */ #include <stdio.h> #include <stdlib.h> static char newcommand[1000]; static char newcommand1[2000]; static int ncn = 0; int main(int argc, char *argv[]) { int i, j; ncn = 0; ncn = sprintf(newcommand+ncn, "cl"); for (i=1; i<argc; i++) { char *a = argv[i]; /* Have a go at avoiding buffer overflow */ if (ncn + strlen(a) > sizeof(newcommand)-10) { fprintf(stderr, "command-line too long\n"); exit(1); } /* If the argument is not "-o" just pass it on */ if (strcmp(a, "-o") != 0) { ncn += sprintf(newcommand+ncn, " %s", a); continue; } /* Check that there is a sensible thing after the "-o" */ if (i+1==argc) { fprintf(stderr, "-o at end of args\n"); ncn += sprintf(newcommand+ncn, " -o"); continue; } a = argv[++i]; j = strlen(a); /* Have a go at avoiding buffer overflow */ if (ncn + j > sizeof(newcommand)-10) { fprintf(stderr, "command-line too long\n"); exit(1); } if (j < 4) { fprintf(stderr, "-o with short arg (%s)\n", a); ncn += sprintf(newcommand+ncn, " -o %s", a); continue; } /* Map it if that item end if ".exe", ".com" or ".obj" */ if (strcmp(a+j-4, ".exe")== 0 || strcmp(a+j-4, ".com")==0) { ncn += sprintf(newcommand+ncn, " -Fe%s", a); continue; } else if (strcmp(a+j-4, ".obj")== 0) { ncn += sprintf(newcommand+ncn, " -Fo%s", a); continue; } else { fprintf(stderr, "-o arg with unknown extension (%s)\n", a); ncn += sprintf(newcommand+ncn, " -o %s", a); continue; } } /* Obey the generated command-line */ newcommand[ncn] = 0; /* Well since it is passed to bash I need to double backslashes */ j = 0; for (i=0; i<ncn; i++) { int c = newcommand[i]; newcommand1[j++] = c; if (c == '\\') newcommand1[j++] = c; } newcommand1[j] = 0; return system(newcommand1); } /* end of cl-wrap.c */