Exemple #1
0
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;
        }
Exemple #2
0
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;
}
Exemple #3
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);
}
Exemple #4
0
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\">&nbsp;</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>&nbsp;</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, "&nbsp;");
      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, "&nbsp;");
      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;
}