OSDN Git Service

updated backend.
authormaqiyuan <maqiyuan@users.sourceforge.jp>
Sat, 3 May 2014 17:56:52 +0000 (01:56 +0800)
committermaqiyuan <maqiyuan@users.sourceforge.jp>
Sat, 3 May 2014 17:56:52 +0000 (01:56 +0800)
src/texsourc/local.c
src/texsourc/openinou.c
src/texsourc/tex4.c
src/texsourc/tex9.c
src/texsourc/texd.h
src/texsourc/yandy_pdf_backend.c

index 97bcc57..add674a 100644 (file)
@@ -1937,7 +1937,8 @@ int free_memory (void)
   format_file = string_file = source_direct = NULL;
   if (dvi_file_name != NULL) free(dvi_file_name);
   if (log_file_name != NULL) free(log_file_name);
-  log_file_name = dvi_file_name = NULL;       /* 00/Jun/18 */
+  if (pdf_file_name != NULL) free(pdf_file_name);
+  pdf_file_name = log_file_name = dvi_file_name = NULL;       /* 00/Jun/18 */
   return 0;
 }
 
@@ -1972,7 +1973,7 @@ void complainarg (int c, char *s)
 
 /* only  01234567.9 still left to take ... maybe recycle u */
 
-char *allowedargs = "+bcdfijnpqrstvwyzABCDFGIJKLMNOPQRSTVWXYZ23456789?a=e=g=h=k=l=m=o=u=x=E=H=P=U=";
+char *allowedargs = "+bcdfijnpqrstvwyzABCDFGIJKLMNOPQRSTVWXYZ023456789?a=e=g=h=k=l=m=o=u=x=E=H=P=U=";
 
 /* char takeargs="gmueoazhluEH"; */ /* subset that takes args! needed here */
 
@@ -2662,6 +2663,10 @@ int analyze_flag (int c, char *optarg)
       if (strcmp(dvi_directory, "") == 0)
         complainarg(c, optarg);
       break;
+    case '0':
+      if (optarg == 0)
+        pdf_output_flag = true;
+      break;
     case 'l':
       if (optarg == 0)
         log_directory = "";
@@ -2860,6 +2865,7 @@ int init_commands (int ac, char **av)
 /*  NOTE: some defaults changed 1993/Nov/18 */
 /*  want_version = show_use = switchflag = return_flag = false;
   is_initex = trace_flag = deslash = non_ascii = false; */
+  pdf_output_flag   = false;
   is_initex         = false; /* check for dumping format file */
   allow_patterns    = false; /* using \pattern after format file loaded */
   reset_exceptions  = false;
@@ -3278,11 +3284,12 @@ int main_init (int ac, char **av)
 
   check_fixed_align(trace_flag);       /* sanity check 1994/Jan/8 */
 
-  format_file   = NULL;       /* to be set in openinou.c 94/Jun/21 */
-  string_file   = NULL;       /* to be set in openinou.c 96/Jan/15 */
-  source_direct = NULL;       /* to be set in openinou.c 98/Sep/29 */
-  dvi_file_name = NULL;       /* to be set in openinou.c 00/Jun/18 */
-  log_file_name = NULL;       /* to be set in openinou.c 00/Jun/18 */
+  format_file   = NULL;
+  string_file   = NULL;
+  source_direct = NULL;
+  dvi_file_name = NULL;
+  log_file_name = NULL;
+  pdf_file_name = NULL;
 
   first_pass_count  = 0;
   second_pass_count = 0;
index 9f8ed87..f171ec5 100644 (file)
@@ -508,6 +508,20 @@ bool open_output (FILE **f, char *fopen_mode)
     unixify(log_line);
     dvi_file_name = xstrdup(log_line);
   }
+  else if (strstr((char *) name_of_file + 1, ".pdf") != NULL)
+  {
+    if (qualified(name_of_file + 1))
+      *log_line = '\0';
+    else
+    {
+      (void) _getcwd(log_line, sizeof(log_line));
+      strcat(log_line, PATH_SEP_STRING);
+    }
+
+    strcat(log_line, (char*) name_of_file + 1);
+    unixify(log_line);
+    pdf_file_name = xstrdup(log_line);
+  }
   else if (strstr((char *)name_of_file + 1, ".log") != NULL)
   {
     if (qualified(name_of_file + 1))
index 8f35113..0ebc005 100644 (file)
@@ -1267,18 +1267,6 @@ void dvi_ship_out_(halfword p)
   page_loc = dvi_offset + dvi_ptr;
   dvi_out(bop);
 
-/*
-  yandy_font = HPDF_GetFont (yandy_pdf, "Helvetica", NULL);
-  yandy_page = HPDF_AddPage (yandy_pdf);
-  HPDF_Page_SetWidth (yandy_page, hsize / 65536);
-  HPDF_Page_SetHeight (yandy_page, vsize / 65536);
-  HPDF_Page_SetFontAndSize (yandy_page, yandy_font, 10);
-  HPDF_Page_BeginText (yandy_page);
-  HPDF_Page_MoveTextPos(yandy_page, 10, 190);
-  HPDF_Page_ShowText (yandy_page, "The page");
-  HPDF_Page_EndText (yandy_page);
-*/
-
   for (k = 0; k <= 9; k++)
     dvi_four(count(k));
 
@@ -1333,7 +1321,10 @@ lab30:;
 }
 void ship_out_(halfword p)
 {
-  dvi_ship_out_(p);
+  if (pdf_output_flag)
+    pdf_ship_out(p);
+  else
+    dvi_ship_out_(p);
 }
 /* sec 0645 */
 void scan_spec_(group_code c, bool three_codes)
index 1c4a45c..af0478a 100644 (file)
@@ -312,107 +312,139 @@ void close_files_and_terminate (void)
       }
   } /* end of if (log_opened) */ 
 #endif /* STAT */
-  while (cur_s > -1)
+
+  if (pdf_output_flag)
   {
-    if (cur_s > 0) 
-      dvi_out(142);
+    if (total_pages == 0)
+    {
+      print_nl("No pages of output.");
+    }
     else
     {
-      dvi_out(eop);
-      incr(total_pages);
+      HPDF_SaveToFile(yandy_pdf, pdf_file_name);
+      
+      print_nl("Output written on ");
+
+      if (full_file_name_flag && dvi_file_name != NULL)
+        print_char_string((unsigned char *) pdf_file_name);
+      else
+        slow_print(output_file_name);
+
+      print_string(" (");
+      print_int(total_pages);
+      print_string(" page");
+
+      if (total_pages != 1)
+        print_char('s');
+
+      //print_string(", ");
+      //print_int(dvi_offset + dvi_ptr);
+      //print_string(" bytes).");
+      print_string(").");
+      b_close(dvi_file);
     }
 
-    decr(cur_s);
+    HPDF_Free(yandy_pdf);
   }
-
-  if (total_pages == 0)
-    print_nl("No pages of output.");
   else
   {
-    dvi_out(post);
-    dvi_four(last_bop);
-    last_bop = dvi_offset + dvi_ptr - 5;
-    dvi_four(25400000L);
-    dvi_four(473628672L);
-    prepare_mag();
-    dvi_four(mag);
-    dvi_four(max_v);
-    dvi_four(max_h);
-    dvi_out(max_push / 256);
-    dvi_out(max_push % 256);
-
-    if (total_pages >= 65536)    // 99/Oct/10 dvi_t 16 bit problem
+    while (cur_s > -1)
     {
-      sprintf(log_line, "\nWARNING: page count (dvi_t) in DVI file will be %ld not %ld\n",
-        (total_pages % 65536), total_pages);
-
-      if (log_opened)
-        (void) fputs (log_line, log_file);
+      if (cur_s > 0) 
+        dvi_out(142);
+      else
+      {
+        dvi_out(eop);
+        incr(total_pages);
+      }
 
-      show_line(log_line, 1);
+      decr(cur_s);
     }
 
-    dvi_out((total_pages / 256) % 256);
-    dvi_out(total_pages % 256);
+    if (total_pages == 0)
+      print_nl("No pages of output.");
+    else
+    {
+      dvi_out(post);
+      dvi_four(last_bop);
+      last_bop = dvi_offset + dvi_ptr - 5;
+      dvi_four(25400000L);
+      dvi_four(473628672L);
+      prepare_mag();
+      dvi_four(mag);
+      dvi_four(max_v);
+      dvi_four(max_h);
+      dvi_out(max_push / 256);
+      dvi_out(max_push % 256);
+
+      if (total_pages >= 65536)    // 99/Oct/10 dvi_t 16 bit problem
+      {
+        sprintf(log_line, "\nWARNING: page count (dvi_t) in DVI file will be %ld not %ld\n",
+          (total_pages % 65536), total_pages);
 
-    if (show_fonts_used && log_opened)     /* 97/Dec/24 */
-      show_font_info();           // now in local.c
+        if (log_opened)
+          (void) fputs (log_line, log_file);
 
-    while (font_ptr > 0)
-    {
-      if (font_used[font_ptr])
-        dvi_font_def(font_ptr);
+        show_line(log_line, 1);
+      }
 
-      decr(font_ptr);
-    }
+      dvi_out((total_pages / 256) % 256);
+      dvi_out(total_pages % 256);
 
-    dvi_out(post_post);
-    dvi_four(last_bop);
-    dvi_out(id_byte);
-    k = 4 + ((dvi_buf_size - dvi_ptr) % 4);
+      if (show_fonts_used && log_opened)     /* 97/Dec/24 */
+        show_font_info();           // now in local.c
 
-    while (k > 0)
-    {
-      dvi_out(223);
-      decr(k);
-    }
+      while (font_ptr > 0)
+      {
+        if (font_used[font_ptr])
+          dvi_font_def(font_ptr);
 
-    if (trace_flag) /* 93/Dec/28 - bkph */
-    {
-      sprintf(log_line, "\ndviwrite %d", dvi_gone);
-      show_line(log_line, 0);
-    }
+        decr(font_ptr);
+      }
+
+      dvi_out(post_post);
+      dvi_four(last_bop);
+      dvi_out(id_byte);
+      k = 4 + ((dvi_buf_size - dvi_ptr) % 4);
+
+      while (k > 0)
+      {
+        dvi_out(223);
+        decr(k);
+      }
 
-    if (dvi_limit == half_buf)
-      write_dvi(half_buf, dvi_buf_size - 1);
+      if (trace_flag) /* 93/Dec/28 - bkph */
+      {
+        sprintf(log_line, "\ndviwrite %d", dvi_gone);
+        show_line(log_line, 0);
+      }
 
-    if (dvi_ptr > 0)
-      write_dvi(0, dvi_ptr - 1); 
+      if (dvi_limit == half_buf)
+        write_dvi(half_buf, dvi_buf_size - 1);
 
-    print_nl("Output written on ");
+      if (dvi_ptr > 0)
+        write_dvi(0, dvi_ptr - 1); 
 
-    if (full_file_name_flag && dvi_file_name != NULL)
-      print_char_string((unsigned char *) dvi_file_name);
-    else
-      slow_print(output_file_name);
+      print_nl("Output written on ");
 
-    print_string(" (");
-    print_int(total_pages);
-    print_string(" page");
+      if (full_file_name_flag && dvi_file_name != NULL)
+        print_char_string((unsigned char *) dvi_file_name);
+      else
+        slow_print(output_file_name);
 
-    if (total_pages != 1)
-      print_char('s');
+      print_string(" (");
+      print_int(total_pages);
+      print_string(" page");
 
-    print_string(", ");
-    print_int(dvi_offset + dvi_ptr);
-    print_string(" bytes).");
-    b_close(dvi_file);
-  }
+      if (total_pages != 1)
+        print_char('s');
 
-/*
-  HPDF_SaveToFile (yandy_pdf, "texput.pdf");
-  HPDF_Free(yandy_pdf);
-*/
+      print_string(", ");
+      print_int(dvi_offset + dvi_ptr);
+      print_string(" bytes).");
+      b_close(dvi_file);
+    }
+  }
 
   if (log_opened)
   {
index bcd92b1..769d268 100644 (file)
@@ -675,6 +675,7 @@ EXTERN str_number output_file_name;   // DVI file
 EXTERN str_number texmf_log_name;   // LOG file
 EXTERN byte_file dvi_file; 
 EXTERN byte_file tfm_file;
+EXTERN byte_file pdf_file;
 EXTERN char * dvi_file_name;
 EXTERN char * pdf_file_name;
 EXTERN char * log_file_name;
@@ -2528,5 +2529,11 @@ EXTERN HPDF_Doc  yandy_pdf;
 EXTERN HPDF_Page yandy_page;
 EXTERN HPDF_Font yandy_font;
 bool pdf_doing_string;
-
+bool pdf_doing_text;
+bool pdf_output_flag;
+EXTERN void pdf_ship_out(pointer p);
+EXTERN void pdf_vlist_out (void);
+EXTERN void pdf_hlist_out (void);
+EXTERN void pdf_font_def(internal_font_number f);
+EXTERN void pdf_error_handler (HPDF_STATUS error_no, HPDF_STATUS detail_no, void * user_data);
 /********BINDING WITH LIBHARU*********/
\ No newline at end of file
index 62fa926..ec90a28 100644 (file)
@@ -26,6 +26,7 @@
 #endif
 
 #pragma warning(disable:4996)
+#include <kpathsea/kpathsea.h>
 #pragma warning(disable:4131) // old style declarator
 #pragma warning(disable:4135) // conversion between different integral types
 #pragma warning(disable:4127) // conditional expression is constant
 
 #include "texd.h"
 
+int dot_string = 0;
 HPDF_Doc  yandy_pdf;
 HPDF_Page yandy_page;
 HPDF_Font yandy_font;
 
+char * pdf_char_to_string(unsigned char i)
+{
+  char * str = malloc(2);
+  str[0] = i;
+  str[1] = 0;
+  return str;
+}
+
 void pdf_out(unsigned char i)
 {
   char temp[2] = {i, '\0'};
@@ -149,6 +159,15 @@ void pdf_begin_string(void)
 {
   scaled s;
 
+//  if (pdf_doing_text)
+//    pdf_begin_text();
+
+  if (f != pdf_f)
+  {
+    pdf_end_string();
+    pdf_font_def(f);
+  }
+
   s = cur_h - pdf_delta_h;
 
   if (!pdf_doing_string)
@@ -176,6 +195,174 @@ void pdf_error_handler (HPDF_STATUS error_no, HPDF_STATUS detail_no, void * user
   longjmp(jumpbuffer, 1);
 }
 
+void pdf_font_def(internal_font_number f)
+{
+  int k;
+  //char temp[256];
+  const char * font_name = NULL;
+  char * afm_name = NULL;
+  char * pfb_name = NULL;
+  
+  //for (k = str_start[font_name[f]]; k <= str_start[font_name[f] + 1] - 1; k++)
+  //  printf("%d\n", font_name[f]);
+  //memmove(temp, str_pool + str_start[font_name[f]], length(font_name[f]));
+  //memcpy(temp, (const char *)(str_pool + str_start[font_name[f]]), length(font_name[f]));
+  //printf("ZZZ: %s.\n", temp);
+  //for (k = str_start[font_area[f]]; k <= str_start[font_area[f] + 1] - 1; k++)
+  //temp[] = (str_pool[k]);
+  //afm_name = kpse_find_file(strcat(temp, ".afm"), kpse_afm_format, 0);
+  //pfb_name = kpse_find_file(strcat(temp, ".pfb"), kpse_type1_format, 0);
+
+  //if (afm_name != NULL && pfb_name != NULL)
+  {
+  //  font_name = HPDF_LoadType1FontFromFile (yandy_pdf, afm_name, pfb_name);
+  //  font_name = HPDF_LoadType1FontFromFile(yandy_pdf, "cmr10.afm", "cmr10.pfb");
+  //  yandy_font[f] = HPDF_GetFont(yandy_pdf, font_name, NULL);
+  }
+  //else
+  //{
+  //  yandy_font = HPDF_GetFont(yandy_pdf, "Times-Roman", NULL);
+  //}
+
+  HPDF_Page_SetFontAndSize(yandy_page, yandy_font, (font_size[f] / 65535));
+}
+
+void pdf_ship_out(halfword p)
+{
+  integer page_loc;
+  char j, k;
+  pool_pointer s;
+  char old_setting;
+
+  if (tracing_output > 0)
+  {
+    print_nl("");
+    print_ln();
+    print_string("Completed box being shipped out");
+  }
+
+  if (term_offset > max_print_line - 9)
+    print_ln();
+  else if ((term_offset > 0) || (file_offset > 0))
+    print_char(' ');
+
+  print_char('[');
+  j = 9;
+
+  while((count(j) == 0) && (j > 0))
+    decr(j);
+
+  for (k = 0; k <= j; k++)
+  {
+    print_int(count(k));
+
+    if (k < j)
+      print_char('.');
+  }
+
+#ifndef _WINDOWS
+  fflush(stdout);
+#endif
+
+  if (tracing_output > 0)
+  {
+    print_char(']');
+    begin_diagnostic();
+    show_box(p);
+    end_diagnostic(true);
+  }
+
+  if ((height(p) > max_dimen) || (depth(p) > max_dimen) ||
+      (height(p) + depth(p) + v_offset > max_dimen) ||
+      (width(p) + h_offset > max_dimen))
+  {
+    print_err("Huge page cannot be shipped out");
+    help2("The page just created is more than 18 feet tall or",
+        "more than 18 feet wide, so I suspect something went wrong.");
+    error();
+
+    if (tracing_output <= 0)
+    {
+      begin_diagnostic();
+      print_nl("The following box has been deleted:");
+      show_box(p);
+      end_diagnostic(true);
+    }
+
+    goto lab30;
+  }
+
+  if (height(p) + depth(p) + v_offset > max_v)
+    max_v = height(p) + depth(p) + v_offset;
+
+  if (width(p) + h_offset > max_h)
+    max_h = width(p) + h_offset;
+
+  dvi_h = 0;
+  dvi_v = 0;
+  cur_h = h_offset;
+  dvi_f = null_font;
+
+  if (output_file_name == 0)
+  {
+    if (job_name == 0)
+      open_log_file();
+
+    pack_job_name(".pdf");
+
+    while(!b_open_out(pdf_file))
+    {
+      prompt_file_name("file name for output", ".pdf");
+    }
+
+    output_file_name = b_make_name_string(pdf_file);
+  }
+
+  if (total_pages == 0)
+  {
+    yandy_pdf = HPDF_New(pdf_error_handler, NULL);
+    yandy_pdf->pdf_version = HPDF_VER_17;
+    HPDF_SetCompressionMode(yandy_pdf, HPDF_COMP_ALL);
+    HPDF_SetInfoAttr(yandy_pdf, HPDF_INFO_PRODUCER, "Y&YTeX 2.2.3");
+    yandy_font = HPDF_GetFont(yandy_pdf, HPDF_LoadType1FontFromFile(yandy_pdf, "cmr10.afm", "cmr10.pfb"), NULL);
+  }
+
+  //page_loc = dvi_offset + dvi_ptr;
+  //dvi_out(bop);
+  yandy_page = HPDF_AddPage (yandy_pdf);
+  HPDF_Page_SetSize(yandy_page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT);
+  //yandy_font = HPDF_GetFont(yandy_pdf, HPDF_LoadType1FontFromFile(yandy_pdf, "cmr10.afm", "cmr10.pfb"), NULL);
+  //HPDF_Page_SetFontAndSize(yandy_page, yandy_font, (10));
+
+  //for (k = 0; k <= 9; k++)
+  //  dvi_four(count(k));
+  //
+  //dvi_four(last_bop);
+  //last_bop = page_loc;
+  cur_v = height(p) + v_offset;
+  temp_ptr = p;
+
+  if (type(p) == vlist_node)
+    pdf_vlist_out();
+  else
+    pdf_hlist_out();
+
+  //dvi_out(eop);
+  incr(total_pages);
+  cur_s = -1;
+lab30:;
+  if (tracing_output <= 0)
+    print_char(']');
+
+  dead_cycles = 0;
+
+#ifndef _WINDOWS
+  fflush(stdout);
+#endif
+
+  flush_node_list(p);
+}
+/*
 void pdf_ship_out(pointer p)
 {
   integer i, j, k;
@@ -278,11 +465,7 @@ void pdf_ship_out(pointer p)
   cur_v = height(p) + v_offset;
   temp_ptr = p;
 
-  if (type(p) == vlist_node)
-    vlist_out();
-  else
-    hlist_out();
-
+  incr(total_pages);
   cur_s = -1;
 lab30:;
   if (tracing_output <= 0)
@@ -293,4 +476,540 @@ lab30:;
 #ifndef _WINDOWS
   fflush(stdout);
 #endif
+
+  flush_node_list(p);
+}
+*/
+void pdf_hlist_out (void)
+{
+  scaled base_line;
+  scaled left_edge;
+  scaled save_h, save_v;
+  halfword this_box;
+/*  glue_ord g_order;  */
+  int g_order;           /* 95/Jan/7 */
+/*  char g_sign;  */
+  int g_sign;            /* 95/Jan/7 */
+  halfword p;
+  integer save_loc;
+  halfword leader_box;
+  scaled leader_wd;
+  scaled lx;
+  bool outer_doing_leaders;
+  scaled edge;
+  real glue_temp;
+  real cur_glue;
+  scaled cur_g;
+
+  cur_g = 0;
+  cur_glue = 0.0;
+  this_box = temp_ptr;
+  g_order = glue_order(this_box);
+  g_sign = glue_sign(this_box);
+  p = list_ptr(this_box);
+  incr(cur_s);
+
+  if (cur_s > 0)
+    dvi_out(141);
+
+  if (cur_s > max_push)
+    max_push = cur_s;
+
+  save_loc = dvi_offset + dvi_ptr;
+  base_line = cur_v;
+  left_edge = cur_h;
+
+  while (p != 0)
+lab21:
+    if (is_char_node(p))
+    {
+      synch_h();
+      synch_v();
+
+      do
+        {
+          f = font(p);
+          c = character(p);
+
+          if (f != dvi_f)
+          {
+            if (!font_used[f])
+            {
+              dvi_font_def(f);
+              //pdf_font_def(f);
+              font_used[f] = true;
+            }
+
+            dvi_f = f;
+          }
+
+          //if (c >= 128)
+          //  dvi_out(set1);
+          //
+          //dvi_out(c);
+          pdf_font_def(f);
+          HPDF_Page_BeginText(yandy_page);
+          HPDF_Page_MoveTextPos(yandy_page, (cur_h/65536 + 72), (841.89 - (cur_v/65536 + 72)));
+          HPDF_Page_ShowText(yandy_page, pdf_char_to_string(c));
+          HPDF_Page_EndText(yandy_page);
+          cur_h = cur_h + char_width(f, char_info(f, c));
+          p = link(p);
+        }
+      while(!(!(p >= hi_mem_min)));
+
+      dvi_h = cur_h;
+  }
+  else
+  {
+    switch (type(p))
+    {
+      case hlist_node:
+      case vlist_node:
+        if (list_ptr(p) == 0)
+          cur_h = cur_h + width(p);
+        else
+        {
+          save_h = dvi_h;
+          save_v = dvi_v;
+          cur_v = base_line + shift_amount(p);
+          temp_ptr = p;
+          edge = cur_h;
+
+          if (type(p) == vlist_node)
+            pdf_vlist_out();
+          else
+            pdf_hlist_out();
+
+          dvi_h = save_h;
+          dvi_v = save_v;
+          cur_h = edge + width(p);
+          cur_v = base_line;
+        }
+        break;
+
+      case rule_node:
+        {
+          rule_ht = height(p);
+          rule_dp = depth(p);
+          rule_wd = width(p);
+          goto lab14;
+        }
+        break;
+
+      case whatsit_node:
+        out_what(p);
+        break;
+
+      case glue_node:
+        {
+          g = glue_ptr(p);
+          rule_wd = width(g) - cur_g;
+
+          if (g_sign != normal)
+          {
+            if (g_sign == stretching)
+            {
+              if (stretch_order(g) == g_order)
+              {
+                cur_glue = cur_glue + stretch(g);
+                glue_temp = glue_set(this_box) * cur_glue;
+
+                if (glue_temp > 1000000000.0)
+                  glue_temp = 1000000000.0;
+                else if (glue_temp < -1000000000.0)
+                  glue_temp = -1000000000.0;
+
+                cur_g = round(glue_temp);
+              }
+            }
+            else if (shrink_order(g) == g_order)
+            {
+              cur_glue = cur_glue - shrink(g);
+              glue_temp = glue_set(this_box) * cur_glue;
+
+              if (glue_temp > 1000000000.0)
+                glue_temp = 1000000000.0;
+              else if (glue_temp < -1000000000.0)
+                glue_temp = -1000000000.0;
+
+              cur_g = round(glue_temp);
+            }
+          }
+
+          rule_wd = rule_wd + cur_g;
+
+          if (subtype(p) >= a_leaders)
+          {
+            leader_box = leader_ptr(p);
+
+            if (type(leader_box) == rule_node)
+            {
+              rule_ht = height(leader_box);
+              rule_dp = depth(leader_box);
+              goto lab14;
+            }
+
+            leader_wd = width(leader_box);
+
+            if ((leader_wd > 0) && (rule_wd > 0))
+            {
+              rule_wd = rule_wd + 10;
+              edge = cur_h + rule_wd;
+              lx = 0;
+
+              if (subtype(p) == a_leaders)
+              {
+                save_h = cur_h;
+                cur_h = left_edge + leader_wd * ((cur_h - left_edge) / leader_wd);
+
+                if (cur_h < save_h)
+                  cur_h = cur_h + leader_wd;
+              }
+              else
+              {
+                lq = rule_wd / leader_wd;
+                lr = rule_wd % leader_wd;
+
+                if (subtype(p) == c_leaders)
+                  cur_h = cur_h + (lr / 2);
+                else
+                {
+                  lx =(2 * lr + lq + 1) / (2 * lq + 2);
+                  cur_h = cur_h + ((lr - (lq - 1)* lx) / 2);
+                }
+              }
+
+              while (cur_h + leader_wd <= edge)
+              {
+                cur_v = base_line + shift_amount(leader_box);
+                synch_v();
+                save_v = dvi_v;
+                synch_h();
+                save_h = dvi_h;
+                temp_ptr = leader_box;
+                outer_doing_leaders = doing_leaders;
+                doing_leaders = true;
+
+                if (type(leader_box) == vlist_node)
+                  pdf_vlist_out();
+                else
+                  pdf_hlist_out();
+
+                doing_leaders = outer_doing_leaders;
+                dvi_v = save_v;
+                dvi_h = save_h;
+                cur_v = base_line;
+                cur_h = save_h + leader_wd + lx;
+              }
+
+              cur_h = edge - 10;
+              goto lab15;
+            }
+          }
+
+          goto lab13;
+        }
+        break;
+
+      case kern_node:
+      case math_node:
+        cur_h = cur_h + width(p);
+        break;
+
+      case ligature_node:
+        {
+          mem[lig_trick] = mem[lig_char(p)];
+          link(lig_trick) = link(p);
+          p = lig_trick;
+          goto lab21;
+        }
+        break;
+
+      default:
+        break;
+    }
+
+    goto lab15;
+lab14:
+    if ((rule_ht == -1073741824L))  /* - 2^30 */
+      rule_ht = height(this_box);
+
+    if ((rule_dp == -1073741824L))     /* - 2^30 */
+      rule_dp = depth(this_box);
+
+    rule_ht = rule_ht + rule_dp;
+
+    if ((rule_ht > 0) && (rule_wd > 0))
+    {
+      synch_h();
+      cur_v = base_line + rule_dp;
+      synch_v();
+      //dvi_out(set_rule);
+      //dvi_four(rule_ht);
+      //dvi_four(rule_wd);
+      HPDF_Page_SetLineWidth(yandy_page, rule_ht / 65535);
+      HPDF_Page_MoveTo (yandy_page, (cur_h / 65535 + 72), (841.89 - cur_v / 65535 - 72));
+      HPDF_Page_LineTo (yandy_page, (cur_h / 65535 + 72 + rule_wd / 65535), (841.89 - cur_v / 65535 - 72));
+      HPDF_Page_Stroke (yandy_page);
+      cur_v = base_line;
+      dvi_h = dvi_h + rule_wd;
+    }
+lab13:
+    cur_h = cur_h + rule_wd;
+lab15:
+    p = link(p);
+  }
+
+  prune_movements(save_loc);
+
+  if (cur_s > 0)
+    dvi_pop(save_loc);
+
+  decr(cur_s);
+}
+/* following needs access to dvi_buf=zdvibuf see coerce.h */
+/* sec 0629 */
+void pdf_vlist_out (void)
+{
+  scaled left_edge;
+  scaled top_edge;
+  scaled save_h, save_v;
+  halfword this_box;
+/*  glue_ord g_order;  */
+  int g_order;         /* 95/Jan/7 */
+/*  char g_sign;  */
+  int g_sign;          /* 95/Jan/7 */
+  halfword p;
+  integer save_loc;
+  halfword leader_box;
+  scaled leader_ht;
+  scaled lx;
+  bool outer_doing_leaders;
+  scaled edge;
+  real glue_temp;
+  real cur_glue;
+  scaled cur_g;
+
+  cur_g = 0;
+  cur_glue = 0.0;
+  this_box = temp_ptr;
+  g_order = glue_order(this_box);
+  g_sign = glue_sign(this_box);
+  p = list_ptr(this_box);
+  incr(cur_s);
+
+  if (cur_s > 0)
+    dvi_out(141);
+
+  if (cur_s > max_push)
+    max_push = cur_s;
+
+  save_loc = dvi_offset + dvi_ptr;
+  left_edge = cur_h;
+  cur_v = cur_v - height(this_box);
+  top_edge = cur_v;
+
+  while (p != 0)
+  {
+    if ((p >= hi_mem_min))
+    {
+      confusion("vlistout");
+      return;       // abort_flag set
+    }
+    else
+    {
+      switch (type(p))
+      {
+        case hlist_node:
+        case vlist_node:
+          if (list_ptr(p) == 0)
+            cur_v = cur_v + height(p) + depth(p);
+          else
+          {
+            cur_v = cur_v + height(p);
+            synch_v();
+            save_h = dvi_h;
+            save_v = dvi_v;
+            cur_h = left_edge + shift_amount(p);
+            temp_ptr = p;
+
+            if (type(p) == vlist_node)
+              pdf_vlist_out();
+            else
+              pdf_hlist_out();
+
+            dvi_h = save_h;
+            dvi_v = save_v;
+            cur_v = save_v + depth(p);
+            cur_h = left_edge;
+          }
+          break;
+
+        case rule_node:
+          {
+            rule_ht = height(p);
+            rule_dp = depth(p);
+            rule_wd = width(p);
+            goto lab14;
+          }
+          break;
+
+        case whatsit_node:
+          out_what(p);
+          break;
+
+        case glue_node:
+          {
+            g = glue_ptr(p);
+            rule_ht = width(g) - cur_g;
+
+            if (g_sign != normal)
+            {
+              if (g_sign == stretching)
+              {
+                if (stretch_order(g) == g_order)
+                {
+                  cur_glue = cur_glue + stretch(g);
+                  glue_temp = glue_set(this_box) * cur_glue;
+
+                  if (glue_temp > 1000000000.0)
+                    glue_temp = 1000000000.0;
+                  else if (glue_temp < -1000000000.0)
+                    glue_temp = -1000000000.0;
+
+                  cur_g = round(glue_temp);
+                }
+              }
+              else if (shrink_order(g) == g_order)   /* BUG FIX !!! */
+              {
+                cur_glue = cur_glue - shrink(g);
+                glue_temp = glue_set(this_box) * cur_glue;
+
+                if (glue_temp > 1000000000.0)
+                  glue_temp = 1000000000.0;
+                else if (glue_temp < -1000000000.0)
+                  glue_temp = -1000000000.0;
+
+                cur_g = round(glue_temp);
+              }
+            }
+
+            rule_ht = rule_ht + cur_g;
+
+            if (subtype(p) >= a_leaders)
+            {
+              leader_box = leader_ptr(p);
+
+              if (type(leader_box) == rule_node)
+              {
+                rule_wd = width(leader_box);
+                rule_dp = 0;
+                goto lab14;
+              }
+
+              leader_ht = height(leader_box) + depth(leader_box);
+
+              if ((leader_ht > 0) && (rule_ht > 0))
+              {
+                rule_ht = rule_ht + 10;
+                edge = cur_v + rule_ht;
+                lx = 0;
+
+                if (subtype(p) == a_leaders)
+                {
+                  save_v = cur_v;
+                  cur_v = top_edge + leader_ht * ((cur_v - top_edge) / leader_ht);
+
+                  if (cur_v < save_v)
+                    cur_v = cur_v + leader_ht;
+                }
+                else
+                {
+                  lq = rule_ht / leader_ht;
+                  lr = rule_ht % leader_ht;
+
+                  if (subtype(p) == c_leaders)
+                    cur_v = cur_v + (lr / 2);
+                  else
+                  {
+                    lx = (2 * lr + lq + 1) / (2 * lq + 2);
+                    cur_v = cur_v + ((lr - (lq - 1) * lx) / 2);
+                  }
+                }
+
+                while (cur_v + leader_ht <= edge)
+                {
+                  cur_h = left_edge + shift_amount(leader_box);
+                  synch_h();
+                  save_h = dvi_h;
+                  cur_v = cur_v + height(leader_box);
+                  synch_v();
+                  save_v = dvi_v;
+                  temp_ptr = leader_box;
+                  outer_doing_leaders = doing_leaders;
+                  doing_leaders = true;
+
+                  if (type(leader_box) == vlist_node)
+                    pdf_vlist_out();
+                  else
+                    pdf_hlist_out();
+
+                  doing_leaders = outer_doing_leaders;
+                  dvi_v = save_v;
+                  dvi_h = save_h;
+                  cur_h = left_edge;
+                  cur_v = save_v - height(leader_box) + leader_ht + lx;
+                }
+
+                cur_v = edge - 10;
+                goto lab15;
+              }
+            }
+
+            goto lab13;
+          }
+          break;
+
+        case kern_node:
+          cur_v = cur_v + width(p);
+          break;
+
+        default:
+          break;
+      }
+      goto lab15;
+lab14:
+      if ((rule_wd == -1073741824L))    /* -2^30 */
+        rule_wd = width(this_box);
+
+      rule_ht = rule_ht + rule_dp;
+      cur_v = cur_v + rule_ht;
+
+      if ((rule_ht > 0) && (rule_wd > 0))
+      {
+        //synch_h();
+        //synch_v();
+        //dvi_out(put_rule);
+        //dvi_four(rule_ht);
+        //dvi_four(rule_wd);
+        HPDF_Page_SetLineWidth(yandy_page, rule_ht / 65535);
+        HPDF_Page_MoveTo (yandy_page, (cur_h / 65535 + 72), (841.89 - cur_v / 65535 - 72));
+        HPDF_Page_LineTo (yandy_page, (cur_h / 65535 + 72 + rule_wd / 65535), (841.89 - cur_v / 65535 - 72));
+        HPDF_Page_Stroke (yandy_page);
+      }
+
+      goto lab15;
+lab13:
+      cur_v = cur_v + rule_ht;
+    }
+lab15:
+    p = link(p);
+  }
+
+  prune_movements(save_loc);
+
+  if (cur_s > 0)
+    dvi_pop(save_loc);
+
+  decr(cur_s);
 }
\ No newline at end of file