OSDN Git Service

・コード整理
authoryoffy <yoffy>
Sun, 21 Sep 2003 08:46:17 +0000 (08:46 +0000)
committeryoffy <yoffy>
Sun, 21 Sep 2003 08:46:17 +0000 (08:46 +0000)
Editor.pas
Favorite.pas
GikoXMLDoc.pas [new file with mode: 0644]
Trip.pas [new file with mode: 0644]
YofUtils.pas

index b5d1175..283bb49 100644 (file)
@@ -10,7 +10,7 @@ uses
 {$ELSE}
        SHDocVw_TLB,
 {$IFEND}
-       ActiveX, {HTTPApp,} YofUtils, IniFiles, StrUtils,
+       ActiveX, {HTTPApp,} YofUtils, Trip, IniFiles, StrUtils,
        GikoSystem, GikoUtil, ImgList, Clipbrd, BoardGroup,
        IdAntiFreezeBase,       IdAntiFreeze, IdBaseComponent, IdComponent,
        IdTCPConnection, IdTCPClient, IdHTTP, ActnList, StdActns, IdIntercept,
index 87b2135..f991b9e 100644 (file)
@@ -4,7 +4,7 @@ interface
 
 uses
        Messages, SysUtils, Classes, Contnrs, ComCtrls, {HttpApp,} YofUtils,
-       GikoSystem{, XMLIntf, XMLDoc};
+       GikoSystem{, XMLIntf, XMLDoc}, GikoXMLDoc;
        {SAX, SAXHelpers, SAXComps, SAXKW;}
 
 type
