そう言えば SHIORI/2.0 にしたのに内容について触れてなかった(^^;) 期待した人ごめん。居ないから良いだろ、ともいえますが。まぁ。ね。
さてパーサーを書かねばならんので敬遠していた事は言いましたが、実装においてはもうパーサーなんて書きませんでしたよ。きょうび 800MHz でも 6000円を切ってんですから少しぐらいの負荷は赦して貰おうってコトで、AnsiSameText() をビシバシ呼んじゃってます。
function request( H:HGLOBAL; var Len:LongInt ): HGLOBAL; cdecl; var I : Integer; Cnt : Integer; Rslt: String; function CmpCmnd( Code:String ):Boolean; begin Result := AnsiSameText( RequestHeader[0], Code ) end; begin Rslt := ''; RequestHeader.Text := HandleToStr( H, Len ); Cnt := RequestHeader.Count; for I:=0 to Cnt-1 do RequestHeader[I] := StringReplace( RequestHeader[I], ': ', '=', [] ); GlobalFree( H ); {$IFDEF VER140} {$IF Defined(DBG_RequestAll)} AddDebugLog( 'SHIORI - Request() - ', RequestHeader[0], True ); {$IFEND} {$ENDIF} if CmpCmnd( 'GET Word SHIORI/2.0' ) then Rslt := GetWord( RequestHeader ) else if CmpCmnd( 'GET Sentence SHIORI/2.0') then Rslt := GetSentence( RequestHeader ) else if CmpCmnd( 'GET Sentence SHIORI/2.2') then Rslt := OnEvent( RequestHeader ) else if CmpCmnd( 'GET Sentence SHIORI/2.3') then Rslt := GetSentence2( RequestHeader ) else if CmpCmnd( 'GET String SHIORI/2.5' ) then Rslt := GetString( RequestHeader ) else if CmpCmnd( 'GET Status SHIORI/2.0' ) then Rslt := GetStatus( RequestHeader ) else if CmpCmnd( 'GET Version SHIORI/2.0' ) then Rslt := 'SHIORI/2.5 200 OK' else if CmpCmnd( 'NOTIFY SHIORI/2.0' ) then Rslt := 'SHIORI/2.0 200 OK' else if CmpCmnd( 'NOTIFY OwnerGhostName SHIORI/2.3' ) then Rslt := SetOwnerGhostName( RequestHeader ) else if CmpCmnd( 'NOTIFY OtherGhostName SHIORI/2.3' ) then Rslt := SetOtherGhostName( RequestHeader ) {$IFDEF VER140} {$IF Defined(DBG_Request)} else AddDebugLog( 'SHIORI - Request() - ', RequestHeader[0], True ) {$IFEND} {$ENDIF}; if (Rslt = '') then Rslt := ExtractVersion(RequestHeader[0]) + ' 204 No Content' else Rslt := BuildScript( Rslt ); Result := GetGlobalMemory( Rslt+TERMINAL, Len ); end; |