File: make-atom-strings.pl

package info (click to toggle)
iceweasel 2.0.0.19-0etch1
  • links: PTS
  • area: main
  • in suites: etch
  • size: 298,784 kB
  • ctags: 317,912
  • sloc: cpp: 1,796,902; ansic: 987,677; xml: 109,036; makefile: 47,777; asm: 35,201; perl: 26,983; sh: 20,879; cs: 6,232; java: 5,513; python: 3,249; pascal: 459; lex: 306; php: 244; csh: 132; objc: 97; yacc: 79; ada: 49; awk: 14; sql: 4; sed: 4
file content (53 lines) | stat: -rw-r--r-- 1,259 bytes parent folder | download | duplicates (13)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#! perl

# Converts a list of atoms in the form:
# // OUTPUT_CLASS=<classname>
# // MACRO_NAME=<macro>
# <macroname>(atomName, "String")
# <macroname>(atomName2, "String2")
#
# into a file suitable for gperf using static atoms
#
# usage:
# make-atom-strings < file.h > file.gperf
#
# the lines in the C++ comments define two variables:
# OUTPUT_CLASS is the class who has all the atoms as members
# MACRO_NAME is the macro to look for in the rest of the file
#
# for example
# // OUTPUT_CLASS=nsHTMLAtoms
# // MACRO_NAME=HTML_ATOM
# HTML_ATOM(a, "a")
# HTML_ATOM(body, "body")
#
# etc...
#
# this will generate a file that looks like:
# struct nsStaticAtom ( const char* mValue; nsIAtom** aAtom; }
# %%
# "a", &nsHTMLAtoms::a
# "body", &nsHTMLAtoms::body
#
# etc...
#
# the output can be plugged into gperf to generate a perfect hash

print "struct nsStaticAtom {const char* mValue; nsIAtom** aAtom; };\n";
print "%%\n";

my $classname, $macroname;

while (<>) {
  chop;
  if (/OUTPUT_CLASS=(\S+)/) {
    $classname=$1;
  } elsif (/MACRO_NAME=(\S+)/) {
    $macroname=$1;
  }
  elsif ($classname && $macroname &&
         /$macroname\((\S+),\s*\"(.*?)\"\s*\)/) {
    my ($str, $atom) = ($2, $1);
    print "\"$str\", (nsIAtom**)&${classname}::$atom\n";
  }
}