Author: esr
Date: Sun Apr  8 05:09:50 2007
New Revision: 16686

URL: http://svn.gna.org/viewcvs/wesnoth?rev=16686&view=rev
Log:
A half-step towards consistency-checking resource references.

Modified:
    trunk/data/tools/macroscope

Modified: trunk/data/tools/macroscope
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/data/tools/macroscope?rev=16686&r1=16685&r2=16686&view=diff
==============================================================================
--- trunk/data/tools/macroscope (original)
+++ trunk/data/tools/macroscope Sun Apr  8 05:09:50 2007
@@ -33,50 +33,69 @@
         else:
             return self.filebame
 
-class macro_cross_reference:
+class CrossRef:
+    macro_reference = re.compile(r"\{([A-Z_][A-Z0-9_:]*[A-Z0-9_])\b")
+    file_reference =  re.compile(r"[A-Za-z0-9.-_/]*\.(png|jpg|ogg)")
     def __init__(self, filelist):
         # First, collect macro definitions from the specified filelist."
         self.xref = {}
+        self.fileref = {}
         for filename in filelist:
-            dfp = open(filename)
-            for (n, line) in enumerate(dfp):
-                if line.startswith("#define"):
-                    tokens = line.split()
-                    name = tokens[1]
-                    here = reference(filename, n+1)
-                    if name in self.xref:
-                        print >>sys.stderr, "*** Warning: duplicate definition 
of %s from %s, at %s" \
-                              % (name, self.xref[name][0], here)
-                    self.xref[name] = (here, {})
-            dfp.close()
+            if filename.endswith(".png") or filename.endswith(".jpg") or 
filename.endswith(".ogg"):
+                self.fileref[filename] = {} 
+            elif iswml(filename):
+                dfp = open(filename)
+                for (n, line) in enumerate(dfp):
+                    if line.startswith("#define"):
+                        tokens = line.split()
+                        name = tokens[1]
+                        here = reference(filename, n+1)
+                        if name in self.xref:
+                            print >>sys.stderr, "*** Warning: duplicate 
definition of %s from %s, at %s" \
+                                  % (name, self.xref[name][0], here)
+                        self.xref[name] = (here, {})
+                dfp.close()
         # Next, decorate definitions with all references from the filelist.
         self.unresolved = []
+        self.missing = []
         formals = []
-        for filename in filelist:
-            rfp = open(filename)
-            for (n, line) in enumerate(rfp):
-                if line.startswith("#define"):
-                    formals = line.split()[2:]
-                elif line.startswith("#enddef"):
-                    formals = []
-                if '#' in line:
-                    line = line.split('#')[0]
-                if not line or "{" not in line:
-                    continue
-                for match in re.finditer(r"\{([A-Z_][A-Z0-9_:]*[A-Z0-9_])\b", 
line):
-                    name = match.group(1)
-                    if name in formals:
+        for fn in filelist:
+            if iswml(fn):
+                rfp = open(fn)
+                for (n, line) in enumerate(rfp):
+                    if line.startswith("#define"):
+                        formals = line.split()[2:]
+                    elif line.startswith("#enddef"):
+                        formals = []
+                    if '#' in line:
+                        line = line.split('#')[0]
+                    if not line or "{" not in line:
                         continue
-                    elif name in self.xref:
-                        namedict = self.xref[name][1]
-                        if filename not in namedict:
-                            namedict[filename] = []
-                        namedict[filename].append(n+1)
-                    else:
-                        self.unresolved.append((name, reference(filename,n+1)))
-            rfp.close()
+                    # Find references to macros
+                    for match in re.finditer(CrossRef.macro_reference, line):
+                        name = match.group(1)
+                        if name in formals:
+                            continue
+                        elif name in self.xref:
+                            namedict = self.xref[name][1]
+                            if fn not in namedict:
+                                namedict[fn] = []
+                            namedict[fn].append(n+1)
+                        else:
+                            self.unresolved.append((name, reference(fn,n+1)))
+                    # Find references to resource files
+                    for match in re.finditer(CrossRef.file_reference, line):
+                        name = match.group(0)
+                        if name in self.fileref:
+                            namedict = self.xref[name]
+                            if fn not in namedict:
+                                namedict[fn] = []
+                            namedict[fn].append(n+1)
+                        else:
+                            self.missing.append((name, reference(fn,n+1)))
+                rfp.close()
     def xrefdump(self, pred=None):
-        "Report resolved references."
+        "Report resolved macro references."
         for (name, (defloc, references)) in self.xref.items():
             if pred and not pred(name, defloc, references):
                 continue
@@ -88,11 +107,11 @@
             for (file, linenumbers) in references.items():
                  print "    %s: %s" % (file, `linenumbers`[1:-1])
     def unresdump(self):
-        "Report dangling references."
-        if len(self.unresolved) == 0:
+        "Report unresolved references."
+        if len(self.unresolved) == 0 and len(self.missing) == 0:
             print "# No unresolved references"
         else:
-            print "# Dangling references:"
+            print "# Unresolved references:"
             for (name, reference) in self.unresolved:
                 print "%s at %s" % (name, reference)
 
@@ -139,7 +158,7 @@
     print "# Directory path:    %s" % dirpath
     files = allfiles(dirpath)
     if crossreference or unresolved:
-        xref = macro_cross_reference(filter(iswml, allfiles(dirpath)))
+        xref = CrossRef(allfiles(dirpath))
         def predicate(name, defloc, references):
             if from_restrict and not defloc.filename.startswith(from_restrict):
                 return False


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

Reply via email to