rtcactn.cpp
上传用户:zhang_dd
上传日期:2007-01-02
资源大小:7k
文件大小:13k
源码类别:

RichEdit

开发平台:

Visual C++

  1. /********************************************************************************************/
  2. /*                                     Rtfactn.cpp                                         */
  3. /*                                                                                          */
  4. /*   Author          :  A.Senthil                                                           */
  5. /*   Creation Date   :  14 July 1998                                                        */
  6. /*   Purpose         :  Support For Reading the Rtf File Contents                           */
  7. /********************************************************************************************/    
  8. /*                             Modification  History                                        */
  9. /*   By Whom            When                     For What                                   */
  10. /********************************************************************************************/
  11. #include "afxwin.h"
  12. #include "rtftype.h"
  13. #include "rtfdecl.h"
  14. // RTF parser tables
  15. // Property descriptions
  16. PROP rgprop [ipropMax] = {
  17.     actnByte,   propChp,    offsetof(CHP, fBold),       // ipropBold
  18.     actnByte,   propChp,    offsetof(CHP, fItalic),     // ipropItalic
  19.     actnByte,   propChp,    offsetof(CHP, fUnderline),  // ipropUnderline
  20.     actnWord,   propPap,    offsetof(PAP, xaLeft),      // ipropLeftInd
  21.     actnWord,   propPap,    offsetof(PAP, xaRight),     // ipropRightInd
  22.     actnWord,   propPap,    offsetof(PAP, xaFirst),     // ipropFirstInd
  23.     actnWord,   propSep,    offsetof(SEP, cCols),       // ipropCols
  24.     actnWord,   propSep,    offsetof(SEP, xaPgn),       // ipropPgnX
  25.     actnWord,   propSep,    offsetof(SEP, yaPgn),       // ipropPgnY
  26.     actnWord,   propDop,    offsetof(DOP, xaPage),      // ipropXaPage
  27.     actnWord,   propDop,    offsetof(DOP, yaPage),      // ipropYaPage
  28.     actnWord,   propDop,    offsetof(DOP, xaLeft),      // ipropXaLeft
  29.     actnWord,   propDop,    offsetof(DOP, xaRight),     // ipropXaRight
  30.     actnWord,   propDop,    offsetof(DOP, yaTop),       // ipropYaTop
  31.     actnWord,   propDop,    offsetof(DOP, yaBottom),    // ipropYaBottom
  32.     actnWord,   propDop,    offsetof(DOP, pgnStart),    // ipropPgnStart
  33.     actnByte,   propSep,    offsetof(SEP, sbk),         // ipropSbk
  34.     actnByte,   propSep,    offsetof(SEP, pgnFormat),   // ipropPgnFormat
  35.     actnByte,   propDop,    offsetof(DOP, fFacingp),    // ipropFacingp
  36.     actnByte,   propDop,    offsetof(DOP, fLandscape),  // ipropLandscape
  37.     actnByte,   propPap,    offsetof(PAP, just),        // ipropJust
  38.     actnSpec,   propPap,    0,                          // ipropPard
  39.     actnSpec,   propChp,    0,                          // ipropPlain
  40.     actnSpec,   propSep,    0,                          // ipropSectd
  41. };
  42. // Keyword descriptions
  43. SYM rgsymRtf[] = {
  44. //  keyword     dflt    fPassDflt   kwd         idx
  45.     "b",        1,      fFalse,     kwdProp,    ipropBold,
  46.     "u",        1,      fFalse,     kwdProp,    ipropUnderline,
  47.     "i",        1,      fFalse,     kwdProp,    ipropItalic,
  48.     "li",       0,      fFalse,     kwdProp,    ipropLeftInd,
  49.     "ri",       0,      fFalse,     kwdProp,    ipropRightInd,
  50.     "fi",       0,      fFalse,     kwdProp,    ipropFirstInd,
  51.     "cols",     1,      fFalse,     kwdProp,    ipropCols,
  52.     "sbknone",  sbkNon, fTrue,      kwdProp,    ipropSbk,
  53.     "sbkcol",   sbkCol, fTrue,      kwdProp,    ipropSbk,
  54.     "sbkeven",  sbkEvn, fTrue,      kwdProp,    ipropSbk,
  55.     "sbkodd",   sbkOdd, fTrue,      kwdProp,    ipropSbk,
  56.     "sbkpage",  sbkPg,  fTrue,      kwdProp,    ipropSbk,
  57.     "pgnx",     0,      fFalse,     kwdProp,    ipropPgnX,
  58.     "pgny",     0,      fFalse,     kwdProp,    ipropPgnY,
  59.     "pgndec",   pgDec,  fTrue,      kwdProp,    ipropPgnFormat,
  60.     "pgnucrm",  pgURom, fTrue,      kwdProp,    ipropPgnFormat,
  61.     "pgnlcrm",  pgLRom, fTrue,      kwdProp,    ipropPgnFormat,
  62.     "pgnucltr", pgULtr, fTrue,      kwdProp,    ipropPgnFormat,
  63.     "pgnlcltr", pgLLtr, fTrue,      kwdProp,    ipropPgnFormat,
  64.     "qc",       justC,  fTrue,      kwdProp,    ipropJust,
  65.     "ql",       justL,  fTrue,      kwdProp,    ipropJust,
  66.     "qr",       justR,  fTrue,      kwdProp,    ipropJust,
  67.     "qj",       justF,  fTrue,      kwdProp,    ipropJust,
  68.     "paperw",   12240,  fFalse,     kwdProp,    ipropXaPage,
  69.     "paperh",   15480,  fFalse,     kwdProp,    ipropYaPage,
  70.     "margl",    1800,   fFalse,     kwdProp,    ipropXaLeft,
  71.     "margr",    1800,   fFalse,     kwdProp,    ipropXaRight,
  72.     "margt",    1440,   fFalse,     kwdProp,    ipropYaTop,
  73.     "margb",    1440,   fFalse,     kwdProp,    ipropYaBottom,
  74.     "pgnstart", 1,      fTrue,      kwdProp,    ipropPgnStart,
  75.     "facingp",  1,      fTrue,      kwdProp,    ipropFacingp,
  76.     "landscape",1,      fTrue,      kwdProp,    ipropLandscape,
  77.     "par",      0,      fFalse,     kwdChar,    0x0a,
  78.     "x0a",    0,      fFalse,     kwdChar,    0x0a,
  79.     "x0d",    0,      fFalse,     kwdChar,    0x0a,
  80.     "tab",      0,      fFalse,     kwdChar,    0x09,
  81.     "ldblquote",0,      fFalse,     kwdChar,    '"',
  82.     "rdblquote",0,      fFalse,     kwdChar,    '"',
  83.     "bin",      0,      fFalse,     kwdSpec,    ipfnBin,
  84.     "*",        0,      fFalse,     kwdSpec,    ipfnSkipDest,
  85.     "'",        0,      fFalse,     kwdSpec,    ipfnHex,
  86.     "author",   0,      fFalse,     kwdDest,    idestSkip,
  87.     "buptim",   0,      fFalse,     kwdDest,    idestSkip,
  88.     "colortbl", 0,      fFalse,     kwdDest,    idestSkip,
  89.     "comment",  0,      fFalse,     kwdDest,    idestSkip,
  90.     "creatim",  0,      fFalse,     kwdDest,    idestSkip,
  91.     "doccomm",  0,      fFalse,     kwdDest,    idestSkip,
  92.     "fonttbl",  0,      fFalse,     kwdDest,    idestSkip,
  93.     "footer",   0,      fFalse,     kwdDest,    idestSkip,
  94.     "footerf",  0,      fFalse,     kwdDest,    idestSkip,
  95.     "footerl",  0,      fFalse,     kwdDest,    idestSkip,
  96.     "footerr",  0,      fFalse,     kwdDest,    idestSkip,
  97.     "footnote", 0,      fFalse,     kwdDest,    idestSkip,
  98.     "ftncn",    0,      fFalse,     kwdDest,    idestSkip,
  99.     "ftnsep",   0,      fFalse,     kwdDest,    idestSkip,
  100.     "ftnsepc",  0,      fFalse,     kwdDest,    idestSkip,
  101.     "header",   0,      fFalse,     kwdDest,    idestSkip,
  102.     "headerf",  0,      fFalse,     kwdDest,    idestSkip,
  103.     "headerl",  0,      fFalse,     kwdDest,    idestSkip,
  104.     "headerr",  0,      fFalse,     kwdDest,    idestSkip,
  105.     "info",     0,      fFalse,     kwdDest,    idestSkip,
  106.     "keywords", 0,      fFalse,     kwdDest,    idestSkip,
  107.     "operator", 0,      fFalse,     kwdDest,    idestSkip,
  108.     "pict",     0,      fFalse,     kwdDest,    idestSkip,
  109.     "printim",  0,      fFalse,     kwdDest,    idestSkip,
  110.     "private1", 0,      fFalse,     kwdDest,    idestSkip,
  111.     "revtim",   0,      fFalse,     kwdDest,    idestSkip,
  112.     "rxe",      0,      fFalse,     kwdDest,    idestSkip,
  113.     "stylesheet",   0,      fFalse,     kwdDest,    idestSkip,
  114.     "subject",  0,      fFalse,     kwdDest,    idestSkip,
  115.     "tc",       0,      fFalse,     kwdDest,    idestSkip,
  116.     "title",    0,      fFalse,     kwdDest,    idestSkip,
  117.     "txe",      0,      fFalse,     kwdDest,    idestSkip,
  118.     "xe",       0,      fFalse,     kwdDest,    idestSkip,
  119.     "{",        0,      fFalse,     kwdChar,    '{',
  120.     "}",        0,      fFalse,     kwdChar,    '}',
  121.     "\",       0,      fFalse,     kwdChar,    '\'
  122.     };
  123. int isymMax = sizeof(rgsymRtf) / sizeof(SYM);
  124. // ecApplyPropChange
  125. // Set the property identified by _iprop_ to the value _val_.
  126. /********************************************************************************************/
  127. int ecApplyPropChange(IPROP iprop, int val)
  128. /********************************************************************************************/
  129. {
  130.     char *pb;
  131.     if (rds == rdsSkip)                 // If we're skipping text,
  132.         return ecOK;                    // don't do anything.
  133.     switch (rgprop[iprop].prop)
  134.     {
  135.     case propDop:
  136.         pb = (char *)&dop;
  137.         break;
  138.     case propSep:
  139.         pb = (char *)&sep;
  140.         break;
  141.     case propPap:
  142.         pb = (char *)&pap;
  143.         break;
  144.     case propChp:
  145.         pb = (char *)&chp;
  146.         break;
  147.     default:
  148.         if (rgprop[iprop].actn != actnSpec)
  149.             return ecBadTable;
  150.         break;
  151.     }
  152.     switch (rgprop[iprop].actn)
  153.     {
  154.     case actnByte:
  155.         pb[rgprop[iprop].offset] = (unsigned char) val;
  156.         break;
  157.     case actnWord:
  158.         (*(int *) (pb+rgprop[iprop].offset)) = val;
  159.         break;
  160.     case actnSpec:
  161.         return ecParseSpecialProperty(iprop, val);
  162.         break;
  163.     default:
  164.         return ecBadTable;
  165.     }
  166.     return ecOK;
  167. }
  168. // ecParseSpecialProperty
  169. // Set a property that requires code to evaluate.
  170. /********************************************************************************************/
  171. int ecParseSpecialProperty(IPROP iprop, int val)
  172. /********************************************************************************************/
  173. {
  174.     switch (iprop)
  175.     {
  176.     case ipropPard:
  177.         memset(&pap, 0, sizeof(pap));
  178.         return ecOK;
  179.     case ipropPlain:
  180.         memset(&chp, 0, sizeof(chp));
  181.         return ecOK;
  182.     case ipropSectd:
  183.         memset(&sep, 0, sizeof(sep));
  184.         return ecOK;
  185.     default:
  186.         return ecBadTable;
  187.     }
  188.     return ecBadTable;
  189. }
  190. // ecTranslateKeyword.
  191. // Search rgsymRtf for szKeyword and evaluate it appropriately.
  192. // Inputs:
  193. // szKeyword:   The RTF control to evaluate.
  194. // param:       The parameter of the RTF control.
  195. // fParam:      fTrue if the control had a parameter; (that is, if param is valid)
  196. //              fFalse if it did not.
  197. /********************************************************************************************/
  198. int ecTranslateKeyword(char *szKeyword, int param, bool fParam)
  199. /********************************************************************************************/
  200. {
  201.     int isym;
  202.     // search for szKeyword in rgsymRtf
  203.     for (isym = 0; isym < isymMax; isym++)
  204.         if (strcmp(szKeyword, rgsymRtf[isym].szKeyword) == 0)
  205.             break;
  206.     if (isym == isymMax)            // control word not found
  207.     {
  208.         if (fSkipDestIfUnk)         // if this is a new destination
  209.             rds = rdsSkip;          // skip the destination
  210.                                     // else just discard it
  211.         fSkipDestIfUnk = fFalse;
  212.         return ecOK;
  213.     }
  214.     // found it!  use kwd and idx to determine what to do with it.
  215.     fSkipDestIfUnk = fFalse;
  216.     switch (rgsymRtf[isym].kwd)
  217.     {
  218.     case kwdProp:
  219.         if (rgsymRtf[isym].fPassDflt || !fParam)
  220.             param = rgsymRtf[isym].dflt;
  221.         return ecApplyPropChange((IPROP)rgsymRtf[isym].idx, param);
  222.     case kwdChar:
  223.         return ecParseChar(rgsymRtf[isym].idx);
  224.     case kwdDest:
  225.         return ecChangeDest((IDEST)rgsymRtf[isym].idx);
  226.     case kwdSpec:
  227.         return ecParseSpecialKeyword((IPFN)rgsymRtf[isym].idx);
  228.     default:
  229.         return ecBadTable;
  230.     }
  231.     return ecBadTable;
  232. }
  233. // ecChangeDest
  234. // Change to the destination specified by idest.
  235. // There's usually more to do here than this...
  236. /********************************************************************************************/
  237. int ecChangeDest(IDEST idest)
  238. /********************************************************************************************/
  239. {
  240.     if (rds == rdsSkip)             // if we're skipping text,
  241.         return ecOK;                // don't do anything
  242.     rds = rdsSkip ;
  243. /*switch (idest)
  244.     {
  245.     default:
  246.         rds = rdsSkip;              // when in doubt, skip it...
  247.         break;
  248.     }*/
  249.     return ecOK;
  250. }
  251. //ecEndGroupAction
  252. // The destination specified by rds is coming to a close.
  253. // If there's any cleanup that needs to be done, do it now.
  254. /********************************************************************************************/
  255. int ecEndGroupAction(RDS rds)
  256. /********************************************************************************************/
  257. {
  258.     return ecOK;
  259. }
  260. // ecParseSpecialKeyword
  261. // Evaluate an RTF control that needs special processing.
  262. /********************************************************************************************/
  263. int ecParseSpecialKeyword(IPFN ipfn)
  264. /********************************************************************************************/
  265. {
  266.     if (rds == rdsSkip && ipfn != ipfnBin)  // if we're skipping, and it's not
  267.         return ecOK;                        // the bin keyword, ignore it.
  268.     switch (ipfn)
  269.     {
  270.     case ipfnBin:
  271.         ris = risBin;
  272.         cbBin = lParam;
  273.         break;
  274.     case ipfnSkipDest:
  275.         fSkipDestIfUnk = fTrue;
  276.         break;
  277.     case ipfnHex:
  278. ris = risHex;
  279. break;
  280.     default:
  281.         return ecBadTable;
  282.     }
  283.     return ecOK;
  284. }