From 474de82693ec571097f355703557f48453f76392 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Wed, 31 Mar 2004 04:04:16 +0000 Subject: Unix porting Unix porting --- .cvsignore | 22 +++++--- AUTHORS | 1 + BUGS | 3 ++ COPYING | 14 ++++++ ChangeLog | 3 ++ INSTALL | 8 +++ Makefile.am | 3 ++ NEWS | 1 + README | 3 ++ config.h.in | 126 ++++++++++++++++++++++++++++++++++++++++++++++ configure.in | 43 ++++++++++++++++ src/basehandler.cpp | 1 - src/rtfparser.cpp | 12 +++-- src/rtfx.cpp | 3 +- src/sablo.h | 2 +- src/sablotr.cpp | 12 ++--- src/usuals.h | 2 +- src/xmlcomposehelpers.cpp | 1 - src/xmlcomposehelpers.h | 2 +- src/xmlcomposer.cpp | 58 +++++++++++---------- src/xmlcomposer.h | 2 +- 21 files changed, 272 insertions(+), 50 deletions(-) create mode 100644 AUTHORS create mode 100644 BUGS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README create mode 100644 config.h.in create mode 100644 configure.in diff --git a/.cvsignore b/.cvsignore index 83eb1f2..8812efc 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1,6 +1,16 @@ -*.plg -*.opt -*.ncb -Debug -Release -test-files \ No newline at end of file +test-files +config.h +autom4te.cache +Makefile +Makefile.in +aclocal.m4 +config.h +config.log +config.status +configure +depcomp +install-sh +missing +mkinstalldirs +stamp-* +*~ diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..d2e76d6 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +nielsen@memberwebs.com diff --git a/BUGS b/BUGS new file mode 100644 index 0000000..64014bd --- /dev/null +++ b/BUGS @@ -0,0 +1,3 @@ +RTFM TODOS AND BUGS +- No font support +- Doesn't handle crummy RTF files nicely. diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..cf2037b --- /dev/null +++ b/COPYING @@ -0,0 +1,14 @@ +LICENSE +This software is in the public domain. + +The software is provided "as is", without warranty of any kind, +express or implied, including but not limited to the warranties +of merchantability, fitness for a particular purpose, and +noninfringement. In no event shall the author(s) be liable for any +claim, damages, or other liability, whether in an action of +contract, tort, or otherwise, arising from, out of, or in connection +with the software or the use or other dealings in the software. + +SUPPORT +Send bug reports to: + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..40246ca --- /dev/null +++ b/ChangeLog @@ -0,0 +1,3 @@ +Version 1.0 + - Initial working release + diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..e245cd6 --- /dev/null +++ b/INSTALL @@ -0,0 +1,8 @@ +====================================================================== + RTFM 1.0 INSTALL + +QUICK INSTALLATION: + # tar -zxvf rtfm-1.0.tar.gz + # ./configure + # make && make install + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..5e729c5 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,3 @@ +EXTRA_DIST = BUGS config.win32.h +SUBDIRS = src win32 + diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..c7ab92a --- /dev/null +++ b/NEWS @@ -0,0 +1 @@ +See ChangeLog \ No newline at end of file diff --git a/README b/README new file mode 100644 index 0000000..e5f9d0d --- /dev/null +++ b/README @@ -0,0 +1,3 @@ +================================================================= + RTFM 1.0 README + diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..0c4c8b5 --- /dev/null +++ b/config.h.in @@ -0,0 +1,126 @@ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ASSERT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ERRNO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_EXCEPTION + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `sablot' library (-lsablot). */ +#undef HAVE_LIBSABLOT + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the header file. */ +#undef HAVE_SABLOT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SDOM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STACK + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strchr' function. */ +#undef HAVE_STRCHR + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `swprintf' function. */ +#undef HAVE_SWPRINTF + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_WCHAR_H + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `unsigned' if does not define. */ +#undef size_t diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..f033a0c --- /dev/null +++ b/configure.in @@ -0,0 +1,43 @@ +# Process this file with autoconf to produce a configure script. +AC_INIT(rtfm, 1.0, nielsen@memberwebs.com) +AM_INIT_AUTOMAKE(rtfm, 1.0) + +LDFLAGS="$LDFLAGS -L/usr/local/lib" + +AC_LANG_CPLUSPLUS + +AC_CONFIG_SRCDIR([src/rtfm.cpp]) +AM_CONFIG_HEADER([config.h]) + +# Checks for programs. +AC_PROG_CC +AC_PROG_CXX +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET + +# Check for libraries +AC_CHECK_LIB(sablot, SDOM_createElement, , + [echo "ERROR: Must install sablotron libraries."; exit 1]) + +# Checks for header files. +AC_FUNC_ALLOCA +AC_HEADER_STDC +AC_CHECK_HEADERS([stddef.h stdlib.h wchar.h assert.h stdio.h errno.h], , + [echo "ERROR: Required C header missing"; exit 1]) +AC_CHECK_HEADERS([string exception stack], , + [echo "ERROR: Required STL header missing"; exit 1]) +AC_CHECK_HEADERS([sablot.h sdom.h], , + [echo "ERROR: Required Sablotron header missing"; exit 1]) + + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_SIZE_T + +# Required Functions +AC_CHECK_FUNCS([memset strchr strerror swprintf], , + [echo "ERROR: Required function missing"; exit 1]) + +AC_CONFIG_FILES([Makefile src/Makefile win32/Makefile]) +AC_OUTPUT diff --git a/src/basehandler.cpp b/src/basehandler.cpp index d561cef..8be9c25 100644 --- a/src/basehandler.cpp +++ b/src/basehandler.cpp @@ -49,4 +49,3 @@ void BaseHandler::charData(wstring data) { } - diff --git a/src/rtfparser.cpp b/src/rtfparser.cpp index 336847f..589ef71 100644 --- a/src/rtfparser.cpp +++ b/src/rtfparser.cpp @@ -60,7 +60,10 @@ void RtfReader::sendData(RtfContext& cx, wstring data) { if(m_uniEat > 0) { - int len = __min(data.size(), m_uniEat); + int len = data.size(); + if(len > m_uniEat) + len = m_uniEat; + cx.data.append(data.substr(len)); m_uniEat -= len; } @@ -134,11 +137,11 @@ bool RtfReader::parseControlWord(RtfContext& cx) // NOTE: Although the RTF specification prohibits upercase // control words, MS Word uses them :-/ if(ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') - controlword.append(1, ch); + controlword.append(1, (char)ch); // Part of the parameter of a control word else if(ch >= '0' && ch <= '9') - param.append(1, ch); + param.append(1, (char)ch); // Now handle escapes and other special types of // control words. These are all only valid at beginning @@ -199,7 +202,7 @@ bool RtfReader::parseControlWord(RtfContext& cx) // a hyphen right after control word is part of number else if(!empty && param.empty() && ch == '-') { - param.append(1, ch); + param.append(1, (char)ch); } // TODO: This looks real hokey and acts that @@ -399,4 +402,3 @@ done: return m_parseErrors.empty(); } - diff --git a/src/rtfx.cpp b/src/rtfx.cpp index e3ceb61..4d1bbd6 100644 --- a/src/rtfx.cpp +++ b/src/rtfx.cpp @@ -2,13 +2,14 @@ #include "usuals.h" #include #include +#include #include "rtfreader.h" #include "rtfanalyser.h" int usage() { - fprintf(stderr, "usage: rtfm inrtf outxml\n"); + fprintf(stderr, "usage: rtfm \n"); return 2; } diff --git a/src/sablo.h b/src/sablo.h index 99cfc40..7b2b04d 100644 --- a/src/sablo.h +++ b/src/sablo.h @@ -2136,4 +2136,4 @@ namespace DOM }; // namespace DOM -#endif //__SABLO_H__ \ No newline at end of file +#endif //__SABLO_H__ diff --git a/src/sablotr.cpp b/src/sablotr.cpp index 3b62cd6..218f0b8 100644 --- a/src/sablotr.cpp +++ b/src/sablotr.cpp @@ -80,10 +80,10 @@ bool DOM::transcode8to16(const std::basic_string& data, (c[2] & 0xC0) == 0x80 && (c[3] & 0xC0) == 0x80) { - ret.append(1, ((wchar_t)c[0] & 7) << 18 | + ret.append(1, (wchar_t)(((wchar_t)c[0] & 7) << 18 | ((wchar_t)c[1] & 63) << 12 | ((wchar_t)c[2] & 63) << 6 | - ((wchar_t)c[3] & 63)); + ((wchar_t)c[3] & 63))); c += 3; } @@ -92,9 +92,9 @@ bool DOM::transcode8to16(const std::basic_string& data, (c[1] & 0xC0) == 0x80 && (c[2] & 0xC0) == 0x80) { - ret.append(1, ((wchar_t)c[0] & 15) << 12 | + ret.append(1, (wchar_t)(((wchar_t)c[0] & 15) << 12 | ((wchar_t)c[1] & 63) << 6 | - ((wchar_t)c[2] & 63)); + ((wchar_t)c[2] & 63))); c += 2; } @@ -102,8 +102,8 @@ bool DOM::transcode8to16(const std::basic_string& data, else if((c[0] & 0xE0) == 0xC0 && (c[1] & 0xC0) == 0x80) { - ret.append(1, ((wchar_t)c[0] & 31) << 6 | - ((wchar_t)c[1] & 63)); + ret.append(1, (wchar_t)(((wchar_t)c[0] & 31) << 6 | + ((wchar_t)c[1] & 63))); c += 1; } diff --git a/src/usuals.h b/src/usuals.h index ea4384c..5d74f0e 100644 --- a/src/usuals.h +++ b/src/usuals.h @@ -8,4 +8,4 @@ #include #include -#endif // __USUALS_H__ \ No newline at end of file +#endif // __USUALS_H__ diff --git a/src/xmlcomposehelpers.cpp b/src/xmlcomposehelpers.cpp index 3f457b4..240c0a4 100644 --- a/src/xmlcomposehelpers.cpp +++ b/src/xmlcomposehelpers.cpp @@ -100,4 +100,3 @@ void Level::setTextProperties(RtfFormatting& formatting) { m_text.copy(formatting); } - diff --git a/src/xmlcomposehelpers.h b/src/xmlcomposehelpers.h index 05abb8b..a73e9b9 100644 --- a/src/xmlcomposehelpers.h +++ b/src/xmlcomposehelpers.h @@ -84,4 +84,4 @@ protected: }; -#endif //__RTFPARSEHELPERS_H__ \ No newline at end of file +#endif //__RTFPARSEHELPERS_H__ diff --git a/src/xmlcomposer.cpp b/src/xmlcomposer.cpp index 9795fe2..36a705a 100644 --- a/src/xmlcomposer.cpp +++ b/src/xmlcomposer.cpp @@ -726,10 +726,10 @@ ON_CONTROLWORD(ListOverrideTable) // the list node for overriding, using the 'listid' and 'ls' we gathered if(curList != NULL && lsId != -1) { - DOM::Element parent = (DOM::Element&)curList.getParentNode(); + DOM::Element parent = (const DOM::Element&)curList.getParentNode(); if(parent != NULL) { - curList = (DOM::Element&)curList.cloneNode(true); + curList = (const DOM::Element&)curList.cloneNode(true); if(curList != NULL) { parent.appendChild(curList); @@ -990,11 +990,11 @@ bool RtfParser::isEqualElement(const DOM::Element& el1, const DOM::Element& el2) for(int i = 0; i < at1->getLength(); i++) { - DOM::Attr attr1 = (DOM::Attr&)at1->item(0); + DOM::Attr attr1 = (const DOM::Attr&)at1->item(0); if(attr1 != NULL) return false; - DOM::Attr attr2 = (DOM::Attr&)at2->getNamedItem(attr1.getNodeName()); + DOM::Attr attr2 = (const DOM::Attr&)at2->getNamedItem(attr1.getNodeName()); if(attr2 != NULL) return false; @@ -1008,7 +1008,13 @@ bool RtfParser::isEqualElement(const DOM::Element& el1, const DOM::Element& el2) wstring RtfParser::formatInt(int num) { wchar_t buff[12]; + + // The Win32 version isn't secure +#ifdef _WIN32 swprintf(buff, L"%d", num); +#else + swprintf(buff, 12, L"%d", num); +#endif wstring n(buff); return n; @@ -1110,7 +1116,7 @@ void RtfParser::breakBreak(DOM::Document& doc, const string& contain, { for(int i = 0; i < els->getLength(); i++) { - DOM::Element el = (DOM::Element&)els->item(i); + DOM::Element el = (const DOM::Element&)els->item(i); #if 0 // See if parent node only has this break tag // in it. If so then replace parent with this @@ -1154,11 +1160,11 @@ void RtfParser::breakBreak(DOM::Document& doc, const string& contain, * test of your concentration. * */ -bool RtfParser::breakElement(DOM::Element& el, const string& contain) +bool RtfParser::breakElement(const DOM::Element& el, const string& contain) { ASSERT(el != NULL); - DOM::Element parent = (DOM::Element&)el.getParentNode(); + DOM::Element parent = (const DOM::Element&)el.getParentNode(); DOM::Element grandparent; string s = el.getNodeName(); @@ -1166,7 +1172,7 @@ bool RtfParser::breakElement(DOM::Element& el, const string& contain) // Get the parent node if(parent != NULL) - grandparent = (DOM::Element&)parent.getParentNode(); + grandparent = (const DOM::Element&)parent.getParentNode(); // Make sure we have something to work with before continuing if(grandparent == NULL || parent == NULL || @@ -1200,7 +1206,7 @@ bool RtfParser::breakElement(DOM::Element& el, const string& contain) else { // Clone it but not deep - DOM::Element parent2 = (DOM::Element&)parent.cloneNode(false); + DOM::Element parent2 = (const DOM::Element&)parent.cloneNode(false); if(parent2 == NULL) return false; @@ -1254,7 +1260,7 @@ void RtfParser::breakBlocks(DOM::Document& document) { for(int i = 0; i < blocks->getLength(); i++) { - DOM::Element block = (DOM::Element&)blocks->item(i); + DOM::Element block = (const DOM::Element&)blocks->item(i); // If it's the single closed style para then break it if(block != NULL && !block.hasChildNodes()) @@ -1269,7 +1275,7 @@ void RtfParser::breakBlocks(DOM::Document& document) { for(int i = 0; i < destinations->getLength(); i++) { - DOM::Element dest = (DOM::Element&)destinations->item(i); + DOM::Element dest = (const DOM::Element&)destinations->item(i); // Sanity Check if(dest == NULL || !dest.hasChildNodes()) @@ -1321,7 +1327,7 @@ void RtfParser::wrapTags(DOM::Document& doc, const string& tagName, { for(int i = 0; i < tags->getLength(); i++) { - DOM::Element tag = (DOM::Element&)tags->item(i); + DOM::Element tag = (const DOM::Element&)tags->item(i); DOM::Element wrap = doc.createElement(wrapName); while(tag.hasChildNodes()) @@ -1340,7 +1346,7 @@ void RtfParser::breakTags(DOM::Document& doc, const string& parentName, { for(int i = 0; i < parents->getLength(); i++) { - DOM::Element parent = (DOM::Element&)parents->item(i); + DOM::Element parent = (const DOM::Element&)parents->item(i); if(!parent.hasChildNodes()) continue; @@ -1349,7 +1355,7 @@ void RtfParser::breakTags(DOM::Document& doc, const string& parentName, if(tags != NULL) { for(int i = 0; i < tags->getLength(); i++) - breakElement((DOM::Element&)tags->item(i), parentName); + breakElement((const DOM::Element&)tags->item(i), parentName); } DOM::Node tag = doc.createElement(tagName); @@ -1406,7 +1412,7 @@ void RtfParser::breakTags(DOM::Document& doc, const string& parentName, { for(int i = 0; i < tags->getLength(); i++) { - DOM::Element tag = (DOM::Element&)tags->item(i); + DOM::Element tag = (const DOM::Element&)tags->item(i); DOM::Node parent = tag.getParentNode(); if(parent != NULL && !isElement(parent, parentName)) @@ -1438,7 +1444,7 @@ void RtfParser::breakLists(DOM::Document& doc) { for(int i = 0; i < destinations->getLength(); i++) { - DOM::Element dest = (DOM::Element&)destinations->item(i); + DOM::Element dest = (const DOM::Element&)destinations->item(i); // Sanity Check if(dest == NULL) @@ -1503,14 +1509,14 @@ void RtfParser::fixStyles(const DOM::Document doc) { for(int i = 0; i < blocks->getLength(); i++) { - DOM::Element block = (DOM::Element&)blocks->item(i); + DOM::Element block = (const DOM::Element&)blocks->item(i); if(block == NULL || !block.hasAttribute(kElStyle)) continue; for(int j = 0; j < styles->getLength(); j++) { - DOM::Element style = (DOM::Element&)styles->item(j); + DOM::Element style = (const DOM::Element&)styles->item(j); if(style != NULL) { if(style.getAttribute(kAtId) == block.getAttribute(kElStyle)) @@ -1526,7 +1532,7 @@ void RtfParser::fixStyles(const DOM::Document doc) for(int i = 0; i < styles->getLength(); i++) { - DOM::Element style = (DOM::Element&)styles->item(i); + DOM::Element style = (const DOM::Element&)styles->item(i); if(style != NULL) style.removeAttribute(kAtId); } @@ -1543,7 +1549,7 @@ void RtfParser::breakTables(DOM::Document& doc) { for(int i = 0; i < rows->getLength(); i++) { - DOM::Element row = (DOM::Element&)rows->item(i); + DOM::Element row = (const DOM::Element&)rows->item(i); DOM::Node parent = row.getParentNode(); if(parent == NULL) @@ -1574,7 +1580,7 @@ void RtfParser::breakTables(DOM::Document& doc) { for(int i = 0; i < destinations->getLength(); i++) { - DOM::Element dest = (DOM::Element&)destinations->item(i); + DOM::Element dest = (const DOM::Element&)destinations->item(i); // Sanity Check if(dest == NULL) @@ -1643,7 +1649,7 @@ void RtfParser::removeTags(const DOM::Document& doc) { for(int j = 0; j < elements->getLength(); j++) { - DOM::Element el = (DOM::Element&)elements->item(j); + DOM::Element el = (const DOM::Element&)elements->item(j); DOM::Node parent = el->getParentNode(); if(parent == NULL) @@ -1668,14 +1674,14 @@ void RtfParser::fixLists(const DOM::Document doc) { for(int i = 0; i < listdefs->getLength(); i++) { - DOM::Element listdef = (DOM::Element&)listdefs->item(i); + DOM::Element listdef = (const DOM::Element&)listdefs->item(i); if(listdef == NULL || !listdef.hasAttribute(kAtList)) continue; for(int j = 0; j < lists->getLength(); j++) { - DOM::Element list = (DOM::Element&)lists->item(j); + DOM::Element list = (const DOM::Element&)lists->item(j); if(list != NULL) { if(list.getAttribute(kAtList) == listdef.getAttribute(kAtList)) @@ -1701,7 +1707,7 @@ void RtfParser::fixBlocks(const DOM::Document doc) for(int i = 0; i < blocks->getLength(); i++) { - DOM::Element block = (DOM::Element&)blocks->item(i); + DOM::Element block = (const DOM::Element&)blocks->item(i); DOM::Node parent = block.getParentNode(); if(parent == NULL) @@ -1756,7 +1762,7 @@ void RtfParser::removeDuplicates(const DOM::Document& doc) { // Make sure it's a valid element - DOM::Element element = (DOM::Element&)elements->item(j); + DOM::Element element = (const DOM::Element&)elements->item(j); if(element == NULL) continue; diff --git a/src/xmlcomposer.h b/src/xmlcomposer.h index 24dd649..a91304a 100644 --- a/src/xmlcomposer.h +++ b/src/xmlcomposer.h @@ -61,7 +61,7 @@ protected: void fixBlocks(DOM::Document doc); void fixLists(const DOM::Document doc); void fixStyles(const DOM::Document doc); - bool breakElement(DOM::Element& el, const string& contain); + bool breakElement(const DOM::Element& el, const string& contain); void breakBreak(DOM::Document& doc, const string& contain, const string& tag); -- cgit v1.2.3