bug-global
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] add support of multi-line string to htags


From: Hideki IWAMOTO
Subject: Re: [PATCH] add support of multi-line string to htags
Date: Sun, 09 Mar 2003 02:08:51 +0900

This is the version improved so that quotation marks and the backslash
in a comment can be treated correctly.

The following things are assumed in order to simplify protect_line.
 o The comment which starts in // is not divided into two or more lines by 
backslash-newline.
 o An escape sequence is not divided into two or more lines by 
backslash-newline.
 o /* and // which are the start of a comment, and */ which is the end of a 
comment 
   are not divided into two lines by backslash-newline.


Index: htags/htags.in
===================================================================
RCS file: /cvsroot/global/global/htags/htags.in,v
retrieving revision 1.99
diff -u -r1.99 htags.in
--- htags/htags.in      6 Mar 2003 15:09:13 -0000       1.99
+++ htags/htags.in      8 Mar 2003 16:10:26 -0000
@@ -2052,6 +2052,7 @@
                #
                print "<PRE>\n";
                $INCOMMENT = 0;                 # initial status is out of 
comment
+               $quote = '';
                local($LNO, $TAG, $TYPE) = &anchor'first();
                while (<SRC>) {
                        local($converted);
@@ -2257,54 +2258,61 @@
 #
 #      io)     $_      source line
 #
-#      \001    quoted(\) char
-#      \002    quoted('') char
 #      \003    quoted string
 #      \004    comment
-#      \005    line comment
-#      \032    temporary mark
 #
 sub protect_line {
-       @quoted_char1 = ();
-       while (s/(\\.)/\001/) {
-               push(@quoted_char1, $1);
-       }
-       @quoted_char2 = ();
-       while (s/('[^']*')/\002/) {
-               push(@quoted_char2, $1);
-       }
        @quoted_strings = ();
-       while (s/("[^"]*")/\003/) {
-               push(@quoted_strings, $1);
-       }
        @comments = ();
-       s/^/\032/ if ($INCOMMENT);
-       while (1) {
-               if ($INCOMMENT == 0) {
-                       if (s/\/\*/\032\/\*/) {         # start comment
-                               $INCOMMENT = 1;
-                       } else {
-                               last;
-                       }
-               } else {
+       if ($INCOMMENT) {
+               # This regular expression was drived from
+               # perl FAQ 4.27 (ftp://ftp.cis.ufl.edu/pub/perl/faq/FAQ)
+               if (s!^([^*]*\*+([^/*][^*]*\*+)*/)!\004!) {
+                       push(@comments, $1);
+                       $INCOMMENT = 0;
+               }
+               else {
+                       s/^(.*)$/\004/;
+                       push(@comments, $1);
+               }
+       } elsif ($quote) {
+               if (s/^(([^$quote\\]|\\.)*$quote)/\003/) {
+                       push(@quoted_strings, $1);
+                       $quote = '';
+               }
+               else {
+                       s/^(.*)$/\003/;
+                       push(@quoted_strings, $1);
+               }
+       }
+       while (/(\/\/|\/\*|'|")/) {
+               if ($1 eq '//') {
+                       s/(\/\/.*$)/\004/;
+                       push(@comments, $1);
+               }
+               elsif ($1 eq '/*') {
                        # This regular expression was drived from
                        # perl FAQ 4.27 (ftp://ftp.cis.ufl.edu/pub/perl/faq/FAQ)
-                       if (s!\032((/\*)?[^*]*\*+([^/*][^*]*\*+)*/)!\004!) {
+                       if (s!(/\*[^*]*\*+([^/*][^*]*\*+)*/)!\004!) {
                                push(@comments, $1);
-                               $INCOMMENT = 0;
-                       } else {
-                               s/\032(.*)$/\004/;      # mark comment
+                       }
+                       else {
+                               s/(\/\*.*)$/\004/;
                                push(@comments, $1);
+                               $INCOMMENT = 1;
+                       }
+               }
+               else {
+                       $quote = $1;
+                       if (s/($quote([^$quote\\]|\\.)*$quote)/\003/) {
+                               push(@quoted_strings, $1);
+                               $quote = '';
+                       }
+                       else {
+                               push(@quoted_strings, $1);
+                               s/($quote.*)$/\003/;
                        }
-                       last if ($INCOMMENT);
                }
-       }
-       $line_comment = '';
-       if (s!(//.*)$!\005! || s!(/\004.*)$!\005!) {
-               $line_comment = $1;
-               # ^     //   /*   $     ... '//' invalidate '/*'.
-               # ^     //*       $     ... Assumed '//' + '*', not '/' + '/*'.
-               $INCOMMENT = 0;
        }
 }
 #
@@ -2315,9 +2323,6 @@
 sub unprotect_line {
        local($s);
 
-       if ($line_comment) {
-               s/\005/$'comment_begin$line_comment$'comment_end/;
-       }
        while (@comments) {
                $s = shift @comments;
                # nested tag can be occured but no problem.
@@ -2326,14 +2331,6 @@
        while (@quoted_strings) {
                $s = shift @quoted_strings;
                s/\003/$s/;
-       }
-       while (@quoted_char2) {
-               $s = shift @quoted_char2;
-               s/\002/$s/;
-       }
-       while (@quoted_char1) {
-               $s = shift @quoted_char1;
-               s/\001/$s/;
        }
 }
 #

----
Hideki IWAMOTO  address@hidden




reply via email to

[Prev in Thread] Current Thread [Next in Thread]