void declare(llvm::Module* module, minivar_t declare_list) { minivar_t name = miniexp_car(declare_list); minivar_t object = miniexp_cadr(declare_list); minivar_t objecttype = miniexp_car(object); if(miniexp_to_stdname(objecttype) == "fun") { declare_fun(module, name, miniexp_cadr(declare_list)); } else { std::cerr << "Unknown object type " << miniexp_to_stdname(objecttype) << " to declare " << miniexp_to_stdname(name) << std::endl; return; } }
extern "C" jlong Java_org_ebookdroid_droids_djvu_codec_DjvuOutline_getChild(JNIEnv *env, jclass cls, jlong expr) { // DEBUG("DjvuOutline.getChild(%p)",expr); miniexp_t s = miniexp_car((miniexp_t) expr); if (miniexp_consp(s) && miniexp_consp(miniexp_cdr(s)) && miniexp_stringp(miniexp_car(s)) && miniexp_stringp(miniexp_cadr(s))) return (jlong) miniexp_cddr(s); return 0; }
int buildTOC(miniexp_t expr, list * myList, int level, JNIEnv * env, jclass olClass, jmethodID ctor) { while(miniexp_consp(expr)) { miniexp_t s = miniexp_car(expr); expr = miniexp_cdr(expr); if (miniexp_consp(s) && miniexp_consp(miniexp_cdr(s)) && miniexp_stringp(miniexp_car(s)) && miniexp_stringp(miniexp_cadr(s)) ) { // fill item const char *name = miniexp_to_str(miniexp_car(s)); const char *page = miniexp_to_str(miniexp_cadr(s)); //starts with # int pageno = -1; if (page[0] == '#') { pageno = ddjvu_document_search_pageno(doc, &page[1]); } if (pageno < 0) { LOGI("Page %s", page); } if (name == NULL) {return -1;} OutlineItem * element = (OutlineItem *) malloc(sizeof(OutlineItem)); element->title = name; element->page = pageno; element->level = level; list_item * next = (list_item *) malloc(sizeof(list_item)); next->item = element; next->next = NULL; myList->tail->next = next; myList->tail = next; // recursion buildTOC(miniexp_cddr(s), myList, level+1, env, olClass, ctor); } } return 0; }
void QDjViewOutline::fillItems(QTreeWidgetItem *root, miniexp_t expr) { while(miniexp_consp(expr)) { miniexp_t s = miniexp_car(expr); expr = miniexp_cdr(expr); if (miniexp_consp(s) && miniexp_consp(miniexp_cdr(s)) && miniexp_stringp(miniexp_car(s)) && miniexp_stringp(miniexp_cadr(s)) ) { // fill item const char *name = miniexp_to_str(miniexp_car(s)); const char *link = miniexp_to_str(miniexp_cadr(s)); int pageno = pageNumber(link); QString pagename = (pageno>=0)?djview->pageName(pageno):QString(); QTreeWidgetItem *item = new QTreeWidgetItem(root); QString text = QString::fromUtf8(name); if (name && name[0]) item->setText(0, text.replace(spaces," ")); else if (! pagename.isEmpty()) item->setText(0, tr("Page %1").arg(pagename)); item->setFlags(0); item->setWhatsThis(0, whatsThis()); if (link && link[0]) { QString slink = QString::fromUtf8(link); item->setData(0, Qt::UserRole+1, slink); item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); item->setToolTip(0, tr("Go: %1").arg(slink)); if (pageno >= 0) item->setData(0, Qt::UserRole, pageno); if (! pagename.isEmpty()) item->setToolTip(0, tr("Go: page %1.").arg(pagename)); } // recurse fillItems(item, miniexp_cddr(s)); } } }
extern "C" jstring Java_org_ebookdroid_droids_djvu_codec_DjvuOutline_getTitle(JNIEnv *env, jclass cls, jlong expr) { // DEBUG("DjvuOutline.getTitle(%p)",expr); miniexp_t s = miniexp_car((miniexp_t) expr); if (miniexp_consp(s) && miniexp_consp(miniexp_cdr(s)) && miniexp_stringp(miniexp_car(s)) && miniexp_stringp(miniexp_cadr(s))) { const char* buf = miniexp_to_str(miniexp_car(s)); return env->NewStringUTF(buf); } return NULL; }
static EvMapping * get_djvu_hyperlink_mapping (DjvuDocument *djvu_document, int page, ddjvu_pageinfo_t *page_info, miniexp_t sexp) { EvMapping *ev_link_mapping = NULL; EvLinkAction *ev_action = NULL; miniexp_t iter; const char *url, *url_target, *comment; ev_link_mapping = g_new (EvMapping, 1); iter = sexp; if (miniexp_car (iter) != miniexp_symbol ("maparea")) goto unknown_mapping; iter = miniexp_cdr(iter); if (miniexp_caar(iter) == miniexp_symbol("url")) { if (!string_from_miniexp (miniexp_cadr (miniexp_car (iter)), &url)) goto unknown_mapping; if (!string_from_miniexp (miniexp_caddr (miniexp_car (iter)), &url_target)) goto unknown_mapping; } else { if (!string_from_miniexp (miniexp_car(iter), &url)) goto unknown_mapping; url_target = NULL; } iter = miniexp_cdr (iter); if (!string_from_miniexp (miniexp_car(iter), &comment)) goto unknown_mapping; iter = miniexp_cdr (iter); if (!get_djvu_hyperlink_area (page_info, miniexp_car(iter), ev_link_mapping)) goto unknown_mapping; iter = miniexp_cdr (iter); /* FIXME: DjVu hyperlink attributes are ignored */ ev_action = get_djvu_link_action (djvu_document, url, page); if (!ev_action) goto unknown_mapping; ev_link_mapping->data = ev_link_new (comment, ev_action); g_object_unref (ev_action); return ev_link_mapping; unknown_mapping: if (ev_link_mapping) g_free(ev_link_mapping); g_warning("DjvuLibre error: Unknown hyperlink %s", miniexp_to_name(miniexp_car(sexp))); return NULL; }
extern "C" jstring Java_org_ebookdroid_droids_djvu_codec_DjvuOutline_getLink(JNIEnv *env, jclass cls, jlong expr, jlong docHandle) { // DEBUG("DjvuOutline.getLinkPage(%p)",expr); miniexp_t s = miniexp_car((miniexp_t) expr); if (miniexp_consp(s) && miniexp_consp(miniexp_cdr(s)) && miniexp_stringp(miniexp_car(s)) && miniexp_stringp(miniexp_cadr(s))) { const char *link = miniexp_to_str(miniexp_cadr(s)); int number = -1; if (link && link[0] == '#') { number = ddjvu_document_search_pageno((ddjvu_document_t*) docHandle, link + 1); if (number >= 0) { char linkbuf[128]; snprintf(linkbuf, 127, "#%d", number + 1); return env->NewStringUTF(linkbuf); } } return env->NewStringUTF(link); } return NULL; }
/** * Builds the index GtkTreeModel from DjVu s-expr * * (bookmarks * ("title1" "dest1" * ("title12" "dest12" * ... ) * ... ) * ("title2" "dest2" * ... ) * ... ) */ static void build_tree (const DjvuDocument *djvu_document, GtkTreeModel *model, GtkTreeIter *parent, miniexp_t iter) { const char *title, *link_dest; char *title_markup; EvLinkAction *ev_action = NULL; EvLink *ev_link = NULL; GtkTreeIter tree_iter; if (miniexp_car (iter) == miniexp_symbol ("bookmarks")) { /* The (bookmarks) cons */ iter = miniexp_cdr (iter); } else if ( miniexp_length (iter) >= 2 ) { gchar *utf8_title = NULL; /* An entry */ if (!string_from_miniexp (miniexp_car (iter), &title)) goto unknown_entry; if (!string_from_miniexp (miniexp_cadr (iter), &link_dest)) goto unknown_entry; if (!g_utf8_validate (title, -1, NULL)) { utf8_title = str_to_utf8 (title); title_markup = g_markup_escape_text (utf8_title, -1); } else { title_markup = g_markup_escape_text (title, -1); } ev_action = get_djvu_link_action (djvu_document, link_dest, -1); if (ev_action) { ev_link = ev_link_new (utf8_title ? utf8_title : title, ev_action); gtk_tree_store_append (GTK_TREE_STORE (model), &tree_iter, parent); gtk_tree_store_set (GTK_TREE_STORE (model), &tree_iter, EV_DOCUMENT_LINKS_COLUMN_MARKUP, title_markup, EV_DOCUMENT_LINKS_COLUMN_LINK, ev_link, EV_DOCUMENT_LINKS_COLUMN_EXPAND, FALSE, -1); g_object_unref (ev_action); g_object_unref (ev_link); } else { gtk_tree_store_append (GTK_TREE_STORE (model), &tree_iter, parent); gtk_tree_store_set (GTK_TREE_STORE (model), &tree_iter, EV_DOCUMENT_LINKS_COLUMN_MARKUP, title_markup, EV_DOCUMENT_LINKS_COLUMN_EXPAND, FALSE, -1); } g_free (title_markup); g_free (utf8_title); iter = miniexp_cddr (iter); parent = &tree_iter; } else { goto unknown_entry; } for (; iter != miniexp_nil; iter = miniexp_cdr (iter)) { build_tree (djvu_document, model, parent, miniexp_car (iter)); } return; unknown_entry: g_warning ("DjvuLibre error: Unknown entry in bookmarks"); return; }
jobject get_djvu_hyperlink_mapping(JNIEnv *jenv, ddjvu_document_t* djvu_document, ddjvu_pageinfo_t *page_info, miniexp_t sexp) { miniexp_t iter; const char *url, *url_target; jobject hl = NULL; iter = sexp; if (miniexp_car(iter) != miniexp_symbol("maparea")) { ERROR("DjvuLibre error: Unknown hyperlink %s", miniexp_to_name(miniexp_car(sexp))); return hl; } iter = miniexp_cdr(iter); if (miniexp_caar(iter) == miniexp_symbol("url")) { if (!string_from_miniexp(miniexp_cadr(miniexp_car(iter)), &url)) { ERROR("DjvuLibre error: Unknown hyperlink %s", miniexp_to_name(miniexp_car(sexp))); return hl; } if (!string_from_miniexp(miniexp_caddr(miniexp_car(iter)), &url_target)) { ERROR("DjvuLibre error: Unknown hyperlink %s", miniexp_to_name(miniexp_car(sexp))); return hl; } } else { if (!string_from_miniexp(miniexp_car(iter), &url)) { ERROR("DjvuLibre error: Unknown hyperlink %s", miniexp_to_name(miniexp_car(sexp))); return hl; } url_target = NULL; } iter = miniexp_cdr(iter); /* FIXME: DjVu hyperlink comments are ignored */ int len = 0; int type; jint* data; iter = miniexp_cdr(iter); if ((data = get_djvu_hyperlink_area(page_info, miniexp_car(iter), type, len)) == NULL) { ERROR("DjvuLibre error: Unknown hyperlink %s", miniexp_to_name(miniexp_car(sexp))); return hl; } iter = miniexp_cdr(iter); /* FIXME: DjVu hyperlink attributes are ignored */ DEBUG("DjvuLibre: Hyperlink url: %s url_target: %s", url, url_target); if (!url) { delete[] data; return hl; } jclass pagelinkClass = jenv->FindClass("org/ebookdroid/core/codec/PageLink"); if (!pagelinkClass) { delete[] data; return hl; } jmethodID plInitMethodId = jenv->GetMethodID(pagelinkClass, "<init>", "(Ljava/lang/String;I[I)V"); if (!plInitMethodId) { delete[] data; return hl; } jintArray points = jenv->NewIntArray(len); jenv->SetIntArrayRegion(points, 0, len, data); jstring jstr = jenv->NewStringUTF(url); hl = jenv->NewObject(pagelinkClass, plInitMethodId, jstr, (jint) type, points); jenv->DeleteLocalRef(jstr); jenv->DeleteLocalRef(points); delete[] data; // DEBUG("DjvuLibre: Hyperlink url: %s url_target: %s", url, url_target); return hl; }
static void build_index(djvu_document_t *djvu_document, miniexp_t expression, girara_tree_node_t* root) { if (expression == miniexp_nil || root == NULL) { return; } int fileno = ddjvu_document_get_filenum(djvu_document->document); int curfile = 0; while (miniexp_consp(expression) != 0) { miniexp_t inner = miniexp_car(expression); if (miniexp_consp(inner) && miniexp_consp(miniexp_cdr(inner)) && miniexp_stringp(miniexp_car(inner)) && miniexp_stringp(miniexp_car(inner)) ) { const char* name = miniexp_to_str(miniexp_car(inner)); const char* link = miniexp_to_str(miniexp_cadr(inner)); /* TODO: handle other links? */ if (link == NULL || link[0] != '#') { expression = miniexp_cdr(expression); continue; } zathura_link_type_t type = ZATHURA_LINK_GOTO_DEST; zathura_rectangle_t rect; zathura_link_target_t target = { 0 }; target.destination_type = ZATHURA_LINK_DESTINATION_XYZ; /* Check if link+1 contains a number */ bool number = true; const size_t linklen = strlen(link); for (unsigned int k = 1; k < linklen; k++) { if (!isdigit(link[k])) { number = false; break; } } /* if link starts with a number assume it is a number */ if (number == true) { target.page_number = atoi(link + 1) - 1; } else { /* otherwise assume it is an id for a page */ ddjvu_fileinfo_t info; int f, i; for (i=0; i < fileno; i++) { f = (curfile + i) % fileno; ddjvu_document_get_fileinfo(djvu_document->document, f, &info); if (info.id != NULL && !strcmp(link+1, info.id)) { break; } } /* got a page */ if (i < fileno && info.pageno >= 0) { curfile = (f+1) % fileno; target.page_number = info.pageno; } else { /* give up */ expression = miniexp_cdr(expression); continue; } } zathura_index_element_t* index_element = zathura_index_element_new(name); if (index_element == NULL) { continue; } index_element->link = zathura_link_new(type, rect, target); if (index_element->link == NULL) { zathura_index_element_free(index_element); continue; } girara_tree_node_t* node = girara_node_append_data(root, index_element); /* search recursive */ build_index(djvu_document, miniexp_cddr(inner), node); } expression = miniexp_cdr(expression); } }