This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate with mainperl.
[perl5.git] / ext / B / byteperl.c
1 #include "EXTERN.h"
2 #include "perl.h"
3
4 static void xs_init (void);
5 static PerlInterpreter *my_perl;
6
7 int
8 #ifndef CAN_PROTOTYPE
9 main(argc, argv, env)
10 int argc;
11 char **argv;
12 char **env;
13 #else  /* def(CAN_PROTOTYPE) */
14 main(int argc, char **argv, char **env)
15 #endif  /* def(CAN_PROTOTYPE) */
16 {
17     int exitstatus;
18     int i;
19     char **fakeargv;
20     FILE *fp;
21 #ifdef INDIRECT_BGET_MACROS
22     struct bytestream bs;
23 #endif /* INDIRECT_BGET_MACROS */
24
25     INIT_SPECIALSV_LIST;
26     PERL_SYS_INIT(&argc,&argv);
27  
28     perl_init_i18nl10n(1);
29
30     if (!PL_do_undump) {
31         my_perl = perl_alloc();
32         if (!my_perl)
33 #ifdef VMS
34             exit(vaxc$errno);
35 #else
36             exit(1);
37 #endif
38         perl_construct( my_perl );
39     }
40
41 #ifdef CSH
42     if (!PL_cshlen) 
43       PL_cshlen = strlen(PL_cshname);
44 #endif
45
46     if (argc < 2)
47         fp = stdin;
48     else {
49 #ifdef WIN32
50         fp = fopen(argv[1], "rb");
51 #else
52         fp = fopen(argv[1], "r");
53 #endif
54         if (!fp) {
55             perror(argv[1]);
56 #ifdef VMS
57             exit(vaxc$errno);
58 #else
59             exit(1);
60 #endif
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     PL_main_cv = PL_compcv;
80     PL_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 }