static void hex_document_real_redo (HexDocument *doc) { HexChangeData *cd; gint len; guchar *rep_data; gchar c_val; undo_stack_ascend(doc); cd = (HexChangeData *)doc->undo_top->data; switch(cd->type) { case HEX_CHANGE_BYTE: if(cd->start >= 0 && cd->end <= doc->file_size) { c_val = hex_document_get_byte(doc, cd->start); if(cd->rep_len > 0) hex_document_set_byte(doc, cd->v_byte, cd->start, FALSE, FALSE); else if(cd->rep_len == 0) hex_document_set_byte(doc, cd->v_byte, cd->start, cd->insert, FALSE); #if 0 hex_document_delete_data(doc, cd->start, 1, FALSE); #endif else hex_document_set_byte(doc, cd->v_byte, cd->start, TRUE, FALSE); cd->v_byte = c_val; }
gint hex_document_compare_data(HexDocument *doc, guchar *s2, gint pos, gint len) { guchar c1; guint i; for(i = 0; i < len; i++, s2++) { c1 = hex_document_get_byte(doc, pos + i); if(c1 != (*s2)) return (c1 - (*s2)); } return 0; }
static void hex_document_real_undo (HexDocument *doc) { HexChangeData *cd; gint len; guchar *rep_data; gchar c_val; cd = (HexChangeData *)doc->undo_top->data; switch(cd->type) { case HEX_CHANGE_BYTE: if(cd->start >= 0 && cd->end < doc->file_size) { c_val = hex_document_get_byte(doc, cd->start); if(cd->rep_len > 0) hex_document_set_byte(doc, cd->v_byte, cd->start, FALSE, FALSE); else if(cd->rep_len == 0) hex_document_delete_data(doc, cd->start, 1, FALSE); else hex_document_set_byte(doc, cd->v_byte, cd->start, TRUE, FALSE); cd->v_byte = c_val; } break; case HEX_CHANGE_STRING: len = cd->end - cd->start + 1; rep_data = hex_document_get_data(doc, cd->start, len); hex_document_set_data(doc, cd->start, cd->rep_len, len, cd->v_string, FALSE); g_free(cd->v_string); cd->end = cd->start + cd->rep_len - 1; cd->rep_len = len; cd->v_string = rep_data; break; } hex_document_changed(doc, cd, FALSE); undo_stack_descend(doc); }
gint hex_document_export_html(HexDocument *doc, gchar *html_path, gchar *base_name, guint start, guint end, guint cpl, guint lpp, guint cpw) { GtkWidget *progress_dialog, *progress_bar; FILE *file; int page, line, pos, lines, pages, c; gchar *page_name, b; gint update_pages; gchar *progress_str; lines = (end - start)/cpl; if((end - start)%cpl != 0) lines++; pages = lines/lpp; if(lines%lpp != 0) pages++; update_pages = pages/1000 + 1; /* top page */ page_name = g_strdup_printf("%s/%s.html", html_path, base_name); file = fopen(page_name, "w"); g_free(page_name); if(!file) return FALSE; fprintf(file, "<HTML>\n<HEAD>\n"); fprintf(file, "<META HTTP-EQUIV=\"Content-Type\" " "CONTENT=\"text/html; charset=UTF-8\">\n"); fprintf(file, "<META NAME=\"hexdata\" CONTENT=\"GHex export to HTML\">\n"); fprintf(file, "</HEAD>\n<BODY>\n"); fprintf(file, "<CENTER>"); fprintf(file, "<TABLE BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"0\">\n"); fprintf(file, "<TR>\n<TD COLSPAN=\"3\"><B>%s</B></TD>\n</TR>\n", doc->file_name?doc->file_name:doc->path_end); fprintf(file, "<TR>\n<TD COLSPAN=\"3\"> </TD>\n</TR>\n"); for(page = 0; page < pages; page++) { fprintf(file, "<TR>\n<TD>\n<A HREF=\"%s%08d.html\"><PRE>", base_name, page); fprintf(file, _("Page")); fprintf(file, " %d</PRE></A>\n</TD>\n<TD> </TD>\n<TD VALIGN=\"CENTER\"><PRE>%08x -", page+1, page*cpl*lpp); fprintf(file, " %08x</PRE></TD>\n</TR>\n", MIN((page+1)*cpl*lpp-1, doc->file_size-1)); } fprintf(file, "</TABLE>\n</CENTER>\n"); fprintf(file, "<HR WIDTH=\"100%%\">"); fprintf(file, _("Hex dump generated by")); fprintf(file, " <B>"LIBGTKHEX_RELEASE_STRING"</B>\n"); fprintf(file, "</BODY>\n</HTML>\n"); fclose(file); progress_dialog = gtk_dialog_new(); gtk_window_set_resizable(GTK_WINDOW(progress_dialog), FALSE); gtk_window_set_modal(GTK_WINDOW(progress_dialog), TRUE); g_signal_connect(G_OBJECT(progress_dialog), "delete-event", G_CALLBACK(ignore_cb), NULL); gtk_window_set_title(GTK_WINDOW(progress_dialog), _("Saving to HTML...")); progress_bar = gtk_progress_bar_new(); gtk_widget_show(progress_bar); gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(progress_dialog))), progress_bar); gtk_widget_show(progress_dialog); pos = start; g_object_ref(G_OBJECT(doc)); for(page = 0; page < pages; page++) { if((page%update_pages) == 0) { gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar), (gdouble)page/(gdouble)pages); progress_str = g_strdup_printf("%d/%d", page, pages); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress_bar), progress_str); g_free(progress_str); while(gtk_events_pending()) gtk_main_iteration(); } /* write page header */ page_name = g_strdup_printf("%s/%s%08d.html", html_path, base_name, page); file = fopen(page_name, "w"); g_free(page_name); if(!file) break; /* write header */ fprintf(file, "<HTML>\n<HEAD>\n"); fprintf(file, "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=iso-8859-1\">\n"); fprintf(file, "<META NAME=\"hexdata\" CONTENT=\"GHex export to HTML\">\n"); fprintf(file, "</HEAD>\n<BODY>\n"); /* write top table |previous|filename: page/pages|next| */ fprintf(file, "<TABLE BORDER=\"0\" CELLSPACING=\"0\" WIDTH=\"100%%\">\n"); fprintf(file, "<TR>\n<TD WIDTH=\"33%%\">\n"); if(page > 0) { fprintf(file, "<A HREF=\"%s%08d.html\">", base_name, page-1); fprintf(file, _("Previous page")); fprintf(file, "</A>"); } else fprintf(file, " "); fprintf(file, "\n</TD>\n"); fprintf(file, "<TD WIDTH=\"33%%\" ALIGN=\"CENTER\">\n"); fprintf(file, "<A HREF=\"%s.html\">", base_name); fprintf(file, "%s:", doc->path_end); fprintf(file, "</A>"); fprintf(file, " %d/%d", page+1, pages); fprintf(file, "\n</TD>\n"); fprintf(file, "<TD WIDTH=\"33%%\" ALIGN=\"RIGHT\">\n"); if(page < pages - 1) { fprintf(file, "<A HREF=\"%s%08d.html\">", base_name, page+1); fprintf(file, _("Next page")); fprintf(file, "</A>"); } else fprintf(file, " "); fprintf(file, "\n</TD>\n"); fprintf(file, "</TR>\n</TABLE>\n"); /* now the actual data */ fprintf(file, "<CENTER>\n"); fprintf(file, "<TABLE BORDER=\"1\" CELLSPACING=\"2\" CELLPADDING=\"2\">\n"); fprintf(file, "<TR>\n<TD>\n"); fprintf(file, "<TABLE BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"0\">\n"); for(line = 0; line < lpp && pos + line*cpl < doc->file_size; line++) { /* offset of line*/ fprintf(file, "<TR>\n<TD>\n"); fprintf(file, "<PRE>%08x</PRE>\n", pos + line*cpl); fprintf(file, "</TD>\n</TR>\n"); } fprintf(file, "</TABLE>\n"); fprintf(file, "</TD>\n<TD>\n"); fprintf(file, "<TABLE BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"0\">\n"); c = 0; for(line = 0; line < lpp; line++) { /* hex data */ fprintf(file, "<TR>\n<TD>\n<PRE>"); while(pos + c < end) { fprintf(file, "%02x", hex_document_get_byte(doc, pos + c)); c++; if(c%cpl == 0) break; if(c%cpw == 0) fprintf(file, " "); } fprintf(file, "</PRE>\n</TD>\n</TR>\n"); } fprintf(file, "</TABLE>\n"); fprintf(file, "</TD>\n<TD>\n"); fprintf(file, "<TABLE BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"0\">\n"); c = 0; for(line = 0; line < lpp; line++) { /* ascii data */ fprintf(file, "<TR>\n<TD>\n<PRE>"); while(pos + c < end) { b = hex_document_get_byte(doc, pos + c); if(b >= 0x20) fprintf(file, "%c", b); else fprintf(file, "."); c++; if(c%cpl == 0) break; } fprintf(file, "</PRE></TD>\n</TR>\n"); if(pos >= end) line = lpp; } pos += c; fprintf(file, "</TD>\n</TR>\n"); fprintf(file, "</TABLE>\n"); fprintf(file, "</TABLE>\n</CENTER>\n"); fprintf(file, "<HR WIDTH=\"100%%\">"); fprintf(file, _("Hex dump generated by")); fprintf(file, " <B>" LIBGTKHEX_RELEASE_STRING "</B>\n"); fprintf(file, "</BODY>\n</HTML>\n"); fclose(file); } g_object_unref(G_OBJECT(doc)); gtk_widget_destroy(progress_dialog); return TRUE; }