dk_session_t * bh_string_output_w (/* this was before 3.0: index_space_t * isp, */ lock_trx_t * lt, blob_handle_t * bh, int omit) { /* take current page at current place and make string of n bytes from the place and write to client */ dk_session_t *string_output = NULL; dp_addr_t start = bh->bh_current_page; buffer_desc_t *buf; long from_char = bh->bh_position; long chars_filled = 0, chars_on_page; virt_mbstate_t state; wchar_t wpage[PAGE_SZ]; #if 0 /* this was */ it_cursor_t *tmp_itc = itc_create (isp, lt); #else it_cursor_t *tmp_itc = itc_create (NULL, lt); itc_from_it (tmp_itc, bh->bh_it); #endif while (start) { long char_len, byte_len, next; unsigned char *mbc; if (NULL == string_output) string_output = strses_allocate(); memset (&state, 0, sizeof (state)); ITC_IN_KNOWN_MAP (tmp_itc, start); page_wait_access (tmp_itc, start, NULL, &buf, PA_READ, RWG_WAIT_ANY); if (!buf || PF_OF_DELETED == buf) { log_info ("Attempt to read deleted blob dp = %d start = %d.", start, bh->bh_page); break; } byte_len = LONG_REF (buf->bd_buffer + DP_BLOB_LEN); mbc = buf->bd_buffer + DP_DATA; char_len = (long) virt_mbsnrtowcs (wpage, &mbc, byte_len, PAGE_DATA_SZ, &state); if (char_len < 0) GPF_T1 ("bad UTF8 data in wide blob page"); chars_on_page = char_len - from_char; if (chars_on_page) { /* dbg_printf (("Read blob page %ld, %ld bytes.\n", start, bytes_on_page)); */ if (!omit) session_buffered_write (string_output, (char *) (wpage + from_char), chars_on_page * sizeof (wchar_t)); chars_filled += chars_on_page; from_char += chars_on_page; } next = LONG_REF (buf->bd_buffer + DP_OVERFLOW); page_leave_outside_map (buf); if (start == bh->bh_page) { dp_addr_t t = LONG_REF (buf->bd_buffer + DP_BLOB_DIR); if (bh->bh_dir_page && t!=bh->bh_dir_page) log_info ("Mismatch in directory page ID %d(%x) vs %d(%x).", t,t,bh->bh_dir_page,bh->bh_dir_page); bh->bh_dir_page=t; } bh->bh_current_page = next; bh->bh_position = 0; from_char = 0; start = next; } itc_free (tmp_itc); return (string_output); }
caddr_t bif_mediawiki_lexer_impl (caddr_t * qst, caddr_t * err, state_slot_t ** args, char *bifname, int run_lexer) { caddr_t rawtext = bif_string_arg (qst, args, 0, bifname); caddr_t CLUSTER_arg = bif_string_arg (qst, args, 1, bifname); caddr_t TOPIC = bif_string_arg (qst, args, 2, bifname); caddr_t WIKINAME = bif_string_arg (qst, args, 3, bifname); caddr_t *env = (caddr_t *)bif_arg (qst, args, 4, bifname); int envlen = 0, envctr; dk_session_t *pipe = NULL, *out = NULL; caddr_t macroexpanded = NULL, res = NULL; switch (DV_TYPE_OF ((caddr_t)env)) { case DV_ARRAY_OF_POINTER: envlen = BOX_ELEMENTS ((caddr_t)env); if (envlen % 2) sqlr_new_error ("22023", "WV001", "%s needs an array of even length or NULL argument 4", bifname); for (envctr = 0; envctr < envlen; envctr++) if (DV_STRING != DV_TYPE_OF (env[envctr])) sqlr_new_error ("22023", "WV001", "%s needs an array of even length of strings or NULL argument 4", bifname); break; case DV_DB_NULL: break; default: sqlr_new_error ("22023", "WV001", "%s needs an array or NULL as argument 4", bifname); } pipe = strses_allocate (); mutex_enter (mediawiki_lexer_mutex); mediawiki_env = dk_alloc_box ((8 + envlen) * sizeof (caddr_t), DV_ARRAY_OF_POINTER); mediawiki_env[0] = "CLUSTER"; mediawiki_env[1] = mediawiki_CLUSTER = CLUSTER_arg; mediawiki_env[2] = "TOPIC"; mediawiki_env[3] = mediawiki_TOPIC = TOPIC; mediawiki_env[4] = "WIKINAME"; mediawiki_env[5] = mediawiki_WIKINAME = WIKINAME; mediawiki_env[6] = "WIKIVERSION"; mediawiki_env[7] = mediawiki_WIKIVERSION; for (envctr = 0; envctr < envlen; envctr++) mediawiki_env[8+envctr] = env[envctr]; QR_RESET_CTX { mediamacyyrestart (NULL); mediamacyylex_prepare (rawtext, pipe); mediamacyylex (); macroexpanded = strses_string (pipe); if (run_lexer) { out = strses_allocate (); mediawikiyyrestart (NULL); mediawikiyylex_prepare (macroexpanded, out); mediawikiyylex (); } } QR_RESET_CODE { du_thread_t *self = THREAD_CURRENT_THREAD; caddr_t err = thr_get_error_code (self); dk_free_box (mediawiki_env); /* not dk_free_tree */ mutex_leave (mediawiki_lexer_mutex); strses_free (pipe); dk_free_box (macroexpanded); if (run_lexer) strses_free (out); POP_QR_RESET; sqlr_resignal (err); } END_QR_RESET; dk_free_box (mediawiki_env); /* not dk_free_tree */ mutex_leave (mediawiki_lexer_mutex); if (run_lexer) { res = strses_string (out); strses_free (out); strses_free (pipe); dk_free_box (macroexpanded); return res; } else { strses_free (pipe); return macroexpanded; } }