The patch below adds the ability to say:
../test_parrot -f - < foo.pbc
(Yes, an interactive bytecode interpreter, just what you've been
waiting for)
and
../test_parrot -f foo.pbc
And have them both do the same thing.
This seems to work fine on FreeBSD and Irix, but might be very wrong
somewhere else, could someone with a windows box give it a whirl or
anyone with any flame produce it now...
Alex Gough
#############################
Index: test_main.c
===================================================================
RCS file: /home/perlcvs/parrot/test_main.c,v
retrieving revision 1.29
diff -u -r1.29 test_main.c
--- test_main.c 4 Jan 2002 16:47:59 -0000 1.29
+++ test_main.c 8 Jan 2002 03:00:25 -0000
@@ -24,6 +24,9 @@
int debugging;
int predereferencing;
int jit;
+ int from_stdin;
+ int from_file;
+ char *filename;
struct Parrot_Interp *interpreter;
init_world();
@@ -48,6 +51,9 @@
debugging = 0;
predereferencing = 0;
jit = 0;
+ from_stdin = 0;
+ from_file = 0;
+ filename = NULL;
while (argc > 1 && argv[1][0] == '-') {
if (argv[1][1] == 'b' && argv[1][2] == '\0') {
@@ -92,6 +98,19 @@
}
argc--;
}
+ else if (argv[1][1] == 'f') {
+ if (strcmp("-", argv[2]) == 0) {
+ from_stdin = 1;
+ }
+ else {
+ filename = malloc(strlen(argv[2])+1);
+ filename = strcpy(filename, argv[2]);
+ }
+ for (i = 3; i < argc; i++) {
+ argv[i-2] = argv[i];
+ }
+ argc -= 2;
+ }
else {
fprintf(stderr, "%s: Invalid switch: %s\n", argv[0], argv[1]);
exit(1);
@@ -133,11 +152,11 @@
/* If we got only the program name, complain */
- if (argc == 1) {
+ if (argc == 1 && !filename && !from_stdin) {
fprintf(stderr, "%s: usage: %s prog\n", argv[0], argv[0]);
exit(1);
}
- /* Otherwise load in the program they gave and try that */
+ /* Otherwise load in the program they gave and try that, or - */
else {
opcode_t *program_code;
size_t program_size;
@@ -145,25 +164,58 @@
int fd;
struct PackFile * pf;
- if (stat(argv[1], &file_stat)) {
- printf("can't stat %s, code %i\n", argv[1], errno);
- return 1;
- }
- fd = open(argv[1], O_RDONLY);
- if (!fd) {
- printf("Can't open, error %i\n", errno);
- return 1;
+ if (from_stdin) {
+ char *cursor;
+ INTVAL read_result;
+ INTVAL read_last;
+
+ program_size = 1024;
+
+ program_code = (opcode_t*)malloc(1024);
+ cursor = (char*)program_code;
+
+ while ((read_result = read(0, cursor, 1024)) > 0) {
+ read_last = read_result;
+ program_size += 1024;
+ realloc(program_code, program_size);
+ cursor = (char*)program_code + program_size - 1024;
+ }
+
+ if (read_result == 0) {
+ program_size = program_size - 2048 + read_last;
+ }
+ else if (read_result < 0) {
+ fprintf(stderr, "Problem reading from stdin\n");
+ exit(1);
+ }
}
-
- program_size = file_stat.st_size;
+ else { /* read from file */
+ if (!filename) {
+ filename = malloc(strlen(argv[1])+1);
+ strcpy(filename, argv[1]);
+ }
+
+ if (stat(filename, &file_stat)) {
+ printf("can't stat %s, code %i\n", argv[1], errno);
+ return 1;
+ }
+ fd = open(filename, O_RDONLY);
+ if (!fd) {
+ printf("Can't open, error %i\n", errno);
+ return 1;
+ }
+
+ program_size = file_stat.st_size;
#ifndef HAS_HEADER_SYSMMAN
- program_code = (opcode_t*)mem_sys_allocate(program_size);
- read(fd, (void*)program_code, program_size);
+ program_code = (opcode_t*)mem_sys_allocate(program_size);
+ read(fd, (void*)program_code, program_size);
#else
- program_code =
- (opcode_t *) mmap(0, program_size, PROT_READ, MAP_SHARED, fd, (off_t)0);
+ program_code =
+ (opcode_t *) mmap(0, program_size, PROT_READ,
+ MAP_SHARED, fd, (off_t)0);
#endif
+ } /* end reading from file */
if (!program_code) {
printf("Can't mmap, code %i\n", errno);