/***************************************************************************** * adorn.c -- add depictions to tdt file * * adorn -h host -s service -d depictor -r renderer -z [file.tdt] * * later: -p pattern * *****************************************************************************/ #include #include #include #include "dy_apputils.h" #include "dy_libutils.h" #include "dt_smiles.h" #include "dt_adept.h" /*============================================================================ * printerrors() */ static void printerrors() { dt_Handle sob, sos = dt_errors(DX_ERR_NONE); dt_String str; dt_Integer lens; while (NULL_OB != (sob = dt_next(sos))) { str = dt_stringvalue(&lens, sob); fprintf(stderr, "%.*s\n", lens, str); dt_dealloc(sob); } dt_dealloc(sos); dt_errorclear(); } /*============================================================================ * zapseq() - deallocate a sequence of objects */ static void zapseq(dt_Handle seq) { dt_Handle ob; dt_reset(seq); while (NULL_OB != (ob = dt_next(seq))) dt_dealloc(ob); dt_dealloc(seq); } /*============================================================================ * printzapsos() - print sequence of strings to stdout and deallocate them */ static void printzapsos(dt_Handle sos) { dt_Handle sob; char *str; int lens; dt_reset(sos); while (NULL_OB != (sob = dt_next(sos))) { str = dt_stringvalue(&lens, sob); printf("%.*s\n", lens, str); dt_dealloc(sob); } dt_dealloc(sos); } /*============================================================================ * usage() -- print error message, usage summary, and exit with 1. */ static void usage(char *prog, char *msg) { if (msg) fprintf(stderr, "%s: %s\n\n", prog, msg); fprintf(stderr, "usage: adorn [options] [in.tdt [out.tdt]]\n" "options and (defaults):\n" " -d depictor ..... specify depictor program name (default)\n" " +d depictor ..... load depictor program on adeptserver (don't)\n" " -h host ......... specify adeptserver host (localhost)\n" " -r renderer ..... specify renderer program name (none)\n" " +r renderer ..... load renderer program on adeptserver (don't)\n" " -s service ...... specify adept service (\"adept\")\n" " -z .............. zap all unused dataitems (don't)\n"); fprintf(stderr, "\n%s: exiting\n"); exit(1); } /*============================================================================ * main() for adorn */ int main(int ac, char **av) { dt_Handle server, sobin, sobout; dt_Integer isnew, lens, ok, i, tdtlen, tdtsiz = 0, zap = FALSE; dt_Boolean boo; char *tdt = NULL, *str, *arg, user[100], host[100], service[100]; char *fnin, *fnout, *depictor, *renderer, *plusdep, *plusrend; FILE *fpin, *fpout; /*** Set up defaults. ***/ fnin = NULL; fnout = NULL; depictor = NULL; renderer = NULL; plusdep = NULL; plusrend = NULL; gethostname(host, 100); strcpy(service, "adept"); /*** Deal with command line. ***/ for (i = 1; i < ac; i++) { arg = av[i]; /*** Options ('-' by itself is an argument not an option) ***/ if ('+' == *arg || ('-' == *arg && *(arg+1))) { if (0 == strcmp("-d", arg)) { if (NULL != (arg = av[++i])) depictor = arg; else usage(*av, "missing -d option"); } else if (0 == strcmp("+d", arg)) { if (NULL != (arg = av[++i])) plusdep = arg; else usage(*av, "missing +d option"); } else if (0 == strcmp("-h", arg)) { if (NULL != (arg = av[++i])) strcpy(host, arg); else usage(*av, "missing -h option"); } else if (0 == strcmp("-r", arg)) { if (NULL != (arg = av[++i])) renderer = arg; else usage(*av, "missing -r option"); } else if (0 == strcmp("+r", arg)) { if (NULL != (arg = av[++i])) plusrend = arg; else usage(*av, "missing +d option"); } else if (0 == strcmp("-s", arg)) { if (NULL != (arg = av[++i])) strcpy(service, arg); else usage(*av, "missing -s option"); } else if (0 == strcmp("-z", arg)) { zap = TRUE; } else { sprintf(user, "unknown option: %s", arg); usage(*av, user); } /*** Arguments: [in [out]] ***/ } else if (NULL == fnin) { fnin = arg; } else if (NULL == fnout) { fnout = arg; } else { usage(*av, "too many filenames"); } } /*** Connect to server. ***/ strcpy(user, dy_getuserid()); server = dt_a_adept_server(strlen(host), host, strlen(service), service, strlen(user), user, &isnew); if (NULL_OB == server) { usage(*av, "can't connect to adept server."); exit(1); } /*** Open files. ***/ if (NULL == fnin || 0 == strcmp("-", fnin)) { fpin = stdin; } else if (NULL == (fpin = fopen(fnin, "r"))) { fprintf(stderr, "%s: can't open input file: %s\n", *av, fnin); exit(1); } if (NULL == fnout || 0 == strcmp("-", fnout)) { fpout = stdout; } else if (NULL == (fpout = fopen(fnout, "w"))) { fprintf(stderr, "%s: can't open output file: %s\n", *av, fnout); exit(1); } /*** Possibly load depiction method. ***/ if (plusdep) { sobin = dt_alloc_string(strlen(plusdep), plusdep); ok = dt_add_depictor(server, sobin); dt_dealloc(sobin); } /*** Possibly load rendering method. ***/ if (plusrend) { sobin = dt_alloc_string(strlen(plusrend), plusrend); ok = dt_add_renderer(server, sobin); dt_dealloc(sobin); } /*** Possibly set depiction method. ***/ if (depictor) { sobin = dt_alloc_string(strlen(depictor), depictor); ok = dt_set_depictor(server, sobin); dt_dealloc(sobin); } /*** Possibly set rendering method. ***/ if (renderer) { sobin = dt_alloc_string(strlen(renderer), renderer); ok = dt_set_renderer(server, sobin); dt_dealloc(sobin); } /*** Repeatedly convert datatrees on input to output via adeptserver(). ***/ while (1 == dy_readtdt(fpin, &tdtlen, &tdt, &tdtsiz)) { /*** Use adeptserver to convert `sobin' to `sobout'. ***/ sobin = dt_alloc_string(tdtlen, tdt); sobout = dt_get_depiction(server, sobin); str = dt_stringvalue(&lens, sobout); printf("%.*s\n", lens, str); dt_dealloc(sobin); dt_dealloc(sobout); /*** Show errors. ***/ printerrors(); } /*** Deallocate the adept server and return happily. ***/ dt_dealloc(server); return 0; }