From: jerome l. <jle...@us...> - 2003-12-31 01:36:19
|
Update of /cvsroot/xlw/xlw/xlw In directory sc8-pr-cvs1:/tmp/cvs-serv11588 Modified Files: XlfOper.cpp Log Message: Fixed conversion of string longer than 255 chars to XlfOper. Used to copy all the characters of the string (256 and on ...) Index: XlfOper.cpp =================================================================== RCS file: /cvsroot/xlw/xlw/xlw/XlfOper.cpp,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -r1.22 -r1.23 *** XlfOper.cpp 28 Oct 2003 02:50:37 -0000 1.22 --- XlfOper.cpp 31 Dec 2003 01:36:14 -0000 1.23 *************** *** 70,80 **** int type = lpxloper_->xltype; ! // Only the types bellow can be flagged xlFreeAuxMem, thus the test is ! // actually redundant: we don't need to re-check the type of the oper. ! // ! // bool canHaveAuxMem = (type & xltypeStr || ! // type & xltypeRef || ! // type & xltypeMulti || ! // type & xltypeBigData); if (type & xlbitFreeAuxMem) { --- 70,80 ---- int type = lpxloper_->xltype; ! // Only the types bellow can be flagged xlFreeAuxMem, thus the test is ! // actually redundant: we don't need to re-check the type of the oper. ! // ! // bool canHaveAuxMem = (type & xltypeStr || ! // type & xltypeRef || ! // type & xltypeMulti || ! // type & xltypeBigData); if (type & xlbitFreeAuxMem) { *************** *** 134,138 **** the method won't throw and the Excel return code will be returned in this variable. ! \sa XlfOper::ConvertToDouble. */ --- 134,138 ---- the method won't throw and the Excel return code will be returned in this variable. ! \sa XlfOper::ConvertToDouble. */ *************** *** 183,187 **** not null the method won't throw and the Excel return code will be returned in this variable. ! \sa XlfOper::ConvertToDoubleVector. */ --- 183,187 ---- not null the method won't throw and the Excel return code will be returned in this variable. ! \sa XlfOper::ConvertToDoubleVector. */ *************** *** 247,251 **** the method won't throw and the Excel return code will be returned in this variable. ! \sa XlfOper::ConvertToShort. */ --- 247,251 ---- the method won't throw and the Excel return code will be returned in this variable. ! \sa XlfOper::ConvertToShort. */ *************** *** 291,295 **** the method won't throw and the Excel return code will be returned in this variable. ! \sa XlfOper::ConvertToBool. */ --- 291,295 ---- the method won't throw and the Excel return code will be returned in this variable. ! \sa XlfOper::ConvertToBool. */ *************** *** 333,339 **** null the method won't throw and the Excel return code will be returned in this variable. ! \sa XlfOper::ConvertToString. ! The XLL allocates the memory on its own buffer. This buffer is automatically freed when a function of the XLL is called again. Note that coerce to --- 333,339 ---- null the method won't throw and the Excel return code will be returned in this variable. ! \sa XlfOper::ConvertToString. ! The XLL allocates the memory on its own buffer. This buffer is automatically freed when a function of the XLL is called again. Note that coerce to *************** *** 384,388 **** the method won't throw and the Excel return code will be returned in this variable. ! \sa XlfOper::ConvertToRef. */ --- 384,388 ---- the method won't throw and the Excel return code will be returned in this variable. ! \sa XlfOper::ConvertToRef. */ *************** *** 498,518 **** /*! ! If no memory can be allocated on xlw internal buffer, the XlfOper is set ! to an invalid state and the string is not copied. ! ! \note String longer than 255 characters are truncated. A warning ! is issued in debug mode. ! */ XlfOper& XlfOper::Set(const char *value) { if (lpxloper_) { lpxloper_->xltype = xltypeStr; int n = strlen(value); ! if (n >= 256) std::cerr << XLW__HERE__ << "String too long is truncated" << std::endl; ! // One byte more for NULL terminal char (allow use of strcpy) ! // and one for the std::string size (convention used by Excel) ! LPSTR str = reinterpret_cast<LPSTR>(XlfExcel::Instance().GetMemory(n + 2)); if (str == 0) { --- 498,524 ---- /*! ! * If no memory can be allocated on xlw internal buffer, the XlfOper is set ! * to an invalid state and the string is not copied. ! */ XlfOper& XlfOper::Set(const char *value) { + static const size_t maxLength = 255; if (lpxloper_) { lpxloper_->xltype = xltypeStr; + /*! computes the size of the string excluding terminal null character. */ int n = strlen(value); ! /*! if the string is longer than 254 characters, truncates it to 254 */ ! if (n > maxLength) ! { std::cerr << XLW__HERE__ << "String too long is truncated" << std::endl; ! n = maxLength; ! } ! /*! Allocates the number of characters + 2 bytes on the buffer. The first ! * character is used to store the size of the string in front (Excel and ! * Pascal convention) while the second is used for the null character at ! * the end. ! */ ! char * str = reinterpret_cast<char *>(XlfExcel::Instance().GetMemory(n + 2)); if (str == 0) { *************** *** 521,528 **** else { ! strcpy(str + 1, value); ! // the number of character include the final \0 or not ? ! lpxloper_->val.str = str; ! lpxloper_->val.str[0] = (BYTE)(n + 1); } } --- 527,535 ---- else { ! // copies the null character as well. ! //strncpy takes care of padding with null characters. ! strncpy(str + 1, value, n + 1); ! lpxloper_->val.str = (LPSTR)(str); ! lpxloper_->val.str[0] = (BYTE)(n); } } *************** *** 548,556 **** XlfOper& XlfOper::Set(WORD r, BYTE c) { ! lpxloper_->xltype = xltypeMulti; ! lpxloper_->val.array.rows = r; ! lpxloper_->val.array.columns = c; ! lpxloper_->val.array.lparray = (LPXLOPER)XlfExcel::Instance().GetMemory(r*c*sizeof(XLOPER)); ! return *this; } --- 555,563 ---- XlfOper& XlfOper::Set(WORD r, BYTE c) { ! lpxloper_->xltype = xltypeMulti; ! lpxloper_->val.array.rows = r; ! lpxloper_->val.array.columns = c; ! lpxloper_->val.array.lparray = (LPXLOPER)XlfExcel::Instance().GetMemory(r*c*sizeof(XLOPER)); ! return *this; } *************** *** 561,568 **** XlfOper& XlfOper::Set(size_t i, XlfOper& val) { ! assert(lpxloper_->xltype == xltypeMulti); ! assert(i < lpxloper_->val.array.rows * lpxloper_->val.array.columns); ! lpxloper_->val.array.lparray[i] = *(LPXLOPER)val; ! return *this; } --- 568,575 ---- XlfOper& XlfOper::Set(size_t i, XlfOper& val) { ! assert(lpxloper_->xltype == xltypeMulti); ! assert(i < lpxloper_->val.array.rows * lpxloper_->val.array.columns); ! lpxloper_->val.array.lparray[i] = *(LPXLOPER)val; ! return *this; } |