Changeset 106


Ignore:
Timestamp:
Apr 11, 2007, 8:41:25 PM (18 years ago)
Author:
RBRi
Message:

more methods

Location:
trunk/NewView
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/NewView/StringUtilsUnit.pas

    r105 r106  
    1717  StrLF = chr(10);
    1818  StrCRLF = StrCR + StrLF;
    19   Quote = '''';
    20   DoubleQuote = '"';
     19  StrSingleQuote = '''';
     20  StrDoubleQuote = '"';
    2121
    2222
     
    107107  Function StrInDoubleQuotes(const aString : String) : String;
    108108
     109  // Extract all fields in a String delimited by whitespace (blank or tab).
     110  // use double quotes if you need blanks in the strings
     111  Procedure StrExtractStringsQuoted(Var aResult: TStrings; const aReceiver: String );
    109112
    110113Implementation
     
    557560  end;
    558561
     562
    559563  Function StrInDoubleQuotes(const aString : String) : String;
    560564  begin
    561     Result := DoubleQuote + aString + DoubleQuote;
    562   end;
    563 
    564 
     565    Result := StrDoubleQuote + aString + StrDoubleQuote;
     566  end;
     567
     568
     569  Procedure StrExtractStringsQuoted(Var aResult: TStrings; const aReceiver: String );
     570  Var
     571    tmpState : (WHITESPACE, INSIDE, START_QUOTE, INSIDE_QUOTED, INSIDE_QUOTED_START_QUOTE);
     572    tmpCurrentParsePosition : Integer;
     573    tmpCurrentChar : Char;
     574    tmpPart : String;
     575
     576  Begin
     577    if (length(aReceiver) < 1) then exit;
     578
     579    tmpState := WHITESPACE;
     580    tmpPart := '';
     581
     582    tmpCurrentParsePosition := 1;
     583
     584    for tmpCurrentParsePosition:=1 to length(aReceiver) do
     585    begin
     586      tmpCurrentChar := aReceiver[tmpCurrentParsePosition];
     587
     588      Case tmpCurrentChar of
     589        ' ', StrTAB :
     590        begin
     591
     592          Case tmpState of
     593
     594            WHITESPACE :
     595            begin
     596              // nothing
     597            end;
     598
     599            INSIDE :
     600            begin
     601              aResult.add(tmpPart);
     602              tmpPart := '';
     603              tmpState := WHITESPACE;
     604            end;
     605
     606            INSIDE_QUOTED :
     607            begin
     608              tmpPart := tmpPart + tmpCurrentChar;
     609            end;
     610
     611            START_QUOTE :
     612            begin
     613              tmpPart := tmpPart + tmpCurrentChar;
     614              tmpState := INSIDE_QUOTED;
     615            end;
     616
     617            INSIDE_QUOTED_START_QUOTE :
     618            begin
     619              aResult.add(tmpPart);
     620              tmpPart := '';
     621              tmpState := WHITESPACE;
     622            end;
     623          end;
     624        end;
     625
     626        StrDoubleQuote :
     627        begin
     628
     629          Case tmpState of
     630
     631            WHITESPACE :
     632            begin
     633              tmpState := START_QUOTE;
     634            end;
     635
     636            INSIDE :
     637            begin
     638              aResult.add(tmpPart);
     639              tmpPart := '';
     640              tmpState := START_QUOTE;
     641            end;
     642
     643            INSIDE_QUOTED :
     644            begin
     645              tmpState := INSIDE_QUOTED_START_QUOTE;
     646            end;
     647
     648            START_QUOTE :
     649            begin
     650              tmpState := INSIDE_QUOTED_START_QUOTE;
     651            end;
     652
     653            INSIDE_QUOTED_START_QUOTE :
     654            begin
     655              tmpPart := tmpPart + tmpCurrentChar;
     656              tmpState := INSIDE_QUOTED;
     657            end;
     658          end;
     659        end;
     660
     661        else
     662        begin
     663          Case tmpState of
     664
     665            WHITESPACE :
     666            begin
     667              tmpPart := tmpPart + tmpCurrentChar;
     668              tmpState := INSIDE;
     669            end;
     670
     671            INSIDE, INSIDE_QUOTED :
     672            begin
     673              tmpPart := tmpPart + tmpCurrentChar;
     674            end;
     675
     676            START_QUOTE :
     677            begin
     678              tmpPart := tmpPart + tmpCurrentChar;
     679              tmpState := INSIDE_QUOTED;
     680            end;
     681
     682            INSIDE_QUOTED_START_QUOTE :
     683            begin
     684              aResult.add(tmpPart);
     685              tmpPart := tmpCurrentChar;
     686              tmpState := INSIDE;
     687            end;
     688          end;
     689        end;
     690
     691      end;
     692    end;
     693
     694    Case tmpState of
     695      WHITESPACE, START_QUOTE : {nothing to do};
     696
     697      INSIDE, INSIDE_QUOTED, INSIDE_QUOTED_START_QUOTE :
     698      begin
     699        aResult.add(tmpPart);
     700      end;
     701    end;
     702  end;
    565703END.
  • trunk/NewView/unittests/StringUtilsUnitTests.pas

    r105 r106  
    14181418
    14191419  // ----------------------------------------------------------
     1420
     1421
     1422  PROCEDURE testStrExtractStringsQuoted_Empty;
     1423  VAR
     1424    tmpResult : TStringList;
     1425    tmpString : String;
     1426  BEGIN
     1427    tmpResult := TStringList.Create;
     1428    tmpString := '';
     1429
     1430    StrExtractStringsQuoted(tmpResult, tmpString);
     1431    assertEqualsInt('testStrExtractStringsQuoted_Empty', 0, tmpResult.count);
     1432
     1433    tmpResult.Destroy;
     1434  END;
     1435
     1436
     1437  PROCEDURE testStrExtractStringsQuoted_OnlyWhitespace;
     1438  VAR
     1439    tmpResult : TStringList;
     1440    tmpString : String;
     1441  BEGIN
     1442    tmpResult := TStringList.Create;
     1443    tmpString := ' ' + StrTAB + '    ';
     1444
     1445    StrExtractStringsQuoted(tmpResult, tmpString);
     1446    assertEqualsInt('testStrExtractStringsQuoted_OnlyWhitespace', 0, tmpResult.count);
     1447
     1448    tmpResult.Destroy;
     1449  END;
     1450
     1451
     1452  PROCEDURE testStrExtractStringsQuoted_OnlyText;
     1453  VAR
     1454    tmpResult : TStringList;
     1455    tmpString : String;
     1456  BEGIN
     1457    tmpResult := TStringList.Create;
     1458    tmpString := 'TeXt';
     1459
     1460    StrExtractStringsQuoted(tmpResult, tmpString);
     1461    assertEqualsInt('testStrExtractStringsQuoted_OnlyText', 1, tmpResult.count);
     1462    assertEqualsString('testStrExtractStringsQuoted_OnlyText', 'TeXt', tmpResult[0]);
     1463
     1464    tmpResult.Destroy;
     1465  END;
     1466
     1467
     1468  PROCEDURE testStrExtractStringsQuoted_OnlyText2Parts;
     1469  VAR
     1470    tmpResult : TStringList;
     1471    tmpString : String;
     1472  BEGIN
     1473    tmpResult := TStringList.Create;
     1474    tmpString := 'TeXt sample';
     1475
     1476    StrExtractStringsQuoted(tmpResult, tmpString);
     1477    assertEqualsInt('testStrExtractStringsQuoted_OnlyText2Parts', 2, tmpResult.count);
     1478    assertEqualsString('testStrExtractStringsQuoted_OnlyText2Parts', 'TeXt', tmpResult[0]);
     1479    assertEqualsString('testStrExtractStringsQuoted_OnlyText2Parts', 'sample', tmpResult[1]);
     1480
     1481    tmpResult.Destroy;
     1482  END;
     1483
     1484
     1485  PROCEDURE testStrExtractStringsQuoted_TextAndWhitespace2Parts;
     1486  VAR
     1487    tmpResult : TStringList;
     1488    tmpString : String;
     1489  BEGIN
     1490    tmpResult := TStringList.Create;
     1491    tmpString := '  TeXt   ' + StrTAB + StrTAB + '  sample ' + StrTAB;
     1492
     1493    StrExtractStringsQuoted(tmpResult, tmpString);
     1494    assertEqualsInt('testStrExtractStringsQuoted_TextAndWhitespace2Parts', 2, tmpResult.count);
     1495    assertEqualsString('testStrExtractStringsQuoted_TextAndWhitespace2Parts', 'TeXt', tmpResult[0]);
     1496    assertEqualsString('testStrExtractStringsQuoted_TextAndWhitespace2Parts', 'sample', tmpResult[1]);
     1497
     1498    tmpResult.Destroy;
     1499  END;
     1500
     1501
     1502  PROCEDURE testStrExtractStringsQuoted_QuotedText1Part;
     1503  VAR
     1504    tmpResult : TStringList;
     1505    tmpString : String;
     1506  BEGIN
     1507    tmpResult := TStringList.Create;
     1508    tmpString := '"TeXt"';
     1509
     1510    StrExtractStringsQuoted(tmpResult, tmpString);
     1511    assertEqualsInt('testStrExtractStringsQuoted_QuotedText1Part', 1, tmpResult.count);
     1512    assertEqualsString('testStrExtractStringsQuoted_QuotedText1Part', 'TeXt', tmpResult[0]);
     1513
     1514    tmpResult.Destroy;
     1515  END;
     1516
     1517
     1518  PROCEDURE testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotes;
     1519  VAR
     1520    tmpResult : TStringList;
     1521    tmpString : String;
     1522  BEGIN
     1523    tmpResult := TStringList.Create;
     1524    tmpString := '"TeXt';
     1525
     1526    StrExtractStringsQuoted(tmpResult, tmpString);
     1527    assertEqualsInt('testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotes', 1, tmpResult.count);
     1528    assertEqualsString('testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotes', 'TeXt', tmpResult[0]);
     1529
     1530    tmpResult.Destroy;
     1531  END;
     1532
     1533
     1534  PROCEDURE testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotesWhitewspace;
     1535  VAR
     1536    tmpResult : TStringList;
     1537    tmpString : String;
     1538  BEGIN
     1539    tmpResult := TStringList.Create;
     1540    tmpString := '"TeX t ';
     1541
     1542    StrExtractStringsQuoted(tmpResult, tmpString);
     1543    assertEqualsInt('testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotesWhitewspace', 1, tmpResult.count);
     1544    assertEqualsString('testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotesWhitewspace', 'TeX t ', tmpResult[0]);
     1545
     1546    tmpResult.Destroy;
     1547  END;
     1548
     1549
     1550
     1551
     1552  PROCEDURE testStrExtractStringsQuoted_QuotedText1PartQuoteInside;
     1553  VAR
     1554    tmpResult : TStringList;
     1555    tmpString : String;
     1556  BEGIN
     1557    tmpResult := TStringList.Create;
     1558    tmpString := '"TeX"t';
     1559
     1560    StrExtractStringsQuoted(tmpResult, tmpString);
     1561    assertEqualsInt('testStrExtractStringsQuoted_QuotedText1PartQuoteInside', 2, tmpResult.count);
     1562    assertEqualsString('testStrExtractStringsQuoted_QuotedText1PartQuoteInside', 'TeX', tmpResult[0]);
     1563    assertEqualsString('testStrExtractStringsQuoted_QuotedText1PartQuoteInside', 't', tmpResult[1]);
     1564
     1565    tmpResult.Destroy;
     1566  END;
     1567
     1568
     1569  PROCEDURE testStrExtractStringsQuoted_QuotedText1Part2QuotesInside;
     1570  VAR
     1571    tmpResult : TStringList;
     1572    tmpString : String;
     1573  BEGIN
     1574    tmpResult := TStringList.Create;
     1575    tmpString := '"TeX""t"';
     1576
     1577    StrExtractStringsQuoted(tmpResult, tmpString);
     1578    assertEqualsInt('testStrExtractStringsQuoted_QuotedText1Part2QuotesInside', 1, tmpResult.count);
     1579    assertEqualsString('testStrExtractStringsQuoted_QuotedText1Part2QuotesInside', 'TeX"t', tmpResult[0]);
     1580
     1581    tmpResult.Destroy;
     1582  END;
     1583
     1584
     1585  PROCEDURE testStrExtractStringsQuoted_QuotedText1Part2Quotes;
     1586  VAR
     1587    tmpResult : TStringList;
     1588    tmpString : String;
     1589  BEGIN
     1590    tmpResult := TStringList.Create;
     1591    tmpString := '"""Te X""t"""';
     1592
     1593    StrExtractStringsQuoted(tmpResult, tmpString);
     1594    assertEqualsInt('testStrExtractStringsQuoted_QuotedText1Part2Quotes', 1, tmpResult.count);
     1595    assertEqualsString('testStrExtractStringsQuoted_QuotedText1Part2Quotes', '"Te X"t"', tmpResult[0]);
     1596
     1597    tmpResult.Destroy;
     1598  END;
     1599
     1600
     1601  PROCEDURE testStrExtractStringsQuoted_Only1Quote;
     1602  VAR
     1603    tmpResult : TStringList;
     1604    tmpString : String;
     1605  BEGIN
     1606    tmpResult := TStringList.Create;
     1607    tmpString := '"';
     1608
     1609    StrExtractStringsQuoted(tmpResult, tmpString);
     1610    assertEqualsInt('testStrExtractStringsQuoted_Only1Quote', 0, tmpResult.count);
     1611
     1612    tmpResult.Destroy;
     1613  END;
     1614
     1615
     1616  PROCEDURE testStrExtractStringsQuoted_Only1QuoteAndWhitespace;
     1617  VAR
     1618    tmpResult : TStringList;
     1619    tmpString : String;
     1620  BEGIN
     1621    tmpResult := TStringList.Create;
     1622    tmpString := ' " ';
     1623
     1624    StrExtractStringsQuoted(tmpResult, tmpString);
     1625    assertEqualsInt('testStrExtractStringsQuoted_Only1QuoteAndWhitespace', 1, tmpResult.count);
     1626    assertEqualsString('testStrExtractStringsQuoted_Only1QuoteAndWhitespace', ' ', tmpResult[0]);
     1627
     1628    tmpResult.Destroy;
     1629  END;
     1630
     1631
     1632  PROCEDURE testStrExtractStringsQuoted_QuoteStartsNewPart;
     1633  VAR
     1634    tmpResult : TStringList;
     1635    tmpString : String;
     1636  BEGIN
     1637    tmpResult := TStringList.Create;
     1638    tmpString := 'ab"c"';
     1639
     1640    StrExtractStringsQuoted(tmpResult, tmpString);
     1641    assertEqualsInt('testStrExtractStringsQuoted_QuoteStartsNewPart', 2, tmpResult.count);
     1642    assertEqualsString('testStrExtractStringsQuoted_QuoteStartsNewPart', 'ab', tmpResult[0]);
     1643    assertEqualsString('testStrExtractStringsQuoted_QuoteStartsNewPart', 'c', tmpResult[1]);
     1644
     1645    // note this is not compatible with the old behavior but more consistent
     1646    // tmpIndex  := 1;
     1647    // GetNextQuotedValue(tmpString, tmpIndex, s, '"');
     1648    // assertEqualsString('testGetNextQuotedValue', 'ab"c"', s);
     1649
     1650    tmpResult.Destroy;
     1651  END;
     1652
     1653
     1654  PROCEDURE testStrExtractStringsQuoted_ManyParts;
     1655  VAR
     1656    tmpResult : TStringList;
     1657    tmpString : String;
     1658  BEGIN
     1659    tmpResult := TStringList.Create;
     1660    tmpString := 'ab "c" """d" xy z  ""';
     1661
     1662    StrExtractStringsQuoted(tmpResult, tmpString);
     1663    assertEqualsInt('testStrExtractStringsQuoted_ManyParts', 6, tmpResult.count);
     1664    assertEqualsString('testStrExtractStringsQuoted_ManyParts', 'ab', tmpResult[0]);
     1665    assertEqualsString('testStrExtractStringsQuoted_ManyParts', 'c', tmpResult[1]);
     1666    assertEqualsString('testStrExtractStringsQuoted_ManyParts', '"d', tmpResult[2]);
     1667    assertEqualsString('testStrExtractStringsQuoted_ManyParts', 'xy', tmpResult[3]);
     1668    assertEqualsString('testStrExtractStringsQuoted_ManyParts', 'z', tmpResult[4]);
     1669    assertEqualsString('testStrExtractStringsQuoted_ManyParts', '', tmpResult[5]);
     1670
     1671    tmpResult.Destroy;
     1672  END;
     1673
     1674
     1675  // ----------------------------------------------------------
     1676
    14201677
    14211678
     
    15621819    result.add(@testStrInDoubleQuotes_Empty);
    15631820    result.add(@testStrInDoubleQuotes);
     1821
     1822    result.add(@testStrExtractStringsQuoted_Empty);
     1823    result.add(@testStrExtractStringsQuoted_OnlyWhitespace);
     1824    result.add(@testStrExtractStringsQuoted_OnlyText);
     1825    result.add(@testStrExtractStringsQuoted_OnlyText2Parts);
     1826    result.add(@testStrExtractStringsQuoted_TextAndWhitespace2Parts);
     1827    result.add(@testStrExtractStringsQuoted_QuotedText1Part);
     1828    result.add(@testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotes);
     1829    result.add(@testStrExtractStringsQuoted_QuotedText1PartNoClosingQuotesWhitewspace);
     1830    result.add(@testStrExtractStringsQuoted_QuotedText1PartQuoteInside);
     1831    result.add(@testStrExtractStringsQuoted_QuotedText1Part2QuotesInside);
     1832    result.add(@testStrExtractStringsQuoted_QuotedText1Part2Quotes);
     1833    result.add(@testStrExtractStringsQuoted_Only1Quote);
     1834    result.add(@testStrExtractStringsQuoted_Only1QuoteAndWhitespace);
     1835    result.add(@testStrExtractStringsQuoted_QuoteStartsNewPart);
     1836    result.add(@testStrExtractStringsQuoted_ManyParts);
     1837
    15641838  END;
    15651839
Note: See TracChangeset for help on using the changeset viewer.