source: to-imperative/trunk/runtime/access.cc @ 228

Last change on this file since 228 was 228, checked in by luba, 18 years ago

* empty log message *

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.2 KB
Line 
1// $Source$
2// $Revision: 228 $
3// $Date: 2002-11-04 15:54:21 +0000 (Mon, 04 Nov 2002) $
4// $Author: luba $
5
6#include "rf_core.hh"
7#include "access.hh"
8
9
10RF_FUNC (LENGTH, (RF_ARG e_Exp), (RF_RES s_ExpLen)
11         )
12  s_ExpLen = Int2Expr(e_Exp.get_len());
13         
14RF_END
15
16
17RF_FUNC (LEFT, (RF_ARG s_Left, s_Len, e_Exp), (RF_RES e_SubExp))
18  if (!(s_Left.is_symbol() && is_Expr_Int(s_Left)))
19    error(Word2Expr("LEFT") + Expr("Invalid Argument"));
20  if (!(s_Len.is_symbol() && is_Expr_Int(s_Len)))
21    error(Word2Expr("LEFT") + Expr("Invalid Argument"));
22
23  if (less_Expr_int (s_Len, 0))
24    error(Word2Expr("LEFT") + Expr("Invalid Argument"));
25
26  if (less_Expr_int (s_Left, 0))       
27    error(Word2Expr("LEFT") + Expr("Invalid Argument"));
28
29  if (greater_Expr_int (s_Len, e_Exp.get_len()))
30    retfail;
31
32  uintptr_t len = Expr2Int(s_Len);
33
34  if (greater_Expr_int (s_Left, e_Exp.get_len() - len))
35    retfail;
36
37  uintptr_t left = Expr2Int(s_Left);
38
39  e_SubExp = Expr(e_Exp, left, len);
40
41RF_END
42 
43
44RF_FUNC (RIGHT, (RF_ARG s_Right, s_Len, e_Exp), (RF_RES e_SubExp))
45
46  if (!(s_Right.is_symbol() && is_Expr_Int(s_Right)))
47    error(Word2Expr("RIGHT") + Expr("Invalid Argument"));
48  if (!(s_Len.is_symbol() && is_Expr_Int(s_Len)))
49    error(Word2Expr("RIGHT") + Expr("Invalid Argument"));
50
51  if (less_Expr_int (s_Len, 0))
52    error(Word2Expr("RIGHT") + Expr("Invalid Argument"));
53  if (less_Expr_int (s_Right, 0))       
54    error(Word2Expr("RIGHT") + Expr("Invalid Argument"));
55
56  if (greater_Expr_int (s_Len, e_Exp.get_len()))
57    retfail;
58
59  uintptr_t len = Expr2Int(s_Len);
60
61  if (greater_Expr_int (s_Right, e_Exp.get_len() - len))
62    retfail;
63
64  uintptr_t right = Expr2Int(s_right);
65
66  e_SubExp = Expr(e_Exp, 0, e_Exp.get_len() - right);
67
68
69RF_END
70
71
72RF_FUNC (MIDDLE, (RF_ARG s_Left, s_Right, e_Exp), (RF_RES e_SubExp))
73  if (!(s_Left.is_symbol() && is_Expr_Int(s_Left)))
74    error(Word2Expr("MIDDLE") + Expr("Invalid Argument"));
75
76  if (!(s_Right.is_symbol() && is_Expr_Int(s_Right)))
77    error(Word2Expr("MIDDLE") + Expr("Invalid Argument"));
78
79  if (less_Expr_int (s_Left, 0))       
80    error(Word2Expr("MIDDLE") + Expr("Invalid Argument"));
81
82  if (less_Expr_int (s_Right, 0))       
83    error(Word2Expr("MIDDLE") + Expr("Invalid Argument"));
84
85  if (greater_Expr_int (s_Left, e_Exp.get_len()))
86    retfail;
87
88  uintptr_t left = Expr2Int(s_Left);
89
90  if (greater_Expr_int (s_Right, e_Exp.get_len() - left))
91    retfail;
92
93  uintptr_t right = Expr2Int(s_Right);
94
95  e_SubExp = Expr(e_Exp, left, e_Exp.get_len() - right - left);
96
97
98RF_END
99
100
101RF_FUNC (L, (RF_ARG s_Left, e_Exp), (RF_RES t_SubExp))
102  if (!(s_Left.is_symbol() && is_Expr_Int(s_Left)))
103    error(Word2Expr("L") + Expr("Invalid Argument"));
104
105  if (less_Expr_int (s_Left, 0))
106    error(Word2Expr("L") + Expr("Invalid Argument"));
107
108  if (greater_Expr_int (s_Left, e_Exp.get_len() - 1))
109    retfail;
110
111  uintptr_t left = Expr2Int(s_Left);
112
113  e_SubExp = Expr(e_Exp, left, 1);
114
115
116RF_END
117
118
119RF_FUNC (R, (RF_ARG s_Right, e_Exp), (RF_RES t_SubExp))
120  if (!(s_Right.is_symbol() && is_Expr_Int(s_Right)))
121    error(Word2Expr("R") + Expr("Invalid Argument"));
122
123  if (less_Expr_int (s_Right, 0))       
124    error(Word2Expr("R") + Expr("Invalid Argument"));
125
126  if (greater_Expr_int (s_Right, e_Exp.get_len() - 1))
127    retfail; 
128
129  uintptr_t right = Expr2Int(s_right);
130
131  e_SubExp = Expr(e_Exp,  e_Exp.get_len() - right - 1, 1);
132
133
134RF_END
Note: See TracBrowser for help on using the repository browser.