diff options
Diffstat (limited to 'parse.c')
-rw-r--r-- | parse.c | 651 |
1 files changed, 325 insertions, 326 deletions
@@ -49,12 +49,11 @@ static void pop_env(DviWidget dw); #ifdef USE_XFT static int -charWidth (DviWidget dw, XftFont *font, char c) +charWidth(DviWidget dw, XftFont *font, char c) { - XGlyphInfo extents; + XGlyphInfo extents; - XftTextExtents8 (XtDisplay (dw), font, - (unsigned char *) &c, 1, &extents); + XftTextExtents8(XtDisplay(dw), font, (unsigned char *) &c, 1, &extents); return extents.xOff; } #else @@ -65,398 +64,398 @@ charWidth (DviWidget dw, XftFont *font, char c) (fi)->max_bounds.width\ ) #endif - + int ParseInput(DviWidget dw) { - int n, k; - int c; - char Buffer[BUFSIZ]; - int NextPage; - int prevFont; - int otherc; - unsigned char tc; + int n, k; + int c; + char Buffer[BUFSIZ]; + int NextPage; + int prevFont; + int otherc; + unsigned char tc; + + /* + * make sure some state exists + */ - /* - * make sure some state exists - */ + if (!dw->dvi.state) + push_env(dw); + for (;;) { + switch (DviGetC(dw, &c)) { + case '\n': + break; + case ' ': /* when input is text */ + case 0: /* occasional noise creeps in */ + break; + case '{': /* push down current environment */ + push_env(dw); + break; + case '}': + pop_env(dw); + break; + /* + * two motion digits plus a character + */ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + HorizontalMove(dw, (c - '0') * 10 + DviGetC(dw, &otherc) - '0'); + /* fall through */ + case 'c': /* single ascii character */ + (void) DviGetC(dw, &c); + if (c == ' ') + break; + tc = c; + PutCharacters(dw, &tc, 1); + break; + case 'C': + GetWord(dw, Buffer, BUFSIZ); + { + DviCharNameMap *map; + int i; + unsigned char *ligature; - if (!dw->dvi.state) - push_env (dw); - for (;;) { - switch (DviGetC(dw, &c)) { - case '\n': - break; - case ' ': /* when input is text */ - case 0: /* occasional noise creeps in */ - break; - case '{': /* push down current environment */ - push_env(dw); - break; - case '}': - pop_env(dw); - break; - /* - * two motion digits plus a character - */ - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - HorizontalMove(dw, (c-'0')*10 + - DviGetC(dw,&otherc)-'0'); - /* fall through */ - case 'c': /* single ascii character */ - (void) DviGetC(dw,&c); - if (c == ' ') - break; - tc = c; - PutCharacters (dw, &tc, 1); - break; - case 'C': - GetWord(dw, Buffer, BUFSIZ); - { - DviCharNameMap *map; - int i; - unsigned char *ligature; - - c = -1; - map = QueryFontMap (dw, dw->dvi.state->font_number); - if (map) - { - c = DviCharIndex (map, Buffer); - if (c == -1) - { - ligature = DviCharIsLigature (map, Buffer); - if (ligature) { - i = strlen ((char *) ligature); - PutCharacters (dw, ligature, i); - break; - } - } - } - prevFont = -1; - if (c == -1) { - for (i = 1; (map = QueryFontMap (dw, i)); i++) - if (map->special) - if ((c = DviCharIndex (map, Buffer)) != -1) { - prevFont = dw->dvi.state->font_number; - dw->dvi.state->font_number = i; - break; - } - } - if (c != -1) - { - tc = c; - PutCharacters (dw, &tc, 1); - } - if (prevFont != -1) - dw->dvi.state->font_number = prevFont; - } - break; - case 'D': /* draw function */ - GetLine(dw, Buffer, BUFSIZ); - ParseDrawFunction(dw, Buffer); - break; - case 's': /* ignore fractional sizes */ - n = GetNumber(dw); - if (!dw->dvi.size_scale) - { - static const int guesses[] = { 1, 4, 100, 1000, 1 }; - int i; + c = -1; + map = QueryFontMap(dw, dw->dvi.state->font_number); + if (map) { + c = DviCharIndex(map, Buffer); + if (c == -1) { + ligature = DviCharIsLigature(map, Buffer); + if (ligature) { + i = strlen((char *) ligature); + PutCharacters(dw, ligature, i); + break; + } + } + } + prevFont = -1; + if (c == -1) { + for (i = 1; (map = QueryFontMap(dw, i)); i++) { + if (map->special) { + if ((c = DviCharIndex(map, Buffer)) != -1) { + prevFont = dw->dvi.state->font_number; + dw->dvi.state->font_number = i; + break; + } + } + } + } + if (c != -1) { + tc = c; + PutCharacters(dw, &tc, 1); + } + if (prevFont != -1) + dw->dvi.state->font_number = prevFont; + } + break; + case 'D': /* draw function */ + GetLine(dw, Buffer, BUFSIZ); + ParseDrawFunction(dw, Buffer); + break; + case 's': /* ignore fractional sizes */ + n = GetNumber(dw); + if (!dw->dvi.size_scale) { + static const int guesses[] = { 1, 4, 100, 1000, 1 }; + int i; - for (i = 0; i < 4; i++) - if (8 <= n/guesses[i] && n/guesses[i] <= 24) - { - break; - } - dw->dvi.size_scale = guesses[i]; - } - dw->dvi.state->font_size = n; - dw->dvi.state->line_width = n * (dw->dvi.device_resolution / - (720 * dw->dvi.size_scale)); - break; - case 'f': - n = GetNumber(dw); - dw->dvi.state->font_number = n; - break; - case 'H': /* absolute horizontal motion */ - k = GetNumber(dw); - HorizontalGoto(dw, k); - break; - case 'h': /* relative horizontal motion */ - k = GetNumber(dw); - HorizontalMove(dw, k); - break; - case 'w': /* word space */ - break; - case 'V': - n = GetNumber(dw); - VerticalGoto(dw, n); - break; - case 'v': - n = GetNumber(dw); - VerticalMove(dw, n); - break; - case 'P': /* new spread */ - break; - case 'p': /* new page */ - (void) GetNumber(dw); - NextPage = dw->dvi.current_page + 1; - RememberPagePosition(dw, NextPage); - FlushCharCache (dw); - return(NextPage); - case 'n': /* end of line */ - GetNumber(dw); - GetNumber(dw); - HorizontalGoto(dw, 0); - break; - case '#': /* comment */ - case 'F': /* file info */ - GetLine(dw, NULL, 0); - break; - case 't': /* text */ - GetLine(dw, Buffer, BUFSIZ); - PutCharacters (dw, (unsigned char *)Buffer, - strlen (Buffer)); - dw->dvi.state->x = ToDevice (dw, dw->dvi.cache.x); - break; - case 'x': /* device control */ - ParseDeviceControl(dw); - break; - case EOF: - dw->dvi.last_page = dw->dvi.current_page; - FlushCharCache (dw); - return dw->dvi.current_page; - default: - GetLine (dw, Buffer, BUFSIZ); - fprintf (stderr, "Unknown command %s\n", Buffer); - break; - } - } + for (i = 0; i < 4; i++) { + if (8 <= n / guesses[i] && n / guesses[i] <= 24) { + break; + } + } + dw->dvi.size_scale = guesses[i]; + } + dw->dvi.state->font_size = n; + dw->dvi.state->line_width = n * (dw->dvi.device_resolution / + (720 * dw->dvi.size_scale)); + break; + case 'f': + n = GetNumber(dw); + dw->dvi.state->font_number = n; + break; + case 'H': /* absolute horizontal motion */ + k = GetNumber(dw); + HorizontalGoto(dw, k); + break; + case 'h': /* relative horizontal motion */ + k = GetNumber(dw); + HorizontalMove(dw, k); + break; + case 'w': /* word space */ + break; + case 'V': + n = GetNumber(dw); + VerticalGoto(dw, n); + break; + case 'v': + n = GetNumber(dw); + VerticalMove(dw, n); + break; + case 'P': /* new spread */ + break; + case 'p': /* new page */ + (void) GetNumber(dw); + NextPage = dw->dvi.current_page + 1; + RememberPagePosition(dw, NextPage); + FlushCharCache(dw); + return (NextPage); + case 'n': /* end of line */ + GetNumber(dw); + GetNumber(dw); + HorizontalGoto(dw, 0); + break; + case '#': /* comment */ + case 'F': /* file info */ + GetLine(dw, NULL, 0); + break; + case 't': /* text */ + GetLine(dw, Buffer, BUFSIZ); + PutCharacters(dw, (unsigned char *) Buffer, strlen(Buffer)); + dw->dvi.state->x = ToDevice(dw, dw->dvi.cache.x); + break; + case 'x': /* device control */ + ParseDeviceControl(dw); + break; + case EOF: + dw->dvi.last_page = dw->dvi.current_page; + FlushCharCache(dw); + return dw->dvi.current_page; + default: + GetLine(dw, Buffer, BUFSIZ); + fprintf(stderr, "Unknown command %s\n", Buffer); + break; + } + } } static void push_env(DviWidget dw) { - DviState *new; + DviState *new; - new = (DviState *) XtMalloc (sizeof (*new)); - if (dw->dvi.state) - *new = *(dw->dvi.state); - else { - new->font_size = 10 * dw->dvi.size_scale; - new->font_number = 1; - new->line_style = 0; - new->line_width = 10; - new->x = 0; - new->y = 0; - } - new->next = dw->dvi.state; - dw->dvi.state = new; + new = (DviState *) XtMalloc(sizeof(*new)); + if (dw->dvi.state) + *new = *(dw->dvi.state); + else { + new->font_size = 10 * dw->dvi.size_scale; + new->font_number = 1; + new->line_style = 0; + new->line_width = 10; + new->x = 0; + new->y = 0; + } + new->next = dw->dvi.state; + dw->dvi.state = new; } static void pop_env(DviWidget dw) { - DviState *old; + DviState *old; - old = dw->dvi.state; - dw->dvi.state = old->next; - XtFree ((char *) old); + old = dw->dvi.state; + dw->dvi.state = old->next; + XtFree((char *) old); } static void -InitTypesetter (DviWidget dw) +InitTypesetter(DviWidget dw) { - while (dw->dvi.state) - pop_env (dw); - dw->dvi.size_scale = dw->dvi.size_scale_set; - push_env (dw); - FlushCharCache (dw); + while (dw->dvi.state) + pop_env(dw); + dw->dvi.size_scale = dw->dvi.size_scale_set; + push_env(dw); + FlushCharCache(dw); } static void -SetFont (DviWidget dw) +SetFont(DviWidget dw) { dw->dvi.cache.font_size = dw->dvi.state->font_size; dw->dvi.cache.font_number = dw->dvi.state->font_number; - dw->dvi.cache.font = QueryFont (dw, - dw->dvi.cache.font_number, - dw->dvi.cache.font_size); + dw->dvi.cache.font = QueryFont(dw, + dw->dvi.cache.font_number, + dw->dvi.cache.font_size); } static void -PutCharacters (DviWidget dw, unsigned char *src, int len) +PutCharacters(DviWidget dw, unsigned char *src, int len) { - int xx, yx; - int fx, fy; - char *dst; - int c; + int xx, yx; + int fx, fy; + char *dst; + int c; xx = ToX(dw, dw->dvi.state->x); yx = ToX(dw, dw->dvi.state->y); - fy = FontSizeInPixels (dw, dw->dvi.state->font_size); + fy = FontSizeInPixels(dw, dw->dvi.state->font_size); fx = fy * len; /* * quick and dirty extents calculation: */ if (yx + fy >= dw->dvi.extents.y1 && - yx - fy <= dw->dvi.extents.y2 && - xx + fx >= dw->dvi.extents.x1 && - xx - fx <= dw->dvi.extents.x2) - { + yx - fy <= dw->dvi.extents.y2 && + xx + fx >= dw->dvi.extents.x1 && xx - fx <= dw->dvi.extents.x2) { #ifdef USE_XFT - XftFont *font; - DviTextItem *text; + XftFont *font; + DviTextItem *text; #else - register XFontStruct *font; - register XTextItem *text; + register XFontStruct *font; + register XTextItem *text; #endif - if (!dw->dvi.display_enable) - return; + if (!dw->dvi.display_enable) + return; - if (yx != dw->dvi.cache.y || - dw->dvi.cache.char_index + len > DVI_CHAR_CACHE_SIZE) - FlushCharCache (dw); - /* - * load a new font, if the current block is not empty, - * step to the next. - */ - if (dw->dvi.cache.font_size != dw->dvi.state->font_size || - dw->dvi.cache.font_number != dw->dvi.state->font_number) - { - SetFont (dw); - if (dw->dvi.cache.cache[dw->dvi.cache.index].nchars != 0) { - ++dw->dvi.cache.index; - if (dw->dvi.cache.index >= dw->dvi.cache.max) - FlushCharCache (dw); - dw->dvi.cache.cache[dw->dvi.cache.index].nchars = 0; - } - } - if (xx != dw->dvi.cache.x) { - if (dw->dvi.cache.cache[dw->dvi.cache.index].nchars != 0) { - ++dw->dvi.cache.index; - if (dw->dvi.cache.index >= dw->dvi.cache.max) - FlushCharCache (dw); - dw->dvi.cache.cache[dw->dvi.cache.index].nchars = 0; - } - } - if (!dw->dvi.cache.font) - SetFont (dw); - text = &dw->dvi.cache.cache[dw->dvi.cache.index]; - font = dw->dvi.cache.font; - dst = &dw->dvi.cache.char_cache[dw->dvi.cache.char_index]; - if (text->nchars == 0) { - text->chars = dst; + if (yx != dw->dvi.cache.y || + dw->dvi.cache.char_index + len > DVI_CHAR_CACHE_SIZE) + FlushCharCache(dw); + /* + * load a new font, if the current block is not empty, + * step to the next. + */ + if (dw->dvi.cache.font_size != dw->dvi.state->font_size || + dw->dvi.cache.font_number != dw->dvi.state->font_number) { + SetFont(dw); + if (dw->dvi.cache.cache[dw->dvi.cache.index].nchars != 0) { + ++dw->dvi.cache.index; + if (dw->dvi.cache.index >= dw->dvi.cache.max) + FlushCharCache(dw); + dw->dvi.cache.cache[dw->dvi.cache.index].nchars = 0; + } + } + if (xx != dw->dvi.cache.x) { + if (dw->dvi.cache.cache[dw->dvi.cache.index].nchars != 0) { + ++dw->dvi.cache.index; + if (dw->dvi.cache.index >= dw->dvi.cache.max) + FlushCharCache(dw); + dw->dvi.cache.cache[dw->dvi.cache.index].nchars = 0; + } + } + if (!dw->dvi.cache.font) + SetFont(dw); + text = &dw->dvi.cache.cache[dw->dvi.cache.index]; + font = dw->dvi.cache.font; + dst = &dw->dvi.cache.char_cache[dw->dvi.cache.char_index]; + if (text->nchars == 0) { + text->chars = dst; #ifdef USE_XFT - text->x = xx; + text->x = xx; #else - text->delta = xx - dw->dvi.cache.x; + text->delta = xx - dw->dvi.cache.x; #endif #ifdef USE_XFT - text->font = font; + text->font = font; #endif - if (font != dw->dvi.font) { + if (font != dw->dvi.font) { #ifndef USE_XFT - text->font = font->fid; + text->font = font->fid; #endif - dw->dvi.font = font; - } + dw->dvi.font = font; + } #ifndef USE_XFT - else - text->font = None; + else + text->font = None; #endif - dw->dvi.cache.x = xx; - } - dw->dvi.cache.char_index += len; - text->nchars += len; - while (len--) - { - c = *src++; - *dst++ = c; - if (font) - dw->dvi.cache.x += charWidth(dw,font,c); - } + dw->dvi.cache.x = xx; + } + dw->dvi.cache.char_index += len; + text->nchars += len; + while (len--) { + c = *src++; + *dst++ = c; + if (font) + dw->dvi.cache.x += charWidth(dw, font, c); + } } } static void ParseDrawFunction(DviWidget dw, char *buf) { - int n, m, n1, m1; + int n, m, n1, m1; - SetGCForDraw (dw); + SetGCForDraw(dw); switch (buf[0]) { - case 'l': /* draw a line */ - sscanf(buf+1, "%d %d", &n, &m); - DrawLine(dw, n, m); - break; - case 'c': /* circle */ - sscanf(buf+1, "%d", &n); - DrawCircle(dw, n); - break; - case 'e': /* ellipse */ - sscanf(buf+1, "%d %d", &m, &n); - DrawEllipse(dw, m, n); - break; - case 'a': /* arc */ - sscanf(buf+1, "%d %d %d %d", &n, &m, &n1, &m1); - DrawArc(dw, n, m, n1, m1); - break; - case '~': /* wiggly line */ - DrawSpline(dw, buf+1,1); - break; - case 't': /* line width */ - sscanf(buf+1, "%d", &n); - dw->dvi.state->line_width = n; - break; - case 's': /* line style */ - sscanf(buf+1, "%d", &n); - /* XXX */ - break; + case 'l': /* draw a line */ + sscanf(buf + 1, "%d %d", &n, &m); + DrawLine(dw, n, m); + break; + case 'c': /* circle */ + sscanf(buf + 1, "%d", &n); + DrawCircle(dw, n); + break; + case 'e': /* ellipse */ + sscanf(buf + 1, "%d %d", &m, &n); + DrawEllipse(dw, m, n); + break; + case 'a': /* arc */ + sscanf(buf + 1, "%d %d %d %d", &n, &m, &n1, &m1); + DrawArc(dw, n, m, n1, m1); + break; + case '~': /* wiggly line */ + DrawSpline(dw, buf + 1, 1); + break; + case 't': /* line width */ + sscanf(buf + 1, "%d", &n); + dw->dvi.state->line_width = n; + break; + case 's': /* line style */ + sscanf(buf + 1, "%d", &n); + /* XXX */ + break; default: - /* warning("unknown drawing function %s", buf); */ - break; + /* warning("unknown drawing function %s", buf); */ + break; } -} +} extern int LastPage, CurrentPage; static void -ParseDeviceControl(DviWidget dw) /* Parse the x commands */ -{ +ParseDeviceControl(DviWidget dw) +{ /* Parse the x commands */ char str[20], str1[50]; int c, n; - GetWord (dw, str, 20); - switch (str[0]) { /* crude for now */ - case 'T': /* output device */ - GetWord(dw, str, 20); - break; - case 'i': /* initialize */ - InitTypesetter (dw); - break; - case 't': /* trailer */ - break; - case 'p': /* pause -- can restart */ - break; - case 's': /* stop */ - return; - case 'r': /* resolution when prepared */ - SetDeviceResolution (dw, GetNumber (dw)); - break; - case 'f': /* font used */ - n = GetNumber(dw); - GetWord(dw, str, 20); - GetLine(dw, str1, 50); - SetFontPosition(dw, n, str, str1); - break; - case 'H': /* char height */ - break; - case 'S': /* slant */ - break; + GetWord(dw, str, 20); + switch (str[0]) { /* crude for now */ + case 'T': /* output device */ + GetWord(dw, str, 20); + break; + case 'i': /* initialize */ + InitTypesetter(dw); + break; + case 't': /* trailer */ + break; + case 'p': /* pause -- can restart */ + break; + case 's': /* stop */ + return; + case 'r': /* resolution when prepared */ + SetDeviceResolution(dw, GetNumber(dw)); + break; + case 'f': /* font used */ + n = GetNumber(dw); + GetWord(dw, str, 20); + GetLine(dw, str1, 50); + SetFontPosition(dw, n, str, str1); + break; + case 'H': /* char height */ + break; + case 'S': /* slant */ + break; } - while (DviGetC(dw,&c) != '\n') /* skip rest of input line */ - if (c == EOF) - return; + while (DviGetC(dw, &c) != '\n') /* skip rest of input line */ + if (c == EOF) + return; } |