Skip to content

Commit c37b5e9

Browse files
committed
fix low and high functions
1 parent c817094 commit c37b5e9

5 files changed

Lines changed: 96 additions & 82 deletions

File tree

examples/033-array3.pas

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,37 @@
66
Program Arrays;
77

88
Type
9-
NumberArray = Array[1..10] Of Integer;
9+
ArraySubRange = 1..10;
10+
NumberArray = Array[ArraySubRange] Of Integer;
1011

1112
Procedure InitializeArray(Var Numbers: NumberArray);
1213
Var
13-
I, N: Integer;
14+
I: Integer;
1415
Begin
1516
WriteLn('InitializeArray');
16-
N := 2;
17-
For I := 1 To 10 Do
17+
For I := Low(Numbers) To High(Numbers) Do
18+
Numbers[I] := Random(1000);
19+
End;
20+
21+
Procedure SortArray(Var Numbers: NumberArray);
22+
Var
23+
I, J, Temp: Integer;
24+
Begin
25+
WriteLn('SortArray');
26+
27+
// Bubble sort algorithm
28+
For I := Low(Numbers) To High(Numbers) Do
1829
Begin
19-
Numbers[I] := N;
20-
WriteLn(' - Numbers[', I:2, '] = ', Numbers[I]:4);
21-
N := N * 2;
30+
For J := I + 1 To High(Numbers) Do
31+
Begin
32+
If Numbers[I] > Numbers[J] Then
33+
Begin
34+
// Swap elements
35+
Temp := Numbers[I];
36+
Numbers[I] := Numbers[J];
37+
Numbers[J] := Temp;
38+
End;
39+
End;
2240
End;
2341
End;
2442

@@ -28,14 +46,26 @@
2846
I: Integer;
2947
Begin
3048
WriteLn('PrintArray');
31-
For I := 1 To 10 Do
49+
For I := Low(Numbers) To High(Numbers) Do
3250
WriteLn(' - Numbers[', I:2, '] = ', Numbers[I]:4);
3351
End;
3452

3553
Var
3654
Numbers: NumberArray;
55+
L, H: Integer;
3756

3857
Begin
58+
L := Low(ArraySubRange);
59+
H := High(ArraySubRange);
60+
WriteLn('ArraySubRange: ', L,' ', H);
61+
L := Low(NumberArray);
62+
H := High(NumberArray);
63+
WriteLn(' NumberArray: ', L,' ', H);
64+
L := Low(Numbers);
65+
H := High(Numbers);
66+
WriteLn(' Numbers: ', L,' ', H);
3967
InitializeArray(Numbers);
4068
PrintArray(Numbers);
69+
SortArray(Numbers);
70+
PrintArray(Numbers);
4171
End.

src/pascalscript.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#include "ps_symbol_table.h"
2121
#include "ps_version.h"
2222

23-
#define DEBUGGER_SOURCE "examples/400-subrange.pas"
23+
#define DEBUGGER_SOURCE "examples/033-array3.pas"
2424
// #define DEBUGGER_SOURCE "examples/005-first.pas"
2525

2626
// Runtime options

src/ps_functions.c

Lines changed: 55 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -262,116 +262,100 @@ ps_error ps_function_chr(ps_interpreter *interpreter, const ps_value *value, ps_
262262
return PS_ERROR_NONE;
263263
}
264264

