OSDN Git Service

カンマの処理でアクセスバイオレーションになる不具合の修正
authorh677 <h677>
Fri, 4 Nov 2005 03:06:53 +0000 (03:06 +0000)
committerh677 <h677>
Fri, 4 Nov 2005 03:06:53 +0000 (03:06 +0000)
HTMLCreate.pas

index a8a2d4b..92a306d 100644 (file)
@@ -333,7 +333,6 @@ var
        cm: boolean;
        No: string;
        oc      : string;
-       st, et: string;
        pos, pmin : integer;
        j : integer;
        token : array[0..5] of string;
@@ -341,6 +340,75 @@ var
        db : boolean;
        len : integer;
        rink : string;
+       function addResAnchor(const Left :string) : string;
+       var
+               st,et : string;
+       begin
+               //\8fI\92[\82Ü\82Å\8ds\82Á\82Ä\82Ì\8fI\97¹\82©\83`\83F\83b\83N
+               if j <= len then begin
+                       if db then j := j - 2
+                       else j := j - 1;
+               end;
+               //\89½\82à\90\94\8e\9a\82ª\8c©\82Â\82©\82ç\82È\82¢\82Æ\82«
+               if No = '' then begin
+                       Result := Left + Copy(s, 1, j - 1);
+               end else begin
+                       separateNumber(st, et, No, '-');
+
+                       if not DatToHTML then begin
+                               Result := Left + Format(FORMAT_LINK,
+                                                       [ParamBBS, Bbs, ParamKey, Key, ParamStart, st, ParamTo, et, ParamNoFirst, ParamTrue]);
+                       end else begin
+                               Result := Left + Format('<a href="#%s">', [st]);
+                       end;
+                       Result := Result + Copy(s, 1, j - 1) + '</a>';
+               end;
+               Delete(s, 1, j - 1);
+       end;
+
+       procedure getNumberString;
+       begin
+               while (j <= len) do begin
+                       if (ByteType(s, j) = mbSingleByte) then begin
+                               //1byte\95\8e\9a
+                               ch := s[j];
+                               Inc(j);
+                               db := false;
+                       end else begin
+                               //2byte\95\8e\9a
+                               ch := ZenToHan(Copy(s, j, 2));
+                               Inc(j, 2);
+                               db := true;
+                       end;
+
+                       if System.Pos(ch, SN) > 0 then begin
+                               No := No + ch;
+                       end else if (ch = '-') then begin
+                               if sw then break;
+                               if No = '' then break;
+                               No := No + ch;
+                               sw := true;
+                       end else begin
+                               break;
+                       end;
+               end;
+       end;
+
+       function checkComma : boolean;
+       begin
+               j := 1;
+               len := Length(s);
+               if ((len > 0) and (s[j] = ',')) or ((len > 1) and (ZenToHan(Copy(s, j ,2)) = ','))  then begin
+                       Result := true;
+                       if (ByteType(s, j) = mbSingleByte) then
+                               Inc(j)
+                       else
+                               Inc(j, 2);
+                       No := '';
+               end else begin
+                       Result := false;
+               end;
+       end;
 begin
        //s \82É\96{\95\82ð\91S\95\94\93ü\82ê\82é
        s        :=     Body;
@@ -406,77 +474,13 @@ begin
                        end;
                        // \83\8c\83X\83A\83\93\83J\81[\82ª\8aÜ\82Ü\82ê\82Ä\82¢\82½\82ç,\82ª\91±\82­\8cÀ\82è\83A\83\93\83J\81[\82Æ\82µ\82Ä\88µ\82¤
                        if i <= 3 then begin
-                               cm := false;
-                               j := 1 ;
+                               No := '';
+                               cm := checkComma;
                                len := Length(s);
