[asperl] integrate mainline changes
[p5sagit/p5-mst-13.2.git] / ext / B / byteperl.c
1 #include "EXTERN.h"
2 #include "perl.h"
3 #ifndef PATCHLEVEL
4 #include "patchlevel.h"
5 #endif
6 #include "byterun.h"
7
8 static void xs_init _((void));
9 static PerlInterpreter *my_perl;
10
11 int
12 #ifndef CAN_PROTOTYPE
13 main(argc, argv, env)
14 int argc;
15 char **argv;
16 char **env;
17 #else  /* def(CAN_PROTOTYPE) */
18 main(int argc, char **argv, char **env)
19 #endif  /* def(CAN_PROTOTYPE) */
20 {
21     int exitstatus;
22     int i;
23     char **fakeargv;
24     FILE *fp;
25 #ifdef INDIRECT_BGET_MACROS
26     struct bytestream bs;
27 #endif /* INDIRECT_BGET_MACROS */
28
29     INIT_SPECIALSV_LIST;
30     PERL_SYS_INIT(&argc,&argv);
31  
32 #if PATCHLEVEL > 3 || (PATCHLEVEL == 3 && SUBVERSION >= 1)
33     perl_init_i18nl10n(1);
34 #else
35     perl_init_i18nl14n(1);
36 #endif
37
38     if (!do_undump) {
39         my_perl = perl_alloc();
40         if (!my_perl)
41             exit(1);
42         perl_construct( my_perl );
43     }
44
45 #ifdef CSH
46     if (!cshlen) 
47       cshlen = strlen(cshname);
48 #endif
49
50     if (argc < 2)
51         fp = stdin;
52     else {
53 #ifdef WIN32
54         fp = fopen(argv[1], "rb");
55 #else
56         fp = fopen(argv[1], "r");
57 #endif
58         if (!fp) {
59             perror(argv[1]);
60             exit(1);
61         }
62         argv++;
63         argc--;
64     }
65     New(666, fakeargv, argc + 4, char *);
66     fakeargv[0] = argv[0];
67     fakeargv[1] = "-e";
68     fakeargv[2] = "";
69     fakeargv[3] = "--";
70     for (i = 1; i < argc; i++)
71         fakeargv[i + 3] = argv[i];
72     fakeargv[argc + 3] = 0;
73     
74     exitstatus = perl_parse(my_perl, xs_init, argc + 3, fakeargv, NULL);
75     if (exitstatus)
76         exit( exitstatus );
77
78     sv_setpv(GvSV(gv_fetchpv("0", TRUE, SVt_PV)), argv[0]);
79     main_cv = compcv;
80     compcv = 0;
81
82 #ifdef INDIRECT_BGET_MACROS
83     bs.data = fp;
84     bs.fgetc = (int(*) _((void*)))fgetc;
85     bs.fread = (int(*) _((char*,size_t,size_t,void*)))fread;
86     bs.freadpv = freadpv;
87     byterun(bs);
88 #else    
89     byterun(fp);
90 #endif /* INDIRECT_BGET_MACROS */
91     
92     exitstatus = perl_run( my_perl );
93
94     perl_destruct( my_perl );
95     perl_free( my_perl );
96
97     exit( exitstatus );
98 }
99
100 static void
101 xs_init()
102 {
103 }