[ANN][UNIX] VM support for command line attributes
Bert Freudenberg
bert at isgnw.CS.Uni-Magdeburg.De
Mon Aug 30 13:46:05 UTC 1999
Here's the patch for sqXWindow.c allowing a startup document file and
additional parameters. See #getSystemAttribute:
Unix hackers: this would fail if uname() is not available via
<sys/utsname.h>. Is there any system without this? I tested it on Linux,
SunOS and IRIX.
/bert
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME="param.diff"
Content-ID: <Pine.LNX.3.96.990830154027.7353B at balloon.cs.uni-magdeburg.de>
Content-Description:
*** ftp/sqXWindow.c Wed Jun 9 17:03:54 1999
--- src/sqXWindow.c Mon Aug 30 10:35:44 1999
***************
*** 31,36 ****
--- 31,37 ----
#include <sys/time.h>
#include <sys/types.h>
#include <sys/param.h>
+ #include <sys/utsname.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
***************
*** 2485,2517 ****
static char *getSpecialAttribute(int id)
{
static char buf[256];
switch (id) {
! case 1: /* Squeak PID */
sprintf(buf, "%d", getpid());
! return buf;
}
- buf[0]= '\0';
return buf;
}
int attributeSize(int id)
{
! if (id + 1 >= initialArgc) return 0;
! if (id < 0)
! return strlen(getSpecialAttribute(-id));
! else
! return strlen(initialArgv[id + 1]);
}
int getAttributeIntoLength(int id, int byteArrayIndex, int length)
{
char *attrIndex= (char *)byteArrayIndex;
char *arg;
! if (id + 1>= initialArgc) return 0;
! if (id < 0)
! arg= getSpecialAttribute(-id);
else
! arg= initialArgv[id + 1];
while (length--)
*attrIndex++= *arg++;
return 0;
--- 2491,2537 ----
static char *getSpecialAttribute(int id)
{
static char buf[256];
+ struct utsname info;
+ uname(&info);
switch (id) {
! case -1:
sprintf(buf, "%d", getpid());
! break;
! case 1001: /* OS */
! strcpy(buf, info.sysname);
! break;
! case 1002: /* OS version */
! strcpy(buf, info.release);
! break;
! case 1003: /* processor type */
! strcpy(buf, info.machine);
! break;
! default:
! buf[0]= '\0';
}
return buf;
}
int attributeSize(int id)
{
! if (id < 0 || id > 1000)
! return strlen(getSpecialAttribute(id));
! if (id < initialArgc)
! return strlen(initialArgv[id]);
! return 0;
}
int getAttributeIntoLength(int id, int byteArrayIndex, int length)
{
char *attrIndex= (char *)byteArrayIndex;
char *arg;
! if (id < 0 || id > 1000)
! arg= getSpecialAttribute(id);
else
! if (id < initialArgc)
! arg= initialArgv[id];
! else
! return 0;
while (length--)
*attrIndex++= *arg++;
return 0;
***************
*** 2574,2581 ****
{
char *ev;
! initialArgv= argv;
! initialArgc= 0;
/* defaults */
--- 2595,2609 ----
{
char *ev;
! initialArgc= 3; /* VM name + image name + document name */
! initialArgv= malloc((argc+3) * sizeof(char*)); /* +3 is worst case */
! if (!initialArgv) {
! fprintf(stderr, "memory allocation failed\n");
! exit(1);
! }
! initialArgv[0]= argv[0];
! initialArgv[1]= shortImageName;
! initialArgv[2]= ""; /* document */
/* defaults */
***************
*** 2728,2745 ****
exit(0);
}
! /* assume the argument is meant for Squeak, and silently ignore it */
! initialArgv[initialArgc++]= *argv++;
! --argc;
}
! if (argc)
! {
! strcpy(shortImageName, *argv);
! initialArgv[initialArgc++]= *argv++;
--argc;
! }
! initialArgv[initialArgc]= (char *)0;
if (0 == strstr(shortImageName, ".image"))
strcat(shortImageName, ".image");
--- 2769,2794 ----
exit(0);
}
! /* first unrecognized option - keep for Squeak */
! /* but print a warning because we got no image file yet */
! fprintf(stderr, "Warning: no imagefile specified "
! "but additional parameters found\n");
! break;
}
! if (argc && **argv != '-') {
! strcpy(shortImageName, *argv++);
--argc;
! }
!
! if (argc && **argv != '-') {
! initialArgv[2]= *argv++;
! --argc;
! }
!
! while (argc--)
! initialArgv[initialArgc++]= *argv++;
! initialArgv[initialArgc]= NULL;
if (0 == strstr(shortImageName, ".image"))
strcat(shortImageName, ".image");
More information about the Squeak-dev
mailing list
|