996
|
1 package Language::INTERCAL::Backend;
|
|
2
|
|
3 # Backends
|
|
4
|
|
5 # This file is part of CLC-INTERCAL
|
|
6
|
|
7 # Copyright (c) 2006-2008 Claudio Calvelli, all rights reserved.
|
|
8
|
|
9 # CLC-INTERCAL is copyrighted software. However, permission to use, modify,
|
|
10 # and distribute it is granted provided that the conditions set out in the
|
|
11 # licence agreement are met. See files README and COPYING in the distribution.
|
|
12
|
|
13 use strict;
|
|
14 use vars qw($VERSION $PERVERSION);
|
|
15 ($VERSION) = ($PERVERSION = "CLC-INTERCAL/Base INTERCAL/Backend.pm 1.-94.-2") =~ /\s(\S+)$/;
|
|
16
|
|
17 use Carp;
|
|
18 use Language::INTERCAL::Exporter '1.-94.-2';
|
|
19 use vars qw(@EXPORT @EXPORT_OK);
|
|
20 @EXPORT = ();
|
|
21 @EXPORT_OK = qw(backend generate_code);
|
|
22
|
|
23 my @backends = ();
|
|
24 my %backends = ();
|
|
25
|
|
26 sub backend {
|
|
27 @_ == 1 or croak "Usage: backend(BACKEND)";
|
|
28 my ($backend) = @_;
|
|
29 $backend =~ s/\s+//g;
|
|
30 if ($backend =~ /^\d+$/) {
|
|
31 return undef if $backend < 0 || $backend >= @backends;
|
|
32 return $backend;
|
|
33 } else {
|
|
34 if (! exists $backends{$backend}) {
|
|
35 eval "require Language::INTERCAL::Backend::$backend";
|
|
36 return undef if $@;
|
|
37 $backends{$backend} = @backends;
|
|
38 push @backends, $backend;
|
|
39 }
|
|
40 $backend = $backends{$backend};
|
|
41 return $backend;
|
|
42 }
|
|
43 }
|
|
44
|
|
45 sub generate_code {
|
|
46 @_ == 6 or @_ == 7 or croak
|
|
47 "Usage: generate_code(INTERPRETER, BACKEND, NAME, BASENAME, " .
|
|
48 "FILESPEC, ORIG [,OPTIONS])";
|
|
49 my ($int, $backend, $name, $basename, $filespec, $orig, $options) = @_;
|
|
50 $options ||= {};
|
|
51 my $verb = $options->{verbose};
|
|
52 $backend = 'Language::INTERCAL::Backend::' . $backend;
|
|
53 eval "require $backend"; die $@ if $@;
|
|
54 my $suffix = $backend->default_suffix;
|
|
55 my $mode = $backend->default_mode;
|
|
56 my $handle = '';
|
|
57 my $filename = undef;
|
|
58 my %p = ('%' => '%', 'p' => $basename, 's' => $suffix, 'o' => $orig);
|
|
59 if (defined $suffix) {
|
|
60 $filename = $filespec;
|
|
61 $filename =~ s/%([%ops])/$p{$1}/ge;
|
|
62 &$verb($filename) if $verb;
|
|
63 $handle = new Language::INTERCAL::GenericIO 'FILE', 'r', $filename;
|
|
64 } else {
|
|
65 &$verb('') if $verb;
|
|
66 }
|
|
67 $name =~ s/%([%ops])/$p{$1}/ge;
|
|
68 $backend->generate($int, $name, $handle, $options);
|
|
69 undef $handle;
|
|
70 if (defined $filename && defined $mode) {
|
|
71 chmod $mode & ~umask, $filename;
|
|
72 }
|
|
73 }
|
|
74
|
|
75 1;
|