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    0,
51    StringImpl::StaticASCIILiteral::s_initialFlags | (${hash} << StringImpl::StaticASCIILiteral::s_hashShift)
52};
53END
54    }
55
56    push(@result, "\n");
57
58    while ( my ($name, $value) = each %strings ) {
59        push(@result, "static StringImpl* ${name}Impl = reinterpret_cast<StringImpl*>(&${name}Data);\n");
60    }
61
62    push(@result, "\n");
63
64    return join "", @result;
65}
66
67sub GenerateStringAsserts($)
68{
69    my $stringsRef = shift;
70    my %strings = %$stringsRef;
71
72    my @result = ();
73
74    push(@result, "#ifndef NDEBUG\n");
75
76    while ( my ($name, $value) = each %strings ) {
77        push(@result, "    ${name}Impl->assertHashIsCorrect();\n");
78    }
79
80    push(@result, "#endif // NDEBUG\n");
81
82    push(@result, "\n");
83
84    return join "", @result;
85}
86
871;
88