const std::string replaceEnvVars(const std::string& str, const std::string& startStr, const std::string& endStr) { std::string ret_str(str); std::string::size_type subst_begin(0), subst_end(0), subst_len(0); while( (subst_begin = ret_str.find(startStr)) != std::string::npos) { std::string env_var, env_var_val; // The environment variable and its value subst_end = ret_str.find(endStr); subst_len = subst_end - subst_begin; env_var = std::string(ret_str, subst_begin+startStr.size(), subst_len-startStr.size()); vpr::System::getenv(env_var, env_var_val); ret_str.replace(subst_begin, subst_len+1, env_var_val); } return ret_str; }
int typeGen(FILE *out) { ID_LIST *il; DCL_NOM_LIST *l, *m, *l1; TYPE_STR *t; char *type, *var; script_open(out); subst_begin(out, PROTO_TYPE_H); /* Nom du module */ print_sed_subst(out, "module", module->name); print_sed_subst(out, "MODULE", module->NAME); /* Nombre de taches d'exec */ print_sed_subst(out, "nbExecTask", "%d", nbExecTask); subst_end(out); cat_begin(out); fprintf(out, "#ifndef %s_TYPE1_H\n", module->name); fprintf(out, "#define %s_TYPE1_H\n\n", module->name); for (il = includeFiles; il != NULL; il = il->next) { if (il->name != NULL) fprintf(out, "#include \"%s\"\n", il->name); } /* for */ fprintf(out, "\n"); /* Structure de donne'es interne */ for (l = typedefs; l != NULL; l = l->next) { t = l->dcl_nom->type; if (t->used == 0) { continue; } /* Ne genere pas les types deja declares */ if (((t->flags & TYPE_INTERNAL_DATA) != TYPE_INTERNAL_DATA) && ((t->flags & TYPE_GENOM) != TYPE_GENOM)) { continue; } if (t->flags & TYPE_INTERNAL_DATA) { /* trouve' la structure interne */ fprintf(out, "/*\n" " * Structure de donnees interne\n" " */\n"); } else { fprintf(out, "/*\n" " * Type declare' dans %s\n" " */\n", nomfic); } l->dcl_nom->flags = 1; fprintf(out, "typedef %s", nom_type(t)); if (t->type == STRUCT || t->type == UNION || t->type == ENUM) { fprintf(out, " {\n"); if (t->members == NULL) { trouve_members(t); } for (m = t->members; m != NULL; m = m->next) { if (t->type == ENUM) { if (m->dcl_nom->flags == ENUM_VALUE) fprintf(out, "\t%s = %d%s\n", m->dcl_nom->name, m->dcl_nom->pointeur, m->next?",":""); else fprintf(out, "\t%s%s\n", m->dcl_nom->name, m->next?",":""); } else { dcl_nom_decl(m->dcl_nom, &type, &var); fprintf(out, "\t%s %s;\n", type, var); free(type); free(var); } } /* for */ fprintf(out, "} "); } dcl_nom_decl(l->dcl_nom, &type, &var); fprintf(out, "%s", var); free(type); free(var); /* recherche d'autres noms pour ce type */ for (l1 = typedefs; l1 != NULL; l1 = l1->next) { if (l1->dcl_nom->flags == 1) { continue; } if (l1->dcl_nom->type == t) { dcl_nom_decl(l1->dcl_nom, &type, &var); l1->dcl_nom->flags = 1; fprintf(out, ", %s", var); free(type); free(var); } } /* for */ fprintf(out, ";\n\n"); } /* for */ fputs("\n#endif\n", out); cat_end(out); script_close(out, "server/%sType.h", module->name); return(0); }
int genTclservClientMsgLib(FILE *out) { RQST_LIST *l; RQST_STR *r; int abortNum; /* * MsgLib.c */ script_open(out); subst_begin(out, PROTO_TCLSERV_CLIENT_MSG_TITLE); /* nom du module */ print_sed_subst(out, "module", module->name); print_sed_subst(out, "MODULE", module->NAME); /* numero de la requete d'abort */ abortNum = trouve_abort_num(); print_sed_subst(out, "abortRequestNum", "%s_ABORT_RQST", module->NAME); subst_end(out); /* Every request */ for (l = requetes; l != NULL; l=l->next) { r=l->rqst; subst_begin(out,r->type == CONTROL ? PROTO_TCLSERV_CLIENT_MSG_CTRL : PROTO_TCLSERV_CLIENT_MSG_EXEC); msgLibSubstRqst(out, l->rqst); subst_end(out); } /* for */ script_close(out, "server/tclservClient/%sTclservClientMsgLib.c", module->name); /* * MsgLib.h */ script_open(out); subst_begin(out, PROTO_TCLSERV_CLIENT_MSG_HEADER); /* Nom du Module */ print_sed_subst(out, "module", module->name); print_sed_subst(out, "MODULE", module->NAME); subst_end(out); /* Prototypes */ /* Every request */ for (l = requetes; l != NULL; l=l->next) { r=l->rqst; subst_begin(out,r->type == CONTROL ? PROTO_TCLSERV_CLIENT_MSG_CTRL_PROTO : PROTO_TCLSERV_CLIENT_MSG_CTRL_EXEC); msgLibSubstRqst(out, l->rqst); subst_end(out); } /* for */ cat_begin(out); fprintf(out, "#ifdef __cplusplus\n"); fprintf(out, "}\n"); fprintf(out, "#endif\n"); fprintf(out, "#endif /* %sTCLSERV_CLIENT_MSG_LIB_H */\n", module->name); cat_end(out); script_close(out, "server/tclservClient/%sTclservClientMsgLib.h", module->name); return(0); }
int openprsGen(FILE *out, int genTclservClient) { RQST_LIST *rl; RQST_STR *rqst; POSTER_LIST *post; const char *file_header_op = ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n" ";; Automatically generated by GenoM: do not edit by hand. ;;\n" ";; Copyright (C) 1999-2007 LAAS/CNRS ;;\n" ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"; /* ------------------------------------------------------------ * LES SYM */ script_open(out); /* Entete */ cat_begin(out); fprintf(out, "%s", file_header_op); /* Declaration de chaque requete */ for (rl = requetes; rl != NULL; rl = rl->next) { rqst = rl->rqst; fprintf(out, "declare op_predicate %s-%s\n", module->NAME, rqst->NAME); fprintf(out, "declare op_predicate %s-%s-REPORT\n", module->NAME, rqst->NAME); fprintf(out, "declare op_predicate %s-%s-ASYNC\n", module->NAME, rqst->NAME); fprintf(out, "declare symbol %s_%s\n", module->NAME, rqst->NAME); if (rqst->input) { declareCStruct(out,rqst->input->dcl_nom,1); } if (rqst->output) { declareCStruct(out,rqst->output->dcl_nom,1); } } fprintf(out, "declare op_predicate %s-ABORT\n", module->NAME); fprintf(out, "declare op_predicate %s-ABORT-REPORT\n", module->NAME); fprintf(out, "declare op_predicate %s-ABORT-ASYNC\n", module->NAME); fprintf(out, "declare symbol %s_ABORT\n", module->NAME); for (post = posters; post != NULL; post = post->next) { DCL_NOM_STR *n; STR_REF_LIST *l; fprintf(out, "declare op_predicate READ-%s-%s\n", module->NAME, post->NAME); fprintf(out, "declare op_predicate WRITE-%s-%s\n", module->NAME, post->NAME); fprintf(out, "declare ff %s-%s 0\n", module->NAME, post->NAME); for (l = post->data; l != NULL; l = l->next) { char *NAME; int i; n = l->str_ref->dcl_nom; NAME = xalloc(strlen(n->name) + 1); for (i = 0; n->name[i] != '\0'; NAME[i] = toupper(n->name[i]), i++); fprintf(out, "declare op_predicate READ-%s-%s-%s\n", module->NAME, post->NAME, NAME); fprintf(out, "declare op_predicate WRITE-%s-%s-%s\n", module->NAME, post->NAME, NAME); fprintf(out, "declare ff %s-%s-%s 0\n", module->NAME, post->NAME, NAME); free(NAME); } } cat_end(out); script_close(out, "server/openprs/%sOpenprs.sym", module->name); /* ------------------------------------------------------------ * LES INC */ script_open(out); /* Entete */ cat_begin(out); fprintf(out, "%s", file_header_op); fprintf(out, "include \"@MODULEDATADIR@/%sOpenprs.sym\"\n", module->name); fprintf(out, "load opf \"@MODULEDATADIR@/%sOpenprs.opf\"\n", module->name); cat_end(out); script_close(out, "server/openprs/%sOpenprs.inc.input", module->name); /* ------------------------------------------------------------ * LES MAKEFILES */ openprsMakeGen(out); /* ------------------------------------------------------------ * L'ENCODAGE DES STRUCTURES (openprs -> genom) */ openprsEncodeGen(out); /* ------------------------------------------------------------ * LE DECODAGE DES STRUCTURES (genom -> openprs) */ openprsDecodeGen(out); /* ------------------------------------------------------------ * LES OP pour les requetes et les posters. */ openprsOpGen(out); /* ------------------------------------------------------------ * DECLARATION DES REQUETES, DES POSTERS ET DES ATOMS */ script_open(out); /* Entete du fichier */ subst_begin(out, PROTO_OPENPRS_C); print_sed_subst(out, "module", module->name); print_sed_subst(out, "MODULE", module->NAME); subst_end(out); cat_begin(out); /* Declaration des requetes */ if (!declareRequests(out,genTclservClient)) { return -1; } /* Declaration des posters */ declarePosters(out); /* Declaration des atomes (enum + reports) */ declareMainAndAtoms(out,genTclservClient); /* FIN */ cat_end(out); script_close(out, "server/openprs/%sRequestsOpenprs.c", module->name); /* ------------------------------------------------------------ * LES PROTOS */ script_open(out); subst_begin(out, PROTO_OPENPRS_PROTO); print_sed_subst(out, "module", module->name); print_sed_subst(out, "MODULE", module->NAME); subst_end(out); script_close(out, "server/openprs/%sRequestsOpenprsProto.h", module->name); return 0; } /* openprsGen */
int tclClientGen(FILE *out) { int n; char *buf = NULL, *type = NULL, *var = NULL, *tmp; RQST_LIST *rqst; POSTER_LIST *poster; RQST_INPUT_INFO_LIST *iinfo; /* Client part */ script_open(out); subst_begin(out, PROTO_TCLCLIENT); print_sed_subst(out, "module", module->name); for(rqst = requetes; rqst != NULL; rqst=rqst->next) { bufcat(&buf, "\"%s\" ", rqst->name); } for(poster = posters; poster != NULL; poster=poster->next) { if (poster->data != NULL) { /* SDI Reference list: generate one function per struct */ DCL_NOM_LIST *memberList; for(memberList = poster->type->members; memberList != NULL; memberList = memberList->next) { bufcat(&buf, "\"%s%sPosterRead\" ", poster->name, memberList->dcl_nom->name); } } else { /* User defined type: generate only one function */ bufcat(&buf, "\"%sPosterRead\" ", poster->name); } } print_sed_subst(out, "rqstList", buf); if (buf != NULL) free(buf); buf = NULL; subst_end(out); /* requêtes */ for(rqst = requetes; rqst != NULL; rqst=rqst->next) { subst_begin(out, PROTO_TCLCLIENTRQST); print_sed_subst(out, "module", module->name); print_sed_subst(out, "requestName", rqst->name); if (rqst->rqst->doc == NULL) print_sed_subst(out, "requestDoc", "** undocumented **"); else { tmp = tclQuoteString(rqst->rqst->doc); print_sed_subst(out, "requestDoc", tmp); free(tmp); } /* input ------------------------------------------------------- */ if (rqst->rqst->input == NULL) { print_sed_subst(out, "inputFormat", ""); print_sed_subst(out, "requestUsage", "no arguments"); print_sed_subst(out, "argNumber", "0"); } else { dcl_nom_decl(rqst->rqst->input->dcl_nom, &type, &var); if (type == NULL || var == NULL) { /* should not happen */ fprintf(stderr, "No input type for %s", rqst->name); return -1; } iinfo = rqst->rqst->input_info; tclInputFormatGen(&buf, rqst->rqst->input->dcl_nom->name, rqst->rqst->input->dcl_nom, &iinfo, 0); /* tmp = tclQuoteString(buf); */ print_sed_subst(out, "inputFormat", buf); /* free(tmp); */ if (buf != NULL) free(buf); buf = NULL; n = tclArgNumberGen(rqst->rqst->input->dcl_nom); if (n < 0) { fprintf(stderr, "Error: could not enumerate input of %s.\n", rqst->name); return -1; } print_sed_subst(out, "argNumber", "%d", n); tclUsageGen(&buf, rqst->rqst->input->dcl_nom, NULL); tmp = tclQuoteString(buf); print_sed_subst(out, "requestUsage", tmp); free(tmp); if (buf != NULL) free(buf); buf = NULL; if (type != NULL) free(type); if (var != NULL) free(var); } /* output ------------------------------------------------------ */ if (rqst->rqst->output == NULL) { print_sed_subst(out, "outputFormat", "{} status "); } else { if (rqst->rqst->output->dcl_nom->name == NULL) { /* should not happen */ fprintf(stderr, "No output name for %s", rqst->name); return -1; } bufcat(&buf, "{} status "); tclOutputFormatGen(&buf, rqst->rqst->output->dcl_nom->name, rqst->rqst->output->dcl_nom); tmp = tclQuoteString(buf); print_sed_subst(out, "outputFormat", tmp); free(tmp); if (buf != NULL) free(buf); buf = NULL; } subst_end(out); } /* posters */ for(poster = posters; poster != NULL; poster=poster->next) { DCL_NOM_LIST *memberList; if (poster->data != NULL) { /* SDI Reference list: generate one function per struct */ for(memberList = poster->type->members; memberList != NULL; memberList = memberList->next) { subst_begin(out, PROTO_TCLCLIENTPOSTER); print_sed_subst(out, "module", module->name); bufcat(&buf, "%s%s", poster->name, memberList->dcl_nom->name); print_sed_subst(out, "posterName", buf); if (buf != NULL) free(buf); buf = NULL; bufcat(&buf, "{} status "); tclOutputFormatGen(&buf, memberList->dcl_nom->name, memberList->dcl_nom); tmp = tclQuoteString(buf); print_sed_subst(out, "outputFormat", tmp); free(tmp); if (buf != NULL) free(buf); buf = NULL; tclUsageGen(&buf, memberList->dcl_nom, NULL); tmp = tclQuoteString(buf); print_sed_subst(out, "posterDoc", tmp); free(tmp); if (buf != NULL) free(buf); buf = NULL; subst_end(out); } } else { /* User defined type: generate only one function */ subst_begin(out, PROTO_TCLCLIENTPOSTER); print_sed_subst(out, "module", module->name); print_sed_subst(out, "posterName", poster->name); bufcat(&buf, "{} status "); for(memberList = poster->type->members; memberList != NULL; memberList = memberList->next) { tclOutputFormatGen(&buf, memberList->dcl_nom->name, memberList->dcl_nom); } tmp = tclQuoteString(buf); print_sed_subst(out, "outputFormat", tmp); free(tmp); if (buf != NULL) free(buf); buf = NULL; for(memberList = poster->type->members; memberList != NULL; memberList = memberList->next) { tclUsageGen(&buf, memberList->dcl_nom, NULL); } tmp = tclQuoteString(buf); print_sed_subst(out, "posterDoc", tmp); free(tmp); if (buf != NULL) free(buf); buf = NULL; subst_end(out); } } script_close(out, "server/tcl/%sClient.tcl", module->name); return 0; }