| /*@z32.c:Counter Service:Next()@**********************************************/ |
| /* */ |
| /* THE LOUT DOCUMENT FORMATTING SYSTEM (VERSION 3.24) */ |
| /* COPYRIGHT (C) 1991, 2000 Jeffrey H. Kingston */ |
| /* */ |
| /* Jeffrey H. Kingston (jeff@cs.usyd.edu.au) */ |
| /* Basser Department of Computer Science */ |
| /* The University of Sydney 2006 */ |
| /* AUSTRALIA */ |
| /* */ |
| /* 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, 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 */ |
| /* */ |
| /* FILE: z32.c */ |
| /* MODULE: Counter Service */ |
| /* EXTERNS: Next() */ |
| /* */ |
| /*****************************************************************************/ |
| #include "externs.h" |
| |
| /*****************************************************************************/ |
| /* */ |
| /* OBJECT Next(x, inc, done) */ |
| /* */ |
| /* Return x with its value incremented by inc (if possible). */ |
| /* Set *done to TRUE if successful, leave *done unchanged otherwise. */ |
| /* */ |
| /*****************************************************************************/ |
| |
| OBJECT Next(OBJECT x, int inc, BOOLEAN *done) |
| { OBJECT y, link; int l, r, n, len; |
| FULL_CHAR buff[MAX_BUFF]; |
| debug3(DCS, DD, "Next( %s, %d, %s )", EchoObject(x), inc, bool(*done)); |
| switch( type(x) ) |
| { |
| case WORD: |
| case QWORD: |
| |
| len = StringLength(string(x)); |
| for( r = len - 1; r >= 0 && !decimaldigit(string(x)[r]); r--); |
| if( r < 0 ) break; |
| for( l = r-1; l >= 0 && decimaldigit(string(x)[l]); l-- ); |
| sscanf( (char *) &string(x)[l+1], "%d", &n); |
| string(x)[l+1] = '\0'; |
| StringCopy(buff, string(x)); |
| StringCat(buff, StringInt(n+inc)); |
| StringCat(buff, &string(x)[r+1]); |
| if( StringLength(buff) >= MAX_BUFF ) |
| Error(32, 1, "word %s is too long", FATAL, &fpos(x), buff); |
| y = MakeWord(type(x), buff, &fpos(x)); |
| word_font(y) = word_font(x); |
| word_colour(y) = word_colour(x); |
| word_outline(y) = word_outline(x); |
| word_language(y) = word_language(x); |
| word_hyph(y) = word_hyph(x); |
| underline(y) = underline(x); |
| MergeNode(y, x); x = y; |
| *done = TRUE; |
| break; |
| |
| |
| case INCGRAPHIC: |
| case SINCGRAPHIC: |
| case GAP_OBJ: |
| case CLOSURE: |
| case NULL_CLOS: |
| case PAGE_LABEL: |
| case CROSS: |
| case FORCE_CROSS: |
| case START_HVSPAN: |
| case START_HSPAN: |
| case START_VSPAN: |
| case HSPAN: |
| case VSPAN: |
| case END_HEADER: |
| case CLEAR_HEADER: |
| |
| break; |
| |
| |
| case BEGIN_HEADER: |
| case SET_HEADER: |
| case ONE_COL: |
| case ONE_ROW: |
| case WIDE: |
| case HIGH: |
| case HSHIFT: |
| case VSHIFT: |
| case HCONTRACT: |
| case VCONTRACT: |
| case HLIMITED: |
| case VLIMITED: |
| case HEXPAND: |
| case VEXPAND: |
| case PADJUST: |
| case HADJUST: |
| case VADJUST: |
| case HSCALE: |
| case VSCALE: |
| case HCOVER: |
| case VCOVER: |
| case ROTATE: |
| case BACKGROUND: |
| case SCALE: |
| case KERN_SHRINK: |
| case SPLIT: |
| case PLAIN_GRAPHIC: |
| case GRAPHIC: |
| case LINK_SOURCE: |
| case LINK_DEST: |
| |
| Child(y, LastDown(x)); |
| y = Next(y, inc, done); |
| break; |
| |
| |
| case ACAT: |
| |
| /* *** seems identical! |
| link = LastDown(x); |
| while( link != x && !*done ) |
| { Child(y, link); |
| if( is_index(type(y)) ) continue; |
| y = Next(y, inc, done); |
| if( !*done ) link = PrevDown(link); |
| } |
| break; |
| *** */ |
| |
| |
| case COL_THR: |
| case ROW_THR: |
| case HCAT: |
| case VCAT: |
| |
| link = LastDown(x); |
| while( link != x && !*done ) |
| { Child(y, link); |
| if( is_index(type(y)) ) continue; |
| y = Next(y, inc, done); |
| if( !*done ) link = PrevDown(link); |
| } |
| break; |
| |
| |
| default: |
| |
| assert1(FALSE, "Next:", Image(type(x))); |
| break; |
| |
| } /* end switch */ |
| debug1(DCS, DD, "Next returning %s", EchoObject(x)); |
| return x; |
| } /* end Next */ |