265-
ps_error ps_function_low(ps_interpreter *interpreter, ps_symbol *type, ps_value *result)
266-
{
267-
if (type->kind != PS_SYMBOL_KIND_TYPE_DEFINITION && type->kind != PS_SYMBOL_KIND_VARIABLE)
268-
return ps_function_return_error_with_message(interpreter, PS_ERROR_UNEXPECTED_TYPE,
269-
"Low: Type or Variable expected, got %s",
270-
ps_symbol_get_kind_name(type->kind));
271-
switch (type->value->data.t->type)
265+
ps_error ps_function_low_or_high_type(ps_interpreter *interpreter, ps_symbol *type, ps_value *result, bool low)
266+
{
267+
bool debug = false;
268+
if (debug)
269+
ps_symbol_debug(stderr, "ps_function_low/high, type: ", type);
270+
ps_type_definition *type_def = type->value->data.t;
271+
if (debug)
272+
ps_type_definition_debug(stderr, "ps_function_low/high, type_def: ", type_def);
273+
switch (type_def->type)
272274
{
273275
case PS_TYPE_CHAR:
274276
result->type = &ps_system_char;
275-
result->data.c = (ps_char)'\0';
277+
result->data.c = low ? (ps_char)'\0' : PS_CHAR_MAX;
276278
break;
277279
case PS_TYPE_INTEGER:
278280
result->type = &ps_system_integer;
279-
result->data.i = PS_INTEGER_MIN;
281+
result->data.i = low ? PS_INTEGER_MIN : PS_INTEGER_MAX;
280282
break;
281283
case PS_TYPE_UNSIGNED:
282284
result->type = &ps_system_unsigned;
283-
result->data.u = 0;
285+
result->data.u = low ? 0 : PS_UNSIGNED_MAX;
284286
break;
285287
case PS_TYPE_ENUM:
286288
result->type = type;
287-
result->data.u = 0;
289+
result->data.u = low ? 0 : type->value->data.t->def.e.count - 1;
288290
break;
289291
case PS_TYPE_BOOLEAN:
290292
result->type = &ps_system_boolean;
291-
result->data.b = ps_system_constant_boolean_false.value->data.b;
292-
break;
293+
result->data.b =
294+
low ? ps_system_constant_boolean_true.value->data.b : ps_system_constant_boolean_false.value->data.b;
295+
break;
296+
case PS_TYPE_ARRAY:
297+
ps_symbol *subrange = type_def->def.a.subrange;
298+
if (debug)
299+
ps_symbol_debug(stderr, "ps_function_low/high, array subrange: ", subrange);
300+
return ps_function_low_or_high_type(interpreter, subrange, result, low);
293301
case PS_TYPE_SUBRANGE:
294-
result->type = type;
295302
switch (type->value->data.t->base)
296303
{
297304
case PS_TYPE_CHAR:
298-
result->data.c = type->value->data.t->def.g.c.min;
305+
result->type = &ps_system_char;
306+
result->data.c = low ? type->value->data.t->def.g.c.min : type->value->data.t->def.g.c.max;
299307
break;
300308
case PS_TYPE_INTEGER:
301-
result->data.i = type->value->data.t->def.g.i.min;
309+
result->type = &ps_system_integer;
310+
result->data.i = low ? type->value->data.t->def.g.i.min : type->value->data.t->def.g.i.max;
302311
break;
303312
case PS_TYPE_UNSIGNED:
304-
result->data.u = type->value->data.t->def.g.u.min;
313+
result->type = &ps_system_unsigned;
314+
result->data.u = low ? type->value->data.t->def.g.u.min : type->value->data.t->def.g.u.max;
305315
break;
306316
case PS_TYPE_ENUM:
307-
result->data.u = type->value->data.t->def.g.e.min;
317+
result->type = type;
318+
result->data.u = low ? type->value->data.t->def.g.e.min : type->value->data.t->def.g.e.max;
308319
break;
309320
default:
310321
return PS_ERROR_UNEXPECTED_TYPE;
311322
}
312323
break;
313324
default:
314325
return ps_function_return_error_with_message(interpreter, PS_ERROR_UNEXPECTED_TYPE,
315-
"Low: Type or Variable expected, got %s",
326+
"%s: (2) Type or Variable expected, got %s", low ? "Low" : "High",
316327
ps_type_definition_get_name(type->value->data.t));
317328
}
329+
if (debug)
330+
ps_value_debug(stderr, "ps_function_low/high, result: ", result);
318331
return PS_ERROR_NONE;
319332
}
320333

321-
ps_error ps_function_high(ps_interpreter *interpreter, ps_symbol *type, ps_value *result)
334+
ps_error ps_function_low_or_high(ps_interpreter *interpreter, ps_symbol *type_or_var, ps_value *result, bool low)
322335
{
323-
if (type->kind != PS_SYMBOL_KIND_TYPE_DEFINITION && type->kind != PS_SYMBOL_KIND_VARIABLE)
324-
return ps_function_return_error_with_message(interpreter, PS_ERROR_UNEXPECTED_TYPE,
325-
"High: Type or Variable expected, got %s",
326-
ps_symbol_get_kind_name(type->kind));
327-
switch (type->value->data.t->type)
328-
{
329-
case PS_TYPE_CHAR:
330-
result->type = &ps_system_char;
331-
result->data.c = PS_CHAR_MAX;
332-
break;
333-
case PS_TYPE_INTEGER:
334-
result->type = &ps_system_integer;
335-
result->data.i = PS_INTEGER_MAX;
336-
break;
337-
case PS_TYPE_UNSIGNED:
338-
result->type = &ps_system_unsigned;
339-
result->data.u = PS_UNSIGNED_MAX;
340-
break;
341-
case PS_TYPE_ENUM:
342-
result->type = type;
343-
result->data.u = type->value->data.t->def.e.count - 1;
344-
break;
345-
case PS_TYPE_SUBRANGE:
346-
result->type = type;
347-
switch (type->value->data.t->base)
348-
{
349-
case PS_TYPE_CHAR:
350-
result->data.c = type->value->data.t->def.g.c.max;
351-
break;
352-
case PS_TYPE_INTEGER:
353-
result->data.i = type->value->data.t->def.g.i.max;
354-
break;
355-
case PS_TYPE_UNSIGNED:
356-
result->data.u = type->value->data.t->def.g.u.max;
357-
break;
358-
case PS_TYPE_ENUM:
359-
result->data.u = type->value->data.t->def.g.e.max;
360-
break;
361-
default:
362-
return PS_ERROR_UNEXPECTED_TYPE;
363-
}
364-
break;
365-
case PS_TYPE_BOOLEAN:
366-
result->type = &ps_system_boolean;
367-
result->data.b = ps_system_constant_boolean_true.value->data.b;
368-
break;
369-
default:
336+
bool debug = false;
337+
if (debug)
338+
ps_symbol_debug(stderr, "ps_function_low/high, type_or_var: ", type_or_var);
339+
ps_symbol *type = NULL;
340+
if (type_or_var->kind == PS_SYMBOL_KIND_TYPE_DEFINITION)
341+
type = type_or_var;
342+
else if (type_or_var->kind == PS_SYMBOL_KIND_VARIABLE)
343+
type = type_or_var->value->type;
344+
else
370345
return ps_function_return_error_with_message(interpreter, PS_ERROR_UNEXPECTED_TYPE,
371-
"High: Type or Variable expected, got %s",
372-
ps_type_definition_get_name(type->value->data.t));
373-
}
374-
return PS_ERROR_NONE;
346+
"%s: (1) Type or Variable expected, got %s", low ? "Low" : "High",
347+
ps_symbol_get_kind_name(type_or_var->kind));
348+
return ps_function_low_or_high_type(interpreter, type, result, low);
349+
}
350+
351+
ps_error ps_function_low(ps_interpreter *interpreter, ps_symbol *type, ps_value *result)
352+
{
353+
return ps_function_low_or_high(interpreter, type, result, true);
354+
}
355+
356+
ps_error ps_function_high(ps_interpreter *interpreter, ps_symbol *type, ps_value *result)
357+
{
358+
return ps_function_low_or_high(interpreter, type, result, false);
375359
}
376360

