@@ -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
377361ps_error ps_function_pred_scalar (const ps_interpreter * interpreter , const ps_value * value , ps_value * result )
0 commit comments