X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=ir-tcl.c;h=c6e789b67ca0a037bcff01e1508623b9d0c58475;hb=0b673e359cca2fdb88719de3d20d5488ead9fefb;hp=54488896480d9a30ed7a716fac46dc53a9f0976a;hpb=1ab5c45763803335f22a1f6a37edf762b2270c8b;p=ir-tcl-moved-to-github.git diff --git a/ir-tcl.c b/ir-tcl.c index 5448889..c6e789b 100644 --- a/ir-tcl.c +++ b/ir-tcl.c @@ -1,11 +1,25 @@ /* * IR toolkit for tcl/tk - * (c) Index Data 1995-1999 + * (c) Index Data 1995-2001 * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss * * $Log: ir-tcl.c,v $ - * Revision 1.112 1999-03-22 06:51:34 adam + * Revision 1.117 2001-03-26 11:39:34 adam + * Fixed bug in ir_deleteDiags - crash when receiving multiple diags. + * + * Revision 1.116 2001/02/09 11:58:04 adam + * Updated for Tcl8.1 and higher where internal encoding is UTF-8. + * + * Revision 1.115 2000/09/13 12:18:49 adam + * Logging utility patch (YAZ version 1.7). + * + * Revision 1.114 1999/05/17 20:37:41 adam + * Fixed problem with ASN code. + * + * Revision 1.113 1999/04/20 10:01:46 adam + * Modified calls to ODR encoders/decoders (name argument). + * + * Revision 1.112 1999/03/22 06:51:34 adam * Implemented sort. * * Revision 1.111 1999/02/11 11:30:09 adam @@ -1361,11 +1375,11 @@ static int do_logLevel (void *o, Tcl_Interp *interp, if (argc <= 2) return TCL_OK; if (argc == 3) - log_init (log_mask_str (argv[2]), "", NULL); + yaz_log_init (yaz_log_mask_str (argv[2]), "", NULL); else if (argc == 4) - log_init (log_mask_str (argv[2]), argv[3], NULL); + yaz_log_init (yaz_log_mask_str (argv[2]), argv[3], NULL); else if (argc == 5) - log_init (log_mask_str (argv[2]), argv[3], argv[4]); + yaz_log_init (yaz_log_mask_str (argv[2]), argv[3], argv[4]); return TCL_OK; } @@ -2024,7 +2038,11 @@ static int do_search (void *o, Tcl_Interp *interp, int argc, char **argv) Odr_oct ccl_query; IrTcl_SetObj *obj = o; IrTcl_Obj *p; - int r; + int r, code; +#if TCL_MAJOR_VERSION > 8 || (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION > 0) + Tcl_DString ds; +#endif + char *query_str; if (argc <= 0) return TCL_OK; @@ -2037,16 +2055,23 @@ static int do_search (void *o, Tcl_Interp *interp, int argc, char **argv) NULL); return TCL_ERROR; } - logf (LOG_DEBUG, "search %s %s", *argv, argv[2]); +#if TCL_MAJOR_VERSION > 8 || (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION > 0) + query_str = Tcl_UtfToExternalDString(0, argv[2], -1, &ds); +#else + query_str = argv[2]; +#endif + logf (LOG_DEBUG, "search %s %s", *argv, query_str); if (!obj->set_inher.num_databaseNames) { Tcl_AppendResult (interp, "no databaseNames", NULL); - return ir_tcl_error_exec (interp, argc, argv); + code = ir_tcl_error_exec (interp, argc, argv); + goto out; } if (!p->cs_link) { Tcl_AppendResult (interp, "not connected", NULL); - return ir_tcl_error_exec (interp, argc, argv); + code = ir_tcl_error_exec (interp, argc, argv); + goto out; } apdu = zget_APDU (p->odr_out, Z_APDU_searchRequest); req = apdu->u.searchRequest; @@ -2111,11 +2136,12 @@ static int do_search (void *o, Tcl_Interp *interp, int argc, char **argv) { Z_RPNQuery *RPNquery; - RPNquery = p_query_rpn (p->odr_out, p->protocol_type, argv[2]); + RPNquery = p_query_rpn (p->odr_out, p->protocol_type, query_str); if (!RPNquery) { Tcl_AppendResult (interp, "query syntax error", NULL); - return ir_tcl_error_exec (interp, argc, argv); + code = ir_tcl_error_exec (interp, argc, argv); + goto out; } query.which = Z_Query_type_1; query.u.type_1 = RPNquery; @@ -2133,18 +2159,19 @@ static int do_search (void *o, Tcl_Interp *interp, int argc, char **argv) bib1.oclass = CLASS_ATTSET; bib1.value = VAL_BIB1; - rpn = ccl_find_str(p->bibset, argv[2], &error, &pos); + rpn = ccl_find_str(p->bibset, query_str, &error, &pos); if (error) { Tcl_AppendResult (interp, "ccl syntax error ", ccl_err_msg(error), NULL); - return ir_tcl_error_exec (interp, argc, argv); + code = ir_tcl_error_exec (interp, argc, argv); + goto out; } #if 0 ccl_pr_tree (rpn, stderr); fprintf (stderr, "\n"); #endif - assert((RPNquery = ccl_rpn_query(rpn))); + RPNquery = ccl_rpn_query(p->odr_out, rpn); RPNquery->attributeSetId = oid_getoidbyent (&bib1); query.which = Z_Query_type_1; query.u.type_1 = RPNquery; @@ -2154,16 +2181,22 @@ static int do_search (void *o, Tcl_Interp *interp, int argc, char **argv) { query.which = Z_Query_type_2; query.u.type_2 = &ccl_query; - ccl_query.buf = (unsigned char *) argv[2]; - ccl_query.len = strlen (argv[2]); + ccl_query.buf = (unsigned char *) query_str; + ccl_query.len = strlen (query_str); } else { Tcl_AppendResult (interp, "invalid query method ", obj->set_inher.queryType, NULL); - return ir_tcl_error_exec (interp, argc, argv); + code = ir_tcl_error_exec (interp, argc, argv); + goto out; } - return ir_tcl_send_APDU (interp, p, apdu, "search", *argv); + code = ir_tcl_send_APDU (interp, p, apdu, "search", *argv); + out: +#if TCL_MAJOR_VERSION > 8 || (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION > 0) + Tcl_DStringFree (&ds); +#endif + return code; } /* @@ -2709,7 +2742,7 @@ static int do_getExplain (void *o, Tcl_Interp *interp, int argc, char **argv) return TCL_OK; assert (rl->u.dbrec.buf); odr_setbuf (p->odr_in, rl->u.dbrec.buf, rl->u.dbrec.size, 0); - if (!(*etype->fun)(p->odr_in, (char **) &rr, 0)) + if (!(*etype->fun)(p->odr_in, (char **) &rr, 0, 0)) return TCL_OK; if (etype->what != Z_External_explainRecord) @@ -3040,7 +3073,7 @@ static int do_sort (void *o, Tcl_Interp *interp, int argc, char **argv) #ifdef ASN_COMPILED req->num_inputResultSetNames = 1; req->inputResultSetNames = (Z_InternationalString **) - odr_malloc (out, sizeof(*req->inputResultSetNames)); + odr_malloc (p->odr_out, sizeof(*req->inputResultSetNames)); req->inputResultSetNames[0] = obj->setName; #else req->inputResultSetNames = @@ -3371,10 +3404,16 @@ static int do_scan (void *o, Tcl_Interp *interp, int argc, char **argv) Z_APDU *apdu; IrTcl_ScanObj *obj = o; IrTcl_Obj *p = obj->parent; + char *start_term; + int code; #if CCL2RPN oident bib1; struct ccl_rpn_node *rpn; int pos; + int r; +#endif +#if TCL_MAJOR_VERSION > 8 || (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION > 0) + Tcl_DString ds; #endif if (argc <= 0) @@ -3385,16 +3424,23 @@ static int do_scan (void *o, Tcl_Interp *interp, int argc, char **argv) " scanQuery\"", NULL); return TCL_ERROR; } - logf (LOG_DEBUG, "scan %s %s", *argv, argv[2]); +#if TCL_MAJOR_VERSION > 8 || (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION > 0) + start_term = Tcl_UtfToExternalDString(0, argv[2], -1, &ds); +#else + start_term = argv[2]; +#endif + logf (LOG_DEBUG, "scan %s %s", *argv, start_term); if (!p->set_inher.num_databaseNames) { Tcl_AppendResult (interp, "no databaseNames", NULL); - return ir_tcl_error_exec (interp, argc, argv); + code = ir_tcl_error_exec (interp, argc, argv); + goto out; } if (!p->cs_link) { Tcl_AppendResult (interp, "not connected", NULL); - return ir_tcl_error_exec (interp, argc, argv); + code = ir_tcl_error_exec (interp, argc, argv); + goto out; } apdu = zget_APDU (p->odr_out, Z_APDU_scanRequest); @@ -3407,25 +3453,30 @@ static int do_scan (void *o, Tcl_Interp *interp, int argc, char **argv) #if !CCL2RPN if (!(req->termListAndStartPoint = p_query_scan (p->odr_out, p->protocol_type, - &req->attributeSet, argv[2]))) + &req->attributeSet, start_term))) { Tcl_AppendResult (interp, "query syntax error", NULL); - return ir_tcl_error_exec (interp, argc, argv); + code = ir_tcl_error_exec (interp, argc, argv); + goto out; } #else - rpn = ccl_find_str(p->bibset, argv[2], &r, &pos); + rpn = ccl_find_str(p->bibset, start_term, &r, &pos); if (r) { Tcl_AppendResult (interp, "ccl syntax error ", ccl_err_msg(r), NULL); - return ir_tcl_error_exec (interp, argc, argv); + code = ir_tcl_error_exec (interp, argc, argv); + goto out; } bib1.proto = p->protocol_type; bib1.oclass = CLASS_ATTSET; bib1.value = VAL_BIB1; req->attributeSet = oid_getoidbyent (&bib1); - if (!(req->termListAndStartPoint = ccl_scan_query (rpn))) - return TCL_ERROR; + if (!(req->termListAndStartPoint = ccl_scan_query (p->odr_out, rpn))) + { + code = TCL_ERROR; + goto out; + } #endif req->stepSize = &obj->stepSize; req->numberOfTermsRequested = &obj->numberOfTermsRequested; @@ -3436,7 +3487,12 @@ static int do_scan (void *o, Tcl_Interp *interp, int argc, char **argv) logf (LOG_DEBUG, "preferredPositionInResponse=%d", *req->preferredPositionInResponse); - return ir_tcl_send_APDU (interp, p, apdu, "scan", *argv); + code = ir_tcl_send_APDU (interp, p, apdu, "scan", *argv); + out: +#if TCL_MAJOR_VERSION > 8 || (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION > 0) + Tcl_DStringFree (&ds); +#endif + return code; } /* @@ -3718,11 +3774,11 @@ static int ir_log_init_proc (ClientData clientData, Tcl_Interp *interp, return TCL_OK; } if (argc == 2) - log_init (log_mask_str (argv[1]), "", NULL); + yaz_log_init (yaz_log_mask_str (argv[1]), "", NULL); else if (argc == 3) - log_init (log_mask_str (argv[1]), argv[2], NULL); + yaz_log_init (yaz_log_mask_str (argv[1]), argv[2], NULL); else - log_init (log_mask_str (argv[1]), argv[2], argv[3]); + yaz_log_init (yaz_log_mask_str (argv[1]), argv[2], argv[3]); return TCL_OK; } @@ -3739,7 +3795,7 @@ static int ir_log_proc (ClientData clientData, Tcl_Interp *interp, " level string\"", NULL); return TCL_OK; } - mask = log_mask_str_x (argv[1], 0); + mask = yaz_log_mask_str_x (argv[1], 0); logf (LOG_DEBUG, "%s", argv[2]); return TCL_OK; } @@ -3810,7 +3866,7 @@ static void ir_deleteDiags (IrTcl_Diagnostic **dst_list, int *dst_num) { int i; for (i = 0; i<*dst_num; i++) - xfree (dst_list[i]->addinfo); + xfree ((*dst_list)[i].addinfo); xfree (*dst_list); *dst_list = NULL; *dst_num = 0; @@ -3881,7 +3937,7 @@ static void ir_handleDBRecord (IrTcl_Obj *p, IrTcl_RecordList *rl, odr_setbuf (p->odr_in, (char*) oe->u.octet_aligned->buf, oe->u.octet_aligned->len, 0); - if (!(*etype->fun)(p->odr_in, (char **) &rr, 0)) + if (!(*etype->fun)(p->odr_in, (char **) &rr, 0, 0)) { rl->u.dbrec.type = VAL_NONE; return; @@ -4273,7 +4329,7 @@ static void ir_select_read (ClientData clientData) p->apduOffset = -1; odr_setbuf (p->odr_in, p->buf_in, r, 0); logf (LOG_DEBUG, "cs_get ok, total size %d", r); - if (!z_APDU (p->odr_in, &apdu, 0)) + if (!z_APDU (p->odr_in, &apdu, 0, 0)) { logf (LOG_DEBUG, "cs_get failed: %s", odr_errmsg (odr_geterror (p->odr_in)));