- Timestamp:
- Apr 30, 2016, 7:49:57 PM (9 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Library/StringUtilsUnit.pas
r388 r390 2 2 3 3 // 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) 5 6 // This software is released under the GNU Public License - see readme.txt 6 7 … … 106 107 Function LongWordToStr(const aLongWord: LongWord) : String; 107 108 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; 109 117 110 118 // Returns aString enclosed in single quotes … … 116 124 // Extract all fields in a String delimited by whitespace (blank or tab). 117 125 // 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); 120 127 121 128 // returns the position of aPart in aString 122 129 // case insensitive 123 Function CaseInsensitivePos(const aPart: String; const aString: String ): longint;130 Function CaseInsensitivePos(const aPart: String; const aString: String) : longint; 124 131 125 132 // 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); 127 138 128 139 … … 668 679 669 680 681 // Hex conversion: sheer extravagance. Conversion from 682 // a hex digit char to int is done by creating a lookup table 683 // in advance. 684 var 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 670 737 Function StrInSingleQuotes(const aString : String) : String; 671 738 begin … … 680 747 681 748 682 Procedure StrExtractStringsQuoted(Var aResult: TStrings; const aReceiver: String 749 Procedure StrExtractStringsQuoted(Var aResult: TStrings; const aReceiver: String); 683 750 Var 684 751 tmpState : (WHITESPACE, INSIDE, START_QUOTE, INSIDE_QUOTED, INSIDE_QUOTED_START_QUOTE); … … 939 1006 end; 940 1007 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 941 1023 // -------------------- 942 1024 // ---- AnsiString ---- … … 1096 1178 end; 1097 1179 1098 END. 1180 1181 Initialization 1182 InitHexDigitMap; 1183 End. -
trunk/unittests/StringUtilsUnitTests.pas
r384 r390 1 1 Unit 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 2 8 3 9 Interface … … 1574 1580 1575 1581 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 1576 1672 PROCEDURE testStrInSingleQuotes_Empty; 1577 1673 VAR … … 1975 2071 1976 2072 1977 1978 2073 // ------------------------------------------------------------------- 1979 2074 … … 2066 2161 2067 2162 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); 2068 2221 END; 2069 2222 … … 2575 2728 result.add(@testStrInSingleQuotes_Empty); 2576 2729 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); 2577 2737 2578 2738 result.add(@testStrInDoubleQuotes_Empty); … … 2614 2774 result.add(@testLastPosOfChar_ManyHits); 2615 2775 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); 2616 2781 2617 2782 // --------------------
Note:
See TracChangeset
for help on using the changeset viewer.