diff --git a/GikoXMLDoc.pas b/GikoXMLDoc.pas
new file mode 100644 (file)
index 0000000..3aad7e0
--- /dev/null
@@ -0,0 +1,448 @@
+unit GikoXMLDoc;
+
+{
+       XMLIntf, XMLDoc \82 \82½\82è\82Ì\83N\83\8d\81[\83\93
+  Delphi 6 Personal \97p
+}
+interface
+
+//==================================================
+uses
+//==================================================
+
+       Classes, SysUtils,
+       YofUtils;
+
+//==================================================
+type
+//==================================================
+
+       // \82í\82¯\82í\82©\82ç\82¸\8dì\82Á\82Ä\82é\82©\82ç\83o\83O\82¾\82ç\82¯\82©\82à
+       XMLDictionary = Record
+               Name : string;
+               Value : string;
+       end;
+
+       IXMLNode = class
+       private
+               FNodeName : string;
+               FCount : Integer;
+               FAttributeCount : Integer;
+               FChildNodes : IXMLNode;
+               FNodes : array of IXMLNode;
+               FAttributes : array of XMLDictionary;
+               function GetAttribute( const Name : string ) : string;
+               function GetNode( Index : Integer ) : IXMLNode;
+       public
+               constructor Create;
+
+               property NodeName : string read FNodeName write FNodeName;
+               property Attributes[ const Name : string ] : string read GetAttribute;
+               property Node[ Index : Integer ] : IXMLNode read GetNode; default;
+               property ChildNodes : IXMLNode read FChildNodes write FChildNodes;
+               property Count : Integer read FCount write FCount;
+               procedure Add( node : IXMLNode );
+               procedure AddAttribute( const Name : string; const Value : string );
+       end;
+
+       IXMLDocument = class( IXMLNode )
+       private
+               function GetDocumentElement() : IXMLNode;
+       public
+               property DocumentElement : IXMLNode read GetDocumentElement;
+       end;
+
+function XMLCloseCheck(
+       var f : TFileStream;
+       var node : IXMLNode;
+       ch : char;
+       out tag : string;
+       out closed : boolean // \8cÄ\82Ñ\8fo\82µ\82½\83\8b\81[\83`\83\93\82ª node \82ð\95Â\82\82é\82×\82«\82È\82ç true
+) : boolean; // ch \82ð\82±\82Ì\83\8b\81[\83`\83\93\82ª\8f\88\97\9d\82µ\82½\82È\82ç true
+
+function XMLReadNode(
+       var f : TFileStream;
+       var node : IXMLNode
+) : string; // node \88È\8aO\82Ì\83m\81[\83h\82ª\95Â\82\82ç\82ê\82½\8fê\8d\87\82Ì\83m\81[\83h\96¼
+
+function LoadXMLDocument(
+       const fileName : string
+) : IXMLDocument;
+
+//==================================================
+const
+//==================================================
+       kXMLWhite : TSysCharSet = [#0..#$20];
+       kXMLDQuote : TSysCharSet = ['"'];
+       kXMLTagStart : TSysCharSet = ['<'];
+       kXMLTagEnd : TSysCharSet = ['>'];
+       kXMLKanji : TSysCharSet = [#$80..#$A0, #$E0..#$ff];
+
+//==================================================
+implementation
+//==================================================
+
+// Constructor
+constructor IXMLNode.Create();
+begin
+
+       FCount := 0;
+
+end;
+
+function IXMLNode.GetAttribute( const Name : string ) : string;
+var
+       i : Integer;
+begin
+
+       i := 0;
+       while i < FAttributeCount do
+       begin
+               if Name = FAttributes[ i ].Name then
+               begin
+                       Result := FAttributes[ i ].Value;
+                       exit;
+               end;
+
+               Inc( i );
+       end;
+
+end;
+
+function IXMLNode.GetNode( Index : Integer ) : IXMLNode;
+begin
+
+       Result := FNodes[ Index ];
+
+end;
+
+procedure IXMLNode.Add( node : IXMLNode );
+begin
+
+       Inc( FCount );
+       SetLength( FNodes, FCount );
+       FNodes[ FCount - 1 ] := node;
+
+end;
+
+procedure IXMLNode.AddAttribute(
+       const Name : string;
+       const Value : string
+);
+var
+       index : Integer;
+begin
+
+       index := FAttributeCount;
+       Inc( FAttributeCount );
+       SetLength( FAttributes, FAttributeCount );
+       FAttributes[ index ].Name := Name;
+       FAttributes[ index ].Value := Value;
+
+end;
+
+function IXMLDocument.GetDocumentElement() : IXMLNode;
+begin
+
+       Result := FChildNodes[ 0 ];
+
+end;
+
+// untilSet \82É\82È\82é\82Ü\82Å\94ò\82Î\82·
+procedure FileThruUntil(
+       var f : TFileStream;
+       const untilSet : TSysCharSet
+);
+var
+       ch : char;
+begin
+
+       while f.Position < f.Size do
+       begin
+               f.ReadBuffer( ch, 1 );
+               if ch in untilSet then
+               begin
+                       f.Seek( -1, soFromCurrent );
+                       exit;
+               end else if ch in kXMLKanji then
+                       f.Seek( 1, soFromCurrent );
+       end;
+
+end;
+
+// whileSet \82Ì\8aÔ\94ò\82Î\82·
+procedure FileThruWhile(
+       var f : TFileStream;
+       const whileSet : TSysCharSet
+);
+var
+       ch : char;
+begin
+
+       while f.Position < f.Size do
+       begin
+               f.ReadBuffer( ch, 1 );
+               if ch in whileSet then
+               begin
+                       if ch in kXMLKanji then
+                               f.ReadBuffer( ch, 1 );
+               end else begin
+                       f.Seek( -1, soFromCurrent );
+                       exit;
+               end;
+       end;
+
+end;
+
+function XMLCloseCheck(
+       var f : TFileStream;
+       var node : IXMLNode;
+       ch : char;
+       out tag : string;
+       out closed : boolean
+) : boolean; // ch \82ð\82±\82Ì\83\8b\81[\83`\83\93\82ª\8f\88\97\9d\82µ\82½\82È\82ç true
+var
+       last : Integer;
+       tagLen : Integer;
+begin
+
+       closed := false;
+       Result := false;
+       tag := '';
+
+       if ch = '>' then
+       begin
+               // \8aJ\8en\83^\83O\82Ì\8dÅ\8cã\82Ü\82Å\93Ç\82ñ\82¾
+               Result := true;
+       end else if ch = '?' then
+       begin
+               // <?xml?> \82Ý\82½\82¢\82È\82â\82Â\81B\82æ\82Á\82Ä\96³\8e\8b
+               FileThruUntil( f, kXMLTagEnd );
+               FileThruUntil( f, kXMLTagStart );
+               f.Seek( 1, soFromCurrent );
+               FileThruWhile( f, kXMLWhite );
+               //closed := true;
+               Result := true;
+       end else if ch = '/' then
+       begin
+               // \83^\83O\96¼\82ð\93Ç\82Ý\8d\9e\82ñ\82Å\95Ô\82·
+               last := f.Position;
+               FileThruUntil( f, kXMLTagEnd );
+               tagLen := f.Position - last;
+               SetLength( tag, tagLen );
+
+               f.Seek( last, soFromBeginning );
+               f.ReadBuffer( PChar( tag )^, tagLen );
+
+               f.Seek( f.Position + 1, soFromBeginning ); // '>' \94ò\82Î\82µ
+               closed := true;
+               Result := true;
+       end;
+
+end;
+
+function XMLReadNode(
+       var f : TFileStream;
+       var node : IXMLNode
+) : string; // node \88È\8aO\82Ì\83m\81[\83h\82ª\95Â\82\82ç\82ê\82½\8fê\8d\87\82Ì\83m\81[\83h\96¼
+var
+       child : IXMLNode;
+
+       last : Integer;
+       tag : string;
+       tagLen : Integer;
+
+       isClosed : boolean;
+
+       attributeName : string;
+       attributeValue : string;
+
+       ch : char;
+label
+       NextNode;
+begin
+       try
+               // node \82Ì\93Ç\82Ý\8d\9e\82Ý(1 \83\8b\81[\83v\82É\82Â\82« 1 \83m\81[\83h)
+               node.ChildNodes := IXMLNode.Create;
+
+               while f.Position < f.Size do
+               begin
+                       // NodeName \93Ç\82Ý\8d\9e\82Ý
+                       FileThruWhile( f, kXMLWhite );
+
+                       while f.Position < f.Size do
+                       begin
+                               f.ReadBuffer( ch, 1 );
+
+                               if XMLCloseCheck( f, node, ch, tag, isClosed ) then
+                               begin
+                                       if isClosed then
+                                       begin
+                                               Result := tag;
+                                               exit;
+                                       end;
+
+                                       goto NextNode;
+                               end else if ch = '<' then
+                               begin
+                                       // \90V\8bK\83m\81[\83h
+                                       child := IXMLNode.Create;
+                                       tag := XMLReadNode( f, child );
+                                       node.ChildNodes.Add( child );
+
+                                       // \83^\83O\82ª\95Â\82\82ç\82ê\82½
+                                       if Length( tag ) > 0 then
+                                       begin
+                                               // \8e©\95ª\82Ì\82à\82Ì\82©\83`\83F\83b\83N\82µ\82Ä\81A\88á\82¦\82Î\90e\82É\95Ô\82·
+                                               if tag <> node.NodeName then
+                                                       Result := tag;
+                                               exit;
+                                       end;
+
+                                       goto NextNode;
+                               end else if ch in kXMLWhite then
+                               begin
+                                       // NodeName \8a®\97¹
+                                       break;
+                               end else begin
+                                       node.NodeName := node.NodeName + ch;
+
+                                       if ch in kXMLKanji then
+                                       begin
+                                               f.ReadBuffer( ch, 1 );
+                                               node.NodeName := node.NodeName + ch;
+                                       end;
+                               end;
+                       end;
+
+                       // Attribute \82Ì\93Ç\82Ý\8d\9e\82Ý
+                       while f.Position < f.Size do
+                       begin
+                               // Attribute \82Ì\96¼\91O\82ð\93Ç\82Ý\8d\9e\82Ý
+                               attributeName := '';
+                               attributeValue := '';
+
+                               FileThruWhile( f, kXMLWhite );
+
+                               while f.Position < f.Size do
+                               begin
+                                       f.ReadBuffer( ch, 1 );
+
+                                       if XMLCloseCheck( f, node, ch, tag, isClosed ) then
+                                       begin
+                                               if isClosed then
+                                               begin
+                                                       // \83^\83O\82ª\95Â\82\82ç\82ê\82½\82Ì\82Å\83\8a\83^\81[\83\93
+                                                       // \81¦NodeName \82ð\92Ê\89ß\82µ\82Ä\82é\82Ì\82Å\93r\92\86\82Å\95Â\82\82Ä\82é\82±\82Æ\82É\82È\82é\81B
+                                                       // \82æ\82Á\82Ä\93Æ\97§\83m\81[\83h\81B
+                                                       exit;
+                                               end;
+
+                                               // \8e\9f\82Ì\83m\81[\83h\82Ö
+                                               goto NextNode;
+                                       end else if ch = '=' then
+                                       begin
+                                               // \82±\82±\82©\82ç\82Í\92l\82ª\8en\82Ü\82é\82Ì\82Å\96¼\91O\82Í\8fI\97¹
+                                               break;
+                                       end else if ch in kXMLWhite then
+                                       begin
+                                               // Value \82ª\91\8dÝ\82µ\82È\82¢(\8bK\8ai\8aO)\82Ì\82Å\8e\9f\82Ì\83m\81[\83h\82Ö
+                                               goto NextNode;
+                                       end else begin
+                                               attributeName := attributeName + ch;
+
+                                               if ch in kXMLKanji then
+                                               begin
+                                                       f.ReadBuffer( ch, 1 );
+                                                       attributeName := attributeName + ch;
+                                               end;
+                                       end;
+                               end;
+
+                               // Attribute \82Ì\92l\82ð\93Ç\82Ý\8d\9e\82Ý
+                               FileThruWhile( f, kXMLWhite );
+
+                               while f.Position < f.Size do
+                               begin
+                                       f.ReadBuffer( ch, 1 );
+
+                                       if XMLCloseCheck( f, node, ch, tag, isClosed ) then
+                                       begin
+                                               if isClosed then
+                                               begin
+                                                       if Length( attributeName ) > 0 then
+                                                               // \8bK\8ai\8aO\82¾\82¯\82Ç\82Ë
+                                                               node.AddAttribute( attributeName, attributeValue );
+
+                                                       // \83^\83O\82ª\95Â\82\82ç\82ê\82½\82Ì\82Å\83\8a\83^\81[\83\93
+                                                       // \81¦NodeName \82ð\92Ê\89ß\82µ\82Ä\82é\82Ì\82Å\93r\92\86\82Å\95Â\82\82Ä\82é\82±\82Æ\82É\82È\82é\81B
+                                                       // \82æ\82Á\82Ä\93Æ\97§\83m\81[\83h\81B
+                                                       exit;
+                                               end;
+
+                                               // \8e\9f\82Ì\83m\81[\83h\82Ö
+                                               goto NextNode;
+                                       end else if ch = '"' then
+                                       begin
+                                               // \92l\82ª "" \82Å\8a\87\82ç\82ê\82Ä\82é\82Ì\82Å(\82Ä\82¢\82¤\82©\8a\87\82ç\82ê\82Ä\82È\82«\82á\82¢\82¯\82È\82¢\82ñ\82¾\82¯\82Ç)
+                                               // \92l\82ð\88ê\8a\87\93Ç\82Ý\8d\9e\82Ý
+                                               last := f.Position;
+                                               FileThruUntil( f, kXMLDQuote );
+                                               tagLen := f.Position - last;
+                                               SetLength( attributeValue, tagLen );
+
+                                               f.Seek( last, soFromBeginning );
+                                               f.ReadBuffer( PChar( attributeValue )^, tagLen );
+
+                                               node.AddAttribute( attributeName, HtmlDecode( attributeValue ) );
+
+                                               // \92l\82ð\93Ç\82Ý\8fI\82í\82Á\82½\82Ì\82Å\8fI\97¹
+                                               f.Seek( f.Position + 1, soFromBeginning ); // '"' \94ò\82Î\82µ
+                                               break;
+                                       end else if ch in kXMLWhite then
+                                       begin
+                                               // \8bK\8ai\8aO\82¾\82¯\82Ç\82Ë
+                                               node.AddAttribute( attributeName, HtmlDecode( attributeValue ) );
+
+                                               goto NextNode;
+                                       end else begin
+                                               // \8bK\8ai\8aO\82¾\82¯\82Ç\88ê\89\9e\8eæ\82Á\82Ä\82¨\82­
+                                               attributeValue := attributeValue + ch;
+
+                                               if ch in kXMLKanji then
+                                               begin
+                                                       f.ReadBuffer( ch, 1 );
+                                                       attributeValue := attributeValue + ch;
+                                               end;
+                                       end;
+                               end;
+                       end; // Attribute \82Ì\93Ç\82Ý\8d\9e\82Ý
+
+                       NextNode:;
+               end; // // node \82Ì\93Ç\82Ý\8d\9e\82Ý(1 \83\8b\81[\83v\82É\82Â\82« 1 \83m\81[\83h)
+       finally
+       end;
+end;
+
+function LoadXMLDocument(
+       const fileName : string
+) : IXMLDocument;
+type
+       xmlMode = ( xmlHoge );
+var
+       xmlFile : TFileStream;
+       doc : IXMLDocument;
+begin
+
+       doc := IXMLDocument.Create;
+
+       xmlFile := TFileStream.Create( fileName, fmOpenRead );
+       XMLReadNode( xmlFile, IXMLNode( doc ) );
+       xmlFile.Free;
+
+       Result := doc;
+
+end;
+
+end.
\ No newline at end of file
diff --git a/Trip.pas b/Trip.pas
new file mode 100644 (file)
index 0000000..4a3c280
--- /dev/null
+++ b/Trip.pas
@@ -0,0 +1,468 @@
+unit Trip;
+
+{
+       \83g\83\8a\83b\83v\82Ì\90\90¬
+
+       http://ghanyan.monazilla.org/trip.html
+       \82ð\8c³\82É\83M\83R\83i\83r\97p\82É\88Ú\90A\82³\82¹\82Ä\82¢\82½\82¾\82«\82Ü\82µ\82½\81B
+}
+interface
+
+type
+       CryptBlock = record
+               b_data : array [0..63] of char;
+       end;
+       PCryptBlock = ^CryptBlock;
+
+       CryptOrdering = record
+               o_data : array [0..63] of char;
+       end;
+
+       CryptData = record
+               Key : CryptBlock;
+               EP : ^CryptOrdering;
+       end;
+
+// \83g\83\8a\83b\83v\82Ì\90\90¬
+function get_2ch_trip(
+       const pw : PChar        // \8c³\82É\82È\82é\83p\83X\83\8f\81[\83h
+) : string;                                    // \90\90¬\82³\82ê\82½\83g\83\8a\83b\83v
+
+const
+       kCryptInitialTr : CryptOrdering = ( o_data: (
+               #58,#50,#42,#34,#26,#18,#10, #2,#60,#52,#44,#36,#28,#20,#12, #4,
+               #62,#54,#46,#38,#30,#22,#14, #6,#64,#56,#48,#40,#32,#24,#16, #8,
+               #57,#49,#41,#33,#25,#17, #9, #1,#59,#51,#43,#35,#27,#19,#11, #3,
+               #61,#53,#45,#37,#29,#21,#13, #5,#63,#55,#47,#39,#31,#23,#15, #7
+       ) );
+
+       kCryptFinalTr : CryptOrdering = ( o_data: (
+               #40, #8,#48,#16,#56,#24,#64,#32,#39, #7,#47,#15,#55,#23,#63,#31,
+               #38, #6,#46,#14,#54,#22,#62,#30,#37, #5,#45,#13,#53,#21,#61,#29,
+               #36, #4,#44,#12,#52,#20,#60,#28,#35, #3,#43,#11,#51,#19,#59,#27,
+               #34, #2,#42,#10,#50,#18,#58,#26,#33, #1,#41, #9,#49,#17,#57,#25
+       ) );
+
+       kCryptSwap : CryptOrdering = ( o_data: (
+               #33,#34,#35,#36,#37,#38,#39,#40,#41,#42,#43,#44,#45,#46,#47,#48,
+               #49,#50,#51,#52,#53,#54,#55,#56,#57,#58,#59,#60,#61,#62,#63,#64,
+                #1, #2, #3, #4, #5, #6, #7, #8, #9,#10,#11,#12,#13,#14,#15,#16,
+               #17,#18,#19,#20,#21,#22,#23,#24,#25,#26,#27,#28,#29,#30,#31,#32
+       ) );
+
+       kCryptKeyTr1 : CryptOrdering = ( o_data: (
+               #57, #49, #41, #33, #25, #17, #9,        #1, #58, #50, #42, #34, #26, #18,
+               #10,    #2, #59, #51, #43, #35, #27, #19, #11,  #3, #60, #52, #44, #36,
+               #63, #55, #47, #39, #31, #23, #15,      #7, #62, #54, #46, #38, #30, #22,
+               #14,    #6, #61, #53, #45, #37, #29, #21, #13,  #5, #28, #20, #12,      #4,
+               #0,     #0,     #0,     #0,     #0,     #0,     #0,     #0
+       ) );
+
+       kCryptKeyTr2 : CryptOrdering = ( o_data: (
+               #14,#17,#11,#24, #1, #5, #3,#28,#15, #6,#21,#10,
+               #23,#19,#12, #4,#26, #8,#16, #7,#27,#20,#13, #2,
+               #41,#52,#31,#37,#47,#55,#30,#40,#51,#45,#33,#48,
+               #44,#49,#39,#56,#34,#53,#46,#42,#50,#36,#29,#32,
+                #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0,
+                #0, #0, #0, #0
+       ) );
+
+       kCryptEtr : CryptOrdering = ( o_data: (
+               #32, #1, #2, #3, #4, #5, #4, #5, #6, #7, #8, #9,
+                #8, #9,#10,#11,#12,#13,#12,#13,#14,#15,#16,#17,
+               #16,#17,#18,#19,#20,#21,#20,#21,#22,#23,#24,#25,
+               #24,#25,#26,#27,#28,#29,#28,#29,#30,#31,#32, #1,
+                #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0,
+                #0, #0, #0, #0
+       ) );
+
+       kCryptPtr : CryptOrdering = ( o_data: (
+               #16, #7,#20,#21,#29,#12,#28,#17, #1,#15,#23,#26, #5,#18,#31,#10,
+                #2, #8,#24,#14,#32,#27, #3, #9,#19,#13,#30, #6,#22,#11, #4,#25,
+                #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0,
+                #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0
+       ) );
+
+       kCryptS_boxes : array [ 0..7, 0..63 ] of Char = (
+       (       #14, #4,#13, #1, #2,#15,#11, #8, #3,#10, #6,#12, #5, #9, #0, #7,
+                #0,#15, #7, #4,#14, #2,#13, #1,#10, #6,#12,#11, #9, #5, #3, #8,
+                #4, #1,#14, #8,#13, #6, #2,#11,#15,#12, #9, #7, #3,#10, #5, #0,
+               #15,#12, #8, #2, #4, #9, #1, #7, #5,#11, #3,#14,#10, #0, #6,#13
+       ),
+
+       (       #15, #1, #8,#14, #6,#11, #3, #4, #9, #7, #2,#13,#12, #0, #5,#10,
+                #3,#13, #4, #7,#15, #2, #8,#14,#12, #0, #1,#10, #6, #9,#11, #5,
+                #0,#14, #7,#11,#10, #4,#13, #1, #5, #8,#12, #6, #9, #3, #2,#15,
+               #13, #8,#10, #1, #3,#15, #4, #2,#11, #6, #7,#12, #0, #5,#14, #9
+       ),
+
+       (       #10, #0, #9,#14, #6, #3,#15, #5, #1,#13,#12, #7,#11, #4, #2, #8,
+               #13, #7, #0, #9, #3, #4, #6,#10, #2, #8, #5,#14,#12,#11,#15, #1,
+               #13, #6, #4, #9, #8,#15, #3, #0,#11, #1, #2,#12, #5,#10,#14, #7,
+                #1,#10,#13, #0, #6, #9, #8, #7, #4,#15,#14, #3,#11, #5, #2,#12
+       ),
+
+       (        #7,#13,#14, #3, #0, #6, #9,#10, #1, #2, #8, #5,#11,#12, #4,#15,
+               #13, #8,#11, #5, #6,#15, #0, #3, #4, #7, #2,#12, #1,#10,#14, #9,
+               #10, #6, #9, #0,#12,#11, #7,#13,#15, #1, #3,#14, #5, #2, #8, #4,
+                #3,#15, #0, #6,#10, #1,#13, #8, #9, #4, #5,#11,#12, #7, #2,#14
+       ),
+
+       (        #2,#12, #4, #1, #7,#10,#11, #6, #8, #5, #3,#15,#13, #0,#14, #9,
+               #14,#11, #2,#12, #4, #7,#13, #1, #5, #0,#15,#10, #3, #9, #8, #6,
+                #4, #2, #1,#11,#10,#13, #7, #8,#15, #9,#12, #5, #6, #3, #0,#14,
+               #11, #8,#12, #7, #1,#14, #2,#13, #6,#15, #0, #9,#10, #4, #5, #3
+       ),
+
+       (       #12, #1,#10,#15, #9, #2, #6, #8, #0,#13, #3, #4,#14, #7, #5,#11,
+               #10,#15, #4, #2, #7,#12, #9, #5, #6, #1,#13,#14, #0,#11, #3, #8,
+                #9,#14,#15, #5, #2, #8,#12, #3, #7, #0, #4,#10, #1,#13,#11, #6,
+                #4, #3, #2,#12, #9, #5,#15,#10,#11,#14, #1, #7, #6, #0, #8,#13
+       ),
+
+       (        #4,#11, #2,#14,#15, #0, #8,#13, #3,#12, #9, #7, #5,#10, #6, #1,
+               #13, #0,#11, #7, #4, #9, #1,#10,#14, #3, #5,#12, #2,#15, #8, #6,
+                #1, #4,#11,#13,#12, #3, #7,#14,#10,#15, #6, #8, #0, #5, #9, #2,
+                #6,#11,#13, #8, #1, #4,#10, #7, #9, #5, #0,#15,#14, #2, #3,#12
+       ),
+
+       (       #13, #2, #8, #4, #6,#15,#11, #1,#10, #9, #3,#14, #5, #0,#12, #7,
+                #1,#15,#13, #8,#10, #3, #7, #4,#12, #5, #6,#11, #0,#14, #9, #2,
+                #7,#11, #4, #1, #9,#12,#14, #2, #0, #6,#10,#13,#15, #3, #5, #8,
+                #2, #1,#14, #7, #4,#10, #8,#13,#15,#12, #9, #0, #3, #5, #6,#11
+       )
+       );
+
+       kCryptRots : array [ 0..15 ] of Integer = (
+               1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
+       );
+
+implementation
+
+procedure memcpy(
+       dst : PChar;
+       src : PChar;
+       size : Integer
+);
+begin
+
+       while size > 0 do
+       begin
+               dst^ := src^;
+               Inc( dst );
+               Inc( src );
+               Dec( size );
+       end;
+
+end;
+
+procedure transpose(
+       var data : CryptBlock;
+       var t : CryptOrdering;
+       n : Integer
+);
+var
+       x : CryptBlock;
+begin
+       x := data;
+
+       while n > 0 do
+       begin
+               Dec( n );
+               data.b_data[ n ] := x.b_data[ Integer( t.o_data[ n ] ) - 1 ];
+       end;
+end;
+
+procedure rotate(
+       var key : CryptBlock
+);
+var
+       p : PChar;
+       ep : PChar;
+       data0, data28 : Char;
+begin
+
+       p := key.b_data;
+       ep := @(key.b_data[ 55 ]);
+       data0 := key.b_data[ 0 ];
+       data28 := key.b_data[ 28 ];
+
+       while p < ep do
+       begin
+               Inc( p );
+               p[ -1 ] := p^;
+       end;
+       key.b_data[ 27 ] := data0;
+       key.b_data[ 55 ] := data28;
+
+end;
+
+procedure f(
+       i : Integer;
+       var key : CryptBlock;
+       var a : CryptBlock;
+       var x : CryptBlock;
+       var data : CryptData
+);
+var
+       e, ikey, y : CryptBlock;
+       k : Integer;
+       p, q, r : PChar;
+
+       xb, ir : Integer;
+
+       temp : CryptOrdering;
+begin
+
+       e := a;
+       transpose( e, data.EP^, 48 );
+       for k := kCryptRots[ i ] downto 1
+               do rotate( key );
+       ikey := key;
+       temp := kCryptKeyTr2;           transpose( ikey, temp, 48 );
+       p := @(y.b_data[ 48 ]);
+       q := @(e.b_data[ 48 ]);
+       r := @(ikey.b_data[ 48 ]);
+       while p > y.b_data do
+       begin
+               Dec( p );
+               Dec( q );
+               Dec( r );
+               p^ := Char( Integer( q^ ) xor Integer( r^ ) );
+       end;
+       q := x.b_data;
+       for k := 0 to 7 do
+       begin
+               ir := Integer( p^ ) shl 5; Inc( p );
+               ir := ir + Integer( p^ ) shl 3; Inc( p );
+               ir := ir + Integer( p^ ) shl 2; Inc( p );
+               ir := ir + Integer( p^ ) shl 1; Inc( p );
+               ir := ir + Integer( p^ );                        Inc( p );
+               ir := ir + Integer( p^ ) shl 4; Inc( p );
+
+               xb := Integer( kCryptS_Boxes[ k, ir ] );
+
+               q^ := Char( (xb shr 3) and 1 ); Inc( q );
+               q^ := Char( (xb shr 2) and 1 ); Inc( q );
+               q^ := Char( (xb shr 1) and 1 ); Inc( q );
+               q^ := Char(     xb                              and 1 ); Inc( q );
+       end;
+       temp := kCryptPtr;                      transpose( x, temp, 32 );
+
+end;
+
+procedure setkey_r(
+       k : PChar;
+       var data : CryptData
+);
+var
+       temp : CryptOrdering;
+begin
+
+       memcpy( data.Key.b_data, k, sizeof(CryptBlock) );
+       temp := kCryptKeyTr1;    transpose( data.Key, temp, 56 );
+
+end;
+
+procedure encrypt_r(
+       blck : PChar;
+       edflag : Integer;
+       var data : CryptData
+);
+var
+       key : PCryptBlock;
+       p : PCryptBlock;
+       i : Integer;
+
+       j : Integer;
+       k : Integer;
+       b, x : CryptBlock;
+
+       temp : CryptOrdering;
+begin
+
+       key := @data.Key;
+       p := PCryptBlock( blck );
+
+       temp := kCryptInitialTr;transpose( p^, temp, 64 );
+       for i := 15 downto 0 do
+       begin
+               if edflag <> 0 then
+                       j := i
+               else
+                       j := 15 - i;
+
+               b := p^;
+               for k := 31 downto 0
+                       do p^.b_data[ k ] := b.b_data[ k + 32 ];
+               f( j, key^, p^, x, data );
+               for k := 31 downto 0
+                       do p^.b_data[ k + 32 ] := Char( Integer( b.b_data[ k ] ) xor Integer( x.b_data[ k ] ) );
+       end;
+       temp := kCryptSwap;              transpose( p^, temp, 64 );
+       temp := kCryptFinalTr;  transpose( p^, temp, 64 );
+
+       end;
+
+function crypt_r(
+       pw : PChar;
+       salt : PChar;
+       var data : CryptData
+) : string;
+var
+       pwb : array [0..65] of char;
+       cp : PChar;
+       ret : array [0..15] of char;
+       p : PChar;
+       new_etr : CryptOrdering;
+       i : Integer;
+
+       j : Integer;
+       c : Char;
+       t : Integer;
+       temp : Integer;
+begin
+
+       p := pwb;
+       data.EP := @kCryptEtr;
+       while (pw^ <> #0) and (p < pwb + 64) do
+       begin
+               j := 7;
+
+               while j > 0 do
+               begin
+                       Dec( j );
+                       p^ := Char( (Integer(pw^) shr j) and 1 );
+                       Inc( p );
+               end;
+               //Dec( j );
+
+               Inc( pw );
+               p^ := #0;
+               Inc( p );
+       end;
+       while (p < pwb + 64) do
+       begin
+                                       p^ := #0;
+                                       Inc( p );
+       end;
+
+       p := pwb;
+       setKey_r( p, data );
+
+       while (p < pwb + 66) do
+       begin
+                                       p^ := #0;
+                                       Inc( p );
+       end;
+
+       new_etr := kCryptEtr;
+       data.EP := @new_etr;
+       if (salt[ 0 ] = #0) and (salt[ 1 ] = #0) then
+                                       salt := '**#0';
+       for i := 0 to 1 do
+       begin
+               c := salt^;
+               Inc( salt );
+
+               ret[ i ] := c;
+               if c > 'Z' then
+                       c := Char( Integer(c) - (6 + 7 + Integer('.')) )
+               else if c > '9' then
+                       c := Char( Integer(c) - (7 + Integer('.')) )
+               else
+                       c := Char( (Integer(c) - Integer('.')) and $ff );
+
+               for j := 0 to 5 do
+               begin
+                       if ((Integer(c) shr j) and 1) <> 0 then
+                       begin
+                               t := 6 * i + j;
+                               temp := Integer( new_etr.o_data[ t ] );
+                               new_etr.o_data[ t ] := new_etr.o_data[ t + 24 ];
+                               new_etr.o_data[ t + 24 ] := Char( temp );
+                       end;
+               end;
+       end;
+
+       if ret[ 1 ] = #0 then
+               ret[ 1 ] := ret[ 0 ];
+
+       for i := 0 to 24 do
+               encrypt_r( pwb, 0, data );
+       data.EP := @kCryptEtr;
+
+       p := pwb;
+       cp := ret + 2;
+       while p < pwb + 66 do
+       begin
+               c := #0;
+               j := 6;
+
+               while j > 0 do
+               begin
+                       Dec( j );
+                       c := Char(      (Integer(c) shl 1) or Integer(p^) );
+                       Inc( p );
+               end;
+               //Dec( j );
+               c := Char( Integer(c) + Integer('.') );
+               if c > '9' then
+                       c := Char( Integer(c) + 7 );
+               if c > 'Z' then
+                       c := Char( Integer(c) + 6 );
+               cp^ := c;
+               Inc( cp );
+       end;
+       cp^ := #0;
+       Result := ret;
+
+end;
+
+function get_2ch_trip(
+       const pw : PChar
+) : string;
+var
+       s : CryptData;
+       salt : array [0..2] of char;
+
+       i : Integer;
+       len : Integer;
+begin
+
+       salt[ 0 ] := #0;
+       if pw[ 0 ] = #0 then
+       begin
+               Result := '';
+               Exit;
+       end;
+
+       if pw[ 1 ] <> #0 then
+       begin
+               if pw[ 2 ] <> #0 then
+                       len := 2
+               else
+                       len := 1;
+               for i := 0 to len - 1 do
+               begin
+                       if ('.' <= pw[ i + 1 ]) and (pw[ i + 1 ] <= 'z' ) then
+                               salt[ i ] := pw[ i + 1 ]
+                       else
+                               salt[ i ] := '.';
+
+                       if Pos( salt[ i ], ':;<=>?@[\\]^_`' ) > 0 then
+                               salt[ i ] := Char( Integer( salt[ i ] ) + 7 );
+               end;
+               if len = 1 then
+                       salt[ 1 ] := 'H';
+               salt[ 2 ] := #0;
+       end else begin
+               salt[ 0 ] := 'H';
+               salt[ 1 ] := '.';
+       end;
+
+       Result := Copy( crypt_r( pw, salt, s ), 4, 100 );
+
+end;
+
+end.
index 0330c22..438b3a1 100644 (file)
 unit YofUtils;
 
+{
+       HttpApp \82Ì\83N\83\8d\81[\83\93\82â\82»\82Ì\91¼\8eG\97p\8aÖ\90\94
+}
 interface
 
 //==================================================
 uses
 //==================================================
 
-  {$IFDEF LINUX}
-    QForms,
-  {$ENDIF}
-  {$IFDEF MSWINDOWS}
-    Windows, ShellApi, Forms,
-  {$ENDIF}
-  Classes, SysUtils, DateUtils;
-
-//==================================================
-type
-//==================================================
-
-        // \82í\82¯\82í\82©\82ç\82¸\8dì\82Á\82Ä\82é\82©\82ç\83o\83O\82¾\82ç\82¯\82©\82à
-        XMLDictionary = Record
-                Name : string;
-                Value : string;
-        end;
-
-       IXMLNode = class
-       private
-                FNodeName : string;
-                FCount : Integer;
-                FAttributeCount : Integer;
-                FChildNodes : IXMLNode;
-                FNodes : array of IXMLNode;
-                FAttributes : array of XMLDictionary;
-                function GetAttribute( const Name : string ) : string;
-                function GetNode( Index : Integer ) : IXMLNode;
-       public
-                constructor Create;
-
-               property NodeName : string read FNodeName write FNodeName;
-                property Attributes[ const Name : string ] : string read GetAttribute;
-                property Node[ Index : Integer ] : IXMLNode read GetNode; default;
-                property ChildNodes : IXMLNode read FChildNodes write FChildNodes;
-                property Count : Integer read FCount write FCount;
-                procedure Add( node : IXMLNode );
-                procedure AddAttribute( const Name : string; const Value : string );
-       end;
-
-       IXMLDocument = class( IXMLNode )
-        private
-                function GetDocumentElement() : IXMLNode;
-       public
-               property DocumentElement : IXMLNode read GetDocumentElement;
-       end;
-
-        CryptBlock = record
-                b_data : array [0..63] of char;
-        end;
-        PCryptBlock = ^CryptBlock;
-
-        CryptOrdering = record
-                o_data : array [0..63] of char;
-        end;
-
-        CryptData = record
-                Key : CryptBlock;
-                EP : ^CryptOrdering;
-        end;
+       Classes, SysUtils;
 
 procedure ExtractHttpFields(
-  const chrSep : TSysCharSet;
-  const chrWhite : TSysCharSet;
-  const strValue : string;
-  var strResult : TStringList;
-  unknownFlag : boolean = false );
+       const chrSep : TSysCharSet;
+       const chrWhite : TSysCharSet;
+       const strValue : string;
+       var strResult : TStringList;
+       unknownFlag : boolean = false
+);
 
 function HtmlEncode(
-  const strValue : string
-  ) : string;
+       const strValue : string
+) : string;
 
 function HtmlDecode(
-  const strValue : string
-  ) : string;
+       const strValue : string
+) : string;
 
 function HttpEncode(
-  const strValue : string
-  ) : string;
+       const strValue : string
+) : string;
 
 function MatchesMask(
-  const filename, mask : string
-  ) : boolean;
-
-procedure FileThruUntil(
-        var f : TFileStream;
-        const untilSet : TSysCharSet
-);
-
-procedure FileThruWhile(
-        var f : TFileStream;
-        const whileSet : TSysCharSet
-);
-
-function XMLCloseCheck(
-        var f : TFileStream;
-        var node : IXMLNode;
-        ch : char;
-        out tag : string;
-        out closed : boolean // \8cÄ\82Ñ\8fo\82µ\82½\83\8b\81[\83`\83\93\82ª node \82ð\95Â\82\82é\82×\82«\82È\82ç true
-) : boolean; // ch \82ð\82±\82Ì\83\8b\81[\83`\83\93\82ª\8f\88\97\9d\82µ\82½\82È\82ç true
-
-function XMLReadNode(
-        var f : TFileStream;
-        var node : IXMLNode
-) : string; // node \88È\8aO\82Ì\83m\81[\83h\82ª\95Â\82\82ç\82ê\82½\8fê\8d\87\82Ì\83m\81[\83h\96¼
+       const filename, mask : string
+) : boolean;
 
-function LoadXMLDocument(
-  const fileName : string
-  ) : IXMLDocument;
-
-function get_2ch_trip(
-        const pw : PChar
+// \83\81\83^\83L\83\83\83\89\83N\83^\82ð\90³\8bK\95\\8c»\88µ\82¢\82É\82È\82ç\82È\82¢\82æ\82¤\82É\92u\8a·
+function RegExpEncode(
+       const text : string
 ) : string;
 
 //==================================================
 const
 //==================================================
-        kXMLWhite : TSysCharSet = [#0..#$20];
-        kXMLDQuote : TSysCharSet = ['"'];
-        kXMLTagStart : TSysCharSet = ['<'];
-        kXMLTagEnd : TSysCharSet = ['>'];
-        kXMLKanji : TSysCharSet = [#$80..#$A0, #$E0..#$ff];
-        kCryptInitialTr : CryptOrdering = ( o_data: (
-               #58,#50,#42,#34,#26,#18,#10, #2,#60,#52,#44,#36,#28,#20,#12, #4,
-               #62,#54,#46,#38,#30,#22,#14, #6,#64,#56,#48,#40,#32,#24,#16, #8,
-               #57,#49,#41,#33,#25,#17, #9, #1,#59,#51,#43,#35,#27,#19,#11, #3,
-               #61,#53,#45,#37,#29,#21,#13, #5,#63,#55,#47,#39,#31,#23,#15, #7
-        ) );
-
-        kCryptFinalTr : CryptOrdering = ( o_data: (
-               #40, #8,#48,#16,#56,#24,#64,#32,#39, #7,#47,#15,#55,#23,#63,#31,
-               #38, #6,#46,#14,#54,#22,#62,#30,#37, #5,#45,#13,#53,#21,#61,#29,
-               #36, #4,#44,#12,#52,#20,#60,#28,#35, #3,#43,#11,#51,#19,#59,#27,
-               #34, #2,#42,#10,#50,#18,#58,#26,#33, #1,#41, #9,#49,#17,#57,#25
-        ) );
-
-        kCryptSwap : CryptOrdering = ( o_data: (
-               #33,#34,#35,#36,#37,#38,#39,#40,#41,#42,#43,#44,#45,#46,#47,#48,
-               #49,#50,#51,#52,#53,#54,#55,#56,#57,#58,#59,#60,#61,#62,#63,#64,
-                #1, #2, #3, #4, #5, #6, #7, #8, #9,#10,#11,#12,#13,#14,#15,#16,
-               #17,#18,#19,#20,#21,#22,#23,#24,#25,#26,#27,#28,#29,#30,#31,#32
-        ) );
-
-        kCryptKeyTr1 : CryptOrdering = ( o_data: (
-               #57, #49, #41, #33, #25, #17, #9,   #1, #58, #50, #42, #34, #26, #18,
-               #10,  #2, #59, #51, #43, #35, #27, #19, #11,  #3, #60, #52, #44, #36,
-               #63, #55, #47, #39, #31, #23, #15,  #7, #62, #54, #46, #38, #30, #22,
-               #14,  #6, #61, #53, #45, #37, #29, #21, #13,  #5, #28, #20, #12,  #4,
-                 #0,  #0,  #0,  #0,  #0,  #0,  #0,  #0
-        ) );
-
-        kCryptKeyTr2 : CryptOrdering = ( o_data: (
-               #14,#17,#11,#24, #1, #5, #3,#28,#15, #6,#21,#10,
-               #23,#19,#12, #4,#26, #8,#16, #7,#27,#20,#13, #2,
-               #41,#52,#31,#37,#47,#55,#30,#40,#51,#45,#33,#48,
-               #44,#49,#39,#56,#34,#53,#46,#42,#50,#36,#29,#32,
-                 #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0,
-                 #0, #0, #0, #0
-        ) );
-
-        kCryptEtr : CryptOrdering = ( o_data: (
-               #32, #1, #2, #3, #4, #5, #4, #5, #6, #7, #8, #9,
-                #8, #9,#10,#11,#12,#13,#12,#13,#14,#15,#16,#17,
-               #16,#17,#18,#19,#20,#21,#20,#21,#22,#23,#24,#25,
-               #24,#25,#26,#27,#28,#29,#28,#29,#30,#31,#32, #1,
-                 #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0,
-                 #0, #0, #0, #0
-        ) );
-
-        kCryptPtr : CryptOrdering = ( o_data: (
-               #16, #7,#20,#21,#29,#12,#28,#17, #1,#15,#23,#26, #5,#18,#31,#10,
-                #2, #8,#24,#14,#32,#27, #3, #9,#19,#13,#30, #6,#22,#11, #4,#25,
-                 #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0,
-                 #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0
-        ) );
-
-        kCryptS_boxes : array [ 0..7, 0..63 ] of Char = (
-        (      #14, #4,#13, #1, #2,#15,#11, #8, #3,#10, #6,#12, #5, #9, #0, #7,
-                #0,#15, #7, #4,#14, #2,#13, #1,#10, #6,#12,#11, #9, #5, #3, #8,
-                #4, #1,#14, #8,#13, #6, #2,#11,#15,#12, #9, #7, #3,#10, #5, #0,
-               #15,#12, #8, #2, #4, #9, #1, #7, #5,#11, #3,#14,#10, #0, #6,#13
-        ),
-
-        (      #15, #1, #8,#14, #6,#11, #3, #4, #9, #7, #2,#13,#12, #0, #5,#10,
-                #3,#13, #4, #7,#15, #2, #8,#14,#12, #0, #1,#10, #6, #9,#11, #5,
-                #0,#14, #7,#11,#10, #4,#13, #1, #5, #8,#12, #6, #9, #3, #2,#15,
-               #13, #8,#10, #1, #3,#15, #4, #2,#11, #6, #7,#12, #0, #5,#14, #9
-        ),
-
-        (      #10, #0, #9,#14, #6, #3,#15, #5, #1,#13,#12, #7,#11, #4, #2, #8,
-               #13, #7, #0, #9, #3, #4, #6,#10, #2, #8, #5,#14,#12,#11,#15, #1,
-               #13, #6, #4, #9, #8,#15, #3, #0,#11, #1, #2,#12, #5,#10,#14, #7,
-                #1,#10,#13, #0, #6, #9, #8, #7, #4,#15,#14, #3,#11, #5, #2,#12
-        ),
-
-        (       #7,#13,#14, #3, #0, #6, #9,#10, #1, #2, #8, #5,#11,#12, #4,#15,
-               #13, #8,#11, #5, #6,#15, #0, #3, #4, #7, #2,#12, #1,#10,#14, #9,
-               #10, #6, #9, #0,#12,#11, #7,#13,#15, #1, #3,#14, #5, #2, #8, #4,
-                #3,#15, #0, #6,#10, #1,#13, #8, #9, #4, #5,#11,#12, #7, #2,#14
-        ),
-
-        (       #2,#12, #4, #1, #7,#10,#11, #6, #8, #5, #3,#15,#13, #0,#14, #9,
-               #14,#11, #2,#12, #4, #7,#13, #1, #5, #0,#15,#10, #3, #9, #8, #6,
-                #4, #2, #1,#11,#10,#13, #7, #8,#15, #9,#12, #5, #6, #3, #0,#14,
-               #11, #8,#12, #7, #1,#14, #2,#13, #6,#15, #0, #9,#10, #4, #5, #3
-        ),
-
-        (      #12, #1,#10,#15, #9, #2, #6, #8, #0,#13, #3, #4,#14, #7, #5,#11,
-               #10,#15, #4, #2, #7,#12, #9, #5, #6, #1,#13,#14, #0,#11, #3, #8,
-                #9,#14,#15, #5, #2, #8,#12, #3, #7, #0, #4,#10, #1,#13,#11, #6,
-                #4, #3, #2,#12, #9, #5,#15,#10,#11,#14, #1, #7, #6, #0, #8,#13
-        ),
-
-        (       #4,#11, #2,#14,#15, #0, #8,#13, #3,#12, #9, #7, #5,#10, #6, #1,
-               #13, #0,#11, #7, #4, #9, #1,#10,#14, #3, #5,#12, #2,#15, #8, #6,
-                #1, #4,#11,#13,#12, #3, #7,#14,#10,#15, #6, #8, #0, #5, #9, #2,
-                #6,#11,#13, #8, #1, #4,#10, #7, #9, #5, #0,#15,#14, #2, #3,#12
-        ),
-
-        (      #13, #2, #8, #4, #6,#15,#11, #1,#10, #9, #3,#14, #5, #0,#12, #7,
-                #1,#15,#13, #8,#10, #3, #7, #4,#12, #5, #6,#11, #0,#14, #9, #2,
-                #7,#11, #4, #1, #9,#12,#14, #2, #0, #6,#10,#13,#15, #3, #5, #8,
-                #2, #1,#14, #7, #4,#10, #8,#13,#15,#12, #9, #0, #3, #5, #6,#11
-        )
-        );
-
-        kCryptRots : array [ 0..15 ] of Integer = (
-               1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
-        );
+       kYofKanji : TSysCharSet = [#$80..#$A0, #$E0..#$ff];
 
 //==================================================
 implementation
 //==================================================
 
-// Constructor
-constructor IXMLNode.Create();
-begin
-        FCount := 0;
-end;
-
-function IXMLNode.GetAttribute( const Name : string ) : string;
-var
-        i : Integer;
-begin
-        i := 0;
-        while i < FAttributeCount do
-        begin
-                if Name = FAttributes[ i ].Name then
-                begin
-                        Result := FAttributes[ i ].Value;
-                        exit;
-                end;
-
-                Inc( i );
-        end;
-end;
-
-function IXMLNode.GetNode( Index : Integer ) : IXMLNode;
-begin
-        Result := FNodes[ Index ];
-end;
-
-procedure IXMLNode.Add( node : IXMLNode );
-begin
-        Inc( FCount );
-        SetLength( FNodes, FCount );
-        FNodes[ FCount - 1 ] := node;
-end;
-
-procedure IXMLNode.AddAttribute(
-        const Name : string;
-        const Value : string
-);
-var
-        index : Integer;
-begin
-        index := FAttributeCount;
-        Inc( FAttributeCount );
-        SetLength( FAttributes, FAttributeCount );
-        FAttributes[ index ].Name := Name;
-        FAttributes[ index ].Value := Value;
-end;
-
-function IXMLDocument.GetDocumentElement() : IXMLNode;
-begin
-        Result := FChildNodes[ 0 ];
-end;
-
 // \82Æ\82è\82 \82¦\82¸\82Ì\91ã\97p\95i\82È\82Ì\82Å chrWhite \82ð\8dl\97\82µ\82Ä\82¢\82È\82¢\82±\82Æ\82É\92\8d\88Ó\81I\81I\81I
 procedure ExtractHttpFields(
-  const chrSep : TSysCharSet;
-  const chrWhite : TSysCharSet;
-  const strValue : string;
-  var strResult : TStringList;
-  unknownFlag : boolean = false
-  );
+       const chrSep : TSysCharSet;
+       const chrWhite : TSysCharSet;
+       const strValue : string;
+       var strResult : TStringList;
+       unknownFlag : boolean = false
+);
 var
-  last, p, strLen : Integer;
+       last, p, strLen : Integer;
 begin
 
-  strLen := Length( strValue );
-  p := 1;
-  last := 1;
+       strLen := Length( strValue );
+       p := 1;
+       last := 1;
 
-  while p <= strLen do
-  begin
+       while p <= strLen do
+       begin
 
-    if strValue[ p ] in chrSep then
-    begin
-      strResult.Add( Copy( strValue, last, p - last ) );
-      last := p + 1;
-    end;
+               if strValue[ p ] in chrSep then
+               begin
+                       strResult.Add( Copy( strValue, last, p - last ) );
+                       last := p + 1;
+               end;
 
-    p := p + 1;
+               p := p + 1;
 
-  end;
+       end;
 
-  if last <> p then
-        strResult.Add( Copy( strValue, last, strLen - last + 1 ) );
+       if last <> p then
+               strResult.Add( Copy( strValue, last, strLen - last + 1 ) );
 
 end;
 
 function HtmlEncode(
-  const strValue : string
-  ) : string;
+       const strValue : string
+) : string;
 var
-  i : Integer;
-  strLen : Integer;
-  strResult : string;
+       i : Integer;
+       strLen : Integer;
+       strResult : string;
 begin
 
-  strLen := Length( strValue );
-  i := 1;
-
-  while i <= strLen do
-  begin
-
-    case strValue[ i ] of
-    '&':
-      begin
-        strResult := strResult + '&amp;';
-      end;
-    '<':
-      begin
-        strResult := strResult + '&lt;';
-      end;
-    '>':
-      begin
-        strResult := strResult + '&gt;';
-      end;
-    '"':
-      begin
-        strResult := strResult + '&quot;';
-      end;
-    else
-      begin
-        if strValue[ i ] in kXMLKanji then
-        begin
-                strResult := strResult + strValue[ i ];
-                Inc( i );
-        end;
-        strResult := strResult + strValue[ i ];
-      end;
-    end;
+       strLen := Length( strValue );
+       i := 1;
+
+       while i <= strLen do
+       begin
+
+               case strValue[ i ] of
+               '&':
+                       begin
+                               strResult := strResult + '&amp;';
+                       end;
+               '<':
+                       begin
+                               strResult := strResult + '&lt;';
+                       end;
+               '>':
+                       begin
+                               strResult := strResult + '&gt;';
+                       end;
+               '"':
+                       begin
+                               strResult := strResult + '&quot;';
+                       end;
+               else
+                       begin
+                               if strValue[ i ] in kYofKanji then
+                               begin
+                                       strResult := strResult + strValue[ i ];
+                                       Inc( i );
+                               end;
+                               strResult := strResult + strValue[ i ];
+                       end;
+               end;
+
+               i := i + 1;
 
-    i := i + 1;
-
-  end;
+       end;
 
-  Result := strResult;
+       Result := strResult;
 
 end;
 
 function HtmlDecode(
-  const strValue : string
-  ) : string;
+       const strValue : string
+) : string;
 var
-  strResult : string;
+       strResult : string;
 begin
 
-        strResult := StringReplace( strValue, '&lt;', '<', [rfReplaceAll] );
-        strResult := StringReplace( strResult, '&gt;', '>', [rfReplaceAll] );
-        strResult := StringReplace( strResult, '&quot;', '"', [rfReplaceAll] );
-        strResult := StringReplace( strResult, '&amp;', '&', [rfReplaceAll] );
+       strResult := StringReplace( strValue, '&lt;', '<', [rfReplaceAll] );
+       strResult := StringReplace( strResult, '&gt;', '>', [rfReplaceAll] );
+       strResult := StringReplace( strResult, '&quot;', '"', [rfReplaceAll] );
+       strResult := StringReplace( strResult, '&amp;', '&', [rfReplaceAll] );
 
-        Result := strResult;
+       Result := strResult;
 
 end;
 
 function HttpEncode(
-  const strValue : string
-  ) : string;
+       const strValue : string
+       ) : string;
 var
-  i : Integer;
-  strLen : Integer;
-  strResult : string;
-  b : Integer;
+       i : Integer;
+       strLen : Integer;
+       strResult : string;
+       b : Integer;
 const
-  kHexCode : array [0..15] of char = (
-        '0', '1', '2', '3', '4', '5', '6', '7',
-        '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' );
+       kHexCode : array [0..15] of char = (
+                               '0', '1', '2', '3', '4', '5', '6', '7',
+                               '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' );
 begin
 
-  strLen := Length( strValue );
-  i := 1;
+       strLen := Length( strValue );
+       i := 1;
 
-  while i <= strLen do
-  begin
+       while i <= strLen do
+       begin
 
-    case strValue[ i ] of
-    '0' .. '9', 'a' .. 'z', 'A' .. 'Z', '*', '-', '.', '@', '_':
-      begin
-        strResult := strResult + strValue[ i ];
-      end;
-    else
-      begin
-        b := Integer( strValue[ i ] );
-        strResult := strResult + '%'
-                + kHexCode[ b div $10 ]
-                + kHexCode[ b mod $10 ];
-      end;
-    end;
+               case strValue[ i ] of
+               '0' .. '9', 'a' .. 'z', 'A' .. 'Z', '*', '-', '.', '@', '_':
+                       begin
+                               strResult := strResult + strValue[ i ];
+                       end;
+               else
+                       begin
+                               b := Integer( strValue[ i ] );
+                               strResult := strResult + '%'
+                                                               + kHexCode[ b div $10 ]
+                                                               + kHexCode[ b mod $10 ];
+                       end;
+               end;
 
-    i := i + 1;
+               i := i + 1;
 
-  end;
+       end;
 
-  Result := strResult;
+       Result := strResult;
 
 end;
 
 // \82Æ\82è\82 \82¦\82¸\82Ì\91ã\97p\95i\82È\82Ì\82Å [] \82ð\8eg\82Á\82½\90³\8bK\95\\8c»\82ð\8dl\97\82µ\82Ä\82¢\82È\82¢\82±\82Æ\82É\92\8d\88Ó\81I\81I\81I
 function MatchesMask(
-  const filename, mask : string
-  ) : boolean;
-var
-  pName, pMask : Integer;
-  nameLen, maskLen : Integer;
-  chrUpMask : char;
-begin
-
-  nameLen := Length( filename );
-  maskLen := Length( mask );
-  pName := 0;
-  pMask := 0;
-
-  while (pMask < maskLen) and (pName < nameLen) do
-  begin
-
-    case mask[ pMask ] of
-    '?':
-      begin
-        // \82±\82Ì 1 \8e\9a\82Í\89½\82à\82µ\82È\82¢
-      end;
-    '*':
-      begin
-        pMask := pMask + 1;
-        // mask \82ð\91\96\8d¸\82µ\90Ø\82Á\82½\82ç\8fI\97¹
-        if pMask >= maskLen then
-        begin
-          Result := true;
-          exit;
-        end;
-
-        // * \82Ì\8e\9f\82Ì\95\8e\9a\82ª\97\88\82é\82Ü\82Å\94ò\82Î\82·
-        chrUpMask := upcase( mask[ pMask ] );
-        while chrUpMask <> UpCase( filename[ pName ] ) do
-        begin
-          pName := pName + 1;
-          if pName >= nameLen then
-          begin
-            Result := true;
-            exit;
-          end;
-        end;
-
-        // * \82Ì\8e\9f\82Ì\95\8e\9a\82ª\8c©\82Â\82©\82ç\82È\82©\82Á\82½\82ç\8fI\97¹
-        if chrUpMask <> UpCase( filename[ pName ] ) then
-        begin
-          Result := false;
-          exit;
-        end;
-
-        pName := pName + 1;
-        pMask := pMask + 1;
-      end;
-    else
-      begin
-        // \82±\82Ì 1 \95\8e\9a\82ª\88á\82Á\82½\82ç\8fI\97¹
-        if UpCase( mask[ pMask ] ) <> UpCase( filename[ pName ] ) then
-        begin
-          Result := false;
-          exit;
-        end;
-
-      end;
-    end;
-
-    // \8e\9f\82Ì\95\8e\9a\82Ö
-    pName := pName + 1;
-    pMask := pMask + 1;
-
-  end;
-
-  if (pMask >= maskLen) and (pName >= nameLen) then
-    Result := true
-  else
-    Result := false;
-
-end;
-
-// untilSet \82É\82È\82é\82Ü\82Å\94ò\82Î\82·
-procedure FileThruUntil(
-        var f : TFileStream;
-        const untilSet : TSysCharSet
-);
-var
-        ch : char;
-begin
-        while f.Position < f.Size do
-        begin
-                f.ReadBuffer( ch, 1 );
-                if ch in untilSet then
-                begin
-                        f.Seek( -1, soFromCurrent );
-                        exit;
-                end else if ch in kXMLKanji then
-                        f.Seek( 1, soFromCurrent );
-        end;
-end;
-
-// whileSet \82Ì\8aÔ\94ò\82Î\82·
-procedure FileThruWhile(
-        var f : TFileStream;
-        const whileSet : TSysCharSet
-);
-var
-        ch : char;
-begin
-        while f.Position < f.Size do
-        begin
-                f.ReadBuffer( ch, 1 );
-                if ch in whileSet then
-                begin
-                        if ch in kXMLKanji then
-                                f.ReadBuffer( ch, 1 );
-                end else begin
-                        f.Seek( -1, soFromCurrent );
-                        exit;
-                end;
-        end;
-end;
-
-function XMLCloseCheck(
-        var f : TFileStream;
-        var node : IXMLNode;
-        ch : char;
-        out tag : string;
-        out closed : boolean
-) : boolean; // ch \82ð\82±\82Ì\83\8b\81[\83`\83\93\82ª\8f\88\97\9d\82µ\82½\82È\82ç true
-var
-        last : Integer;
-        tagLen : Integer;
-begin
-        closed := false;
-        Result := false;
-        tag := '';
-
-        if ch = '>' then
-        begin
-                // \8aJ\8en\83^\83O\82Ì\8dÅ\8cã\82Ü\82Å\93Ç\82ñ\82¾
-                Result := true;
-        end else if ch = '?' then
-        begin
-                // <?xml?> \82Ý\82½\82¢\82È\82â\82Â\81B\82æ\82Á\82Ä\96³\8e\8b
-                FileThruUntil( f, kXMLTagEnd );
-                FileThruUntil( f, kXMLTagStart );
-                f.Seek( 1, soFromCurrent );
-                FileThruWhile( f, kXMLWhite );
-                //closed := true;
-                Result := true;
-        end else if ch = '/' then
-        begin
-                // \83^\83O\96¼\82ð\93Ç\82Ý\8d\9e\82ñ\82Å\95Ô\82·
-                last := f.Position;
-                FileThruUntil( f, kXMLTagEnd );
-                tagLen := f.Position - last;
-                SetLength( tag, tagLen );
-
-                f.Seek( last, soFromBeginning );
-                f.ReadBuffer( PChar( tag )^, tagLen );
-
-                f.Seek( f.Position + 1, soFromBeginning ); // '>' \94ò\82Î\82µ
-                closed := true;
-                Result := true;
-        end;
-end;
-
-function XMLReadNode(
-        var f : TFileStream;
-        var node : IXMLNode
-) : string; // node \88È\8aO\82Ì\83m\81[\83h\82ª\95Â\82\82ç\82ê\82½\8fê\8d\87\82Ì\83m\81[\83h\96¼
-var
-        child : IXMLNode;
-
-        last : Integer;
-        tag : string;
-        tagLen : Integer;
-
-        isClosed : boolean;
-
-        attributeName : string;
-        attributeValue : string;
-
-        ch : char;
-label
-        NextNode;
-begin
-        try
-                // node \82Ì\93Ç\82Ý\8d\9e\82Ý(1 \83\8b\81[\83v\82É\82Â\82« 1 \83m\81[\83h)
-                node.ChildNodes := IXMLNode.Create;
-
-                while f.Position < f.Size do
-                begin
-                        // NodeName \93Ç\82Ý\8d\9e\82Ý
-                        FileThruWhile( f, kXMLWhite );
-                        
-                        while f.Position < f.Size do
-                        begin
-                                f.ReadBuffer( ch, 1 );
-
-                                if XMLCloseCheck( f, node, ch, tag, isClosed ) then
-                                begin
-                                        if isClosed then
-                                        begin
-                                                Result := tag;
-                                                exit;
-                                        end;
-
-                                        goto NextNode;
-                                end else if ch = '<' then
-                                begin
-                                        // \90V\8bK\83m\81[\83h
-                                        child := IXMLNode.Create;
-                                        tag := XMLReadNode( f, child );
-                                        node.ChildNodes.Add( child );
-
-                                        // \83^\83O\82ª\95Â\82\82ç\82ê\82½
-                                        if Length( tag ) > 0 then
-                                        begin
-                                                // \8e©\95ª\82Ì\82à\82Ì\82©\83`\83F\83b\83N\82µ\82Ä\81A\88á\82¦\82Î\90e\82É\95Ô\82·
-                                                if tag <> node.NodeName then
-                                                        Result := tag;
-                                                exit;
-                                        end;
-
-                                        goto NextNode;
-                                end else if ch in kXMLWhite then
-                                begin
-                                        // NodeName \8a®\97¹
-                                        break;
-                                end else begin
-                                        node.NodeName := node.NodeName + ch;
-
-                                        if ch in kXMLKanji then
-                                        begin
-                                                f.ReadBuffer( ch, 1 );
-                                                node.NodeName := node.NodeName + ch;
-                                        end;
-                                end;
-                        end;
-
-                        // Attribute \82Ì\93Ç\82Ý\8d\9e\82Ý
-                        while f.Position < f.Size do
-                        begin
-                                // Attribute \82Ì\96¼\91O\82ð\93Ç\82Ý\8d\9e\82Ý
-                                attributeName := '';
-                                attributeValue := '';
-
-                                FileThruWhile( f, kXMLWhite );
-
-                                while f.Position < f.Size do
-                                begin
-                                        f.ReadBuffer( ch, 1 );
-
-                                        if XMLCloseCheck( f, node, ch, tag, isClosed ) then
-                                        begin
-                                                if isClosed then
-                                                begin
-                                                        // \83^\83O\82ª\95Â\82\82ç\82ê\82½\82Ì\82Å\83\8a\83^\81[\83\93
-                                                        // \81¦NodeName \82ð\92Ê\89ß\82µ\82Ä\82é\82Ì\82Å\93r\92\86\82Å\95Â\82\82Ä\82é\82±\82Æ\82É\82È\82é\81B
-                                                        // \82æ\82Á\82Ä\93Æ\97§\83m\81[\83h\81B
-                                                        exit;
-                                                end;
-
-                                                // \8e\9f\82Ì\83m\81[\83h\82Ö
-                                                goto NextNode;
-                                        end else if ch = '=' then
-                                        begin
-                                                // \82±\82±\82©\82ç\82Í\92l\82ª\8en\82Ü\82é\82Ì\82Å\96¼\91O\82Í\8fI\97¹
-                                                break;
-                                        end else if ch in kXMLWhite then
-                                        begin
-                                                // Value \82ª\91\8dÝ\82µ\82È\82¢(\8bK\8ai\8aO)\82Ì\82Å\8e\9f\82Ì\83m\81[\83h\82Ö
-                                                goto NextNode;
-                                        end else begin
-                                                attributeName := attributeName + ch;
-
-                                                if ch in kXMLKanji then
-                                                begin
-                                                        f.ReadBuffer( ch, 1 );
-                                                        attributeName := attributeName + ch;
-                                                end;
-                                        end;
-
-                                end;
-
-                                // Attribute \82Ì\92l\82ð\93Ç\82Ý\8d\9e\82Ý
-                                FileThruWhile( f, kXMLWhite );
-
-                                while f.Position < f.Size do
-                                begin
-                                        f.ReadBuffer( ch, 1 );
-
-                                        if XMLCloseCheck( f, node, ch, tag, isClosed ) then
-                                        begin
-                                                if isClosed then
-                                                begin
-                                                        if Length( attributeName ) > 0 then
-                                                                // \8bK\8ai\8aO\82¾\82¯\82Ç\82Ë
-                                                                node.AddAttribute( attributeName, attributeValue );
-
-                                                        // \83^\83O\82ª\95Â\82\82ç\82ê\82½\82Ì\82Å\83\8a\83^\81[\83\93
-                                                        // \81¦NodeName \82ð\92Ê\89ß\82µ\82Ä\82é\82Ì\82Å\93r\92\86\82Å\95Â\82\82Ä\82é\82±\82Æ\82É\82È\82é\81B
-                                                        // \82æ\82Á\82Ä\93Æ\97§\83m\81[\83h\81B
-                                                        exit;
-                                                end;
-
-                                                // \8e\9f\82Ì\83m\81[\83h\82Ö
-                                                goto NextNode;
-                                        end else if ch = '"' then
-                                        begin
-                                                // \92l\82ª "" \82Å\8a\87\82ç\82ê\82Ä\82é\82Ì\82Å(\82Ä\82¢\82¤\82©\8a\87\82ç\82ê\82Ä\82È\82«\82á\82¢\82¯\82È\82¢\82ñ\82¾\82¯\82Ç)
-                                                // \92l\82ð\88ê\8a\87\93Ç\82Ý\8d\9e\82Ý
-                                                last := f.Position;
-                                                FileThruUntil( f, kXMLDQuote );
-                                                tagLen := f.Position - last;
-                                                SetLength( attributeValue, tagLen );
-
-                                                f.Seek( last, soFromBeginning );
-                                                f.ReadBuffer( PChar( attributeValue )^, tagLen );
-
-                                                node.AddAttribute( attributeName, HtmlDecode( attributeValue ) );
-
-                                                // \92l\82ð\93Ç\82Ý\8fI\82í\82Á\82½\82Ì\82Å\8fI\97¹
-                                                f.Seek( f.Position + 1, soFromBeginning ); // '"' \94ò\82Î\82µ
-                                                break;
-                                        end else if ch in kXMLWhite then
-                                        begin
-                                                // \8bK\8ai\8aO\82¾\82¯\82Ç\82Ë
-                                                node.AddAttribute( attributeName, HtmlDecode( attributeValue ) );
-
-                                                goto NextNode;
-                                        end else begin
-                                                // \8bK\8ai\8aO\82¾\82¯\82Ç\88ê\89\9e\8eæ\82Á\82Ä\82¨\82­
-                                                attributeValue := attributeValue + ch;
-
-                                                if ch in kXMLKanji then
-                                                begin
-                                                        f.ReadBuffer( ch, 1 );
-                                                        attributeValue := attributeValue + ch;
-                                                end;
-                                        end;
-                                end;
-                        end; // Attribute \82Ì\93Ç\82Ý\8d\9e\82Ý
-
-                        NextNode:;
-                end; // // node \82Ì\93Ç\82Ý\8d\9e\82Ý(1 \83\8b\81[\83v\82É\82Â\82« 1 \83m\81[\83h)
-        finally
-        end;
-end;
-
-function LoadXMLDocument(
-  const fileName : string
-  ) : IXMLDocument;
-type
-        xmlMode = ( xmlHoge );
-var
-        xmlFile : TFileStream;
-        doc : IXMLDocument;
-begin
-
-        doc := IXMLDocument.Create;
-
-        xmlFile := TFileStream.Create( fileName, fmOpenRead );
-        XMLReadNode( xmlFile, IXMLNode( doc ) );
-        xmlFile.Destroy;
-
-        Result := doc;
-
-end;
-
-procedure memcpy(
-        dst : PChar;
-        src : PChar;
-        size : Integer
-);
-begin
-        while size > 0 do
-        begin
-                dst^ := src^;
-                Inc( dst );
-                Inc( src );
-                Dec( size );
-        end;
-end;
-
-procedure transpose(
-        var data : CryptBlock;
-        var t : CryptOrdering;
-        n : Integer
-);
-var
-        x : CryptBlock;
-begin
-        x := data;
-
-        while n > 0 do
-        begin
-                Dec( n );
-                data.b_data[ n ] := x.b_data[ Integer( t.o_data[ n ] ) - 1 ];
-        end;
-end;
-
-procedure rotate(
-        var key : CryptBlock
-);
+       const filename, mask : string
+       ) : boolean;
 var
