diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-17 21:41:51 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-17 21:41:51 +0000 |
commit | 487ca4806cc046076293cf6cc5fbba0db282bac7 (patch) | |
tree | 847b412ab5158dd7bdd7ed7e5a4cc3fbca94be32 /Build/source/texk/dvipdfm/numbers.c | |
parent | a3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (diff) |
texk 1
git-svn-id: svn://tug.org/texlive/trunk@1485 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvipdfm/numbers.c')
-rw-r--r-- | Build/source/texk/dvipdfm/numbers.c | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/Build/source/texk/dvipdfm/numbers.c b/Build/source/texk/dvipdfm/numbers.c new file mode 100644 index 00000000000..02f9e2869cf --- /dev/null +++ b/Build/source/texk/dvipdfm/numbers.c @@ -0,0 +1,317 @@ +/* $Header$ + + This is dvipdfm, a DVI to PDF translator. + Copyright (C) 1998, 1999 by Mark A. Wicks + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + The author may be contacted via the e-mail address + + mwicks@kettering.edu +*/ + +#include "system.h" +#include "error.h" +#include "mfileio.h" +#include "numbers.h" + +UNSIGNED_BYTE get_unsigned_byte (FILE *file) +{ + int ch; + if ((ch = fgetc (file)) < 0) + ERROR ("File ended prematurely\n"); + return (UNSIGNED_BYTE) ch; +} + +UNSIGNED_BYTE sget_unsigned_byte (char *s) +{ + return *((unsigned char *) s); +} + +SIGNED_BYTE get_signed_byte (FILE *file) +{ + int byte; + byte = get_unsigned_byte(file); + if (byte >= 0x80) + byte -= 0x100; + return (SIGNED_BYTE) byte; +} + +UNSIGNED_PAIR get_unsigned_pair (FILE *file) +{ + int i; + UNSIGNED_BYTE byte; + UNSIGNED_PAIR pair = 0; + for (i=0; i<2; i++) { + byte = get_unsigned_byte(file); + pair = pair*0x100u + byte; + } + return pair; +} + +UNSIGNED_PAIR sget_unsigned_pair (unsigned char *s) +{ + int i; + UNSIGNED_BYTE byte; + UNSIGNED_PAIR pair = 0; + for (i=0; i<2; i++) { + byte = *(s++); + pair = pair*0x100u + byte; + } + return pair; +} + +SIGNED_PAIR get_signed_pair (FILE *file) +{ + int i; + long pair = 0; + for (i=0; i<2; i++) { + pair = pair*0x100 + get_unsigned_byte(file); + } + if (pair >= 0x8000) { + pair -= 0x10000l; + } + return (SIGNED_PAIR) pair; +} + + +UNSIGNED_TRIPLE get_unsigned_triple(FILE *file) +{ + int i; + long triple = 0; + for (i=0; i<3; i++) { + triple = triple*0x100u + get_unsigned_byte(file); + } + return (UNSIGNED_TRIPLE) triple; +} + +SIGNED_TRIPLE get_signed_triple(FILE *file) +{ + int i; + long triple = 0; + for (i=0; i<3; i++) { + triple = triple*0x100 + get_unsigned_byte(file); + } + if (triple >= 0x800000l) + triple -= 0x1000000l; + return (SIGNED_TRIPLE) triple; +} + +SIGNED_QUAD get_signed_quad(FILE *file) +{ + int byte, i; + long quad = 0; + + /* Check sign on first byte before reading others */ + byte = get_unsigned_byte(file); + quad = byte; + if (quad >= 0x80) + quad = byte - 0x100; + for (i=0; i<3; i++) { + quad = quad*0x100 + get_unsigned_byte(file); + } + return (SIGNED_QUAD) quad; +} + +UNSIGNED_QUAD get_unsigned_quad(FILE *file) +{ + int i; + unsigned long quad = 0; + for (i=0; i<4; i++) { + quad = quad*0x100u + get_unsigned_byte(file); + } + return (UNSIGNED_QUAD) quad; +} + +SIGNED_QUAD sqxfw (SIGNED_QUAD sq, fixword fw) +{ + int sign = 1; + unsigned long a, b, c, d, ad, bd, bc, ac; + unsigned long e, f, g, h, i, j, k; + unsigned long result; + /* Make positive. */ + if (sq < 0) { + sign = -sign; + sq = -sq; + } + if (fw < 0) { + sign = -sign; + fw = -fw; + } + a = ((unsigned long) sq) >> 16u; + b = ((unsigned long) sq) & 0xffffu; + c = ((unsigned long) fw) >> 16u; + d = ((unsigned long) fw) & 0xffffu; + ad = a*d; bd = b*d; bc = b*c; ac = a*c; + e = bd >> 16u; + f = ad >> 16u; + g = ad & 0xffffu; + h = bc >> 16u; + i = bc & 0xffffu; + j = ac >> 16u; + k = ac & 0xffffu; + result = (e+g+i + (1<<3)) >> 4u; /* 1<<3 is for rounding */ + result += (f+h+k) << 12u; + result += j << 28u; + return (sign>0)?result:-result; +} + +SIGNED_QUAD axboverc (SIGNED_QUAD n1, SIGNED_QUAD n2, SIGNED_QUAD div) +{ + int sign = 1; + unsigned long a, b, c, d, ad, bd, bc, ac, e, f, g, h, i, j, o; + unsigned long high, low; + SIGNED_QUAD result = 0; + /* Make positive. */ + if (n1 < 0) { + sign = -sign; + n1 = -n1; + } + if (n2 < 0) { + sign = -sign; + n2 = -n2; + } + if (div < 0) { + sign = -sign; + div = -div; + } + a = ((unsigned long) n1) >> 16u; + b = ((unsigned long) n1) & 0xffffu; + c = ((unsigned long) n2) >> 16u; + d = ((unsigned long) n2) & 0xffffu; + ad = a*d; bd = b*d; bc = b*c; ac = a*c; + e = bd >> 16u; f = bd & 0xffffu; + g = ad >> 16u; h = ad & 0xffffu; + i = bc >> 16u; j = bc & 0xffffu; + o = e+h+j; + high = g+i+(o>>16u)+ac; o &= 0xffffu; + low = (o << 16) + f; + if (high >= div) + ERROR ("Overflow in axboc"); + { + int i; + for (i=0; i<32; i++) { + high *= 2; + result *= 2; + if (low >= 0x80000000) { + low -= 0x80000000; + high += 1; + } + low *= 2; + if (high > div) { + high -= div; + result += 1; + } + } + } + high *= 2; + if (high >= div) + result += 1; + return (sign>0)?result:-result; +} + +/* Create a private_itoa to be used internally in the + hopes that a good optimizing compiler will use it inline */ +static int private_itoa (char *s, long int n, int mindigits) +{ + int j, nwhole; + char *p = s; + if (n<0) { + *(p++) = '-'; + n = -n; + } + /* Generate at least one digit in reverse order */ + nwhole = 0; + do { + p[nwhole++] = n%10 + '0'; + n /= 10; + } while (n != 0 || nwhole < mindigits); + /* Reverse the digits */ + for (j=0; j<nwhole/2; j++) { + char tmp = p[j]; + p[j] = p[nwhole-j-1]; + p[nwhole-j-1]=tmp; + } + p += nwhole; + *p = 0; + return (p-s); +} + +int inttoa (char *s, long int i) +{ + /* Call the private one */ + return private_itoa (s, i, 0); +} + +int centi_u_to_a (char *s, long int n) +{ + char *p = s; + unsigned long whole_part; + int frac_part; + if (n<0) { + *(p++) = '-'; + n = -n; + } + whole_part = ((unsigned long) n) / 100; + frac_part = ((unsigned long) n) % 100; + /* Print the whole part */ + p += private_itoa (p, whole_part, 0); + if (frac_part) { + int mindigits = 2; + *(p++) = '.'; + while (!(frac_part % 10)) { + frac_part /= 10; + mindigits -= 1; + } + p += private_itoa (p, frac_part, mindigits); + } + return (p-s); +} + +int fixnumtoa (char *s, long int n) +{ + int j, thresh; + char *p = s; + unsigned long whole_part, frac_part; + if (n<0) { + *(p++) = '-'; + n = -n; + } + whole_part = ((unsigned long) n) / (65536l); + frac_part = ((unsigned long) n) % 65536l; + /* Print the whole part */ + p += private_itoa (p, whole_part, 0); + + #define BASE ((unsigned long)(256*65536l)) + frac_part *= 256; + thresh = BASE / 10000; + /* Round last digit */ + frac_part += thresh/2; + if (frac_part > thresh) { + *(p++) = '.'; + } + for (j=0; j<4 && frac_part> thresh; j++) { + char next_digit; + next_digit = (10*frac_part)/BASE; + frac_part = (10*frac_part)%BASE; + *(p++) = next_digit + '0'; + thresh *= 10; + } + *p = 0; + return (p-s); +} + + + |