Changeset 390 for trunk


Ignore:
Timestamp:
Apr 30, 2016, 7:49:57 PM (9 years ago)
Author:
RBRi
Message:

more string utils (merged from old 2.20)

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Library/StringUtilsUnit.pas

    r388 r390  
    22
    33// NewView - a new OS/2 Help Viewer
    4 // Copyright 2006-2007 Ronald Brill (rbri at rbri dot de)
     4// Copyright 2003-2006 Aaron Lawrence
     5// Copyright 2006-2009 Ronald Brill (rbri at rbri dot de)
    56// This software is released under the GNU Public License - see readme.txt
    67
     
    106107  Function LongWordToStr(const aLongWord: LongWord) : String;
    107108
    108   Function BoolToStr(const aBoolean : boolean ): string;
     109  Function BoolToStr(const aBoolean : Boolean ): String;
     110
     111  // Converts a hex string to a longint
     112  // May be upper or lower case
     113  // Does not allow a sign
     114  // Is not forgiving as StrToInt: all characters
     115  // must be valid hex chars.
     116  Function HexStrToLongInt(const aString : String ): longint;
    109117
    110118  // Returns aString enclosed in single quotes
     
    116124  // Extract all fields in a String delimited by whitespace (blank or tab).
    117125  // use double quotes if you need blanks in the strings
    118   Procedure StrExtractStringsQuoted(Var aResult: TStrings; const aReceiver: String );
    119 
     126  Procedure StrExtractStringsQuoted(Var aResult: TStrings; const aReceiver: String);
    120127
    121128  // returns the position of aPart in aString
    122129  // case insensitive
    123   Function CaseInsensitivePos(const aPart: String; const aString: String ): longint;
     130  Function CaseInsensitivePos(const aPart: String; const aString: String) : longint;
    124131
    125132  // Finds the last position of aChar within aString. Returns zero if no match
    126   Function LastPosOfChar(const aChar: char; const aString: String): longint;
     133  Function LastPosOfChar(const aChar: char; const aString: String) : longint;
     134
     135
     136  // Substitutes all occurences of given character with the replace char
     137  Procedure SubstituteAllOccurencesOfChar(var aReceiver: String; const aSearchChar: Char; const aReplaceChar: Char);
    127138
    128139
     
    668679
    669680
     681// Hex conversion: sheer extravagance. Conversion from
     682// a hex digit char to int is done by creating a lookup table
     683// in advance.
     684var
     685  MapHexDigitToInt: array[Chr(0) .. Chr(255)] of longint;
     686
     687  procedure InitHexDigitMap;
     688  var
     689    tmpChar : char;
     690    tmpIntValue : longint;
     691  begin
     692    for tmpChar := Chr(0) to Chr(255) do
     693    begin
     694      tmpIntValue := -1;
     695      if ( tmpChar >= '0') and (tmpChar <= '9') then
     696      begin
     697        tmpIntValue := Ord(tmpChar) - Ord('0');
     698      end;
     699
     700      if ( Upcase(tmpChar) >= 'A') and (Upcase(tmpChar) <= 'F') then
     701      begin
     702        tmpIntValue := 10 + Ord(Upcase(tmpChar)) - Ord('A');
     703      end;
     704
     705      MapHexDigitToInt[tmpChar] := tmpIntValue;
     706    end;
     707  end;
     708
     709
     710  Function HexDigitToInt(const aString : String; const aPosition : integer) : longint;
     711  begin
     712    Result := MapHexDigitToInt[aString[aPosition]];
     713    if Result = -1 then
     714    begin
     715      raise EConvertError.Create('Invalid hex char: ''' + aString[aPosition] + ''' in hex string ''' + aString +'''.' );
     716    end
     717  end;
     718
     719
     720  Function HexStrToLongInt(const aString : String) : longint;
     721  var
     722    i: integer;
     723  begin
     724    if Length(aString) = 0 then
     725    begin
     726      raise EConvertError.Create('No chars in hex string');
     727    end;
     728
     729    Result := 0;
     730    for i:= 1 to Length(aString) do
     731    begin
     732      Result := Result shl 4;
     733      inc(Result, HexDigitToInt(aString, i));
     734    end;
     735  end;
     736
    670737  Function StrInSingleQuotes(const aString : String) : String;
    671738  begin
     
    680747
    681748
    682   Procedure StrExtractStringsQuoted(Var aResult: TStrings; const aReceiver: String );
     749  Procedure StrExtractStringsQuoted(Var aResult: TStrings; const aReceiver: String);
    683750  Var
    684751    tmpState : (WHITESPACE, INSIDE, START_QUOTE, INSIDE_QUOTED, INSIDE_QUOTED_START_QUOTE);
     
    9391006  end;
    9401007
     1008
     1009  Procedure SubstituteAllOccurencesOfChar(var aReceiver: String; const aSearchChar: Char; const aReplaceChar: Char );
     1010  var
     1011    i : longint;
     1012  begin
     1013    for i :=1 to length(aReceiver) do
     1014    begin
     1015      if aReceiver[i] = aSearchChar then
     1016      begin
     1017        aReceiver[i] := aReplaceChar;
     1018      end
     1019    end
     1020  end;
     1021
     1022
    9411023  // --------------------
    9421024  // ---- AnsiString ----
     
    10961178  end;
    10971179
    1098 END.
     1180
     1181Initialization
     1182  InitHexDigitMap;
     1183End.
  • trunk/unittests/StringUtilsUnitTests.pas

    r384 r390  
    11Unit StringUtilsUnitTests;
     2
     3// NewView - a new OS/2 Help Viewer
     4// Copyright 2006-2009 Ronald Brill (rbri at rbri dot de)
     5// This software is released under the GNU Public License - see readme.txt
     6
     7// UnitTests for StringUtilsUnit
    28
    39Interface
     
    15741580
    15751581
     1582  PROCEDURE testHexStrToLongInt_Empty;
     1583  VAR
     1584    tmpResult : LongInt;
     1585  BEGIN
     1586    tmpResult := -1;
     1587    try
     1588      tmpResult := HexStrToLongInt('');
     1589    except
     1590      on e:EConvertError do
     1591      begin
     1592        assertEqualsString('testHexStrToLongInt_Empty', 'No chars in hex string', e.message);
     1593      end;
     1594    end;
     1595
     1596
     1597    assertEqualsInt('testHexStrToLongInt_Empty', -1, tmpResult);
     1598  END;
     1599
     1600
     1601  PROCEDURE testHexStrToLongInt_IllegalChar;
     1602  VAR
     1603    tmpResult : LongInt;
     1604  BEGIN
     1605    tmpResult := -1;
     1606    try
     1607      tmpResult := HexStrToLongInt('abG');
     1608    except
     1609      on e:EConvertError do
     1610      begin
     1611        assertEqualsString('testHexStrToLongInt_IllegalChar', 'Invalid hex char: ''G'' in hex string ''abG''.', e.message);
     1612      end;
     1613    end;
     1614
     1615
     1616    assertEqualsInt('testHexStrToLongInt_IllegalChar', -1, tmpResult);
     1617  END;
     1618
     1619
     1620  PROCEDURE testHexStrToLongInt_IllegalCharMinus;
     1621  VAR
     1622    tmpResult : LongInt;
     1623  BEGIN
     1624    tmpResult := -1;
     1625    try
     1626      tmpResult := HexStrToLongInt('-F3');
     1627    except
     1628      on e:EConvertError do
     1629      begin
     1630        assertEqualsString('testHexStrToLongInt_IllegalCharMinus', 'Invalid hex char: ''-'' in hex string ''-F3''.', e.message);
     1631      end;
     1632    end;
     1633
     1634
     1635    assertEqualsInt('testHexStrToLongInt_IllegalCharMinus', -1, tmpResult);
     1636  END;
     1637
     1638
     1639  PROCEDURE testHexStrToLongInt_Zero;
     1640  VAR
     1641    tmpResult : LongInt;
     1642  BEGIN
     1643    tmpResult := HexStrToLongInt('000');
     1644
     1645    assertEqualsInt('testHexStrToLongInt_Zero', 0, tmpResult);
     1646  END;
     1647
     1648
     1649  PROCEDURE testHexStrToLongInt_Ten;
     1650  VAR
     1651    tmpResult : LongInt;
     1652  BEGIN
     1653    tmpResult := HexStrToLongInt('A');
     1654
     1655    assertEqualsInt('testHexStrToLongInt_Ten', 10, tmpResult);
     1656  END;
     1657
     1658
     1659  PROCEDURE testHexStrToLongInt_Big;
     1660  VAR
     1661    tmpResult : LongInt;
     1662  BEGIN
     1663    tmpResult := HexStrToLongInt('7fffFFFF');
     1664
     1665    assertEqualsLongWord('testHexStrToLongInt_Big', 2147483647, tmpResult);
     1666  END;
     1667
     1668
     1669  // ----------------------------------------------------------
     1670
     1671
    15761672  PROCEDURE testStrInSingleQuotes_Empty;
    15771673  VAR
     
    19752071
    19762072
    1977 
    19782073  // -------------------------------------------------------------------
    19792074
     
    20662161
    20672162    assertEqualsInt('testLastPosOfChar_ManyHits', 7, tmpResult);
     2163  END;
     2164
     2165
     2166  // -------------------------------------------------------------------
     2167
     2168
     2169  PROCEDURE testSubstituteAllOccurencesOfChar_Empty;
     2170  VAR
     2171    tmpResult : String;
     2172  BEGIN
     2173    tmpResult := '';
     2174    SubstituteAllOccurencesOfChar(tmpResult, 'x', 'y');
     2175
     2176    assertEqualsString('testSubstituteAllOccurencesOfChar_Empty', '', tmpResult);
     2177  END;
     2178
     2179
     2180  PROCEDURE testSubstituteAllOccurencesOfChar_NotFound;
     2181  VAR
     2182    tmpResult : String;
     2183  BEGIN
     2184    tmpResult := 'abc';
     2185    SubstituteAllOccurencesOfChar(tmpResult, 'x', 'y');
     2186
     2187    assertEqualsString('testSubstituteAllOccurencesOfChar_NotFound', 'abc', tmpResult);
     2188  END;
     2189
     2190
     2191  PROCEDURE testSubstituteAllOccurencesOfChar_OneCharReplace;
     2192  VAR
     2193    tmpResult : String;
     2194  BEGIN
     2195    tmpResult := 'x';
     2196    SubstituteAllOccurencesOfChar(tmpResult, 'x', 'y');
     2197
     2198    assertEqualsString('testSubstituteAllOccurencesOfChar_OneCharReplace', 'y', tmpResult);
     2199  END;
     2200
     2201
     2202  PROCEDURE testSubstituteAllOccurencesOfChar_ReplaceAll;
     2203  VAR
     2204    tmpResult : String;
     2205  BEGIN
     2206    tmpResult := 'xxxx';
     2207    SubstituteAllOccurencesOfChar(tmpResult, 'x', 'y');
     2208
     2209    assertEqualsString('testSubstituteAllOccurencesOfChar_ReplaceAll', 'yyyy', tmpResult);
     2210  END;
     2211
     2212
     2213  PROCEDURE testSubstituteAllOccurencesOfChar_Some;
     2214  VAR
     2215    tmpResult : String;
     2216  BEGIN
     2217    tmpResult := 'xabxcxddx';
     2218    SubstituteAllOccurencesOfChar(tmpResult, 'x', 'y');
     2219
     2220    assertEqualsString('testSubstituteAllOccurencesOfChar_Some', 'yabycyddy', tmpResult);
    20682221  END;
    20692222
     
    25752728    result.add(@testStrInSingleQuotes_Empty);
    25762729    result.add(@testStrInSingleQuotes);
     2730
     2731    result.add(@testHexStrToLongInt_Empty);
     2732    result.add(@testHexStrToLongInt_IllegalChar);
     2733    result.add(@testHexStrToLongInt_IllegalCharMinus);
     2734    result.add(@testHexStrToLongInt_Zero);
     2735    result.add(@testHexStrToLongInt_Ten);
     2736    result.add(@testHexStrToLongInt_Big);
    25772737
    25782738    result.add(@testStrInDoubleQuotes_Empty);
     
    26142774    result.add(@testLastPosOfChar_ManyHits);
    26152775
     2776    result.add(@testSubstituteAllOccurencesOfChar_Empty);
     2777    result.add(@testSubstituteAllOccurencesOfChar_NotFound);
     2778    result.add(@testSubstituteAllOccurencesOfChar_OneCharReplace);
     2779    result.add(@testSubstituteAllOccurencesOfChar_ReplaceAll);
     2780    result.add(@testSubstituteAllOccurencesOfChar_Some);
    26162781
    26172782  // --------------------
Note: See TracChangeset for help on using the changeset viewer.