Changeset 119


Ignore:
Timestamp:
Aug 26, 2006, 12:51:01 AM (19 years ago)
Author:
dmik
Message:

Tools: Fixed SYS3184 (divide-by-zero) in qt_os2QString2MB() (used by QString::local8Bit()) happened when the target codepage required more than one byte per some Unicode character, e.g. in Japanese locales [thanks to achain].

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/tools/qstring.cpp

    r8 r119  
    69766976    UniChar *ucPtr = (UniChar *) s.unicode();
    69776977    size_t ucLeft = uclen;
    6978    
     6978
     6979    // be optimistic (imply that one byte is necessary per every Unicode char)
    69796980    size_t mblen = uclen;
    69806981    QCString mbBuf( mblen + 1 );
     
    69916992            size_t mbDone = mblen - mbLeft;
    69926993            size_t ucDone = uclen - ucLeft;
    6993             // assume that ucLeft/mbLeft is an approximation of ucDone/mbDone
    6994             mblen = mbDone + (ucLeft * mbDone) / ucDone;
     6994            size_t newLen = mblen;
     6995            if ( ucDone ) {
     6996                // assume that ucLeft/mbLeft is an approximation of ucDone/mbDone
     6997                newLen = mbDone + (ucLeft * mbDone) / ucDone;
     6998            }
     6999            if ( newLen == mblen ) {
     7000                // could not process a single Unicode char, double the size
     7001                mblen *= 2;
     7002            } else {
     7003                mblen = newLen;
     7004            }
    69957005            mbBuf.resize( mblen + 1 );
    69967006            mbPtr = mbBuf.data() + mbDone;
     7007            mbLeft = mblen - mbDone;
    69977008        } else if ( rc != ULS_SUCCESS ) {
    69987009#ifndef QT_NO_DEBUG
     
    70047015        }
    70057016    }
    7006     mbBuf[ mblen - mbLeft ] = '\0';
     7017    mbBuf.truncate( mblen - mbLeft );
    70077018    return mbBuf;
    70087019}
Note: See TracChangeset for help on using the changeset viewer.