OSDN Git Service

ref #17383
[gikonavigoeson/gikonavi.git] / YofUtils.pas
index 704f315..af875e3 100644 (file)
@@ -1,7 +1,10 @@
 unit YofUtils;
 
-{
-       HttpApp \82Ì\83N\83\8d\81[\83\93\82â\82»\82Ì\91¼\8eG\97p\8aÖ\90\94
+{!
+\file          YofUtils.pas
+\brief HttpApp \82Ì\83N\83\8d\81[\83\93\82â\82»\82Ì\91¼\8eG\97p\8aÖ\90\94
+
+$Id: YofUtils.pas,v 1.10 2004/10/09 15:06:19 yoffy Exp $
 }
 interface
 
@@ -12,6 +15,10 @@ uses
        Classes, SysUtils,
        Windows;
 
+{!
+\brief         ExtractHttpFields \82Ì\83N\83\8d\81[\83\93
+\warning       \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;
@@ -36,16 +43,20 @@ function HttpDecode(
        const strValue : string
 ) : string;
 
+{!
+\brief         MachiesMask \82Ì\83N\83\8d\81[\83\93
+\warning       \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;
 
-/// \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·
+//! \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;
 
-{*!
+{!
 \brief         \95\\8e¦\83\81\83b\83Z\81[\83W\82Ì\90®\8c`
 \param         msg                             \95\\8e¦\82·\82é\83\81\83b\83Z\81[\83W
 \param         elements        \92u\8a·\92P\8cê
@@ -61,7 +72,7 @@ m := MessageStyle(
 </code></pre>
 
 \82Å\8fo\97Í\82³\82ê\82é m \82Í\81u10 \8cÂ\82Ì\81ghoge\81h\82ð\92u\8a·\82µ\82Ü\82µ\82½\81B\81v\82Æ\82È\82è\82Ü\82·\81B
-*}
+}
 function MessageStyle(
        const msg                               : string;
        const elements  : string
@@ -72,26 +83,57 @@ function MessageStyle(
        const elements  : TStringList
 ) : string; overload;
 
+{!
+\brief \89E\89ñ\93]\83V\83t\83g
+\param v               \89ñ\93]\82·\82é\92l
+\param n               \89ñ\93]\83r\83b\83g\90\94
+\return        Longword( (v shl (32 - n)) or (v shr n) ) \82Ì\92l
+}
+function ror( v, n : Longword ) : Longword; register;
+
+{!
+\brief         \95\8e\9a\97ñ\82Ì\83n\83b\83V\83\85\92l\82ð\8cv\8eZ
+\param         s               \95\8e\9a\97ñ
+\return                \83n\83b\83V\83\85\92l ( 4 byte )
+\warning  \91½\83o\83C\83g\82ð 4 byte \82É\8fk\82ß\82Ä\82¢\82é\82½\82ß\81A
+                                       \93¯\82\92l\82ð\8fo\97Í\82·\82é\95\8e\9a\97ñ\82Í\96³\8cÀ\82É\91\8dÝ\82µ\82Ü\82·\81B
+                                       \83R\83\93\83t\83\8a\83N\83g\82ª\8bN\82±\82ç\82È\82¢\8e\96\82ð\91O\92ñ\82É\82µ\82½\8bL\8fq\82Í\94ð\82¯\82Ä\82­\82¾\82³\82¢\81B
+
+\82±\82Ì\8aÖ\90\94\82Í\91½\83o\83C\83g\92·\82Ì\95\8e\9a\97ñ\82ð 4 byte \82É\8fk\82ß\82Ü\82·\81B<br>
+\82»\82Ì\89ß\92ö\82Å\81A'abcdefgh' \82Æ 'efghabcd' \82ª\93¯\82\92l\82É\82È\82ç\82È\82¢\82æ\82¤\82É\82·\82é\93\99\81A
+\91½\8f­\95Î\82è\82ð\8fÈ\82­\82æ\82¤\82É\8dl\97\82³\82ê\82Ü\82·\81B
+}
+function GetStringHash( const s : string ) : Longword;
+
 type
-       /// Mode \92l\82ª\82¨\82©\82µ\82¢
+       //! Mode \92l\82ª\82¨\82©\82µ\82¢
        EMappedFileModeError = class( Exception );
-       /// \83}\83b\83s\83\93\83O\82É\8e¸\94s
+       //! \83}\83b\83s\83\93\83O\82É\8e¸\94s
        EMappedFileMappingError = class( Exception );
 
-       /// \83\81\83\82\83\8a\83}\83b\83v\83h\81E\83t\83@\83C\83\8b \83N\83\89\83X
+       //! \83\81\83\82\83\8a\83}\83b\83v\83h\81E\83t\83@\83C\83\8b \83N\83\89\83X
        TMappedFile = class( TObject )
        private
                FFileHandle                     : THandle;
                FMappingHandle  : THandle;
-               FSize                                           : Longword;
+               FSize                                           : Int64;
                FViewAddress            : Pointer;
        public
-               constructor Create( const filePath : string; mode : Longword = fmOpenRead );
+               {!
+               \brief  \83\81\83\82\83\8a\83}\83b\83v\83h\83t\83@\83C\83\8b\82Ì\8dì\90¬
+               \param  filePath                \8aJ\82­\83t\83@\83C\83\8b\82Ì\83p\83X
+               \param  mode                            fmOpenRead (\83f\83t\83H\83\8b\83g) \82Ü\82½\82Í fmOpenReadWrite
+               \param  maximumSize     \83y\81[\83W\83T\83C\83Y\82Ì\8fã\8cÀ (0 \82È\82ç\8c»\8dÝ\82Ì\83t\83@\83C\83\8b\83T\83C\83Y)
+               }
+               constructor Create(
+                       const filePath  : string;
+                       mode                                            : Longword = fmOpenRead;
+                       maximumSize                     : Int64 = 0 );
                destructor      Destroy; override;
 
-               /// \83T\83C\83Y\82Ì\8eæ\93¾
-               property                Size            : Longword      read FSize;
-               /// \83A\83h\83\8c\83X\82Ì\8eæ\93¾
+               //! \83T\83C\83Y\82Ì\8eæ\93¾
+               property                Size            : Int64                 read FSize;
+               //! \83A\83h\83\8c\83X\82Ì\8eæ\93¾
                property                Memory  : Pointer               read FViewAddress;
        end;
 
@@ -106,7 +148,6 @@ implementation
 
 uses MojuUtils;
 
-// \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;
@@ -302,7 +343,6 @@ begin
 
 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;
@@ -392,8 +432,6 @@ begin
 
 end;
 
-
-// \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;
@@ -452,14 +490,49 @@ begin
 
 end;
 
+//==============================
+// ror
+//==============================
+function ror( v, n : Longword ) : Longword; register;
+asm
+       mov             cl, dl
+       ror             eax, cl
+end;
+
+//==============================
+// GetStringHash
+//==============================
+function GetStringHash( const s : string ) : Longword;
+var
+       l                               : Integer;
+       v                               : Longword;
+       p, tail : PChar;
+begin
+
+       l                       := Length( s );
+       p                       := PChar( s );
+       v                       := $87654321;
+       tail    := p + (l and $fffffffc);
+       while p < tail do begin
+               v       := PDword( p )^ + (v shl 2) * ($10000 - v);
+               p := p + 4;
+       end;
+       tail    := PChar( s ) + l;
+       while p < tail do begin
+               v := PByte( p )^ + (v shl 2) * ($10000 - v);
+               Inc( p );
+       end;
+
+       Result := v xor ((v shl 2) * ($10000 - v));
+
+end;
+
 { TMappedFile }
 
-{*!
-\brief \83\81\83\82\83\8a\83}\83b\83v\83h\83t\83@\83C\83\8b\82Ì\8dì\90¬
-\param filePath        \8aJ\82­\83t\83@\83C\83\8b\82Ì\83p\83X
-\param mode                    fmOpenRead (\83f\83t\83H\83\8b\83g) \82Ü\82½\82Í fmOpenReadWrite
-*}
-constructor TMappedFile.Create( const filePath : string; mode : Longword = fmOpenRead );
+constructor TMappedFile.Create(
+       const filePath  : string;
+       mode                                            : Longword = fmOpenRead;
+       maximumSize                     : Int64 = 0 );
 var
        dwFileDesiredAccess     : DWORD;
        flProtect                                               : DWORD;
@@ -486,15 +559,20 @@ begin
        end;
 
        FFileHandle := CreateFile(
-               PChar( filePath ), dwFileDesiredAccess, 0, nil, OPEN_EXISTING,
+               PChar( filePath ), dwFileDesiredAccess, 0, nil, OPEN_ALWAYS,
                FILE_ATTRIBUTE_NORMAL, 0 );
        if FFileHandle = INVALID_HANDLE_VALUE then
                raise EFOpenError.Create( '\83t\83@\83C\83\8b\82Ì\83I\81[\83v\83\93\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B' );
 
        FSize := GetFileSize( FFileHandle, nil );
+       if FSize < maximumSize then
+               FSize := maximumSize;
 
        FMappingHandle := CreateFileMapping(
-               FFileHandle, nil, flProtect, 0, 0, nil );
+               FFileHandle, nil, flProtect,
+               DWORD( (maximumSize shr 32) and $ffffffff ),
+               DWORD( maximumSize and $ffffffff ),
+               nil );
        if FFileHandle = INVALID_HANDLE_VALUE then
                raise EMappedFileMappingError.Create( '\83t\83@\83C\83\8b\82Ì\83}\83b\83s\83\93\83O\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B' );