Reviewed by Ken.
[WebKit-https.git] / WebCore / khtml / misc / maketags
1 #!/usr/bin/perl
2 #   This file is part of the KDE libraries
3 #
4 #   Copyright (C) 1998 Waldo Bastian (bastian@kde.org)
5 #                 1999 Lars Knoll (knoll@kde.org)
6 #   Copyright (C) 2004 Apple Computer, Inc.  All rights reserved.
7 #
8 #   This library is free software; you can redistribute it and/or
9 #   modify it under the terms of the GNU Library General Public
10 #   License as published by the Free Software Foundation; either
11 #   version 2 of the License, or (at your option) any later version.
12 #
13 #   This library is distributed in the hope that it will be useful,
14 #   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 #   Library General Public License for more details.
17 #
18 #   You should have received a copy of the GNU Library General Public License
19 #   along with this library; see the file COPYING.LIB.  If not, write to
20 #   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 #   Boston, MA 02111-1307, USA.
22 #
23 #----------------------------------------------------------------------------
24 #
25 #  KDE HTML Widget -- Script to generate htmltags.c and htmltags.h
26 #
27
28 use strict;
29
30 open IN, "htmltags.in"
31   or die "Can't open in\n";
32 open header, ">htmltags.h"
33   or die "Can't open header\n";
34 open out, ">htmltags.gperf"
35   or die "Can't open out\n";
36
37 print out "%{\n/* This file is automatically generated from htmltags.in by maketags, do not edit */\n/* Copyright 1999 Lars Knoll */\n#include \"htmltags.h\"\n%}\n";
38 print out "struct tags {\n    const char *name;\n    int id;\n};\n%%\n";
39
40 print header "/* This file is automatically generated from
41 htmltags.in by maketags, do not edit */\n/* Copyright 1999 Lars Knoll */\n/* Copyright 2004 Apple Computer, Inc. */\n\n#ifndef KHTML_TAGS_H\n#define KHTML_TAGS_H\n\n#include \"dom/dom_string.h\"\n\n";
42
43 print header "DOM::DOMString getTagName(unsigned short id);\n\n";
44
45 my $num = 0;
46 my $openTags = "";
47 my $closeTags = "";
48 while (<IN>) {
49     chomp;
50     my $attr = $_;
51     $num += 1;
52     my $up = uc($attr);
53     $openTags .= "    \"$up\",\n";
54     $closeTags .= "    \"/$up\",\n";
55     $up =~ s/-/_/;
56     print out $attr . ", ID_" . $up . "\n";
57     print header "const unsigned short ID_$up = $num;\n";
58 }
59 print out "anchor, ID_A\n";
60 print out "image, ID_IMG\n";
61 print out "listing, ID_PRE\n";
62 $num += 1;
63 print header "const unsigned short ID_TEXT = $num;\n";
64 $num += 1;
65 print header "const unsigned short ID_COMMENT = $num;\n";
66 print header "const unsigned short ID_LAST_TAG = $num;\n";
67 print header "const unsigned short ID_CLOSE_TAG = 32000;\n";
68
69 print out "%%\n";
70 close out;
71 print header "\n#endif\n";
72 close header;
73
74 my $result = system("/bin/sh", "-c", "gperf -a -L 'ANSI-C' -D -E -C -l -o -t -k '*' -NfindTag -Hhash_tag -Wwordlist_tag htmltags.gperf > htmltags.c");
75 if ($result) {
76   unlink "htmltags.c";
77   exit $result;
78 }
79
80 open IN, "htmltags.c" or die;
81
82 my $numLines = 0;
83 while (<IN>) {
84     $numLines++;
85 }
86 $numLines += 2;
87
88 chomp $openTags;
89 chomp $closeTags;
90
91 open OUT, ">>htmltags.c" or die;
92 print OUT <<END
93 #line $numLines "htmltags.c"
94
95 using DOM::DOMString;
96
97 static const char * const openTagNames[] = {
98     0,
99 $openTags
100     "TEXT",
101     "COMMENT"
102 };
103
104 static const char * const closeTagNames[] = {
105     0,
106 $closeTags
107 };
108
109 DOMString getTagName(unsigned short id)
110 {
111     if (id > ID_CLOSE_TAG) {
112         int index = id - ID_CLOSE_TAG;
113         if (index >= ID_TEXT)
114             return DOMString();
115         return closeTagNames[index];
116     }
117     if (id > ID_LAST_TAG)
118         return DOMString();
119     return openTagNames[id];
120 }
121 END