-        p : PChar;
-        ep : PChar;
-        data0, data28 : Char;
-begin
-        p := key.b_data;
-        ep := @(key.b_data[ 55 ]);
-        data0 := key.b_data[ 0 ];
-        data28 := key.b_data[ 28 ];
-
-        while p < ep do
-        begin
-                Inc( p );
-                p[ -1 ] := p^;
-        end;
-        key.b_data[ 27 ] := data0;
-        key.b_data[ 55 ] := data28;
-end;
-
-procedure f(
-        i : Integer;
-        var key : CryptBlock;
-        var a : CryptBlock;
-        var x : CryptBlock;
-        var data : CryptData
-);
-var
-        e, ikey, y : CryptBlock;
-        k : Integer;
-        p, q, r : PChar;
-
-        xb, ir : Integer;
-
-        temp : CryptOrdering;
+       pName, pMask : Integer;
+       nameLen, maskLen : Integer;
+       chrUpMask : char;
 begin
-        e := a;
-        transpose( e, data.EP^, 48 );
-        for k := kCryptRots[ i ] downto 1
-                do rotate( key );
-        ikey := key;
-        temp := kCryptKeyTr2;    transpose( ikey, temp, 48 );
-        p := @(y.b_data[ 48 ]);
-        q := @(e.b_data[ 48 ]);
-        r := @(ikey.b_data[ 48 ]);
-        while p > y.b_data do
-        begin
-                Dec( p );
-                Dec( q );
-                Dec( r );
-                p^ := Char( Integer( q^ ) xor Integer( r^ ) );
-        end;
-        q := x.b_data;
-        for k := 0 to 7 do
-        begin
-                ir := Integer( p^ ) shl 5; Inc( p );
-                ir := ir + Integer( p^ ) shl 3; Inc( p );
-                ir := ir + Integer( p^ ) shl 2; Inc( p );
-                ir := ir + Integer( p^ ) shl 1; Inc( p );
-                ir := ir + Integer( p^ );       Inc( p );
-                ir := ir + Integer( p^ ) shl 4; Inc( p );
-
-                xb := Integer( kCryptS_Boxes[ k, ir ] );
-
-                q^ := Char( (xb shr 3) and 1 ); Inc( q );
-                q^ := Char( (xb shr 2) and 1 ); Inc( q );
-                q^ := Char( (xb shr 1) and 1 ); Inc( q );
-                q^ := Char(  xb        and 1 ); Inc( q );
-        end;
-        temp := kCryptPtr;      transpose( x, temp, 32 );
-end;
-
-procedure setkey_r(
-        k : PChar;
-        var data : CryptData
-);
-var
-        //key : CryptBlock;
-
-        temp : CryptOrdering;
-begin
-        memcpy( data.Key.b_data, k, sizeof(CryptBlock) );
-        temp := kCryptKeyTr1;   transpose( data.Key, temp, 56 );
-end;
-
-procedure encrypt_r(
-        blck : PChar;
-        edflag : Integer;
-        var data : CryptData
-);
-var
-        key : PCryptBlock;
-        p : PCryptBlock;
-        i : Integer;
 
