Author: esr
Date: Thu Apr 26 04:47:20 2007
New Revision: 17102

URL: http://svn.gna.org/viewcvs/wesnoth?rev=17102&view=rev
Log:
Don't issue a warning om duplicated but identical maacro definitions.
-w 1 can be used to force warning on duplicates.

Modified:
    trunk/data/tools/macroscope

Modified: trunk/data/tools/macroscope
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/data/tools/macroscope?rev=17102&r1=17101&r2=17102&view=diff
==============================================================================
--- trunk/data/tools/macroscope (original)
+++ trunk/data/tools/macroscope Thu Apr 26 04:47:20 2007
@@ -38,7 +38,7 @@
 #
 # The reporting format is compatible with GNU Emacs compile mode.
 
-import sys, os, time, re, getopt, sre_constants
+import sys, os, time, re, getopt, sre_constants, md5
 
 resource_extensions = ("png", "jpg", "ogg", "wav")
 
@@ -152,7 +152,7 @@
                 key = trial
                 self.fileref[key].append(fn, n)
         return key
-    def __init__(self, dirpath, exclude=""):
+    def __init__(self, dirpath, exclude="", warnlevel=0):
         "Build cross-reference object from the specified filelist."
         self.dirpath = dirpath
         self.filelist = allfiles(dirpath, exclude)
@@ -184,22 +184,38 @@
             elif iswml(filename):
                 # It's a WML file, scan for macro defitions
                 dfp = open(filename)
-                here = None
+                state = "outside"
                 for (n, line) in enumerate(dfp):
-                    if line.strip().startswith("#define"):
-                        tokens = line.strip().split()
+                    line = line.strip()
+                    if line.startswith("#define"):
+                        tokens = line.split()
                         name = tokens[1]
                         here = reference(filename, n+1, line)
+                        here.hash = md5.new()
+                        here.docstring = line[8:]      # Strip off #define_
+                        state = "macro_header"
+                        continue
+                    elif line.endswith("#enddef"):
+                        here.hash.update(line)
+                        here.hash = here.hash.digest()
                         if name in self.xref:
-                            print >>sys.stderr, "*** Warning: duplicate 
definition of %s from %s, at %s" \
-                                  % (name, self.xref[name], here)
-                        self.xref[name] = here
-                        here.docstring = line[8:]      # Strip off #define_
-                    elif here:
-                        if line[0] == "#":
-                            here.docstring += line[1:]
+                            if self.xref[name].hash != here.hash:
+                                print >>sys.stderr, "*** Warning: different " \
+                                       "definition of %s from %s, at %s" \
+                                       % (name, self.xref[name], here)
+                            elif warnlevel > 0:
+                                print >>sys.stderr, "*** Warning: duplicate " \
+                                       "definition of %s from %s, at %s" \
+                                       % (name, self.xref[name], here)
                         else:
-                            here = None
+                            self.xref[name] = here
+                        state = "outside"
+                    elif state == "macro_header" and line and line[0] != "#":
+                        state = "macro_body"
+                    if state == "macro_header":
+                        here.docstring += line[1:]
+                    if state in ("macro_header", "macro_body"):
+                        here.hash.update(line)
                 dfp.close()
             elif filename.endswith(".def"):
                 # It's a list of names to be considered defined
@@ -349,20 +365,21 @@
 Usage: macroscope [options] dirpath
     Options may be any of these:
     -h, --help                 Emit this help message and quit
-    -c, --crossreference       Report resolved macro references
+    -c, --crossreference       Report resolved macro references (implies -w 1)
     -d, --deflist              Make definition list
     -e reg, --exclude reg      Ignore files matching 
     -f dir, --from dir         Report only on macros defined under dir
     -l, --listfiles            List files that will be processed
     -r ddd, --refcount=ddd     Report only on macros w/references in ddd files
     -u, --unresolved           Report unresolved macro references
+    -w, --warnlevel            Set to 1 to warn of duplicate definitions
     --forced-used reg          Ignore refcount 0 on names matching regexp
     --extracthelp              Extract help from macro definition comments.
    The required dirpath argument may be a colon-separated directory list.
 """)
 
     # Process options
-    (options, arguments) = getopt.getopt(sys.argv[1:], "cdhe:f:lr:u",
+    (options, arguments) = getopt.getopt(sys.argv[1:], "cdhe:f:lr:uw:",
                                          [
                                           'crossreference',
                                           'definitions',
@@ -374,12 +391,14 @@
                                           'listfiles',
                                           'refcount=',
                                           'unresolved',
+                                          'warnlevel=',
                                           ])
     crossreference = definitions = listfiles = unresolved = extracthelp = False
     from_restrict = None
     refcount_restrict = None
     forceused = None
     exclude = []
+    warnlevel = 0
     for (switch, val) in options:
         if switch in ('-h', '--help'):
             help()
@@ -388,6 +407,7 @@
             from_restrict = val
         elif switch in ('-c', '--crossreference'):
             crossreference = True
+            warnlevel = 1
         elif switch in ('-d', '--definitions'):
             definitions = True
         elif switch in ('-e', '--exclude'):
@@ -402,12 +422,14 @@
             refcount_restrict = int(val)
         elif switch in ('-u', '--unresolved'):
             unresolved = True
+        elif switch in ('-w', '--warnlevel'):
+            warnlevel = int(val)
 
     if len(arguments):
         dirpath = arguments[0].split(":")
     else:
         dirpath = ['.']
-    xref = CrossRef(dirpath, "|".join(exclude))
+    xref = CrossRef(dirpath, "|".join(exclude), warnlevel)
     if extracthelp:
         xref.extracthelp(dirpath[0], sys.stdout)
     elif listfiles:


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to