-                               if ((len > 0) and (s[j] = ',')) or
-                                       ((len > 1) and (ZenToHan(Copy(s, j ,2)) = ',')) then begin
-                                       cm := true;
-                                       db := false;
-                                       sw := false;
-                                       if (ByteType(s, j) = mbSingleByte) then
-                                               Inc(j)
-                                       else
-                                               Inc(j, 2);
-                                       No := '';
-                                       len := Length(s);
-                                       while cm do begin
-                                               while (j <= len) do begin
-                                                       if (ByteType(s, j) = mbSingleByte) then begin
-                                                               //1byte\95\8e\9a
-                                                               ch := s[j];
-                                                               Inc(j);
-                                                               db := false;
-                                                       end else begin
-                                                               //2byte\95\8e\9a
-                                                               ch := ZenToHan(Copy(s, j, 2));
-                                                               Inc(j, 2);
-                                                               db := true;
-                                                       end;
-                                                       if System.Pos(ch, SN) > 0 then begin
-                                                               No := No + ch;
-                                                       end else if (ch = '-') then begin
-                                                               if sw then break;
-                                                               if No = '' then cm := false;
-                                                               No := No + ch;
-                                                               sw := true;
-                                                       end else begin
-                                                               break;
-                                                       end;
-                                               end;
-                                               //\8fI\92[\82Ü\82Å\8ds\82Á\82Ä\82Ì\8fI\97¹\82©\83`\83F\83b\83N
-                                               if j <= len then begin
-                                                       if db then j := j - 2
-                                                       else j := j - 1;
-                                               end;
-                                               //\89½\82à\90\94\8e\9a\82ª\8c©\82Â\82©\82ç\82È\82¢\82Æ\82«
-                                               if No = '' then begin
-                                                       Result := Result + Copy(s, 1, j - 1);
-                                               end else begin
-                                                       separateNumber(st, et, No, '-');
-
-                                                       if not DatToHTML then begin
-                                                               Result := Result + Format(FORMAT_LINK,
-                                                                       [ParamBBS, Bbs, ParamKey, Key, ParamStart, st, ParamTo, et, ParamNoFirst, ParamTrue]);
-                                                       end else begin
-                                                               Result := Result + Format('<a href="#%s">', [st]);
-                                                       end;
-                                                       Result := Result + Copy(s, 1, j - 1) + '</a>';
-                                               end;
-                                               Delete(s, 1, j - 1);
-                                               j := 1;
-                                               if (s[j] = ',') or (ZenToHan(Copy(s, j ,2)) = ',')  then begin
-                                                       cm := true;
-                                                       if (ByteType(s, j) = mbSingleByte) then
-                                                               Inc(j)
-                                                       else
-                                                               Inc(j, 2);
-                                                       No := '';
-                                                       len := Length(s);
-                                               end else begin
-                                                       cm := false;
-                                               end;
-                                       end;
+                               while cm do begin
+                                       getNumberString;
+                                       Result := addResAnchor(Result);
+                                       cm := checkComma;
                                end;
                        end;
                end else begin
@@ -487,50 +491,8 @@ begin
                        sw := false;
                        db := false;
                        len := Length(s);
-                       while j <= len do begin
-                               if (ByteType(s, j) = mbSingleByte) then begin
-                                       //1byte\95\8e\9a
-                                       ch := s[j];
-                                       Inc(j);
-                                       db := false;
-                               end else begin
-                                       //2byte\95\8e\9a
-                                       ch := ZenToHan(Copy(s, j, 2));
-                                       Inc(j, 2);
-                                       db := true;
-                               end;
-
-                               if System.Pos(ch, SN) > 0 then begin
-                                       No := No + ch;
-                               end else if (ch = '-') then begin
-                                       if sw then break;
-                                       if No = '' then break;
-                                       No := No + ch;
-                                       sw := true;
-                               end else begin
-                                       break;
-                               end;
-                       end;
-                       //\8fI\92[\82Ü\82Å\8ds\82Á\82Ä\82Ì\8fI\97¹\82©\83`\83F\83b\83N
-                       if j <= len then begin
-                               if db then j := j - 2
-                               else j := j - 1;
-                       end;
-                       //\89½\82à\90\94\8e\9a\82ª\8c©\82Â\82©\82ç\82È\82¢\82Æ\82«
-                       if No = '' then begin
-                               Result := Result + Copy(s, 1, j - 1);
-                       end else begin
-                               separateNumber(st, et, No, '-');
-
-                               if not DatToHTML then begin
-                                       Result := Result + Format(FORMAT_LINK,
-                                                               [ParamBBS, Bbs, ParamKey, Key, ParamStart, st, ParamTo, et, ParamNoFirst, ParamTrue]);
-                               end else begin
-                                       Result := Result + Format('<a href="#%s">', [st]);
-                               end;
-                               Result := Result + Copy(s, 1, j - 1) + '</a>';
-                       end;
-                       Delete(s, 1, j - 1);
+                       getNumberString;
+                       Result := addResAnchor(Result);
                end;
        end;
        Result := Result + s;