Wine-20041201 vendor drop Added: vendor/wine/dlls/richedit/ Added: vendor/wine/dlls/richedit/current/ Added: vendor/wine/dlls/richedit/current/Makefile.in Added: vendor/wine/dlls/richedit/current/ansi_gen.h Added: vendor/wine/dlls/richedit/current/ansi_sym.h Added: vendor/wine/dlls/richedit/current/reader.c Added: vendor/wine/dlls/richedit/current/riched32.h Added: vendor/wine/dlls/richedit/current/riched32.spec Added: vendor/wine/dlls/richedit/current/richedit.c Added: vendor/wine/dlls/richedit/current/rtf.h Added: vendor/wine/dlls/richedit/current/rtf2text.h Added: vendor/wine/dlls/richedit/current/stdcharnames.h Added: vendor/wine/dlls/richedit/current/text-writer.c Added: vendor/wine/dlls/richedit/current/text_map.h _____
Added: vendor/wine/dlls/richedit/current/Makefile.in --- vendor/wine/dlls/richedit/current/Makefile.in 2004-12-31 15:41:00 UTC (rev 12587) +++ vendor/wine/dlls/richedit/current/Makefile.in 2004-12-31 15:42:33 UTC (rev 12588) @@ -0,0 +1,15 @@
+TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = riched32.dll +IMPORTS = user32 kernel32 + +C_SRCS = \ + reader.c \ + text-writer.c \ + richedit.c + +@MAKE_DLL_RULES@ + +### Dependencies: _____
Added: vendor/wine/dlls/richedit/current/ansi_gen.h --- vendor/wine/dlls/richedit/current/ansi_gen.h 2004-12-31 15:41:00 UTC (rev 12587) +++ vendor/wine/dlls/richedit/current/ansi_gen.h 2004-12-31 15:42:33 UTC (rev 12588) @@ -0,0 +1,211 @@
+/* + RTF ANSI character set (\ansi) general map + These are taken from the ISO-Latin-1 (ISO-8859-1) encodings, with + a few additions + + Field 1 is the standard character name which the character value in + field 2 maps onto. (It doesn't mean "to produce the character in field 1, + use the value in field 2.) + + The character value may be given either as a single character (which will be + converted to the ASCII value of the character), or in numeric format, either + in decimal or 0xyy as hex yy. Single or double quotes may be used to quote + characters.*/ + +int ansi_gen[] = +{ + rtfSC_formula ,0x06, + rtfSC_nobrkhyphen ,0x1e, + rtfSC_opthyphen ,0x1f, + rtfSC_space ,' ', + rtfSC_exclam ,'!', + rtfSC_quotedbl ,'"', + rtfSC_numbersign ,'#', + rtfSC_dollar ,'$', + rtfSC_percent ,'%', + rtfSC_ampersand ,'&', + rtfSC_quoteright ,'\', + rtfSC_parenleft ,'(', + rtfSC_parenright ,')', + rtfSC_asterisk ,'*', + rtfSC_plus ,'+', + rtfSC_comma ,',', + rtfSC_hyphen ,'-', + rtfSC_period ,'.', + rtfSC_slash ,'/', + rtfSC_zero ,'0', + rtfSC_one ,'1', + rtfSC_two ,'2', + rtfSC_three ,'3', + rtfSC_four ,'4', + rtfSC_five ,'5', + rtfSC_six ,'6', + rtfSC_seven ,'7', + rtfSC_eight ,'8', + rtfSC_nine ,'9', + rtfSC_colon ,':', + rtfSC_semicolon ,';', + rtfSC_less ,'<', + rtfSC_equal ,'=', + rtfSC_greater ,'>', + rtfSC_question ,'?', + rtfSC_at ,'@', + rtfSC_A ,'A', + rtfSC_B ,'B', + rtfSC_C ,'C', + rtfSC_D ,'D', + rtfSC_E ,'E', + rtfSC_F ,'F', + rtfSC_G ,'G', + rtfSC_H ,'H', + rtfSC_I ,'I', + rtfSC_J ,'J', + rtfSC_K ,'K', + rtfSC_L ,'L', + rtfSC_M ,'M', + rtfSC_N ,'N', + rtfSC_O ,'O', + rtfSC_P ,'P', + rtfSC_Q ,'Q', + rtfSC_R ,'R', + rtfSC_S ,'S', + rtfSC_T ,'T', + rtfSC_U ,'U', + rtfSC_V ,'V', + rtfSC_W ,'W', + rtfSC_X ,'X', + rtfSC_Y ,'Y', + rtfSC_Z ,'Z', + rtfSC_bracketleft ,'[', + rtfSC_backslash ,'\', + rtfSC_bracketright ,']', + rtfSC_asciicircum ,'^', + rtfSC_underscore ,'_', + rtfSC_quoteleft ,'`', + rtfSC_a ,'a', + rtfSC_b ,'b', + rtfSC_c ,'c', + rtfSC_d ,'d', + rtfSC_e ,'e', + rtfSC_f ,'f', + rtfSC_g ,'g', + rtfSC_h ,'h', + rtfSC_i ,'i', + rtfSC_j ,'j', + rtfSC_k ,'k', + rtfSC_l ,'l', + rtfSC_m ,'m', + rtfSC_n ,'n', + rtfSC_o ,'o', + rtfSC_p ,'p', + rtfSC_q ,'q', + rtfSC_r ,'r', + rtfSC_s ,'s', + rtfSC_t ,'t', + rtfSC_u ,'u', + rtfSC_v ,'v', + rtfSC_w ,'w', + rtfSC_x ,'x', + rtfSC_y ,'y', + rtfSC_z ,'z', + rtfSC_braceleft ,'{', + rtfSC_bar ,'|', + rtfSC_braceright ,'}', + rtfSC_asciitilde ,'~', + rtfSC_nobrkspace ,0xa0, + rtfSC_exclamdown ,0xa1, + rtfSC_cent ,0xa2, + rtfSC_sterling ,0xa3, + rtfSC_currency ,0xa4, + rtfSC_yen ,0xa5, + rtfSC_brokenbar ,0xa6, + rtfSC_section ,0xa7, + rtfSC_dieresis ,0xa8, + rtfSC_copyright ,0xa9, + rtfSC_ordfeminine ,0xaa, + rtfSC_guillemotleft ,0xab, + rtfSC_logicalnot ,0xac, + rtfSC_opthyphen ,0xad, + rtfSC_registered ,0xae, + rtfSC_macron ,0xaf, + rtfSC_degree ,0xb0, + rtfSC_plusminus ,0xb1, + rtfSC_twosuperior ,0xb2, + rtfSC_threesuperior ,0xb3, + rtfSC_acute ,0xb4, + rtfSC_mu ,0xb5, + rtfSC_paragraph ,0xb6, + rtfSC_periodcentered ,0xb7, + rtfSC_cedilla ,0xb8, + rtfSC_onesuperior ,0xb9, + rtfSC_ordmasculine ,0xba, + rtfSC_guillemotright ,0xbb, + rtfSC_onequarter ,0xbc, + rtfSC_onehalf ,0xbd, + rtfSC_threequarters ,0xbe, + rtfSC_questiondown ,0xbf, + rtfSC_Agrave ,0xc0, + rtfSC_Aacute ,0xc1, + rtfSC_Acircumflex ,0xc2, + rtfSC_Atilde ,0xc3, + rtfSC_Adieresis ,0xc4, + rtfSC_Aring ,0xc5, + rtfSC_AE ,0xc6, + rtfSC_Ccedilla ,0xc7, + rtfSC_Egrave ,0xc8, + rtfSC_Eacute ,0xc9, + rtfSC_Ecircumflex ,0xca, + rtfSC_Edieresis ,0xcb, + rtfSC_Igrave ,0xcc, + rtfSC_Iacute ,0xcd, + rtfSC_Icircumflex ,0xce, + rtfSC_Idieresis ,0xcf, + rtfSC_Eth ,0xd0, + rtfSC_Ntilde ,0xd1, + rtfSC_Ograve ,0xd2, + rtfSC_Oacute ,0xd3, + rtfSC_Ocircumflex ,0xd4, + rtfSC_Otilde ,0xd5, + rtfSC_Odieresis ,0xd6, + rtfSC_multiply ,0xd7, + rtfSC_Oslash ,0xd8, + rtfSC_Ugrave ,0xd9, + rtfSC_Uacute ,0xda, + rtfSC_Ucircumflex ,0xdb, + rtfSC_Udieresis ,0xdc, + rtfSC_Yacute ,0xdd, + rtfSC_Thorn ,0xde, + rtfSC_germandbls ,0xdf, + rtfSC_agrave ,0xe0, + rtfSC_aacute ,0xe1, + rtfSC_acircumflex ,0xe2, + rtfSC_atilde ,0xe3, + rtfSC_adieresis ,0xe4, + rtfSC_aring ,0xe5, + rtfSC_ae ,0xe6, + rtfSC_ccedilla ,0xe7, + rtfSC_egrave ,0xe8, + rtfSC_eacute ,0xe9, + rtfSC_ecircumflex ,0xea, + rtfSC_edieresis ,0xeb, + rtfSC_igrave ,0xec, + rtfSC_iacute ,0xed, + rtfSC_icircumflex ,0xee, + rtfSC_idieresis ,0xef, + rtfSC_eth ,0xf0, + rtfSC_ntilde ,0xf1, + rtfSC_ograve ,0xf2, + rtfSC_oacute ,0xf3, + rtfSC_ocircumflex ,0xf4, + rtfSC_otilde ,0xf5, + rtfSC_odieresis ,0xf6, + rtfSC_divide ,0xf7, + rtfSC_oslash ,0xf8, + rtfSC_ugrave ,0xf9, + rtfSC_uacute ,0xfa, + rtfSC_ucircumflex ,0xfb, + rtfSC_udieresis ,0xfc, + rtfSC_yacute ,0xfd, + rtfSC_thorn ,0xfe, + rtfSC_ydieresis ,0xff +}; _____
Added: vendor/wine/dlls/richedit/current/ansi_sym.h --- vendor/wine/dlls/richedit/current/ansi_sym.h 2004-12-31 15:41:00 UTC (rev 12587) +++ vendor/wine/dlls/richedit/current/ansi_sym.h 2004-12-31 15:42:33 UTC (rev 12588) @@ -0,0 +1,112 @@
+/* + * RTF ANSI character set (\ansi) Symbol font map + * + * Field 1 is the standard character name which the character value in + * field 2 maps onto. (It doesn't mean "to produce the character in field 1, + * use the value in field 2.) + * + * The character value may be given either as a single character (which will be + * converted to the ASCII value of the character), or in numeric format, either + * in decimal or 0xyy as hex yy. Single or double quotes may be used to quote + * characters. + * + */ + +int ansi_sym[] = +{ + rtfSC_formula ,0x06, + rtfSC_nobrkhyphen ,0x1e, + rtfSC_opthyphen ,0x1f, + rtfSC_space ,' ', + rtfSC_exclam ,'!', + rtfSC_universal ,'"', + rtfSC_mathnumbersign ,'#', + rtfSC_existential ,'$', + rtfSC_percent ,'%', + rtfSC_ampersand ,'&', + rtfSC_suchthat ,'\', + rtfSC_parenleft ,'(', + rtfSC_parenright ,')', + rtfSC_mathasterisk ,'*', + rtfSC_mathplus ,'+', + rtfSC_comma ,',', + rtfSC_mathminus ,'-', + rtfSC_period ,'.', + rtfSC_slash ,'/', + rtfSC_zero ,'0', + rtfSC_one ,'1', + rtfSC_two ,'2', + rtfSC_three ,'3', + rtfSC_four ,'4', + rtfSC_five ,'5', + rtfSC_six ,'6', + rtfSC_seven ,'7', + rtfSC_eight ,'8', + rtfSC_nine ,'9', + rtfSC_colon ,':', + rtfSC_semicolon ,';', + rtfSC_less ,'<', + rtfSC_mathequal ,'=', + rtfSC_greater ,'>', + rtfSC_question ,'?', + rtfSC_congruent ,'@', + rtfSC_Alpha ,'A', + rtfSC_Beta ,'B', + rtfSC_Chi ,'C', + rtfSC_Delta ,'D', + rtfSC_Epsilon ,'E', + rtfSC_Phi ,'F', + rtfSC_Gamma ,'G', + rtfSC_Eta ,'H', + rtfSC_Iota ,'I', + rtfSC_Kappa ,'K', + rtfSC_Lambda ,'L', + rtfSC_Mu ,'M', + rtfSC_Nu ,'N', + rtfSC_Omicron ,'O', + rtfSC_Pi ,'P', + rtfSC_Theta ,'Q', + rtfSC_Rho ,'R', + rtfSC_Sigma ,'S', + rtfSC_Tau ,'T', + rtfSC_Upsilon ,'U', + rtfSC_varsigma ,'V', + rtfSC_Omega ,'W', + rtfSC_Xi ,'X', + rtfSC_Psi ,'Y', + rtfSC_Zeta ,'Z', + rtfSC_bracketleft ,'[', + rtfSC_backslash ,'\', + rtfSC_bracketright ,']', + rtfSC_asciicircum ,'^', + rtfSC_underscore ,'_', + rtfSC_quoteleft ,'`', + rtfSC_alpha ,'a', + rtfSC_beta ,'b', + rtfSC_chi ,'c', + rtfSC_delta ,'d', + rtfSC_epsilon ,'e', + rtfSC_phi ,'f', + rtfSC_gamma ,'g', + rtfSC_eta ,'h', + rtfSC_iota ,'i', + rtfSC_kappa ,'k', + rtfSC_lambda ,'l', + rtfSC_mu ,'m', + rtfSC_nu ,'n', + rtfSC_omicron ,'o', + rtfSC_pi ,'p', + rtfSC_theta ,'q', + rtfSC_rho ,'r', + rtfSC_sigma ,'s', + rtfSC_tau ,'t', + rtfSC_upsilon ,'u', + rtfSC_omega ,'w', + rtfSC_xi ,'x', + rtfSC_psi ,'y', + rtfSC_zeta ,'z', + rtfSC_braceleft ,'{', + rtfSC_bar ,'|', + rtfSC_braceright ,'}', + rtfSC_mathtilde ,'~' +}; _____
Added: vendor/wine/dlls/richedit/current/reader.c --- vendor/wine/dlls/richedit/current/reader.c 2004-12-31 15:41:00 UTC (rev 12587) +++ vendor/wine/dlls/richedit/current/reader.c 2004-12-31 15:42:33 UTC (rev 12588) @@ -0,0 +1,2726 @@
+/* + * WINE RTF file reader + * + * Portions Copyright 2004 Mike McCormack for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * - Need to document error code meanings. + * - Need to do something with * on destinations. + * - Make the parameter a long? + * + * reader.c - RTF file reader. Release 1.10. + * + * ASCII 10 (\n) and 13 (\r) are ignored and silently discarded. + * Nulls are also discarded. + * (although the read hook will still get a look at them.) + * + * ":" is not a ":", it's a control symbol. But some versions of + * Word seem to write ":" for ":". This reader treats ":" as a + * plain text ":" + * + * 19 Mar 93 + * - Add hack to skip "{*\keycode ... }" group in stylesheet. + * This is probably the wrong thing to do, but it's simple. + * 13 Jul 93 + * - Add THINK C awareness to malloc() declaration. Necessary so + * compiler knows the malloc argument is 4 bytes. Ugh. + * 07 Sep 93 + * - Text characters are mapped onto standard codes, which are placed + * in rtfMinor. + * - Eliminated use of index() function. + * 05 Mar 94 + * - Added zillions of new symbols (those defined in RTF spec 1.2). + * 14 Mar 94 + * - Public functions RTFMsg() and RTFPanic() now take variable arguments. + * This means RTFPanic() now is used in place of what was formerly the + * internal function Error(). + * - 8-bit characters are now legal, so they're not converted to 'xx + * hex char representation now. + * 01 Apr 94 + * - Added public variables rtfLineNum and rtfLinePos. + * - #include string.h or strings.h, avoiding strncmp() problem where + * last argument is treated as zero when prototype isn't available. + * 04 Apr 94 + * - Treat style numbers 222 and 0 properly as "no style" and "normal". + * + * Author: Paul DuBois dubois@primate.wisc.edu + * + * This software may be redistributed without restriction and used for + * any purpose whatsoever. + */ + +# include <stdio.h> +# include <ctype.h> +# include <string.h> +# include <stdarg.h> + +#include "rtf.h" +/* + * include hard coded charsets + */ + +#include "ansi_gen.h" +#include "ansi_sym.h" +#include "text_map.h" + +#include <stdlib.h> + +#include "windef.h" +#include "winbase.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(richedit); + +extern HANDLE RICHED32_hHeap; + +static int _RTFGetChar(RTF_Info *); +static void _RTFGetToken (RTF_Info *); +static void _RTFGetToken2 (RTF_Info *); +static int GetChar (RTF_Info *); +static void ReadFontTbl (RTF_Info *); +static void ReadColorTbl (RTF_Info *); +static void ReadStyleSheet (RTF_Info *); +static void ReadInfoGroup (RTF_Info *); +static void ReadPictGroup (RTF_Info *); +static void ReadObjGroup (RTF_Info *); +static void LookupInit (); +static void Lookup (RTF_Info *, char *); +static int Hash (); + +static void CharSetInit (RTF_Info *); +static void ReadCharSetMaps (RTF_Info *); + + +/* + * This array is used to map standard character names onto their numeric codes. + * The position of the name within the array is the code. + * stdcharnames.h is generated in the ../h directory. + */ + +#include "stdcharnames.h" + +int _RTFGetChar(RTF_Info *info) +{ + int ch; + + TRACE("\n"); + + if( info->dwInputSize <= info->dwInputUsed ) + { + long count = 0; + info->editstream.pfnCallback(info->editstream.dwCookie, + info->InputBuffer, sizeof(info->InputBuffer), &count); + if(count == 0) + return EOF; + info->dwInputSize = count; + info->dwInputUsed = 0; + } + ch = info->InputBuffer[info->dwInputUsed++]; + if( !ch ) return EOF; + return ch; +} + +void RTFSetEditStream(RTF_Info *info, EDITSTREAM *es) +{ + TRACE("\n"); + + info->editstream.dwCookie = es->dwCookie; + info->editstream.dwError = es->dwError; + info->editstream.pfnCallback = es->pfnCallback; +} + +/* + * Initialize the reader. This may be called multiple times, + * to read multiple files. The only thing not reset is the input + * stream; that must be done with RTFSetStream(). + */ + +void RTFInit(RTF_Info *info) +{ +int i; +RTFColor *cp; +RTFFont *fp; +RTFStyle *sp; +RTFStyleElt *eltList, *ep; + + TRACE("\n"); + + if (info->rtfTextBuf == (char *) NULL) /* initialize the text buffers */ + { + info->rtfTextBuf = RTFAlloc (rtfBufSiz); + info->pushedTextBuf = RTFAlloc (rtfBufSiz); + if (info->rtfTextBuf == (char *) NULL + || info->pushedTextBuf == (char *) NULL) + RTFPanic (info,"Cannot allocate text buffers."); + info->rtfTextBuf[0] = info->pushedTextBuf[0] = '\0'; + } + + RTFFree (info->inputName); + RTFFree (info->outputName); + info->inputName = info->outputName = (char *) NULL; + + /* initialize lookup table */ + LookupInit (); + + for (i = 0; i < rtfMaxClass; i++) + RTFSetClassCallback (info, i, (RTFFuncPtr) NULL); + for (i = 0; i < rtfMaxDestination; i++) + RTFSetDestinationCallback (info, i, (RTFFuncPtr) NULL); + + /* install built-in destination readers */ + RTFSetDestinationCallback (info, rtfFontTbl, ReadFontTbl); + RTFSetDestinationCallback (info, rtfColorTbl, ReadColorTbl); + RTFSetDestinationCallback (info, rtfStyleSheet, ReadStyleSheet); + RTFSetDestinationCallback (info, rtfInfo, ReadInfoGroup); + RTFSetDestinationCallback (info, rtfPict, ReadPictGroup); + RTFSetDestinationCallback (info, rtfObject, ReadObjGroup); + + + RTFSetReadHook (info, (RTFFuncPtr) NULL); + + /* dump old lists if necessary */ + + while (info->fontList != (RTFFont *) NULL) + { + fp = info->fontList->rtfNextFont; + RTFFree (info->fontList->rtfFName); + RTFFree ((char *) info->fontList); + info->fontList = fp; + } + while (info->colorList != (RTFColor *) NULL) + { + cp = info->colorList->rtfNextColor; + RTFFree ((char *) info->colorList); + info->colorList = cp; + } + while (info->styleList != (RTFStyle *) NULL) + { + sp = info->styleList->rtfNextStyle; + eltList = info->styleList->rtfSSEList; + while (eltList != (RTFStyleElt *) NULL) + { + ep = eltList->rtfNextSE; + RTFFree (eltList->rtfSEText); + RTFFree ((char *) eltList); + eltList = ep; + } + RTFFree (info->styleList->rtfSName); + RTFFree ((char *) info->styleList); + info->styleList = sp; + } + + info->rtfClass = -1; + info->pushedClass = -1; + info->pushedChar = EOF; + + info->rtfLineNum = 0; + info->rtfLinePos = 0; + info->prevChar = EOF; + info->bumpLine = 0; + + CharSetInit (info); + info->csTop = 0; +} + +/* + * Set or get the input or output file name. These are never guaranteed + * to be accurate, only insofar as the calling program makes them so. + */ + +void RTFSetInputName(RTF_Info *info, char *name) +{ + TRACE("\n"); + + if ((info->inputName = RTFStrSave (name)) == (char *) NULL) + RTFPanic (info,"RTFSetInputName: out of memory"); +} + + +char *RTFGetInputName(RTF_Info *info) +{ + return (info->inputName); +} + + +void RTFSetOutputName(RTF_Info *info, char *name) +{ + TRACE("\n"); + + if ((info->outputName = RTFStrSave (name)) == (char *) NULL) + RTFPanic (info, "RTFSetOutputName: out of memory"); +} + + +char *RTFGetOutputName(RTF_Info *info) +{ + return (info->outputName); +} + + + +/* ---------------------------------------------------------------------- */ + +/* + * Callback table manipulation routines + */ + + +/* + * Install or return a writer callback for a token class + */ + +void RTFSetClassCallback(RTF_Info *info, int class, RTFFuncPtr callback) +{ + if (class >= 0 && class < rtfMaxClass) + info->ccb[class] = callback; +} + + +RTFFuncPtr RTFGetClassCallback(RTF_Info *info, int class) +{ + if (class >= 0 && class < rtfMaxClass) + return (info->ccb[class]); + return ((RTFFuncPtr) NULL); +} + + +/* + * Install or return a writer callback for a destination type + */ + +void RTFSetDestinationCallback(RTF_Info *info, int dest, RTFFuncPtr callback) +{ + if (dest >= 0 && dest < rtfMaxDestination) + info->dcb[dest] = callback; +} + + +RTFFuncPtr RTFGetDestinationCallback(RTF_Info *info, int dest) +{ + if (dest >= 0 && dest < rtfMaxDestination) + return (info->dcb[dest]); + return ((RTFFuncPtr) NULL); +} + + +/* ---------------------------------------------------------------------- */ + +/* + * Token reading routines + */ + + +/* + * Read the input stream, invoking the writer's callbacks + * where appropriate. + */ + +void RTFRead(RTF_Info *info) +{ + while (RTFGetToken (info) != rtfEOF) + RTFRouteToken (info); +} + + +/* + * Route a token. If it's a destination for which a reader is + * installed, process the destination internally, otherwise + * pass the token to the writer's class callback. + */ + +void RTFRouteToken(RTF_Info *info) +{ +RTFFuncPtr p; + + TRACE("\n"); + + if (info->rtfClass < 0 || info->rtfClass >= rtfMaxClass) /* watchdog */ + { + RTFPanic (info,"Unknown class %d: %s (reader malfunction)", + info->rtfClass, info->rtfTextBuf); + } + if (RTFCheckCM (info, rtfControl, rtfDestination)) + { + /* invoke destination-specific callback if there is one */ + if ((p = RTFGetDestinationCallback (info, info->rtfMinor)) + != (RTFFuncPtr) NULL) + { + (*p) (info); + return; + } + } + /* invoke class callback if there is one */ + if ((p = RTFGetClassCallback (info, info->rtfClass)) != (RTFFuncPtr) NULL) + (*p) (info); +} + + +/* + * Skip to the end of the current group. When this returns, + * writers that maintain a state stack may want to call their + * state unstacker; global vars will still be set to the group's + * closing brace. + */ + +void RTFSkipGroup(RTF_Info *info) +{ +int level = 1; + TRACE("\n"); + + while (RTFGetToken (info) != rtfEOF) + { + if (info->rtfClass == rtfGroup) + { + if (info->rtfMajor == rtfBeginGroup) + ++level; + else if (info->rtfMajor == rtfEndGroup) + { + if (--level < 1) + break; /* end of initial group */ + } + } + } +} + + +/* + * Read one token. Call the read hook if there is one. The + * token class is the return value. Returns rtfEOF when there + * are no more tokens. + */ + +int RTFGetToken(RTF_Info *info) +{ +RTFFuncPtr p; + TRACE("\n"); + + for (;;) + { + _RTFGetToken (info); + if ((p = RTFGetReadHook (info)) != (RTFFuncPtr) NULL) + (*p) (info); /* give read hook a look at token */ + + /* Silently discard newlines, carriage returns, nulls. */ + if (!(info->rtfClass == rtfText && info->rtfFormat != SF_TEXT + && (info->rtfMajor == '\r' || info->rtfMajor == '\n' || info->rtfMajor == '\0'))) + break; + } + return (info->rtfClass); +} + + +/* + * Install or return a token reader hook. + */ + +void RTFSetReadHook(RTF_Info *info, RTFFuncPtr f) +{ + info->readHook = f; +} + + +RTFFuncPtr RTFGetReadHook(RTF_Info *info) +{ + return (info->readHook); +} + + +void RTFUngetToken(RTF_Info *info) +{ + TRACE("\n"); + + if (info->pushedClass >= 0) /* there's already an ungotten token */ + RTFPanic (info,"cannot unget two tokens"); + if (info->rtfClass < 0) + RTFPanic (info,"no token to unget"); + info->pushedClass = info->rtfClass; + info->pushedMajor = info->rtfMajor; + info->pushedMinor = info->rtfMinor; + info->pushedParam = info->rtfParam; + (void) strcpy (info->pushedTextBuf, info->rtfTextBuf); +} + + +int RTFPeekToken(RTF_Info *info) +{ + _RTFGetToken (info); + RTFUngetToken (info); + return (info->rtfClass); +} + + +static void _RTFGetToken(RTF_Info *info) +{ +RTFFont *fp; + + TRACE("\n"); + + if (info->rtfFormat == SF_TEXT) { + info->rtfMajor = GetChar (info); + info->rtfMinor = rtfSC_nothing; + info->rtfParam = rtfNoParam; + info->rtfTextBuf[info->rtfTextLen = 0] = '\0'; + if (info->rtfMajor == EOF) + info->rtfClass = rtfEOF; + else + info->rtfClass = rtfText; + return; + } + + /* first check for pushed token from RTFUngetToken() */ + + if (info->pushedClass >= 0) + { + info->rtfClass = info->pushedClass; + info->rtfMajor = info->pushedMajor; + info->rtfMinor = info->pushedMinor; + info->rtfParam = info->pushedParam; + (void) strcpy (info->rtfTextBuf, info->pushedTextBuf); + info->rtfTextLen = strlen (info->rtfTextBuf); + info->pushedClass = -1; + return; + } + + /* + * Beyond this point, no token is ever seen twice, which is + * important, e.g., for making sure no "}" pops the font stack twice. + */ + + _RTFGetToken2 (info); + if (info->rtfClass == rtfText) /* map RTF char to standard code */ + info->rtfMinor = RTFMapChar (info, info->rtfMajor); + + /* + * If auto-charset stuff is activated, see if anything needs doing, + * like reading the charset maps or switching between them. + */ + + if (info->autoCharSetFlags == 0) + return; + + if ((info->autoCharSetFlags & rtfReadCharSet) + && RTFCheckCM (info, rtfControl, rtfCharSet)) + { + ReadCharSetMaps (info); + } + else if ((info->autoCharSetFlags & rtfSwitchCharSet) + && RTFCheckCMM (info, rtfControl, rtfCharAttr, rtfFontNum)) + { + if ((fp = RTFGetFont (info, info->rtfParam)) != (RTFFont *) NULL) + { + if (strncmp (fp->rtfFName, "Symbol", 6) == 0) + info->curCharSet = rtfCSSymbol; + else + info->curCharSet = rtfCSGeneral; + RTFSetCharSet (info, info->curCharSet); + } + } + else if ((info->autoCharSetFlags & rtfSwitchCharSet) && info->rtfClass == rtfGroup) + { + switch (info->rtfMajor) + { + case rtfBeginGroup: + if (info->csTop >= maxCSStack) + RTFPanic (info, "_RTFGetToken: stack overflow"); + info->csStack[info->csTop++] = info->curCharSet; + break; + case rtfEndGroup: + /* + * If stack top is 1 at this point, we are ending the + * group started by the initial {, which ends the + * RTF stream + */ + if (info->csTop <= 0) + RTFPanic (info,"_RTFGetToken: stack underflow"); + else if (info->csTop == 1) + info->rtfClass = rtfEOF; + else + { + info->curCharSet = info->csStack[--info->csTop]; + RTFSetCharSet (info, info->curCharSet); + } + break; + } + } +} + + +/* this shouldn't be called anywhere but from _RTFGetToken() */ + +static void _RTFGetToken2(RTF_Info *info) +{ +int sign; +int c; + + TRACE("\n"); + + /* initialize token vars */ + + info->rtfClass = rtfUnknown; + info->rtfParam = rtfNoParam; + info->rtfTextBuf[info->rtfTextLen = 0] = '\0'; + + /* get first character, which may be a pushback from previous token */ + + if (info->pushedChar != EOF) + { + c = info->pushedChar; + info->rtfTextBuf[info->rtfTextLen++] = c; + info->rtfTextBuf[info->rtfTextLen] = '\0'; + info->pushedChar = EOF; + } + else if ((c = GetChar (info)) == EOF) + { + info->rtfClass = rtfEOF; + return; + } + + if (c == '{') + { + info->rtfClass = rtfGroup; + info->rtfMajor = rtfBeginGroup; + return; + } + if (c == '}') + { + info->rtfClass = rtfGroup; + info->rtfMajor = rtfEndGroup; + return; + } + if (c != '\') + { + /* + * Two possibilities here: + * 1) ASCII 9, effectively like \tab control symbol + * 2) literal text char + */ + if (c == '\t') /* ASCII 9 */ + { + info->rtfClass = rtfControl; + info->rtfMajor = rtfSpecialChar; + info->rtfMinor = rtfTab; + } + else + { + info->rtfClass = rtfText; + info->rtfMajor = c; + } + return; + } + if ((c = GetChar (info)) == EOF) + { + /* early eof, whoops (class is rtfUnknown) */ + return; + } + if (!isalpha (c)) + { + /* + * Three possibilities here: + * 1) hex encoded text char, e.g., 'd5, 'd3 + * 2) special escaped text char, e.g., {, } + * 3) control symbol, e.g., _, -, |, <10> + */ + if (c == ''') /* hex char */ + { + int c2; + + if ((c = GetChar (info)) != EOF && (c2 = GetChar (info)) != EOF) [truncated at 1000 lines; 5385 more skipped]