diff options
Diffstat (limited to 'Build/source/texk/web2c/pmpostdir/pmp.ch')
-rw-r--r-- | Build/source/texk/web2c/pmpostdir/pmp.ch | 359 |
1 files changed, 359 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/pmpostdir/pmp.ch b/Build/source/texk/web2c/pmpostdir/pmp.ch new file mode 100644 index 00000000000..edab992e8ec --- /dev/null +++ b/Build/source/texk/web2c/pmpostdir/pmp.ch @@ -0,0 +1,359 @@ +% jMetaPost change file for MetaPost +% +% written by Michio Matsuyama <fwhw5892@mb.infoweb.ne.jp> +% Hideyuki Suzuki <hideyuki@sat.t.u-tokyo.ac.jp> +% +% $Id: jmp.ch,v 1.42 2000/03/20 02:55:50 hideyuki Exp $ + +% +% +% change file of mp.w for pMetaPost (CWEB version) +% Akira Kakuto (translated the WEB version) +% +% + +@x +@d default_banner "This is MetaPost, Version 2.00" /* printed when \MP\ starts */ +@y +@z + +@x +#define metapost_version "2.00" +@y +#ifdef UPMP +#define P_UP "up" +#define metapost_version "2.00-0.04-u1.27" +#else +#define P_UP "p" +#define metapost_version "2.00-0.04" +#endif +#define default_banner "This is " P_UP "MetaPost, Version " metapost_version /* printed when \MP\ starts */ +@z + +@x +# include <unistd.h> /* for access */ +#endif +@y +# include <unistd.h> /* for access */ +#endif +#include <kpathsea/config.h> +#include <kpathsea/kpathsea.h> +#include <ptexenc/ptexenc.h> +#include <errno.h> +@z + +@x +void mp_close_file (MP mp, void *f) { + (void) mp; + if (f != NULL) + fclose ((FILE *) f); +@y +void mp_close_file (MP mp, void *f) { + (void) mp; +#ifdef WIN32 + if (f != NULL) { + clear_infile_enc((FILE *)f); + fclose ((FILE *) f); + } +#else + if (f != NULL) + fclose ((FILE *) f); +#endif +@z + +@x +mp->buf_size = 200; +@y +{ + char *kpse_buf = kpse_var_value("buf_size"); + if(kpse_buf) { + mp->buf_size = atoi(kpse_buf); + free(kpse_buf); + } else { + mp->buf_size = 500000; + } +} +@z + +@x +static boolean mp_input_ln (MP mp, void *f) { + /* inputs the next line or returns |false| */ + char *s; + size_t size = 0; + mp->last = mp->first; /* cf.\ Matthew 19\thinspace:\thinspace30 */ + s = (mp->read_ascii_file) (mp, f, &size); + if (s == NULL) + return false; + if (size > 0) { + mp->last = mp->first + size; + if (mp->last >= mp->max_buf_stack) { + mp->max_buf_stack = mp->last + 1; + while (mp->max_buf_stack > mp->buf_size) { + mp_reallocate_buffer (mp, (mp->buf_size + (mp->buf_size >> 2))); + } + } + (void) memcpy ((mp->buffer + mp->first), s, size); + } + free (s); + return true; +} +@y +static boolean mp_input_ln (MP mp, void *f ) { + int i = EOF; + mp->last = input_line2((FILE *)f, mp->buffer, mp->first, mp->buf_size, &i); + if (i == EOF && errno != EINTR && mp->last == mp->first) + return false; + if (i != EOF && i != '\n' && i != '\r') { + fprintf (stderr, "! Unable to read an entire line---bufsize=%u.\n", + (unsigned) mp->buf_size); + fputs ("Please increase buf_size in texmf.cnf.\n", stderr); + exit (1); + } + if (i == '\r') { + while ((i = getc ((FILE *)f)) == EOF && errno == EINTR) + ; + if (i != '\n') + ungetc (i, f); + } + return true; +} +@z + +@x +wterm (mp->banner); +@y +wterm (mp->banner); +wterm(" ("); +wterm(getencstring()); +wterm(")"); +@z + +@x +} four_quarters; +typedef union { + integer sc; + four_quarters qqqq; +} font_data; +@y +} four_quarters; +typedef struct { + halfword RH, LH; +} two_halves; +typedef union { + two_halves hh; + integer sc; + four_quarters qqqq; +} font_data; +@z + +% +% tategaki support +% +% Suppose h==(0,height), d==(0,-depth) && w==(width,0) in horizontal string, +% && h==(height,0), d==(-depth,0) && w==(0,-width) in vertical string. +% Four vertices of the bounding box is h, d, h+w && d+w && those of the +% transformed boundig box is Th, Td, T(h+w) && T(d+w), so that the values +% of Th, Td && Tw are compared here. + +@x +@ The height width and depth information stored in a text node determines a +rectangle that needs to be transformed according to the transformation +parameters stored in the text node. + +@y +@ The height width and depth information stored in a text node determines a +rectangle that needs to be transformed according to the transformation +parameters stored in the text node. + +Boundig box depends on JFM font ID. + +@d yoko_jfm_id 11 /* `yoko-kumi' fonts */ +@d tate_jfm_id 9 /* `tate-kumi' fonts */ +@d font_jfm_p(A) (mp->font_id[(A)]!=0) + +@z + +@x + mp_number x0a, y0a, x1a, y1a, arg1; + mp_text_node p0 = (mp_text_node)p; + new_number (x0a); + new_number (x1a); + new_number (y0a); + new_number (y1a); + new_number (arg1); + number_clone (arg1, p0->depth); + number_negate (arg1); + take_scaled (x1a, p0->txx, p0->width); + take_scaled (y0a, p0->txy, arg1); + take_scaled (y1a, p0->txy, p0->height); +@y + mp_number x0a, y0a, x1a, y1a, arg1, arg2; + mp_text_node p0 = (mp_text_node)p; + new_number (x0a); + new_number (x1a); + new_number (y0a); + new_number (y1a); + new_number (arg1); + new_number (arg2); + number_clone (arg1, p0->depth); + number_negate (arg1); + number_clone (arg2, p0->width); + number_negate (arg2); + if ( mp->font_id[mp_font_n(p)]!=tate_jfm_id ) { + take_scaled (x1a, p0->txx, p0->width); + take_scaled (y0a, p0->txy, arg1); + take_scaled (y1a, p0->txy, p0->height); + } else { + take_scaled (x1a, p0->txy, arg2); + take_scaled (y0a, p0->txx, arg1); + take_scaled (y1a, p0->txx, p0->height); + } +@z + +@x + take_scaled (x1a, p0->tyx, p0->width); + number_clone (arg1, p0->depth); + number_negate (arg1); + take_scaled (y0a, p0->tyy, arg1); + take_scaled (y1a, p0->tyy, p0->height); +@y + if ( mp->font_id[mp_font_n(p)]!=tate_jfm_id ) { + take_scaled (x1a, p0->tyx, p0->width); + number_clone (arg1, p0->depth); + number_negate (arg1); + take_scaled (y0a, p0->tyy, arg1); + take_scaled (y1a, p0->tyy, p0->height); + } else { + number_clone (arg1, p0->depth); + number_negate (arg1); + number_clone (arg2, p0->width); + number_negate (arg2); + take_scaled (x1a, p0->tyy, arg2); + take_scaled (y0a, p0->tyx, arg1); + take_scaled (y1a, p0->tyx, p0->height); + } +@z + +@x + wlog (mp->banner); +@y + wlog (mp->banner); + wlog (" ("); + wlog (getencstring()); + wlog (")"); +@z + +% +% char type pointers +@x +eight_bits *font_bc; +eight_bits *font_ec; /* first and last character code */ +@y +eight_bits *font_bc; +eight_bits *font_ec; /* first and last character code */ +halfword *font_nt; +halfword *font_id; +@z + +@x +int *char_base; /* base address for |char_info| */ +@y +int *char_base; /* base address for |char_info| */ +int *ctype_base; +@z + +@x +xfree (mp->char_base); +@y +xfree (mp->font_id); +xfree (mp->font_nt); +xfree (mp->char_base); +xfree (mp->ctype_base); +@z + +@x + XREALLOC (mp->char_base, l, int); +@y + XREALLOC (mp->font_id, l, halfword); + XREALLOC (mp->font_nt, l, halfword); + XREALLOC (mp->char_base, l, int); + XREALLOC (mp->ctype_base, l, int); +@z + + +@x +mp->char_base[null_font] = 0; +@y +mp->font_id[null_font] = 0; +mp->font_nt[null_font] = 0; +mp->char_base[null_font] = 0; +mp->ctype_base[null_font] = 0; +@z + +@x +@d char_mp_info(A,B) mp->font_info[mp->char_base[(A)]+(B)].qqqq +@y +@d char_mp_info(A,B) mp->font_info[mp->char_base[(A)]+(B)].qqqq +@d ctype_char_end(A) (A)].hh.LH +@d ctype_char(A) mp->font_info[mp->ctype_base[(A)]+ctype_char_end +@d ctype_type_end(A) (A)].hh.RH +@d ctype_type(A) mp->font_info[mp->ctype_base[(A)]+ctype_type_end +@z + +% +% lookup character type table +@x +void mp_set_text_box (MP mp, mp_text_node p) { +@y +@<Declare JFM function for text measuring@>; +void mp_set_text_box (MP mp, mp_text_node p) { +@z + +@x + if ((*(mp_text_p (p)->str + k) < bc) || (*(mp_text_p (p)->str + k) > ec)) { + mp_lost_warning (mp, f, *(mp_text_p (p)->str + k)); + } else { + cc = char_mp_info (f, *(mp_text_p (p)->str + k)); +@y + if ( ((*(mp_text_p (p)->str + k) < bc) || (*(mp_text_p (p)->str + k) > ec)) && (mp->font_id[f]==0) ) { + mp_lost_warning (mp, f, *(mp_text_p (p)->str + k)); + } else { + if (mp->font_id[f]!=0) { +#ifdef UPMP + integer cx; /* code for Japanese two byte character */ + if (multistrlen(mp_text_p (p)->str, kk, k)>1) { + cx=fromBUFF(mp_text_p (p)->str, kk, k); + k=k+multistrlen(mp_text_p (p)->str, kk, k)-1; + } else { + cx=*(mp_text_p (p)->str + k); + } + cc=char_mp_info(f,mp_lookup_ctype(mp, f, cx)); +#else + cc=char_mp_info(f,mp_lookup_ctype(mp, f,fromBUFF(mp_text_p(p)->str,limit,k))); + k++; +#endif + } else { + cc = char_mp_info (f, *(mp_text_p (p)->str + k)); + } +@z + +@x +@* Debugging. +@y +@ @<Declare JFM function for text measuring@>= +static int mp_lookup_ctype (MP mp,font_number f, integer c) +{ + int l, u, r, ch; + l=0; u=mp->font_nt[f]-1; + while ( l<u ) { + r=(l+u)/2; + ch=ctype_char(f)(r); + if ( ch==c ) { + return ctype_type(f)(r);}; + if ( ch<c ) l=r+1; + else u=r-1; + }; + return 0; +} +@* Debugging. +@z |