GlobalNames.cpp
Go to the documentation of this file.
1 /*----------------------------------------------------------------------------*/
2 /* */
3 /* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */
4 /* Copyright (c) 2005-2009 Rexx Language Association. All rights reserved. */
5 /* */
6 /* This program and the accompanying materials are made available under */
7 /* the terms of the Common Public License v1.0 which accompanies this */
8 /* distribution. A copy is also available at the following address: */
9 /* http://www.oorexx.org/license.html */
10 /* */
11 /* Redistribution and use in source and binary forms, with or */
12 /* without modification, are permitted provided that the following */
13 /* conditions are met: */
14 /* */
15 /* Redistributions of source code must retain the above copyright */
16 /* notice, this list of conditions and the following disclaimer. */
17 /* Redistributions in binary form must reproduce the above copyright */
18 /* notice, this list of conditions and the following disclaimer in */
19 /* the documentation and/or other materials provided with the distribution. */
20 /* */
21 /* Neither the name of Rexx Language Association nor the names */
22 /* of its contributors may be used to endorse or promote products */
23 /* derived from this software without specific prior written permission. */
24 /* */
25 /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
26 /* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
27 /* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */
28 /* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
29 /* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
30 /* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
31 /* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */
32 /* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */
33 /* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
34 /* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
35 /* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
36 /* */
37 /*----------------------------------------------------------------------------*/
38 /******************************************************************************/
39 /* REXX Kernel */
40 /* */
41 /* Save and Restore all global "name" strings */
42 /* */
43 /******************************************************************************/
44 #include "RexxCore.h"
45 #include "DirectoryClass.hpp"
46 #include "ArrayClass.hpp"
48 /******************************************************************************/
49 /* Function: Create all globally available string objects */
50 /******************************************************************************/
51 {
52  // if we're calling this, then we're building the image. Make sure the
53  // global string directory is created first.
55  /* redefine the GLOBAL_NAME macro */
56  /* to create each of the strings */
57 #undef GLOBAL_NAME
58 #if debug_encoding // debug encoding
59  // Never had a PANIC
60  #define GLOBAL_NAME(name, value) \
61  OREF_##name = getGlobalName(value); \
62  if (OREF_##name->getEncoding() != OREF_NULL && OREF_##name->getEncoding() != OREF_##name) printf("RexxMemory::createStrings PANIC string=%p encoding=%p %s\n", OREF_##name, OREF_##name->getEncoding(), OREF_##name->getStringData());
63 #else
64  #define GLOBAL_NAME(name, value) OREF_##name = getGlobalName(value);
65 #endif
66 
67 #include "GlobalNames.h" /* now create the strings */
68 }
69 
70 
72 /******************************************************************************/
73 /* Function: Create all globally available string objects */
74 /******************************************************************************/
75 {
76  /* redefine the GLOBAL_NAME macro */
77  /* to count the number of string */
78  /* objects we need to save */
79  #undef GLOBAL_NAME
80  #define GLOBAL_NAME(name, value) stringCount++;
81 
82  size_t stringCount = 0; /* no strings yet */
83  #include "GlobalNames.h" /* now create the strings */
84 
85  // get an array to contain all of the string values
86  RexxArray *stringArray = new_array(stringCount);
87  /* redefine the GLOBAL_NAME macro */
88  /* to save each string in the array */
89  /* at its relative offset */
90  #undef GLOBAL_NAME
91 #if debug_encoding // debug encoding
92  #define GLOBAL_NAME(name, value) \
93  stringArray->put((RexxObject *)OREF_##name, stringCount); stringCount++; \
94  if (OREF_##name->getEncoding() != OREF_NULL && OREF_##name->getEncoding() != OREF_##name) printf("RexxMemory::saveStrings PANIC string=%p encoding=%p %s\n", OREF_##name, OREF_##name->getEncoding(), OREF_##name->getStringData());
95 #else
96  #define GLOBAL_NAME(name, value) stringArray->put((RexxObject *)OREF_##name, stringCount); stringCount++;
97 #endif
98 
99  stringCount = 1; /* start with the first string */
100  #include "GlobalNames.h" /* now save the strings */
101 
102  return stringArray; // and return the saved string array
103 }
104 
106 /******************************************************************************/
107 /* Function: Create all globally available string objects */
108 /******************************************************************************/
109 {
110  /* redefine the GLOBAL_NAME macro */
111  /* to create and give a count of the */
112  /* strings created */
113  #undef GLOBAL_NAME
114 #if debug_encoding // debug encoding
115  // there is indeed a PANIC if I don't initialize text and encoding
116  // initialize text and encoding to NULL (otherwise I have a non-NULL value which is an invalid pointer, don' know why)
117  // #define GLOBAL_NAME(name, value) OREF_##name = *strings++;
118  #define GLOBAL_NAME(name, value) \
119  OREF_##name = *strings++; \
120  if (OREF_##name->getEncoding() != OREF_NULL && OREF_##name->getEncoding() != OREF_##name) printf("RexxMemory::restoreStrings PANIC string=%p encoding=%p %s\n", OREF_##name, OREF_##name->getEncoding(), OREF_##name->getStringData()); \
121  printf("RexxMemory::restoreStrings before initialize OREF_##name=%p text=%p encoding=%p %s\n", OREF_##name, OREF_##name->getText(), OREF_##name->getEncoding(), OREF_##name->getStringData()); \
122  OREF_##name->setText(OREF_NULL); \
123  OREF_##name->setEncoding(OREF_NULL);
124 #else
125  #define GLOBAL_NAME(name, value) OREF_##name = *strings++;
126 #endif
127 
128  RexxString **strings = (RexxString **)stringArray->data();
129  #include "GlobalNames.h" /* now restore the strings */
130 }
RexxArray * new_array(size_t s)
Definition: ArrayClass.hpp:259
RexxDirectory * new_directory()
RexxObject ** data()
Definition: ArrayClass.hpp:204
static RexxDirectory * globalStrings
Definition: RexxMemory.hpp:418
static void createStrings()
Definition: GlobalNames.cpp:47
static RexxArray * saveStrings()
Definition: GlobalNames.cpp:71
static void restoreStrings(RexxArray *stringArray)