-
Notifications
You must be signed in to change notification settings - Fork 5
/
Dir.pir
175 lines (143 loc) · 3.34 KB
/
Dir.pir
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# Copyright (C) 2001-2008, Parrot Foundation.
# $Id$
=head1 TITLE
Dir - Cardinal Dir class
=head1 DESCRIPTION
=head2 Functions
=over
=item onload()
Perform initializations and create the Dir class
=cut
.namespace ['Dir']
.sub 'onload' :anon :init :load
.local pmc cardinalmeta
$P0 = get_hll_global ['CardinalObject'], '!CARDINALMETA'
cardinalmeta = $P0.'new_class'('Dir', 'parent'=>'CardinalObject', 'attr'=>'!umask')
# XXX Throw some sort of runtime exception unless loadlib succeeded
$P1 = loadlib 'os'
.end
#.sub 'new' :method
# .param string dir
# print "Dir.new"
# print " param="
# say dir
#opendir dir
#.end
.sub 'get_bool' :vtable
.return(1)
.end
#.sub 'get_string_keyed' :vtable
# .return ('Dir')
#.end
.sub 'get_string' :vtable
$S0 = 'Dir'
.return ($S0)
.end
.sub 'chdir' :method
.param string new_dir
.param pmc block :named('!BLOCK') :optional
.param int has_block :opt_flag
.local pmc os
.local string old_dir
if has_block goto with_block
goto no_block
with_block:
os = new 'OS'
old_dir = os.'cwd'()
os.'chdir'(new_dir)
$P0 = block()
os.'chdir'(old_dir)
goto done
no_block:
$P0 = new 'CardinalInteger'
$P0 = 0
os = new 'OS'
os.'chdir'(new_dir)
goto done
done:
.return ($P0)
.end
.sub 'pwd' :method
.local pmc os
.local pmc pwd
pwd = new 'CardinalString'
os = new 'OS'
pwd = os.'cwd'()
.return (pwd)
.end
.sub 'getwd' :method
.tailcall self.'pwd'()
.end
.sub 'chroot' :method
.local pmc os
.local pmc status
status = new 'CardinalInteger'
os = new 'OS'
status = os.'cwd'()
.return (status)
.end
.sub 'mkdir' :method
.param string path
.param string mode :optional
.param int mode_flag :opt_flag
.local pmc os
os = new 'OS'
if mode_flag goto make
goto no_mode
no_mode:
mode = ''
goto make
make:
os.'mkdir'(path, mode)
.end
.sub 'unlink' :method
.tailcall self.'rmdir'()
.end
.sub 'delete' :method
.tailcall self.'rmdir'()
.end
.sub 'rmdir' :method
.param string path
.local pmc os
os = new 'OS'
os.'rm'(path)
$P0 = new 'CardinalInteger'
$P0 = 0
.return ($P0)
.end
.sub 'entries' :method
.param string path
.local pmc os
.local pmc list
os = new 'OS'
list = new 'CardinalArray'
$P0 = os.'readdir'(path)
$P1 = iter $P0
loop:
unless $P1 goto loop_end
$P2 = shift $P1
list.'push'($P2)
goto loop
loop_end:
.return (list)
.end
.sub 'foreach' :method
.param string path
.param pmc block :named('!BLOCK')
.local pmc names
names = self.'entries'(path)
$P0 = iter names
loop:
unless $P0 goto loop_end
$P1 = shift $P0
block($P1)
goto loop
loop_end:
$P2 = get_hll_global 'nil'
.return ($P2)
.end
# Local Variables:
# mode: pir
# fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir: