summaryrefslogtreecommitdiff
path: root/Build/source/texk/windvi/dvi-init.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/windvi/dvi-init.c')
-rw-r--r--Build/source/texk/windvi/dvi-init.c1047
1 files changed, 0 insertions, 1047 deletions
diff --git a/Build/source/texk/windvi/dvi-init.c b/Build/source/texk/windvi/dvi-init.c
deleted file mode 100644
index c1819ce0e98..00000000000
--- a/Build/source/texk/windvi/dvi-init.c
+++ /dev/null
@@ -1,1047 +0,0 @@
-/*========================================================================*\
-
-Copyright (c) 1990-1999 Paul Vojta
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-PAUL VOJTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-NOTE:
- xdvi is based on prior work, as noted in the modification history
- in xdvi.c.
-
-\*========================================================================*/
-#define HAVE_BOOLEAN
-#include "xdvi-config.h"
-#include <kpathsea/c-fopen.h>
-#include <kpathsea/c-stat.h>
-#include <kpathsea/magstep.h>
-#include <kpathsea/tex-glyph.h>
-#include "dvi.h"
-
-#if defined(HTEX) && !defined(WIN32)
-#include "HTEscape.h"
-#endif
-
-#include <t1lib.h>
-
-#define PK_PRE 247
-#define PK_ID 89
-#define PK_MAGIC (PK_PRE << 8) + PK_ID
-#define GF_PRE 247
-#define GF_ID 131
-#define GF_MAGIC (GF_PRE << 8) + GF_ID
-#define VF_PRE 247
-#define VF_ID_BYTE 202
-#define VF_MAGIC (VF_PRE << 8) + VF_ID_BYTE
-
-#define dvi_oops(str) (dvi_oops_msg = (str), longjmp(dvi_env, 1))
-
-#ifdef SELFILE
-extern void set_icon_and_title (); /* from xdvi.c */
-extern void home (); /* from events.c */
-#endif
-
-static struct stat fstatbuf;
-
-static Boolean font_not_found;
-
-/*
- * DVI preamble and postamble information.
- */
-static char job_id[300];
-static long numerator, denominator;
-
-/*
- * Offset in DVI file of last page, set in read_postamble().
- */
-static long last_page_offset;
-
-#ifdef HTEX
-extern int this_is_a_href;
-#else
-int this_is_a_href = 0;
-#endif
-
-/*
- * free_vf_chain frees the vf_chain structure.
- */
-
-static void
-free_vf_chain(tnp)
- struct tn *tnp;
-{
- while (tnp != NULL) {
- struct tn *tnp1 = tnp->next;
- free((char *) tnp);
- tnp = tnp1;
- }
-}
-
-
-/*
- * Release all shrunken bitmaps for all fonts.
- */
-
-void
-reset_fonts()
-{
- struct font *f;
- struct glyph *g;
-
- for (f = font_head; f != NULL; f = f->next)
- if ((f->flags & FONT_LOADED) && !(f->flags & FONT_VIRTUAL)) {
-#if TTF
- if (f->ttfid>=0) {
- continue;
- }
-#endif
-#if T1
- if (f->t1id>=0) {
- /* Type1 font, all glyps in t1lib structures only */
- T1_DeleteAllSizes(f->t1id);
- continue;
- }
-#endif
- if (f->glyph) {
- for (g = f->glyph; g <= f->glyph + f->maxchar; ++g) {
- if (g && g->bitmap2.bits) {
- free(g->bitmap2.bits);
- g->bitmap2.bits = NULL;
- }
-#ifdef GREY
- if (g && g->pixmap2) {
- XDestroyImage(g->image2);
- g->pixmap2 = NULL;
- if (g->pixmap2_t != NULL) {
- free(g->pixmap2_t);
- g->pixmap2_t = NULL;
- }
- }
-#endif
- } /* inner for */
- }
- }
-}
-
-/*
- * realloc_font allocates the font structure to contain (newsize + 1)
- * characters.
- */
-
-void
-realloc_font(fontp, newsize)
- struct font *fontp;
- wide_ubyte newsize;
-{
- struct glyph *glyph;
-
- glyph = fontp->glyph = xrealloc(fontp->glyph,
- (unsigned int) (newsize + 1) * sizeof(struct glyph));
- if (newsize > fontp->maxchar)
- bzero((char *) (glyph + fontp->maxchar + 1),
- (int) (newsize - fontp->maxchar) * sizeof(struct glyph));
- maxchar = fontp->maxchar = newsize;
-}
-
-
-/*
- * realloc_virtual_font does the same thing for virtual fonts.
- */
-
-void
-realloc_virtual_font(fontp, newsize)
- struct font *fontp;
- wide_ubyte newsize;
-{
- struct macro *macro;
-
- macro = fontp->macro = xrealloc(fontp->macro,
- (unsigned int) (newsize + 1) * sizeof(struct macro));
- if (newsize > fontp->maxchar)
- bzero((char *) (macro + fontp->maxchar + 1),
- (int) (newsize - fontp->maxchar) * sizeof(struct macro));
- maxchar = fontp->maxchar = newsize;
-}
-
-
-/*
- * load_font locates the t1 font or raster file and reads the index of
- * characters, plus whatever other preprocessing is done (depending on
- * the format). Return True on error, False on success.
- */
-
-Boolean
-load_font(fontp)
- struct font *fontp;
-{
- double fsize = fontp->fsize;
- int dpi = fsize + 0.5;
- char *font_found;
- int size_found;
- int magic;
- Boolean hushcs = hush_chk;
-
- fontp->flags |= FONT_LOADED;
- fontp->file = font_open(fontp->fontname, &font_found,
- fsize, &size_found, fontp->magstepval,
- &fontp->filename
-#if T1
- , &fontp->t1id
-#endif
- );
-
-#if TTF
- if (fontp->ttfid>=0) {
- /* It's a TrueType font */
- fontp->fsize=fsize; /* It comes in all sizes */
- fontp->timestamp = ++current_timestamp;
- fontp->maxchar = maxchar = 255;
- fontp->set_char_p = set_ttf_char;
- /* read_TTF_char is a dummy */
- fontp->read_char = read_TTF_char;
- fontp->glyph = NULL;
- return False;
- }
-#endif
-#if T1
- if (fontp->t1id>=0) {
- /* It's a type1 font */
- fontp->fsize=fsize; /* It comes in all sizes */
- fontp->timestamp = ++current_timestamp;
- fontp->maxchar = maxchar = 255;
- fontp->set_char_p = set_t1_char;
- /* read_T1_char is a dummy */
- fontp->read_char = read_T1_char;
- fontp->glyph = NULL;
- return False;
- }
-#endif
-
- if (fontp->file == NULL) {
- Fprintf(stderr, "%s: Can't find font %s.%dpk\n", prog,
- fontp->fontname, dpi);
- /* Err, can we just return here? Mustn't we load cmr10 in the
- fonts place? Looks like type1 version of replacement is
- never loaded. */
- return True;
- }
- --n_files_left;
- if (font_found != NULL) {
- Fprintf(stderr,
- "%s: can't find font %s; using %s instead at %d dpi.\n",
- prog, fontp->fontname, font_found, dpi);
- free(fontp->fontname);
- fontp->fontname = strdup(font_found);
- hushcs = True;
- }
- else if (!kpse_bitmap_tolerance ((double) size_found, fsize))
- Fprintf(stderr,
- "%s: Can't find font %s at %d dpi; using %d dpi instead.\n",
- prog, fontp->fontname, dpi, size_found);
- fontp->fsize = size_found;
- fontp->timestamp = ++current_timestamp;
- fontp->maxchar = maxchar = 255;
- fontp->set_char_p = set_char;
- magic = two(fontp->file);
- if (magic == PK_MAGIC) read_PK_index(fontp, WIDENINT hushcs);
- else
-#if USE_GF
- if (magic == GF_MAGIC) read_GF_index(fontp, WIDENINT hushcs);
- else
-#endif
-#ifdef Omega
- if (magic == VF_MAGIC)
- maxchar = read_VF_index(fontp, WIDENINT hushcs);
-#else
- if (magic == VF_MAGIC) read_VF_index(fontp, WIDENINT hushcs);
-#endif
- else
- oops("Cannot recognize format for font file %s", fontp->filename);
-
- if (fontp->flags & FONT_VIRTUAL) {
-#ifdef Omega
-#else
- while (maxchar > 0 && fontp->macro[maxchar].pos == NULL) --maxchar;
- if (maxchar < 255)
- realloc_virtual_font(fontp, WIDENINT maxchar);
-#endif
- } else {
- while (maxchar > 0 && fontp->glyph[maxchar].addr == 0) --maxchar;
- if (maxchar < 255)
- realloc_font(fontp, WIDENINT maxchar);
- }
- return False;
-}
-
-
-/*
- * MAGSTEPVALUE - If the given magnification is close to a \magstep
- * or a \magstephalf, then return twice the number of \magsteps.
- * Otherwise return NOMAGSTP.
- */
-
-#define NOMAGSTP (-29999)
-#define NOBUILD 29999
-
-static int
-magstepvalue(mag)
- float *mag;
-{
- int m_ret;
- unsigned dpi_ret =
- kpse_magstep_fix ((unsigned) *mag, (unsigned) pixels_per_inch, &m_ret);
- *mag = (float) dpi_ret; /* MAG is actually a dpi. */
- return m_ret ? m_ret : NOMAGSTP;
-}
-
-/*
- * reuse_font recursively sets the flags for font structures being reused.
- */
-
-static void
-reuse_font(fontp)
- struct font *fontp;
-{
- struct font **fp;
- struct tn *tnp;
-
- if (fontp->flags & FONT_IN_USE) return;
-
- fontp->flags |= FONT_IN_USE;
- if (list_fonts)
- Printf("%s: (reusing) %s at %d dpi\n", prog, fontp->fontname,
- (int) (fontp->fsize + 0.5));
- if (fontp->flags & FONT_VIRTUAL) {
- for (fp = fontp->vf_table; fp < fontp->vf_table + VFTABLELEN; ++fp)
- if (*fp != NULL) reuse_font(*fp);
- for (tnp = fontp->vf_chain; tnp != NULL; tnp = tnp->next)
- reuse_font(tnp->fontp);
- }
-}
-
-
-/*
- * define_font reads the rest of the fntdef command and then reads in
- * the specified pixel file, adding it to the global linked-list holding
- * all of the fonts used in the job.
- */
-struct font *
-define_font(file, cmnd, vfparent, tntable, tn_table_len, tn_headpp)
- FILE *file;
- wide_ubyte cmnd;
- struct font *vfparent; /* vf parent of this font, or NULL */
- struct font **tntable; /* table for low TeXnumbers */
- unsigned int tn_table_len; /* length of table for TeXnumbers */
- struct tn **tn_headpp; /* addr of head of list of TeXnumbers */
-{
- int TeXnumber;
- struct font *fontp;
- float fsize;
-/* BEGIN CHUNK dvi-init.c 1 */
-#ifdef SRC_SPECIALS
- float helpconv;
- long conv_help;
-#endif
-/* END CHUNK dvi-init.c 1 */
- double scale_dimconv;
- long checksum;
- int scale;
- int design;
- int magstepval;
- int len;
- char *fontname;
- int size;
-
- TeXnumber = num(file, (int) cmnd - FNTDEF1 + 1);
- checksum = four(file);
- scale = four(file);
- design = four(file);
- len = one(file); len += one(file); /* sequence point in the middle */
- fontname = xmalloc((unsigned) len + 1);
- Fread(fontname, sizeof(char), len, file);
- fontname[len] = '\0';
-/* BEGIN CHUNK dvi-init.c 2 */
-#ifdef SRC_SPECIALS
- /* helpconv will contain the pt size (in floats)
- *
- * helpconv = (float)design * ((float)scale/(float)design) / (float)(2**16);
- *
- * simplified:
- */
- helpconv = (float)scale / 65536.0;
-#endif
-/* END CHUNK dvi-init.c 2 */
- if(debug & DBG_PK)
- Printf("%s: Define font \"%s\" scale=%d design=%d\n",
- prog, fontname, scale, design);
- if (vfparent == NULL) {
- fsize = 0.001 * scale / design * magnification * pixels_per_inch;
- scale_dimconv = dimconv;
- }
- else {
- /* The scaled size is given in units of vfparent->scale *
- * 2 ** -20 SPELL units, so we convert it into SPELL
- * units by multiplying by
- * vfparent->dimconv.
- * The design size is given in units of 2 ** -20 pt, so we convert
- * into SPELL units by multiplying by
- * (pixels_per_inch * 2**16) / (72.27 * 2**20). */
- fsize = (72.27 * (1<<4)) * vfparent->dimconv * scale / design;
- scale_dimconv = vfparent->dimconv;
-#if 0 /* FP: seems to be wrong ! */
- scale = vfparent->scale;
-#endif
- }
- magstepval = magstepvalue(&fsize);
- size = fsize + 0.5;
-/* BEGIN CHUNK dvi-init.c 3 */
-#ifdef SRC_SPECIALS
- conv_help = (float)dimconv * (float)(1<<19) / 655360.0;
- if (debug & DBG_SRC_SPECIALS) {
- Fprintf(stderr, "Define font has vals: %f, %d, %lf, %lf, [%f]\n",
- fsize, magstepval, dimconv, scale_dimconv, conv_help);
- }
-#endif
-/* END CHUNK dvi-init.c 3 */
- /*
- * reuse font if possible
- */
- for (fontp = font_head;; fontp = fontp->next) {
- if (fontp == NULL) { /* if font doesn't exist yet */
- if (list_fonts)
- Printf("%s: %s at %d dpi\n", prog, fontname, (int) (fsize + 0.5));
- fontp = xmalloc((unsigned) sizeof(struct font));
- fontp->fontname = fontname;
- fontp->fsize = fsize;
-/* BEGIN CHUNK dvi-init.c 4 */
-#ifdef SRC_SPECIALS
- fontp->pt_size = helpconv;
-#endif
-/* END CHUNK dvi-init.c 4 */
- fontp->magstepval = magstepval;
- fontp->file = NULL; /* needed if it's a virtual font */
- fontp->checksum = checksum;
- fontp->flags = FONT_IN_USE;
- fontp->dimconv = scale * scale_dimconv / (1<<20);
- fontp->set_char_p = load_n_set_char;
- fontp->scale=scale;
- /* With virtual fonts, we might be opening another font
- (pncb.vf), instead of what we just allocated for
- (rpncb), thus leaving garbage in the structure for
- when close_a_file comes along looking for something. */
- fontp->file = NULL;
- fontp->filename = NULL;
- if (vfparent == NULL) font_not_found |= load_font(fontp);
- fontp->next = font_head;
- font_head = fontp;
- break;
- }
- if (strcmp(fontname, fontp->fontname) == 0
- && size == (int) (fontp->fsize + 0.5)) {
- /* if font already in use */
- reuse_font(fontp);
- free(fontname);
- break;
- }
- }
- if (TeXnumber < tn_table_len)
- tntable[TeXnumber] = fontp;
- else {
- struct tn *tnp;
- tnp = xmalloc((unsigned) sizeof(struct tn));
- tnp->next = *tn_headpp;
- *tn_headpp = tnp;
- tnp->TeXnumber = TeXnumber;
- tnp->fontp = fontp;
- }
- return fontp;
-}
-
-
-/*
- * process_preamble reads the information in the preamble and stores
- * it into global variables for later use.
- */
-static void
-process_preamble()
-{
- ubyte k;
-
- if (one(dvi_file) != PRE)
- dvi_oops("Not a DVI file.");
- if (one(dvi_file) != 2)
- dvi_oops("Wrong version of DVI output for this program");
- numerator = four(dvi_file);
- denominator = four(dvi_file);
- magnification = four(dvi_file);
- dimconv = (((double) numerator * magnification)
- / ((double) denominator * 1000.));
- dimconv = dimconv * (((long) pixels_per_inch)<<16) / 254000;
- tpic_conv = pixels_per_inch * magnification / 1000000.0;
- k = one(dvi_file);
- Fread(job_id, sizeof(char), (int) k, dvi_file);
- job_id[k] = '\0';
-}
-
-/*
- * find_postamble locates the beginning of the postamble
- * and leaves the file ready to start reading at that location.
- */
-#define TMPSIZ 516 /* 4 trailer bytes + 512 junk bytes allowed */
-static void
-find_postamble()
-{
- long pos;
- ubyte temp[TMPSIZ];
- ubyte *p;
- ubyte *p1;
- ubyte byte;
-
- Fseek(dvi_file, (long) 0, 2);
- pos = ftell(dvi_file) - TMPSIZ;
- if (pos < 0) pos = 0;
- Fseek(dvi_file, pos, 0);
- p = temp + fread((char *) temp, sizeof(char), TMPSIZ, dvi_file);
- for (;;) {
- p1 = p;
- while (p1 > temp && *(--p1) != TRAILER) ;
- p = p1;
- while (p > temp && *(--p) == TRAILER) ;
- if (p <= p1 - 4) break; /* found 4 TRAILER bytes */
- if (p <= temp) dvi_oops("DVI file corrupted");
- }
- pos += p - temp;
- byte = *p;
- while (byte == TRAILER) {
- Fseek(dvi_file, --pos, 0);
- byte = one(dvi_file);
- }
- if (byte != 2)
- dvi_oops("Wrong version of DVI output for this program");
- Fseek(dvi_file, pos - 4, 0);
- Fseek(dvi_file, sfour(dvi_file), 0);
-}
-
-
-/*
- * read_postamble reads the information in the postamble,
- * storing it into global variables.
- * It also takes care of reading in all of the pixel files for the fonts
- * used in the job.
- */
-static void
-read_postamble()
-{
- ubyte cmnd;
- struct font *fontp;
- struct font **fontpp;
-
- if (one(dvi_file) != POST)
- dvi_oops("Postamble doesn't begin with POST");
- last_page_offset = four(dvi_file);
- if (numerator != four(dvi_file)
- || denominator != four(dvi_file)
- || magnification != four(dvi_file))
- dvi_oops("Postamble doesn't match preamble");
- /* read largest box height and width */
- unshrunk_dvifile_page_h = unshrunk_page_h
- = (spell_conv(sfour(dvi_file)) >> 16) + offset_y;
- if (unshrunk_page_h < unshrunk_paper_h)
- unshrunk_page_h = unshrunk_paper_h;
- unshrunk_dvifile_page_w = unshrunk_page_w
- = (spell_conv(sfour(dvi_file)) >> 16) + offset_x;
- if (unshrunk_page_w < unshrunk_paper_w)
- unshrunk_page_w = unshrunk_paper_w;
- (void) two(dvi_file); /* max stack size */
- total_pages = two(dvi_file);
- font_not_found = False;
- while ((cmnd = one(dvi_file)) >= FNTDEF1 && cmnd <= FNTDEF4)
- (void) define_font(dvi_file, cmnd, (struct font *) NULL,
- tn_table, TNTABLELEN, &tn_head);
- if (cmnd != POSTPOST)
- dvi_oops("Non-fntdef command found in postamble");
- if (font_not_found)
- dvi_oops("Not all pixel files were found");
- /*
- * free up fonts no longer in use
- */
- fontpp = &font_head;
- while ((fontp = *fontpp) != NULL)
- if (fontp->flags & FONT_IN_USE)
- fontpp = &fontp->next;
- else {
- if (debug & DBG_PK)
- Printf("%s: Discarding font \"%s\" at %d dpi\n",
- prog, fontp->fontname, (int) (fontp->fsize + 0.5));
- *fontpp = fontp->next; /* remove from list */
- free(fontp->fontname);
- if (fontp->flags & FONT_LOADED) {
- if (fontp->file != NULL) {
- Fclose(fontp->file);
- ++n_files_left;
- }
- free(fontp->filename);
- if (fontp->flags & FONT_VIRTUAL) {
- struct macro *m;
-
- for (m = fontp->macro;
- m <= fontp->macro + fontp->maxchar; ++m)
- if (m->free_me) free((char *) m->pos);
- free((char *) fontp->macro);
- free((char *) fontp->vf_table);
- free_vf_chain(fontp->vf_chain);
- }
- else if (fontp->glyph != NULL) { /* skip empty fonts (tjc) */
- struct glyph *g;
-
- for (g = fontp->glyph;
- g <= fontp->glyph + fontp->maxchar; ++g) {
- if (g == NULL) continue;
- if (g->bitmap.bits != NULL) {
- free(g->bitmap.bits);
- g->bitmap.bits = NULL;
- }
- if (g->bitmap2.bits != NULL) {
- free(g->bitmap2.bits);
- g->bitmap2.bits = NULL;
- }
-#ifdef GREY
- if (g->pixmap2 != NULL) {
- XDestroyImage(g->image2);
- g->pixmap2 = NULL;
- if (g->pixmap2_t != NULL) {
- free(g->pixmap2_t);
- g->pixmap2_t = NULL;
- }
- }
-#endif
- }
- free((char *) fontp->glyph);
- }
- free((char *) fontp);
- }
- }
-}
-
-static void
-prepare_pages()
-{
- int i;
-
- page_offset = xmalloc((unsigned) total_pages * sizeof(long));
- i = total_pages;
- page_offset[--i] = last_page_offset;
- Fseek(dvi_file, last_page_offset, 0);
- /*
- * Follow back pointers through pages in the DVI file,
- * storing the offsets in the page_offset table.
- */
- while (i > 0) {
- Fseek(dvi_file, (long) (1+4+(9*4)), 1);
- Fseek(dvi_file, page_offset[--i] = four(dvi_file), 0);
- }
-}
-
-void
-init_page()
-{
- page_w = ROUNDUP(unshrunk_page_w, mane.shrinkfactor) + 2;
- page_h = ROUNDUP(unshrunk_page_h, mane.shrinkfactor) + 2;
-}
-
-#ifndef S_ISDIR
-#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
-#endif
-
-/*
- * init_dvi_file is the main subroutine for reading the startup
- * information from the dvi file. Returns True on success.
- */
-
-Boolean
-init_dvi_file()
-{
-#ifdef WIN32
- char szBuf[80];
- extern void UpdateStatusBar(LPSTR lpszStatusString,
- WORD partNumber, WORD displayFlags);
-
- wsprintf(szBuf, "Initializing %s", xbasename(dvi_name));
- UpdateStatusBar(szBuf, 0, 0);
-#endif
- (void) fstat(fileno(dvi_file), &fstatbuf);
- if (S_ISDIR(fstatbuf.st_mode))
- return False;
- dvi_time = fstatbuf.st_mtime;
- process_preamble();
- find_postamble();
- read_postamble();
- prepare_pages();
- init_page();
- if (current_page >= total_pages) current_page = total_pages - 1;
- warn_spec_now = warn_spec;
-#if PS
- ps_newdoc();
-#endif
-#ifdef SRC_SPECIALS
- src_delete_all_specials();
-#endif
-#ifdef HTEX
- htex_reinit();
-#endif /* HTEX */
-#ifdef WIN32
- wsprintf(szBuf, "Ready");
- UpdateStatusBar(szBuf, 0, 0);
-#endif
- return True;
-}
-
-#ifdef WIN32
-/*
- add the current file to the list of last used files.
- */
-
-#define MAX_USED_FILES 4
-
-void push_current_used()
-{
- extern void UpdateMainMenuUsedFiles(void);
- extern char **lpLastUsedFiles;
- extern int iLastUsedFilesNum;
- int i;
- char path[260], *fp;
-
- if (!dvi_name) {
- fprintf(stderr, "push_current_used : error, no valid dvi_name\n");
- return;
- }
- /* Get the full file name */
-#if 1
- /* Beware : might have added file:
- FIXME: there should be a copy of original dvi_name
- rather that parsing it back !
- In fact, dvi_name must be made absolute first.
- */
- if (memicmp(dvi_name, "file:", 5) == 0) {
- if (GetFullPathName(dvi_name+5, sizeof(path), path, &fp) == 0)
- Win32Error("push_current_used/GetFullPathName");
- }
- else
-#endif
- if (GetFullPathName(dvi_name, sizeof(path), path, &fp) == 0)
- Win32Error("push_current_used/GetFullPathName");
-
- if (iLastUsedFilesNum < MAX_USED_FILES) {
- for (i = iLastUsedFilesNum; i >= 1; i--)
- lpLastUsedFiles[i] = lpLastUsedFiles[i - 1];
- lpLastUsedFiles[0] = xstrdup(path);
- iLastUsedFilesNum++;
- }
- else {
- /* Cancellation or something like that */
- if (FILESTRCASEEQ(path, lpLastUsedFiles[0]))
- return;
-
- free(lpLastUsedFiles[iLastUsedFilesNum - 1]);
- for (i = iLastUsedFilesNum - 1; i >= 1; i--)
- lpLastUsedFiles[i] = lpLastUsedFiles[i-1];
- lpLastUsedFiles[0] = xstrdup(path);
- UpdateMainMenuUsedFiles();
- }
-}
-
-void
-set_directory_dvifile()
-{
- char path[260], *fp;
- /* Get the full file name */
- if (GetFullPathName(dvi_name, sizeof(path), path, &fp) == 0)
- Win32Error("set_directory_dvifile/GetFullPathName");
- NormalizeDviName(sizeof(path), path);
- if (fp == path) {
- fprintf(stderr, "Error : no valid path %s -> %s\n", dvi_name, path);
- }
-
- *(fp-1) = '\0';
-
- dvi_name = strdup(fp);
- if (SetCurrentDirectory(path) == 0)
- Win32Error("set_directory_dvifile/SetCurrentDirectory");
-}
-#endif /* WIN32 */
-
-/**
- ** open_dvi_file opens the dvi file and calls init_dvi_file() to
- ** initialize it.
- **/
-
-void
-open_dvi_file()
-{
- int n;
- char *file;
-
- if (setjmp(dvi_env)) oops(dvi_oops_msg);
-
- n = strlen(dvi_name);
- file = dvi_name;
-#ifdef WIN32
- dvipos = 0L;
- dvistate = CLEARED;
-#endif
- if (!this_is_a_href) {
- /*
- * Try foo.dvi before foo, in case there's an executable foo with
- * documentation foo.tex. Unless it already ends with ".dvi".
- */
- if (n < sizeof(".dvi")
- || strcmp(dvi_name + n - sizeof(".dvi") + 1, ".dvi") != 0) {
- dvi_name = xmalloc((unsigned) n + sizeof(".dvi"));
- Strcpy(dvi_name, file);
- Strcat(dvi_name, ".dvi");
- dvi_file = xfopen(dvi_name, OPEN_MODE);
- if (dvi_file != NULL && init_dvi_file()) {
-#ifdef WIN32
- /* New recent used file */
- push_current_used();
- initcolor();
-#endif
- return;
- }
- free(dvi_name);
- dvi_name = file;
- }
- }
-
- /* Then try `foo', in case the user likes DVI files without `.dvi'. */
- if ((dvi_file = xfopen(dvi_name, OPEN_MODE)) == NULL
- || !init_dvi_file()) {
-#ifdef WIN32
- /* May be this can be handled more gracefully ? */
- extern HWND hWndMain;
- char buf[200];
-#if PS
- ps_destroy();
-#endif
- wsprintf(buf, "File not found : %s", xbasename(dvi_name));
- MessageBox(hWndMain, buf,
- NULL, MB_OK | MB_ICONERROR | MB_APPLMODAL);
- Exit(1);
-#else /* ! WIN32 */
- perror(dvi_name);
-#if PS
- ps_destroy();
-#endif
- exit(1);
-#endif /* ! WIN32 */
- }
-#ifdef WIN32
- /* New recent used file */
- scanned_page = scanned_page_reset = -1;
-#ifdef XFORM
- reset_xform_stack();
-#endif
-#ifdef SRC_SPECIALS
- src_delete_all_specials();
-#endif
-#ifdef HTEX
- htex_reinit();
-#endif
- push_current_used();
- initcolor();
-#endif
-}
-
-#ifdef SELFILE
-/* Allow the user to choose a new dvi file, by popping up a dialog box
- which allows the graphical selection of the correct filename,
- maybe we should only allow files ending in .dvi to be selected. */
-
-FILE *
-select_filename(open, move_home)
- int open, move_home ;
-{
- extern FILE *XsraSelFile();
- FILE *dummy_file ;
- static char *dummy_name ;
-
- dummy_file = XsraSelFile(top_level, "Select a dvi file: ",
- "Ok", "Cancel",
- "Can't open file: ", NULL,
- OPEN_MODE, NULL, &dummy_name) ;
- if (dummy_file != NULL) {
- /* we may not want the file they returned... */
- if (!open)
- fclose (dummy_file) ;
-
- /* The name is what we really want, so use it, but turn it into an URL */
- free(dvi_name);
-#if 0
- dummy_name = HTEscape(dummy_name,URL_PATH);
- dvi_name = xmalloc((unsigned) strlen(dummy_name)+6);
- strcat(strcpy(dvi_name,"file:"),dummy_name);
-#else
- dvi_name = xstrdup(dummy_name);
-#endif
- /* Should we really free dummy_name? */
-
- current_page = 0 ; /* go to start of new dvi file */
- if (move_home)
- home(False); /* Move to home position on new first page */
-
- /* We do this elsewhere if we don't open the file. */
- if (open)
- set_icon_and_title (dvi_name, NULL, NULL, 1);
-
- } else if (open && dvi_name) { /* User cancelled, so open old file */
- dummy_file = xfopen(dvi_name, OPEN_MODE);
- if (dummy_file == NULL)
- dvi_oops("Could not open old file");
- --dvi_time;
- }
-
- return dummy_file ;
-}
-#endif /* SELFILE */
-
-/**
- ** Check for changes in dvi file.
- **/
-
-Boolean
-check_dvi_file()
-{
- struct font *fontp;
-#if 0
- fprintf(stderr, "dvi_file = %x, stat = %d, dvi_time = %x, fstat.mtime = %x\n",
- dvi_file, fstat(fileno(dvi_file), &fstatbuf), dvi_time, fstatbuf.st_mtime);
-#endif
- if (dvi_name == NULL)
- return False;
-
- if (dvi_file == NULL || fstat(fileno(dvi_file), &fstatbuf) != 0
- || fstatbuf.st_mtime != dvi_time) {
- if (dvi_file) {
- Fclose(dvi_file);
- dvi_file = NULL;
- if (list_fonts) Putchar('\n');
- }
- if (page_offset != (long *) NULL) {
- free((char *) page_offset);
- page_offset = (long *) NULL;
- }
- bzero((char *) tn_table, (int) sizeof(tn_table));
- free_vf_chain(tn_head);
- tn_head = NULL;
- for (fontp = font_head; fontp != NULL; fontp = fontp->next)
- fontp->flags &= ~FONT_IN_USE;
-#ifdef SELFILE
- if ((dvi_time > fstatbuf.st_mtime) && /* choose a new file */
- (dvi_file = select_filename(True, True)) == NULL)
- dvi_oops("Cannot open new dvi file.");
- else
-#endif /* SELFILE */
-
- if ((dvi_file = xfopen(dvi_name, OPEN_MODE)) == NULL)
- dvi_oops("Cannot reopen dvi file.");
-
- /* This function should be applied in both cases, for a
- * new opened or a reread dvi file or we will get empty
- * page_offset and fonts. <werner@suse.de>
- */
- if (!init_dvi_file())
- dvi_oops("Cannot initialise dvi file.");
-
- scanned_page = scanned_page_reset = -1;
- initcolor();
-
- reconfig();
-/* BEGIN CHUNK dvi-init.c 5 */
-#ifdef SRC_SPECIALS
- src_delete_all_specials();
-#endif
-/* END CHUNK dvi-init.c 5 */
-#ifdef HTEX
- htex_reinit();
-#endif /* HTEX */
- redraw_page();
- return False;
- }
- return True;
-}
-
-#ifdef WIN32
-
-void CloseCurrentFile()
-{
- struct font *fontp;
-
- if (dvi_file) {
- Fclose(dvi_file);
- dvi_file = NULL;
- if (list_fonts) Putchar('\n');
- }
- if (page_offset) {
- /* With SELFILE, we are called once before the file
- selection, and then once recursively (below). Thus
- we would free a freed pointer. */
- free((char *) page_offset);
- page_offset = NULL;
- bzero((char *) tn_table, (int) sizeof(tn_table));
- free_vf_chain(tn_head);
- tn_head = NULL;
- for (fontp = font_head; fontp != NULL; fontp = fontp->next)
- fontp->flags &= ~FONT_IN_USE;
- }
-
-}
-
-void OpenCurrentFile(char *name)
-{
- extern void ChangePage(int);
- extern void ChangeZoom(int);
- extern void initcolor();
-
- dvi_name = xstrdup(name);
- dvi_file = fopen(name, OPEN_MODE);
- set_icon_and_title (dvi_name, NULL, NULL, 1);
- if (dvi_file == NULL
- || !init_dvi_file())
- dvi_oops("Cannot reopen dvi file.");
- initcolor();
- reconfig();
-#ifdef SRC_SPECIALS
- src_delete_all_specials();
-#endif
-#ifdef HTEX
- htex_reinit();
-#endif /* HTEX */
- ChangePage(0);
- ChangeZoom(0);
- redraw_page();
-}
-
-void NormalizeDviName(int size, char * name)
-{
- int len = strlen(name);
- if (_stricmp(name + len - 4, ".dvi") && (len+4 < size)) {
- strcat(name, ".dvi");
- }
-
-}
-
-#endif