-        j : Integer;
-        k : Integer;
-        b, x : CryptBlock;
+       nameLen := Length( filename );
+       maskLen := Length( mask );
+       pName := 0;
+       pMask := 0;
+
+       while (pMask < maskLen) and (pName < nameLen) do
+       begin
+
+               case mask[ pMask ] of
+               '?':
+                       begin
+                               // \82±\82Ì 1 \8e\9a\82Í\89½\82à\82µ\82È\82¢
+                       end;
+               '*':
+                       begin
+                               pMask := pMask + 1;
+                               // mask \82ð\91\96\8d¸\82µ\90Ø\82Á\82½\82ç\8fI\97¹
+                               if pMask >= maskLen then
+                               begin
+                                       Result := true;
+                                       exit;
+                               end;
+
+                               // * \82Ì\8e\9f\82Ì\95\8e\9a\82ª\97\88\82é\82Ü\82Å\94ò\82Î\82·
+                               chrUpMask := upcase( mask[ pMask ] );
+                               while chrUpMask <> UpCase( filename[ pName ] ) do
+                               begin
+                                       pName := pName + 1;
+                                       if pName >= nameLen then
+                                       begin
+                                               Result := true;
+                                               exit;
+                                       end;
+                               end;
+
+                               // * \82Ì\8e\9f\82Ì\95\8e\9a\82ª\8c©\82Â\82©\82ç\82È\82©\82Á\82½\82ç\8fI\97¹
+                               if chrUpMask <> UpCase( filename[ pName ] ) then
+                               begin
+                                       Result := false;
+                                       exit;
+                               end;
+
+                               pName := pName + 1;
+                               pMask := pMask + 1;
+                       end;
+               else
+                       begin
+                               // \82±\82Ì 1 \95\8e\9a\82ª\88á\82Á\82½\82ç\8fI\97¹
+                               if UpCase( mask[ pMask ] ) <> UpCase( filename[ pName ] ) then
+                               begin
+                                       Result := false;
+                                       exit;
+                               end;
+
+                       end;
+               end;
+
+               // \8e\9f\82Ì\95\8e\9a\82Ö
+               pName := pName + 1;
+               pMask := pMask + 1;
 
