StringClassUtil.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 /* Word-related REXX string method utility functions */
42 /* */
43 /******************************************************************************/
44 #include <stdlib.h>
45 #include <string.h>
46 #include <ctype.h>
47 
48 #include "RexxCore.h"
49 #include "StringClass.hpp"
50 #include "ActivityManager.hpp"
51 
52 
53 /******************************************************************************/
54 /* Function: Take in an agument passed to a method, convert it to a length */
55 /* object, verifying that the number is a non-negative value. */
56 /* If the argument is omitted, an error is raised. */
57 /******************************************************************************/
59  RexxObject * argument, /* input argument */
60  size_t position ) /* position of the argument */
61 {
62  if (argument == OREF_NULL) /* have a real argument? */
63  {
64  missingArgument(OREF_positional, position); /* raise an error */
65  }
66  stringsize_t value; /* converted number value */
67 
68  if (!argument->unsignedNumberValue(value, Numerics::ARGUMENT_DIGITS))
69  {
70  /* raise the error */
72  }
73  return value;
74 }
75 
76 
77 /******************************************************************************/
78 /* Function: Take in an agument passed to a method, convert it to a position*/
79 /* value, verifying that the number is a positive value. */
80 /* If the argument is omitted, an error is raised. */
81 /******************************************************************************/
83  RexxObject *argument, /* input argument */
84  size_t position ) /* position of the argument */
85 {
86  if (argument == OREF_NULL) /* have a real argument? */
87  {
88  missingArgument(OREF_positional, position); /* raise an error */
89  }
90  stringsize_t value; /* converted number value */
91 
92  if (!argument->unsignedNumberValue(value, Numerics::ARGUMENT_DIGITS) || value == 0)
93  {
94  /* raise the error */
96  }
97  return value;
98 }
99 
100 /******************************************************************************/
101 /* Function: Take in an argument passed to the BIF, convert it to a */
102 /* character, if it exists otherwise return the default */
103 /* character as defined (passed in) by the BIF. */
104 /******************************************************************************/
106  RexxObject *argument, /* method argument */
107  size_t position ) /* argument position */
108 {
109  RexxString *parameter = (RexxString *)stringArgument(argument, OREF_positional, position);
110  /* is the string only 1 character? */
111  if (parameter->getLength() != 1)
112  {
113  /* argument not good, so raise an */
114  /*error */
115  reportException(Error_Incorrect_method_pad, parameter); // better to display parameter instead of argument
116  }
117  /* yes, return the character. */
118  return parameter->getChar(0);
119 }
120 
121 /******************************************************************************/
122 /* Function: Take in an argument passed to the BIF, convert it to a */
123 /* character, if it exists otherwise return the default */
124 /* character as defined (passed in) by the BIF. */
125 /******************************************************************************/
127  RexxObject *argument, /* method argument */
128  size_t position ) /* argument position */
129 {
130  /* force option to string */
131  RexxString *parameter = (RexxString *)stringArgument(argument, OREF_positional, position);
132  /* return the first character */
133  return toupper(parameter->getChar(0));
134 }
void reportException(wholenumber_t error)
void missingArgument(RexxString *kind, size_t argumentPosition)
#define OREF_NULL
Definition: RexxCore.h:61
RexxString * stringArgument(RexxObject *object, RexxString *kind, size_t position)
Definition: RexxCore.h:315
#define Error_Incorrect_method_position
#define Error_Incorrect_method_length
#define Error_Incorrect_method_pad
codepoint_t padArgument(RexxObject *argument, size_t position)
char optionArgument(RexxObject *argument, size_t position)
stringsize_t positionArgument(RexxObject *argument, size_t position)
stringsize_t lengthArgument(RexxObject *argument, size_t position)
static const size_t ARGUMENT_DIGITS
Definition: Numerics.hpp:68
virtual bool unsignedNumberValue(stringsize_t &result, size_t precision)
size_t getLength()
char getChar(size_t p)
ssize_t codepoint_t
Definition: rexx.h:232
size_t stringsize_t
Definition: rexx.h:228