QString.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:13k
源码类别:

DVD

开发平台:

C/C++

  1. #include <assert.h>
  2. #include <limits.h>
  3. #include "QString.h"
  4. #include "Osp.h"
  5. #include <string.h>
  6. #include <ctype.h>
  7. QString   NewQString()
  8. {
  9.    QString self;
  10.    self.Init =  QStringInit;
  11.    self.Release = QStringRelease;
  12.    self.AllocBuffer = QStringAllocBuffer;
  13.    self.GetLength = QStringGetLength;
  14.    self.IsEmpty = QStringIsEmpty;
  15.    self.ReSet = QStringReSet;
  16.    self.Append = QStringAppend;
  17.    self.AppendChar = QStringAppendChar;
  18.    self.AppendInt = QStringAppendInt;
  19.    self.AppendString = QStringAppendString;
  20.    self.GetAt = QStringGetAt;
  21.    self.Include = QStringInclude;
  22.    self.Find = QStringFind;
  23.    self.FindString = QStringFindString;
  24.    self.ToInt = QStringToInt;
  25.    self.CompareString = QStringCompareString;
  26.    self.Equal = QStringEqual;
  27.    self.Replace = QStringReplace;
  28.    self.Mid = QStringMid;
  29.    self.MidIndex = QStringMidIndex;
  30.    self.Left = QStringLeft;
  31.    self.Right = QStringRight;
  32.    self.Trim = QStringTrim;
  33.    self.TrimRight = QStringTrimRight;
  34.    self.TrimLeft = QStringTrimLeft;
  35.    self.MakeUpper = QStringMakeUpper;
  36.    self.MakeLower = QStringMakeLower;
  37.    self.Delete = QStringDelete;
  38.    self.Split = QStringSplit;
  39.    self.Init(&self);
  40.    return self;               
  41. }
  42. QString   *MallocQString()
  43. {
  44.    QString *self = (QString *)KB_OSPMalloc(sizeof(QString));
  45.    
  46.    if(!self) return NULL;
  47.    self->Init =  QStringInit;
  48.    self->Release = QStringRelease;
  49.    self->AllocBuffer = QStringAllocBuffer;
  50.    self->GetLength = QStringGetLength;
  51.    self->IsEmpty = QStringIsEmpty;
  52.    self->ReSet = QStringReSet;
  53.    self->Append = QStringAppend;
  54.    self->AppendChar = QStringAppendChar;
  55.    self->AppendInt = QStringAppendInt;
  56.    self->AppendString = QStringAppendString;
  57.    self->GetAt = QStringGetAt;
  58.    self->Include = QStringInclude;
  59.    self->Find = QStringFind;
  60.    self->FindString = QStringFindString;
  61.    self->ToInt = QStringToInt;
  62.    self->CompareString = QStringCompareString;
  63.    self->Equal = QStringEqual;
  64.    self->Replace = QStringReplace;
  65.    self->Mid = QStringMid;
  66.    self->MidIndex = QStringMidIndex;
  67.    self->Left = QStringLeft;
  68.    self->Right = QStringRight;
  69.    self->Trim = QStringTrim;
  70.    self->TrimRight = QStringTrimRight;
  71.    self->TrimLeft = QStringTrimLeft;
  72.    self->MakeUpper = QStringMakeUpper;
  73.    self->MakeLower = QStringMakeLower;
  74.    self->Delete = QStringDelete;
  75.    self->Split = QStringSplit;
  76.    self->Init(self);
  77.    return self;               
  78. }
  79. void QStringInit(QString * self)
  80. {
  81.    assert(self);
  82.    self->m_dataBuff = NULL;
  83.    self->m_nDataLength = 0;
  84.    self->m_nAllocLength = 0;
  85. }
  86. void QStringRelease(QString * self)
  87. {
  88.    assert(self);
  89.    if(self->m_nAllocLength) KB_OSPFree(self->m_dataBuff);
  90.    self->m_dataBuff = NULL;
  91.    self->m_nDataLength = 0;
  92.    self->m_nAllocLength = 0;
  93. }
  94. BOOL QStringAllocBuffer(QString * self,int nLen)
  95. {
  96.    assert(nLen >= 0);
  97.    assert(nLen <= INT_MAX - 1); 
  98.    assert(self);
  99.    if (nLen == 0){
  100.       self->Init(self);
  101.    }else{
  102.       char *pData = NULL;
  103.       int bufflen  = sizeof(char)*nLen+sizeof(char);
  104.       pData = KB_OSPMalloc(bufflen);
  105.       if(pData == NULL)
  106.    return FALSE;
  107.       self->m_nAllocLength = nLen;
  108.       memset(pData,0,bufflen);
  109.       self->m_dataBuff = pData;
  110.    }
  111.    return TRUE;   
  112. }
  113. int QStringGetLength(QString * self)
  114. {
  115.    assert(self);
  116.    return self->m_nDataLength;
  117. }
  118. BOOL QStringIsEmpty(QString * self)
  119. {
  120.    assert(self);
  121.    return self->m_nDataLength>0?FALSE:TRUE;
  122. }
  123. void QStringReSet(QString * self,const char *szStr)
  124. {
  125.    assert(self);
  126.    self->Release(self);
  127.    if(!szStr) return;
  128.       self->Append(self,szStr,strlen(szStr));
  129. }
  130. void QStringAppend(QString * self,const char *szStr,int nLen)
  131. {
  132.    int nNewStrSize;
  133.    int nStrSize;
  134.    char *pStr;
  135.    char *tmpData;
  136.    int newAllocSize;
  137.    assert(self);
  138.    if(!szStr) return;         
  139.       nStrSize = 0;
  140.    
  141.    pStr = (char *)szStr;
  142.    
  143.    while(*pStr && nStrSize < nLen){
  144.       pStr ++;
  145.       nStrSize ++;
  146.    }
  147.    
  148.    if(nStrSize < 0)
  149.       return;
  150.    
  151.    nNewStrSize = self->m_nDataLength + nStrSize + sizeof(char);
  152.    
  153.    if(nNewStrSize > self->m_nAllocLength){
  154.       tmpData = self->m_dataBuff;
  155.       newAllocSize = nNewStrSize + /*nNewStrSize;*/nNewStrSize/4;
  156.       if(!self->AllocBuffer(self,newAllocSize))
  157.          return ;
  158.    
  159.       memcpy(self->m_dataBuff,tmpData,self->m_nDataLength);
  160.       KB_OSPFree(tmpData);
  161.       memcpy(self->m_dataBuff + self->m_nDataLength,szStr,nStrSize);
  162.       
  163.       self->m_nDataLength += nStrSize; 
  164.       self->m_nAllocLength = newAllocSize;
  165.    }else{
  166.       memcpy (self->m_dataBuff + self->m_nDataLength, szStr,nStrSize);
  167.       self->m_nDataLength += nStrSize; 
  168.    }
  169.    self->m_dataBuff[self->m_nDataLength] = 0;
  170. }
  171. void QStringAppendChar(QString * self,char ch)
  172. {
  173.    char tempData[2] = {0,0};
  174.    assert(self);
  175.    tempData[0] = ch;
  176.    self->Append(self,tempData,1);
  177. }
  178. void QStringAppendInt(QString * self,int n)
  179. {
  180.    char tempData[32];
  181.    assert(self);
  182.    sprintf(tempData,"%d",n);   
  183.    self->Append(self,tempData,strlen(tempData));
  184. }
  185. void QStringAppendString(QString * self,const char *str)
  186. {
  187.    assert(self);
  188.    if(!str) return ;
  189.    
  190.    self->Append(self,str,strlen(str));   
  191. }
  192. char QStringGetAt(QString * self,int index)
  193. {
  194.    assert(self);
  195.    if(index<0 || index >= self->m_nDataLength || self->m_nDataLength<=0) 
  196.        return 0;
  197.    
  198.    return self->m_dataBuff[index];
  199. }
  200. BOOL QStringInclude(QString * self,char ch)
  201. {
  202.    assert(self);
  203.    return self->Find(self,ch,0)>=0?TRUE:FALSE;
  204. }
  205. int QStringFind(QString * self,char ch,int offset)
  206. {
  207.    char * lookUp;
  208.    assert(self);
  209.             
  210.    if (offset >= self->m_nDataLength)
  211.       return -1;
  212.    for (lookUp = self->m_dataBuff + offset; * lookUp; lookUp++)
  213.       if (* lookUp == ch)
  214.          return lookUp - self->m_dataBuff;
  215.    return -1;      
  216. }
  217. int QStringFindString(QString * self,const char *str,int offset)
  218. {
  219.    int strLen = 0;
  220.    int i = 0;
  221.    char *pStr = (char *)str;
  222.    
  223.    assert(self);
  224.    
  225.    if(pStr == NULL) return -1;
  226.    while(*pStr){
  227.       strLen++;
  228.       pStr++;
  229.    }   
  230.    i = offset;
  231.    while(i < self->m_nDataLength){
  232.       if(strncmp(self->m_dataBuff + i, str, strLen) == 0)
  233.          return i;
  234.          i++;
  235.    }
  236.    return -1;   
  237. }
  238. int QStringToInt(QString * self)
  239. {
  240.    assert(self);
  241.    return atoi(self->m_dataBuff);
  242. }
  243. int QStringCompareString(QString * self,const char * lpsz)
  244. {
  245.    assert(self);
  246.    return strcmp(self->m_dataBuff,lpsz);
  247. }
  248. BOOL QStringEqual(QString * self,const char * lpsz)
  249. {
  250.    assert(self);
  251.    
  252.    if(self->m_dataBuff == NULL) return FALSE;
  253.    
  254.    return strcmp(self->m_dataBuff,lpsz) == 0 ? TRUE:FALSE;   
  255. }
  256. int QStringReplace(QString * self,char chOld, char chNew)
  257. {
  258.    int nCount = 0;   
  259.    assert(self);
  260.    
  261.    if (chOld != chNew){
  262.       char *psz = self->m_dataBuff;
  263.       
  264.       for(; * psz; psz++){
  265.          if (*psz == chOld){
  266.             *psz = chNew;
  267.             nCount++;
  268.          }
  269.       }
  270.    }
  271.    return nCount;   
  272. }
  273. char *QStringMid(QString * self,int nFirst)
  274. {
  275.    assert(self);
  276.    return self->MidIndex(self,nFirst, self->m_nDataLength - nFirst);
  277. }
  278. char *QStringMidIndex(QString * self,int nFirst,int nCount)
  279. {
  280.    QString dest = NewQString();
  281.    assert(self);
  282.    nFirst = nFirst < 0 ? 0:nFirst;
  283.    nCount = nCount < 0 ? 0:nCount;
  284.    if(nFirst + nCount > self->m_nDataLength)
  285.       nCount = self->m_nDataLength - nFirst;
  286.    if (nFirst > self->m_nDataLength)
  287.       nCount = 0;
  288.    
  289.    dest.AllocBuffer(&dest,nCount);
  290.    memcpy(dest.m_dataBuff,self->m_dataBuff+nFirst,nCount);
  291.    //dest.m_dataBuff[nCount] = 0;
  292.    return dest.m_dataBuff;
  293. }
  294. char *QStringLeft(QString * self,int nCount)
  295. {
  296.    QString dest = NewQString();
  297.    
  298.    assert(self);
  299.  
  300.    if(nCount < 0)
  301.       nCount = 0;
  302.    else if (nCount > self->m_nDataLength)
  303.       nCount = self->m_nDataLength;
  304.    
  305.    dest.AllocBuffer(&dest,nCount);
  306.    memcpy(dest.m_dataBuff,self->m_dataBuff,nCount);
  307.    dest.m_dataBuff[nCount] = 0;
  308.    return dest.m_dataBuff;   
  309. }
  310. char *QStringRight(QString * self,int nCount)
  311. {
  312.    QString dest = NewQString();
  313.    assert(self);
  314.    if(nCount < 0)
  315.       nCount = 0;
  316.    else if (nCount > self->m_nDataLength)
  317.       nCount = self->m_nDataLength;
  318.    dest.AllocBuffer(&dest,nCount);
  319.    memcpy(dest.m_dataBuff,self->m_dataBuff+
  320.           (self->m_nDataLength-nCount),nCount);   
  321.    return dest.m_dataBuff;   
  322. }
  323. void QStringTrim(QString * self)
  324. {
  325.    char *lpsz = NULL;
  326.    char *lpszLast = NULL;
  327.    int nDataLength;
  328.    int nMoveDataLength;
  329.    assert(self);
  330.    if(!self->m_dataBuff) return;
  331.    lpsz = self->m_dataBuff;
  332.    while ((*lpsz ==' ' || 
  333.          *lpsz == 't' || 
  334.           *lpsz =='n' ||
  335.            *lpsz =='r')&& *lpsz)
  336.       lpsz++;
  337.   
  338.    // fix up data and length
  339.    nMoveDataLength = (int)(unsigned long)(lpsz - self->m_dataBuff);
  340.    nDataLength = self->m_nDataLength - nMoveDataLength;
  341.    memmove(self->m_dataBuff, lpsz, (nDataLength + 1) * sizeof(char));
  342.    
  343.    self->m_nAllocLength-= nMoveDataLength;   
  344.    self->m_nDataLength = nDataLength;
  345.    
  346.    while (*lpsz != ''){
  347.       if( *lpsz ==' ' || *lpsz == 't' || *lpsz =='n' || *lpsz =='r'){
  348.          if (lpszLast == NULL)
  349.             lpszLast = lpsz;
  350.          }else{
  351.             lpszLast = NULL;
  352.          }
  353.       lpsz++;
  354.    }
  355.    if(lpszLast != NULL){
  356.       // truncate at trailing space start
  357.       *lpszLast = '';
  358.       nDataLength = (int)(unsigned long)(lpszLast - self->m_dataBuff);
  359.       nMoveDataLength = self->m_nDataLength - nDataLength;
  360.       self->m_nDataLength = nDataLength;
  361.       self->m_nAllocLength -= nMoveDataLength;
  362.    }
  363. }
  364. void QStringTrimRight(QString * self)
  365. {
  366.    char *lpsz = NULL;
  367.    char *lpszLast = NULL;
  368.    int nMoveDataLength;
  369.    int nDataLength ;
  370.    assert(self);
  371.    if(!self->m_dataBuff) return;
  372.       lpsz = self->m_dataBuff;
  373.    while (*lpsz != ''){
  374.       if (*lpsz ==' ' || *lpsz == 't' || *lpsz =='n' || *lpsz =='r'){
  375.          if (lpszLast == NULL)
  376.             lpszLast = lpsz;
  377.       }else{
  378.          lpszLast = NULL;
  379.       }
  380.       lpsz++;
  381.    }
  382.    
  383.    if (lpszLast != NULL){
  384.       // truncate at trailing space start
  385.       *lpszLast = '';
  386.       nDataLength = (int)(unsigned long)(lpszLast - self->m_dataBuff);
  387.       nMoveDataLength = self->m_nDataLength - nDataLength;
  388.       self->m_nDataLength = nDataLength;
  389.       self->m_nAllocLength -= nMoveDataLength;
  390.    }
  391. }      
  392. void QStringTrimLeft(QString * self)
  393. {
  394.    // find first non-space character
  395.    char *lpsz = NULL;
  396.    int nMoveDataLength;
  397.    int nDataLength ;
  398.    assert(self);
  399.    if(!self->m_dataBuff) return;
  400.    lpsz = self->m_dataBuff;
  401.    while ((*lpsz ==' ' || *lpsz == 't' || *lpsz =='n' || *lpsz =='r')&&
  402.           *lpsz)
  403.      lpsz++;
  404.    // fix up data and length
  405.    nMoveDataLength = (int)(unsigned long)(lpsz - self->m_dataBuff);
  406.    nDataLength = self->m_nDataLength - nMoveDataLength ;
  407.    memmove(self->m_dataBuff, lpsz, (nDataLength + 1) * sizeof(char));
  408.    self->m_nDataLength = nDataLength;
  409.    self->m_nAllocLength -= nMoveDataLength;
  410. }   
  411. char *QStringMakeUpper(QString * self)
  412. {
  413.    char *lpsz;
  414.    assert(self);
  415.    if(!self->m_dataBuff) return "";
  416.    lpsz = self->m_dataBuff;
  417.    while (*lpsz != ''){
  418.       if(isalpha(*lpsz)&&islower(*lpsz))
  419.          *lpsz = toupper(*lpsz);
  420.       lpsz++;
  421.    }
  422.    return self->m_dataBuff;
  423. }      
  424. char *QStringMakeLower(QString * self)
  425. {
  426.    char *lpsz;
  427.    assert(self);
  428.    if(!self->m_dataBuff) return "";
  429.    lpsz = self->m_dataBuff;
  430.    while (*lpsz != '')
  431.    {
  432.       if(isalpha(*lpsz)&&isupper(*lpsz))
  433.          *lpsz = tolower(*lpsz);
  434.       lpsz++;
  435.    }
  436.    return self->m_dataBuff;
  437. }   
  438. int   QStringDelete(QString * self,int nIndex, int nCount )
  439. {
  440.    int nNewLength ;
  441.    assert(self);
  442.    
  443.    if (nIndex < 0)
  444.       nIndex = 0;
  445.    nNewLength = self->m_nDataLength;
  446.    if (nCount > 0 && nIndex < nNewLength)
  447.    {
  448.       int nBytesToCopy = nNewLength - (nIndex + nCount) + 1;
  449.       if(nBytesToCopy <0 ) {   return -1;}
  450.       memmove(self->m_dataBuff + nIndex, self->m_dataBuff + nIndex + nCount, nBytesToCopy * sizeof(char));
  451.       self->m_nDataLength = nNewLength - nCount;
  452.       self->m_nAllocLength -= nCount;
  453.    }
  454.    return nNewLength;
  455. }
  456. QList   QStringSplit(QString * self,char ch )
  457. {
  458.    QList stringlist = NewQList();
  459.    char * lookUp;
  460.    QString word = NewQString();
  461.    QString * newWord = NULL;
  462.    BOOL hasChar = FALSE;
  463.    
  464.    assert(self);   
  465.    for (lookUp = self->m_dataBuff; * lookUp; lookUp++)
  466.    {
  467.       if (* lookUp == ch)
  468.       {
  469.          hasChar = TRUE;
  470.          newWord = MallocQString();
  471.          newWord->AppendString(newWord,word.m_dataBuff);
  472.          stringlist.Add(&stringlist,newWord);
  473.          word.Release(&word);
  474.          lookUp++;
  475.          if(!*lookUp) break;
  476.       }
  477.       word.AppendChar(&word , *lookUp);
  478.    }
  479.    if(!hasChar)
  480.    {
  481.       stringlist.Clear(&stringlist);
  482.    }
  483.    else
  484.    {
  485.       if(!word.IsEmpty(&word))
  486.       {   
  487.          newWord = MallocQString();
  488.          newWord->AppendString(newWord,word.m_dataBuff);
  489.          stringlist.Add(&stringlist,newWord);   
  490.       }
  491.       
  492.    }
  493.    word.Release(&word);
  494.    return stringlist;
  495. }
  496. QStringList NewQStringList()
  497. {
  498.    QStringList self;
  499.    self.list = NewQList();
  500.    self.Release = QStringListRelease;
  501.    return self;
  502. }
  503. QStringList *MallocQStringList()
  504. {
  505.    QStringList *self = (QStringList *) KB_OSPMalloc(sizeof(QStringList));
  506.    if(!self) return NULL;
  507.    self->list = NewQList();
  508.    self->Release = QStringListRelease;
  509.    return self;
  510. }
  511. void   QStringListRelease(QStringList * self)
  512. {
  513.    QString *str;
  514.    assert(self);
  515.    if(self->list.MoveToHead(&self->list) == QLIST_OK)
  516.    {
  517.       str = (QString *)self->list.GetData(&self->list);
  518.       while(str)
  519.       {
  520.          str->Release(str);
  521.          KB_OSPFree(str);
  522.          str = NULL;
  523.          self->list.MoveNext(&self->list);   
  524.          str = (QString *)self->list.GetData(&self->list);
  525.       }
  526.    }
  527.    self->list.Clear(&self->list);
  528. }