377361
ps_error ps_function_pred_scalar(const ps_interpreter *interpreter, const ps_value *value, ps_value *result)

src/ps_symbol.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ const ps_symbol_kind_name ps_symbol_kind_names[] = {
6969
// clang-format off
7070
// 123456789
7171
{PS_SYMBOL_KIND_AUTO , "AUTO" },
72-
{PS_SYMBOL_KIND_TYPE_DEFINITION, "TYPE" },
72+
{PS_SYMBOL_KIND_TYPE_DEFINITION, "TYPE_DEF" },
7373
{PS_SYMBOL_KIND_PROGRAM , "PROGRAM" },
7474
{PS_SYMBOL_KIND_UNIT , "UNIT" },
7575
{PS_SYMBOL_KIND_CONSTANT , "CONSTANT" },

src/ps_visit_expression.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ bool ps_visit_function_call_random(ps_interpreter *interpreter, ps_interpreter_m
496496
*arg_count = 1;
497497
if (!ps_visit_expression(interpreter, mode, arg1))
498498
TRACE_ERROR("PARAMETER");
499-
if (mode==MODE_EXEC&& arg1->type != &ps_system_integer && arg1->type != &ps_system_unsigned)
499+
if (mode == MODE_EXEC && arg1->type != &ps_system_integer && arg1->type != &ps_system_unsigned)
500500
RETURN_ERROR(PS_ERROR_UNEXPECTED_TYPE);
501501
EXPECT_TOKEN(PS_TOKEN_RIGHT_PARENTHESIS);
502502
result->type = arg1->type;

0 commit comments

Comments
 (0)