1# Copyright (C) 2013 Google, Inc. All Rights Reserved.
2#
3# Redistribution and use in source and binary forms, with or without
4# modification, are permitted provided that the following conditions
5# are met:
6# 1. Redistributions of source code must retain the above copyright
7#    notice, this list of conditions and the following disclaimer.
8# 2. Redistributions in binary form must reproduce the above copyright
9#    notice, this list of conditions and the following disclaimer in the
10#    documentation and/or other materials provided with the distribution.
11#
12# THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
13# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
15# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
16# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
17# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
18# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
19# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
20# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
22# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
24package StaticString;
25
26use strict;
27use Hasher;
28
29sub GenerateStrings($)
30{
31    my $stringsRef = shift;
32    my %strings = %$stringsRef;
33
34    my @result = ();
35
36    while ( my ($name, $value) = each %strings ) {
37        push(@result, "static const LChar ${name}String8[] = \"${value}\";\n");
38    }
39
40    push(@result, "\n");
41
42    while ( my ($name, $value) = each %strings ) {
43        my $length = length($value);
44        my $hash = Hasher::GenerateHashValue($value);
45        push(@result, <<END);
46static StringImpl::StaticASCIILiteral ${name}Data = {
47    StringImpl::StaticASCIILiteral::s_initialRefCount,
48    $length,
49    ${name}String8,
50    StringImpl::StaticASCIILiteral::s_initialFlags | (${hash} << StringImpl::StaticASCIILiteral::s_hashShift)
51};
52END
53    }
54
55    push(@result, "\n");
56
57    return join "", @result;
58}
59
60sub GenerateStringAsserts($)
61{
62    my $stringsRef = shift;
63    my %strings = %$stringsRef;
64
65    my @result = ();
66
67    push(@result, "#ifndef NDEBUG\n");
68
69    while ( my ($name, $value) = each %strings ) {
70        push(@result, "    reinterpret_cast<StringImpl*>(&${name}Data)->assertHashIsCorrect();\n");
71    }
72
73    push(@result, "#endif // NDEBUG\n");
74
75    push(@result, "\n");
76
77    return join "", @result;
78}
79
801;
81