ooRexx  4.2.0-source
About: ooRexx (Open Object Rexx) is a free implementation of Object Rexx. Object Rexx is an enhancement of the classic Rexx interpreter; a full-featured programming language with a human-oriented syntax.
  Fossies Dox: ooRexx-4.2.0-source.tar.gz  ("inofficial" and yet experimental doxygen-generated source code documentation)  

ExternalFunctions.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 AIX Support aixextf.c */
40 /* */
41 /* AIX specific external function lookup and AIX built-in functions. */
42 /* */
43 /******************************************************************************/
44 
45 /******************************************************************************/
46 /* aixextf.c - Methods to resolve external function calls. */
47 /* */
48 /* C methods: */
49 /* sysDirectory- Method for the DIRECTORY BIF */
50 /* SysExternalFunction- Method for searching/invoking an external function */
51 /* */
52 /* Internal routines: */
53 /* ExecExternalSearch - Search for and execute a REXX program from disk. */
54 /* MacroSpaceSearch - Search for and execute a function in REXX macrospace.*/
55 /* RegExternalFunction - Search for and execute a registered external */
56 /* function. */
57 /******************************************************************************/
58 #include <stdio.h> /* Get printf, FILE type, etc. */
59 #include <string.h> /* Get strcpy, strcat, etc. */
60 #include <ctype.h> /* Get toupper */
61 #include <unistd.h> /* get getcwd routine/environ */
62 #include <limits.h> /* Get PATH_MAX */
63 #include <sys/ioctl.h>
64 #include <fcntl.h>
65 #include <errno.h>
66 #include <sys/types.h>
67 #include <pwd.h>
68 
69 #include "RexxCore.h" /* global REXX definitions */
70 #include "StringClass.hpp"
71 #include "ArrayClass.hpp"
72 #include "RexxActivity.hpp"
73 #include "RexxActivation.hpp"
74 #include "MethodClass.hpp"
75 #include "SourceFile.hpp"
76 #include "RexxInternalApis.h" /* Get private REXXAPI API's */
77 #include "ActivityManager.hpp"
78 #include "ProtectedObject.hpp"
79 #include "StringUtil.hpp"
80 #include "SystemInterpreter.hpp"
81 #include "PackageManager.hpp"
82 #include "BufferClass.hpp"
83 
84 
85 #define CMDBUFSIZE 1024 /* Max size of executable cmd */
86 #if defined(AIX)
87 #define CMDDEFNAME "/bin/ksh" /* Default unix sys cmd handler */
88 #define COMSPEC "ksh" /* unix cmd handler env name */
89 #define SYSENV "ksh" /* Default AIX cmd environment */
90 #elif defined(OPSYS_SUN)
91 #define CMDDEFNAME "/bin/sh" /* Default unix sys cmd handler */
92 #define COMSPEC "sh" /* unix cmd handler env name */
93 #define SYSENV "sh" /* Default LINUX cmd environment */
94 #else
95 #define CMDDEFNAME "/bin/bash" /* Default unix sys cmd handler */
96 #define COMSPEC "bash" /* unix cmd handler env name */
97 #define SYSENV "bash" /* Default AIX cmd environment */
98 #endif
99 
100 #define DRVNUM 0x40 /* drive number subtractor */
101 #define DIRLEN 256 /* length of a directory */
102 #define FULLSEG 65536L /* ^4K constant */
103  /* FILESPEC function options */
104 #define FILESPEC_PATH 'P'
105 #define FILESPEC_NAME 'N'
106 #define FILESPEC_LOCATION 'L'
107 #define FILESPEC_EXTENSION 'E'
108 #define FILESPEC_DRIVE 'D'
109 
110 #define KIOCSOUND 0x4B2F /* start sound generation (0 for off) */
111 
112 typedef struct _ENVENTRY { /* setlocal/endlocal structure */
113  size_t size; /* size of the saved memory */
114 } ENVENTRY;
115 
116 int putflag = 0; /* static or dynamic env memory */
117 
118 /*********************************************************************/
119 /* */
120 /* Subroutine Name: sysBeep */
121 /* */
122 /* Descriptive Name: BEEP function */
123 /* */
124 /* Function: sounds the speaker if possible, else flash */
125 /* the screen */
126 /*********************************************************************/
127 
128 RexxRoutine2(CSTRING, sysBeep, OPTIONAL_wholenumber_t, Frequency, OPTIONAL_wholenumber_t, Duration)
129 {
130  /* console beep for Unix */
131  printf("\a");
132  return ""; /* always returns a null */
133 }
134 
135 
136 /********************************************************************
137 * Function: resolve_tilde(path) *
138 * *
139 * Purpose: Resolves path names including '~'. *
140 * *
141 * RC: Returns the absolute path in new allocated space. *
142 * *
143 *********************************************************************/
144 char *resolve_tilde(const char *path)
145 {
146  const char * st;
147  const char *home_dir = NULL; /* home directory path */
148  char *dir_buf = NULL; /* full directory path */
149  const char * slash;
150  char username[100];
151  struct passwd *ppwd;
152 
153  st = path;
154  /* if no user name */
155  if (*(st) == '~' && (*(st+1) == '\0' || *(st+1) == '/'|| *(st+1) == ' ' ))
156  {
157  if (*(st+1) == '/')
158  { /* if there is a path */
159  st +=2; /* jump over '~/' */
160  /* get home directory path */
161  home_dir = getenv("HOME"); /* from the environment */
162  if (!home_dir) /* if no home dir info */
163  return(0);
164  /* get space for the buf */
165  dir_buf = (char *)malloc(strlen(home_dir)+strlen(st)+2);
166  if (!dir_buf)
167  return(0);
168  /* merge the strings */
169  sprintf(dir_buf, "%s/%s", home_dir, st);
170  return dir_buf;
171  }
172  else
173  {
174  /* get home directory path */
175  home_dir = getenv("HOME"); /* from the environment */
176  /* get space for the buf */
177  dir_buf = (char *)malloc(strlen(home_dir)+2);
178  if (!dir_buf)
179  return(0);
180  sprintf(dir_buf, "%s/", home_dir);
181  return dir_buf;
182  }
183  }
184  else if (*(st) == '~')
185  { /* cmd is '~username...' */
186  st++; /* jump over '~' */
187  slash = strchr(st,'/'); /* search for '/' */
188  if (!slash)
189  { /* if no '/' */
190  /* rest of string is username */
191  ppwd = getpwnam(st); /* get info about the user */
192  /* get space for the buf */
193  if (ppwd == NULL)
194  { /* no user */
195  return NULL; /* nothing happend */
196  }
197  dir_buf = (char *)malloc(strlen(ppwd->pw_dir)+2);
198  if (!dir_buf)
199  return NULL;
200  /* merge the strings */
201  sprintf(dir_buf, "%s/", ppwd->pw_dir);
202  }
203  else
204  { /* there is a slash */
205  /* copy the username into a */
206  /* local buffer; 100 bytes */
207  /* should be big enough */
208  /* fixes bug 1695834 */
209  memcpy(username, st, slash-st);
210  username[slash-st] = '\0';
211  ppwd = getpwnam(username); /* get info about the user */
212  slash++; /* step over the slash */
213  /* get space for the buf */
214  dir_buf = (char *)malloc(strlen(ppwd->pw_dir)+strlen(slash)+2);
215  if (!dir_buf)
216  return NULL;
217  /* merge the strings */
218  sprintf(dir_buf, "%s/%s", ppwd->pw_dir, slash);
219  }
220  return dir_buf; /* directory change to */
221  }
222  return NULL;
223 }
224 
225 /****************************************************************************/
226 /* sysDirectory */
227 /****************************************************************************/
228 RexxRoutine1(RexxStringObject, sysDirectory, OPTIONAL_CSTRING, dir)
229 {
230  RexxReturnCode rc;
231  char *rdir; /* resolved path */
232 
233  rc = 0;
234  if (dir != NO_CSTRING) /* if new directory is not null, */
235  {
236  if (*dir == '~')
237  {
238  rdir = resolve_tilde(dir);
239  rc = chdir(rdir);
240  free(rdir);
241  }
242  else
243  {
244  rc = chdir(dir); /* change to the new directory */
245  }
246  }
247 
248  // if we couldn't change the directory, return a null string
249  if (rc != 0)
250  {
251  return context->NullString();
252  }
253  else
254  {
255  // get the current working directory and return it
256  char temp[PATH_MAX + 3];
258  return context->NewStringFromAsciiz(temp);
259  }
260 }
261 
262 
263 /*****************************************************************************/
264 /* sysFilespec */
265 /*****************************************************************************/
266 RexxRoutine2(RexxStringObject, sysFilespec, CSTRING, option, CSTRING, name)
267 {
268  const char *endPtr = name + strlen(name); // point to last character
269  const char *pathEnd = strrchr(name, '/'); // find the last slash in name
270  // get the end of the path portion (if any)
271  const char *pathStart = name;
272  // note that pathend is one character past the end of the path.
273  // this means the length is easily calculated as pathEnd - pathStart,
274  // even in the cases where there is no patch portion
275  pathEnd = pathEnd == NULL ? pathStart : pathEnd + 1;
276  // this one needs a little adjustment for the case where this is all name
277  const char *nameStart = pathEnd == name ? name : pathEnd;
278 
279  switch (toupper(*option)) /* process each option */
280  {
281  case FILESPEC_PATH: /* extract the path */
282  {
283  return context->String(pathStart, pathEnd - pathStart);
284  }
285 
286  case FILESPEC_NAME: /* extract the file name */
287  { /* everything to right of slash */
288  return context->String(nameStart, endPtr - nameStart);
289  }
290 
291  case FILESPEC_DRIVE: /* extract the drive name */
292  { /* compatibility to windows, no drive */
293  return context->NullString();
294  }
295 
296  case FILESPEC_LOCATION: /* extract the file name */
297  { /* everything to left of slash */
298  return context->String(name, pathEnd - name);
299  }
300 
301  case FILESPEC_EXTENSION: // extract the file extension
302  {
303  // find the position of the last dot
304  const char *lastDot = strrchr(name, '.');
305 
306  if (lastDot >= nameStart)
307  {
308  // we don't extract the period
309  lastDot++;
310  return context->String(lastDot, endPtr - lastDot);
311  }
312  else
313  {
314  return context->NullString(); // nothing found, return the empty string
315  }
316 
317  }
318  default: /* unknown option */
319  {
320  char optionChar[2];
321  optionChar[0] = *option;
322  optionChar[1] = '\0';
323 
324  RexxArrayObject subs = context->Array(context->String("FILESPEC"), context->WholeNumberToObject(1),
325  context->String("ELNP"), context->String(optionChar));
326  /* raise an error */
327  context->RaiseException(Rexx_Error_Incorrect_call_list, subs);
328  return NULLOBJECT;
329  }
330  }
331 }
332 
333 
334 /******************************************************************************/
335 /* Name: SysExternalFunction */
336 /* */
337 /* Notes: Handles searching for and executing an external function. The */
338 /* search order is: */
339 /* 1) Macro-space pre-order functions */
340 /* 2) Registered external functions */
341 /* 3) REXX programs with same extension (if applicable) */
342 /* 4) REXX programs with default extension */
343 /* 5) Macro-space post-order functions */
344 /******************************************************************************/
346  RexxActivation * activation, /* Current Activation */
347  RexxActivity * activity, /* activity in use */
348  RexxString * target, /* Name of external function */
349  RexxObject ** arguments, /* Argument array */
350  size_t argcount, /* count of arguments */
351  RexxString * calltype, /* Type of call */
352  ProtectedObject &result)
353 {
354  if (activation->callMacroSpaceFunction(target, arguments, argcount, calltype, MS_PREORDER, result))
355  {
356  return true;
357  }
358  /* no luck try for a registered func */
359  if (PackageManager::callNativeRoutine(activity, target, arguments, argcount, result))
360  {
361  return true;
362  }
363  /* have activation do the call */
364  if (activation->callExternalRexx(target, arguments, argcount, calltype, result))
365  {
366  return true;
367  }
368  /* function. If still not found, */
369  /* then raise an error */
370  if (activation->callMacroSpaceFunction(target, arguments, argcount, calltype, MS_POSTORDER, result))
371  {
372  return true;
373  }
374 
375  return false;
376 }
377 
378 
387 {
388  RexxObject *Current = buildEnvlist(); /* build the new save block */
389  if (Current == OREF_NULL) /* if unsuccessful return zero */
390  {
391  return TheFalseObject;
392  }
393  else
394  {
395  /* Have Native Actiovation */
396  context->pushEnvironment(Current); /* update environemnt list */
397  return TheTrueObject; /* this returns one */
398  }
399 }
400 
409 {
410  RexxBuffer *Current = (RexxBuffer *)context->popEnvironment();/* block, if ixisted. */
411  if (TheNilObject == Current) /* nothing saved? */
412  {
413  return TheFalseObject; /* return failure value */
414  }
415  else
416  {
417  /* restore everything */
418  restoreEnvironment(Current->getData());
419  return TheTrueObject; /* this worked ok */
420  }
421 }
422 
423 
424 /*********************************************************************/
425 /* */
426 /* Subroutine Name: BuildEnvlist */
427 /* */
428 /* Descriptive Name: Build saved environment block */
429 /* */
430 /* Function: Builds a block containing all of the */
431 /* environment variables, the current drive */
432 /* and the current directory. */
433 /* */
434 /*********************************************************************/
435 
437 {
438  RexxBuffer *newBuffer; /* Buffer object to hold env */
439  char **Environment; /* environment pointer */
440  size_t size = 0; /* size of the new buffer */
441  char *curr_dir; /* current directory */
442  char *New; /* starting address of buffer */
443  Environment = getEnvironment(); /* get the ptr to the environ */
444 
445  for (;*Environment != NULL;Environment++)
446  {
447  size += strlen(*Environment); /* calculate the size for all */
448  size++; /* environment variables+'\0' */
449  } /* now get current dir */
450  if (!size)
451  {
452  return OREF_NULL; /* no envrionment ! */
453  }
454  if (!(curr_dir=(char *)malloc(PATH_MAX + 3)))/* malloc storage for cwd*/
455  {
457  }
458 
459  // start with a copy of the current working directory
461  size += strlen(curr_dir); /* add the space for curr dir */
462  size++; /* and its terminating '\0' */
463  size += sizeof(size_t); /* this is for the size itself*/
464  /* Now we have the size for */
465  /* allocating the new buffer */
466  newBuffer = new_buffer(size); /* let's do it */
467  /* Get starting address of buf*/
468  New = newBuffer->getData();
469  ((ENVENTRY*)New)->size = size; /* first write the size */
470  New += sizeof(size_t); /* update the pointer */
471  /* now write the curr dir */
472  memcpy(New,curr_dir,strlen(curr_dir));
473  New += strlen(curr_dir); /* update the pointer */
474  memcpy(New,"\0",1); /* write the terminator */
475  New++; /* update the pointer */
476  Environment = getEnvironment(); /* reset to begin of environ */
477  /* Loop through environment */
478  /* and copy all entries to the*/
479  /* buffer, each terminating */
480  /* with '\0' */
481  for (;*Environment != NULL;Environment++)
482  {
483  /* copy the entry */
484  memcpy(New,*Environment,strlen(*Environment));
485  New += strlen(*Environment); /* update the pointer */
486  memcpy(New,"\0",1); /* write the terminator */
487  New++; /* update the pointer */
488  }
489  free(curr_dir); /* free curr dir buffer */
490  return newBuffer; /* return the pointer */
491 }
492 
493 
494 /*********************************************************************/
495 /* */
496 /* Subroutine Name: RestoreEnvironment */
497 /* */
498 /* Descriptive Name: restores environment saved by Setlocal() */
499 /* */
500 /* Function: restores the environment variables, current */
501 /* directory and drive. */
502 /* */
503 /*********************************************************************/
504 
506  void *CurrentEnv) /* saved environment */
507 {
508  char *current; /* ptr to saved environment */
509  size_t size; /* size of the saved space */
510  size_t length; /* string length */
511  char *begin; /* begin of saved space */
512  char **Environment; /* environment pointer */
513 
514  char *del = NULL; /* ptr to old unused memory */
515  char *Env_Var_String; /* enviornment entry */
516  char namebufsave[256],namebufcurr[256];
517  char *np;
518  int i;
519 
520  Environment = getEnvironment(); /* get the current environment*/
521 
522  begin = current = (char *)CurrentEnv;/* get the saved space */
523  size = ((ENVENTRY*)current)->size; /* first read out the size */
524  current += sizeof(size_t); /* update the pointer */
525  if (chdir(current) == -1) /* restore the curr dir */
526  {
527  char msg[1024];
528  sprintf(msg, "Error restoring current directory: %s", current);
530  }
531  current += strlen(current); /* update the pointer */
532  current++; /* jump over '\0' */
533  if (!putflag)
534  { /* first change in the */
535  /* environment ? */
536  /* copy all entries to dynamic memory */
537  /*for all entries in the env */
538  for (;*Environment != NULL;Environment++)
539  {
540  length = strlen(*Environment)+1; /* get the size of the string */
541  /* and alloc space for it */
542  Env_Var_String = (char *)malloc(length);
543  memcpy(Env_Var_String,*Environment,length);/* copy the string */
544  putenv(Env_Var_String); /* and make it part of env */
545  }
546  putflag = 1; /* prevent do it again */
547  }
548  /* Loop through the saved env */
549  /* entries and restore them */
550  for (;(size_t)(current-begin)<size;current+=(strlen(current)+1))
551  {
552  Environment = getEnvironment(); /* get the environment */
553  del = NULL;
554  np = current;
555  /* extract the the name */
556  /* from the saved enviroment */
557  for (i=0;(*np!='=')&&(i<255);np++,i++)
558  {
559  memcpy(&(namebufsave[i]),np,1); /* copy the character */
560  }
561  memcpy(&(namebufsave[i]),"\0",1); /* copy the terminator */
562  /* find the entry in the env */
563  for (;*Environment != NULL;Environment++)
564  {
565  np = *Environment;
566  /* extract the the name */
567  /* from the current env */
568  for (i=0;(*np!='=')&&(i<255);np++,i++)
569  {
570  memcpy(&(namebufcurr[i]),np,1);/* copy the character */
571  }
572  memcpy(&(namebufcurr[i]),"\0",1);/* copy the terminator */
573 
574  if (!strcmp(namebufsave,namebufcurr))
575  {/* have a match ? */
576  del = *Environment; /* remember it for deletion */
577  break; /* found, so get out of here */
578  }
579  }
580  if (putenv(current) == -1)
581  {
582  reportException(Error_System_service_service, "Error restoring environment variable");
583  }
584  if (del) /* if there was an old entry */
585  {
586  free(del); /* free it */
587  }
588  }
589 }
RexxActivation::callExternalRexx
bool callExternalRexx(RexxString *, RexxObject **, size_t, RexxString *, ProtectedObject &)
Definition: RexxActivation.cpp:2668
StringUtil.hpp
CSTRING
const typedef char * CSTRING
Definition: rexx.h:78
SystemInterpreter::invokeExternalFunction
static bool invokeExternalFunction(RexxActivation *, RexxActivity *, RexxString *, RexxObject **, size_t, RexxString *, ProtectedObject &)
Definition: ExternalFunctions.cpp:344
TheFalseObject
#define TheFalseObject
Definition: RexxCore.h:184
RexxArrayObject
struct _RexxArrayObject * RexxArrayObject
Definition: rexx.h:130
MethodClass.hpp
SystemInterpreter::popEnvironment
static RexxObject * popEnvironment(RexxActivation *context)
Definition: ExternalFunctions.cpp:407
RexxActivation.hpp
Error_System_service_service
#define Error_System_service_service
Definition: RexxErrorCodes.h:398
SystemInterpreter::pushEnvironment
static RexxObject * pushEnvironment(RexxActivation *context)
Definition: ExternalFunctions.cpp:385
RexxReturnCode
int RexxReturnCode
Definition: rexx.h:73
_ENVENTRY::size
size_t size
Definition: ExternalFunctions.cpp:113
SystemInterpreter::restoreEnvironment
static void restoreEnvironment(void *CurrentEnv)
Definition: ExternalFunctions.cpp:504
ActivityManager.hpp
putflag
int putflag
Definition: ExternalFunctions.cpp:116
resolve_tilde
char * resolve_tilde(const char *path)
Definition: ExternalFunctions.cpp:143
FILESPEC_PATH
#define FILESPEC_PATH
Definition: ExternalFunctions.cpp:104
reportException
void reportException(wholenumber_t error)
Definition: ActivityManager.hpp:136
SystemInterpreter::buildEnvlist
static RexxObject * buildEnvlist()
Definition: ExternalFunctions.cpp:435
TheTrueObject
#define TheTrueObject
Definition: RexxCore.h:185
PackageManager::callNativeRoutine
static bool callNativeRoutine(RexxActivity *activity, RexxString *name, RexxObject **arguments, size_t argcount, ProtectedObject &result)
Definition: PackageManager.cpp:653
RexxBuffer
Definition: BufferClass.hpp:91
RexxRoutine2
RexxRoutine2(CSTRING, sysBeep, OPTIONAL_wholenumber_t, Frequency, OPTIONAL_wholenumber_t, Duration)
Definition: ExternalFunctions.cpp:128
RexxRoutine1
RexxRoutine1(RexxStringObject, sysDirectory, OPTIONAL_CSTRING, dir)
Definition: ExternalFunctions.cpp:227
RexxActivation::callMacroSpaceFunction
bool callMacroSpaceFunction(RexxString *, RexxObject **, size_t, RexxString *, int, ProtectedObject &)
Definition: RexxActivation.cpp:2554
SystemInterpreter.hpp
OREF_NULL
#define OREF_NULL
Definition: RexxCore.h:60
MS_PREORDER
#define MS_PREORDER
Definition: RexxActivation.hpp:86
ArrayClass.hpp
ENVENTRY
struct _ENVENTRY ENVENTRY
RexxActivity
Definition: RexxActivity.hpp:127
ProtectedObject.hpp
ProtectedObject
Definition: ProtectedObject.hpp:46
StringClass.hpp
RexxActivation::popEnvironment
RexxObject * popEnvironment()
Definition: RexxActivation.cpp:4064
getEnvironment
char ** getEnvironment()
Definition: PlatformDefinitions.h:133
RexxActivation::pushEnvironment
void pushEnvironment(RexxObject *)
Definition: RexxActivation.cpp:4039
FILESPEC_EXTENSION
#define FILESPEC_EXTENSION
Definition: ExternalFunctions.cpp:107
RexxBuffer::getData
virtual char * getData()
Definition: BufferClass.hpp:105
FILESPEC_NAME
#define FILESPEC_NAME
Definition: ExternalFunctions.cpp:105
RexxInternalApis.h
RexxActivation
Definition: RexxActivation.hpp:156
FILESPEC_LOCATION
#define FILESPEC_LOCATION
Definition: ExternalFunctions.cpp:106
new_buffer
RexxBuffer * new_buffer(size_t s)
Definition: BufferClass.hpp:116
MS_POSTORDER
#define MS_POSTORDER
Definition: RexxActivation.hpp:87
TheNilObject
#define TheNilObject
Definition: RexxCore.h:180
_ENVENTRY
Definition: ExternalFunctions.cpp:112
RexxActivity.hpp
Error_System_service
#define Error_System_service
Definition: RexxErrorCodes.h:397
FILESPEC_DRIVE
#define FILESPEC_DRIVE
Definition: ExternalFunctions.cpp:108
Rexx_Error_Incorrect_call_list
#define Rexx_Error_Incorrect_call_list
Definition: oorexxerrors.h:344
RexxCore.h
NO_CSTRING
#define NO_CSTRING
Definition: rexx.h:146
RexxStringObject
struct _RexxStringObject * RexxStringObject
Definition: rexx.h:128
BufferClass.hpp
NULLOBJECT
#define NULLOBJECT
Definition: rexx.h:147
SourceFile.hpp
RexxObject
Definition: ObjectClass.hpp:311
PackageManager.hpp
RexxString
Definition: StringClass.hpp:119
SystemInterpreter::getCurrentWorkingDirectory
static void getCurrentWorkingDirectory(char *)
Definition: SystemInterpreter.cpp:182