/*--------------------------------------------------------------------------- * Purpose: Register a documentation string with the switch. * * Programmer: Robb Matzke * Wednesday, May 31, 2000 * * Modifications: *--------------------------------------------------------------------------- */ void switch_doc(switch_t *sw, const char *doc_string) { char *fulldoc = (char *)malloc(8192); /* Set switch info */ if (!sw) sw = switch_latest; if (sw->doc_string) free(sw->doc_string); sw->doc_string = safe_strdup(doc_string); /* Build browser documentation string */ switch_synopsis(sw, fulldoc); strcat(fulldoc, "\n"); strcat(fulldoc, doc_string); /* Assign browser documentation string to symbols */ if (sw->short_name) { obj_t symbol = obj_new(C_SYM, sw->short_name); obj_t docstr = obj_new(C_STR, fulldoc); sym_dbind(symbol, docstr); obj_dest(symbol); } if (sw->long_name) { obj_t symbol = obj_new(C_SYM, sw->long_name); obj_t docstr = obj_new(C_STR, fulldoc); sym_dbind(symbol, docstr); obj_dest(symbol); } free(fulldoc); }
/*------------------------------------------------------------------------- * Function: bif * * Purpose: Installs a builtin function in the symbol table. * * Return: void * * Programmer: Robb Matzke * [email protected] * Dec 4 1996 * * Modifications: * Robb Matzke, 2000-06-06 * Added the DESC and DOC arguments. DESC is an optional * one-line description to be added to the function table of * contents. DOC is a multi-line documentation string. *------------------------------------------------------------------------- */ static void bif (const char *func_name, obj_t(*func_ptr)(int x, obj_t y[]), int flags, const char *desc, const char *doc) { obj_t name = func_name?obj_new(C_SYM, func_name):NIL; obj_t func = func_ptr?obj_new(C_BIF, func_ptr, flags):NIL; /* Bind the function to the symbol */ if (name) sym_fbind(name, func); /* Function table of contents */ if (name && desc) { HelpFuncToc[NHelpFuncToc].name = safe_strdup(func_name); HelpFuncToc[NHelpFuncToc].desc = safe_strdup(desc); NHelpFuncToc++; } /* Operator table of contents. Operators are added to the operator * table of contents if the description contains the string `operator' * and the operators are listed in quotes like `this'. */ if (desc && strstr(desc, "operator")) { const char *s=desc, *first, *last; while ((first=strchr(s, '`')) && (last=strchr(++first, '\''))) { char opname[64]; strcpy(opname, "op"); strncpy(opname+2, first, last-first); opname[2+last-first] = '\0'; if (opname[2]) { if (doc) { obj_t sym = obj_new(C_SYM, opname); obj_t docval = obj_new(C_STR, doc); sym_dbind(sym, docval); obj_dest(sym); } strcpy(opname, "\"op"); strncpy(opname+3, first, last-first); strcpy(opname+(3+last-first), "\""); HelpOpToc[NHelpOpToc].name = safe_strdup(opname); HelpOpToc[NHelpOpToc].desc = safe_strdup(desc); NHelpOpToc++; } s = last+1; } } /* Bind the documentation string to the symbol */ if (name && doc) { obj_t docval = obj_new(C_STR, doc); sym_dbind(name, docval); } if (name) obj_dest (name); /*dont destroy func or doc*/ }
/*--------------------------------------------------------------------------- * Purpose: Convenience function for setting the documentation string * of some symbol. * * Programmer: Robb Matzke * Tuesday, June 6, 2000 * * Modifications: *--------------------------------------------------------------------------- */ void sym_doc(const char *symname, const char *docstr) { obj_t sym = obj_new(C_SYM, symname); if (docstr) { obj_t doc = obj_new(C_STR, docstr); sym_dbind(sym, doc); } else { sym_dbind(sym, NIL); } obj_dest(sym); }
/*--------------------------------------------------------------------------- * Purpose: Set a builtin symbol to the specified value. If VALUE * looks like a number then it is treated as such, otherwise * the symbol is assigned a string value. * * If NAME does not begin with the standard prefix used for * builtin variables then it will be automatically added. * * Programmer: Robb Matzke * Thursday, June 1, 2000 * * Modifications: *--------------------------------------------------------------------------- */ void sym_bi_set(const char *name, const char *value, const char *desc, const char *doc) { char fullname[1024], *rest; obj_t symbol; /* Add built-in prefix */ if (*name!='$') { fullname[0] = '$'; strcpy(fullname+1, name); name = fullname; } symbol = obj_new(C_SYM, name); /* Does value look like a number or a string? */ if (!value || !*value) { sym_vbind(symbol, NIL); } else { strtod(value, &rest); if (rest && *rest) { sym_vbind(symbol, obj_new(C_STR, value)); } else { sym_vbind(symbol, obj_new(C_NUM, value)); } } /* Description for var table of contents */ if (desc) { HelpVarToc[NHelpVarToc].name = safe_strdup(name); HelpVarToc[NHelpVarToc].desc = safe_strdup(desc); NHelpVarToc++; } /* The documentation string */ if (doc) sym_dbind(symbol, obj_new(C_STR, doc)); obj_dest(symbol); }