// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Compile .go file, import data from .6 file, and generate C string version. #include #include #include #include int main(int argc, char **argv) { char *name; FILE *fin; char buf[1024], initfunc[1024], *p, *q; if(argc != 2) { fprintf(stderr, "usage: mkbuiltin1 sys\n"); fprintf(stderr, "in file $1.6 s/PACKAGE/$1/\n"); exits("error"); } name = argv[1]; snprintf(initfunc, sizeof(initfunc), "init_%s_function", name); snprintf(buf, sizeof(buf), "%s.%s", name, getenv("O")); if((fin = fopen(buf, "r")) == NULL) { fprintf(stderr, "open %s: %r\n", buf); exits("eror"); } // look for $$ that introduces imports while(fgets(buf, sizeof buf, fin) != NULL) if(strstr(buf, "$$")) goto begin; fprintf(stderr, "did not find beginning of imports\n"); exits("eror"); begin: printf("char *%simport =\n", name); // process imports, stopping at $$ that closes them while(fgets(buf, sizeof buf, fin) != NULL) { buf[strlen(buf)-1] = 0; // chop \n if(strstr(buf, "$$")) goto end; // chop leading white space for(p=buf; *p==' ' || *p == '\t'; p++) ; // cut out decl of init_$1_function - it doesn't exist if(strstr(buf, initfunc)) continue; // sys.go claims to be in package PACKAGE to avoid // conflicts during "6g sys.go". rename PACKAGE to $2. printf("\t\""); while(q = strstr(p, "PACKAGE")) { *q = 0; printf("%s", p); // up to the substitution printf("%s", name); // the sub name p = q+7; // continue with rest } printf("%s\\n\"\n", p); } fprintf(stderr, "did not find end of imports\n"); exits("eror"); end: printf("\t\"$$\\n\";\n"); return 0; }