-        temp : CryptOrdering;
-begin
-        key := @data.Key;
-        p := PCryptBlock( blck );
+       end;
 
-        temp := kCryptInitialTr;transpose( p^, temp, 64 );
-        for i := 15 downto 0 do
-        begin
-                if edflag <> 0 then
-                        j := i
-                else
-                        j := 15 - i;
+       if (pMask >= maskLen) and (pName >= nameLen) then
+               Result := true
+       else
+               Result := false;
 
-                b := p^;
-                for k := 31 downto 0
-                        do p^.b_data[ k ] := b.b_data[ k + 32 ];
-                f( j, key^, p^, x, data );
-                for k := 31 downto 0
-                        do p^.b_data[ k + 32 ] := Char( Integer( b.b_data[ k ] ) xor Integer( x.b_data[ k ] ) );
-        end;
-        temp := kCryptSwap;     transpose( p^, temp, 64 );
-        temp := kCryptFinalTr;  transpose( p^, temp, 64 );
 end;
 
-function crypt_r(
-        pw : PChar;
-        salt : PChar;
-        var data : CryptData
-) : string;
-var
-        pwb : array [0..65] of char;
-        cp : PChar;
-        ret : array [0..15] of char;
-        p : PChar;
-        new_etr : CryptOrdering;
-        i : Integer;
-
-        j : Integer;
-        c : Char;
-        t : Integer;
-        temp : Integer;
-begin
-
-        p := pwb;
-        data.EP := @kCryptEtr;
-        while (pw^ <> #0) and (p < pwb + 64) do
-        begin
-                j := 7;
-
-                while j > 0 do
-                begin
-                        Dec( j );
-                        p^ := Char( (Integer(pw^) shr j) and 1 );
-                        Inc( p );
-                end;
-                //Dec( j );
-
-                Inc( pw );
-                p^ := #0;
-                Inc( p );
-        end;
-        while (p < pwb + 64) do
-        begin
-                p^ := #0;
-                Inc( p );
-        end;
-
-        p := pwb;
-        setKey_r( p, data );
-
-        while (p < pwb + 66) do
-        begin
-                p^ := #0;
-                Inc( p );
-        end;
-
-        new_etr := kCryptEtr;
-        data.EP := @new_etr;
-        if (salt[ 0 ] = #0) and (salt[ 1 ] = #0) then
-                salt := '**#0';
-        for i := 0 to 1 do
-        begin
-                c := salt^;
-                Inc( salt );
 
-                ret[ i ] := c;
-                if c > 'Z' then
-                        c := Char( Integer(c) - (6 + 7 + Integer('.')) )
-                else if c > '9' then
-                        c := Char( Integer(c) - (7 + Integer('.')) )
-                else
-                        c := Char( (Integer(c) - Integer('.')) and $ff );
-
-                for j := 0 to 5 do
-                begin
-                        if ((Integer(c) shr j) and 1) <> 0 then
-                        begin
-                                t := 6 * i + j;
-                                temp := Integer( new_etr.o_data[ t ] );
-                                new_etr.o_data[ t ] := new_etr.o_data[ t + 24 ];
-                                new_etr.o_data[ t + 24 ] := Char( temp );
-                        end;
-                end;
-        end;
-
-        if ret[ 1 ] = #0 then
-                ret[ 1 ] := ret[ 0 ];
-
-        for i := 0 to 24 do
-                encrypt_r( pwb, 0, data );
-        data.EP := @kCryptEtr;
-
-        p := pwb;
-        cp := ret + 2;
-        while p < pwb + 66 do
-        begin
-                c := #0;
-                j := 6;
-
-                while j > 0 do
-                begin
-                        Dec( j );
-                        c := Char(  (Integer(c) shl 1) or Integer(p^) );
-                        Inc( p );
-                end;
-                //Dec( j );
-                c := Char( Integer(c) + Integer('.') );
-                if c > '9' then
-                        c := Char( Integer(c) + 7 );
-                if c > 'Z' then
-                        c := Char( Integer(c) + 6 );
-                cp^ := c;
-                Inc( cp );
-        end;
-        cp^ := #0;
-        Result := ret;
-
-end;
-
-function get_2ch_trip(
-        const pw : PChar
+// \83\81\83^\83L\83\83\83\89\83N\83^\82ð\90³\8bK\95\\8c»\88µ\82¢\82É\82È\82ç\82È\82¢\82æ\82¤\82É\92u\8a·
+function RegExpEncode(
+       const text : string
 ) : string;
 var
-        s : CryptData;
-        salt : array [0..2] of char;
-
-        i : Integer;
-        len : Integer;
+       tmp : string;
 begin
-        salt[ 0 ] := #0;
-        if pw[ 0 ] = #0 then
-        begin
-                Result := '';
-                Exit;
-        end;
-
-        if pw[ 1 ] <> #0 then
-        begin
-                if pw[ 2 ] <> #0 then
-                        len := 2
-                else
-                        len := 1;
-                for i := 0 to len - 1 do
-                begin
-                        if ('.' <= pw[ i + 1 ]) and (pw[ i + 1 ] <= 'z' ) then
-                                salt[ i ] := pw[ i + 1 ]
-                        else
-                                salt[ i ] := '.';
-
-                        if Pos( salt[ i ], ':;<=>?@[\\]^_`' ) > 0 then
-                                salt[ i ] := Char( Integer( salt[ i ] ) + 7 );
-                end;
-                if len = 1 then
-                        salt[ 1 ] := 'H';
-                salt[ 2 ] := #0;
-        end else begin
-                salt[ 0 ] := 'H';
-                salt[ 1 ] := '.';
-        end;
-
-        Result := Copy( crypt_r( pw, salt, s ), 4, 100 );
+       // \95Û\97¯
 end;
 
 end.