[Top][All Lists]
[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