Line data Source code
1 : /* do not edit automatically generated by mc from M2DebugStack. */
2 : /* M2DebugStack.mod display parameter stack.
3 :
4 : Copyright (C) 2011-2026 Free Software Foundation, Inc.
5 : Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
6 :
7 : This file is part of GNU Modula-2.
8 :
9 : GNU Modula-2 is free software; you can redistribute it and/or modify
10 : it under the terms of the GNU General Public License as published by
11 : the Free Software Foundation; either version 3, or (at your option)
12 : any later version.
13 :
14 : GNU Modula-2 is distributed in the hope that it will be useful, but
15 : WITHOUT ANY WARRANTY; without even the implied warranty of
16 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 : General Public License for more details.
18 :
19 : You should have received a copy of the GNU General Public License
20 : along with GNU Modula-2; see the file COPYING3. If not see
21 : <http://www.gnu.org/licenses/>. */
22 :
23 : #include "config.h"
24 : #include "system.h"
25 : #include "gcc-consolidation.h"
26 :
27 : #include <stdbool.h>
28 : # if !defined (PROC_D)
29 : # define PROC_D
30 : typedef void (*PROC_t) (void);
31 : typedef struct { PROC_t proc; } PROC;
32 : # endif
33 :
34 : # if !defined (TRUE)
35 : # define TRUE (1==1)
36 : # endif
37 :
38 : # if !defined (FALSE)
39 : # define FALSE (1==0)
40 : # endif
41 :
42 : # include "Gmcrts.h"
43 : #if defined(__cplusplus)
44 : # undef NULL
45 : # define NULL 0
46 : #endif
47 : #define _M2DebugStack_C
48 :
49 : #include "GM2DebugStack.h"
50 : # include "GDynamicStrings.h"
51 : # include "GSymbolTable.h"
52 : # include "GStringConvert.h"
53 : # include "GNameKey.h"
54 : # include "GFIO.h"
55 : # include "GSFIO.h"
56 : # include "GM2Error.h"
57 : # include "GM2Printf.h"
58 :
59 : typedef struct M2DebugStack_ProcedureWord_p M2DebugStack_ProcedureWord;
60 :
61 : typedef struct M2DebugStack_ProcedureString_p M2DebugStack_ProcedureString;
62 :
63 : # define Debugging false
64 : static M2DebugStack_ProcedureWord OperandTok;
65 : static M2DebugStack_ProcedureWord OperandT;
66 : static M2DebugStack_ProcedureWord OperandF;
67 : static M2DebugStack_ProcedureWord OperandA;
68 : static M2DebugStack_ProcedureWord OperandD;
69 : static M2DebugStack_ProcedureWord OperandRW;
70 : static M2DebugStack_ProcedureString OperandAnno;
71 :
72 : /*
73 : DebugStack - displays the stack.
74 : */
75 :
76 : extern "C" void M2DebugStack_DebugStack (unsigned int amount, M2DebugStack_ProcedureWord opt, M2DebugStack_ProcedureWord opf, M2DebugStack_ProcedureWord opa, M2DebugStack_ProcedureWord opd, M2DebugStack_ProcedureWord oprw, M2DebugStack_ProcedureWord optk, M2DebugStack_ProcedureString opanno);
77 :
78 : /*
79 : x - checks to see that a=b.
80 : */
81 :
82 : static DynamicStrings_String x (DynamicStrings_String a, DynamicStrings_String b);
83 :
84 : /*
85 : IsWhite - returns TRUE if, ch, is a space.
86 : */
87 :
88 : static bool IsWhite (char ch);
89 :
90 : /*
91 : ConCatWord - joins sentances, a, b, together.
92 : */
93 :
94 : static DynamicStrings_String ConCatWord (DynamicStrings_String a, DynamicStrings_String b);
95 :
96 : /*
97 : symDesc -
98 : */
99 :
100 : static DynamicStrings_String symDesc (unsigned int sym, DynamicStrings_String o);
101 :
102 : /*
103 : Output - output string, s, to Stdout. It also disposes of the string, s.
104 : */
105 :
106 : static void Output (DynamicStrings_String s);
107 :
108 : /*
109 : GetComment -
110 : */
111 :
112 : static int GetComment (DynamicStrings_String s);
113 :
114 : /*
115 : doName - concatenate namekey, o, to, p.
116 : */
117 :
118 : static DynamicStrings_String doName (DynamicStrings_String p, unsigned int o);
119 :
120 : /*
121 : doSymName - concatenate symbol, o, name to, p.
122 : */
123 :
124 : static DynamicStrings_String doSymName (DynamicStrings_String p, unsigned int o);
125 :
126 : /*
127 : doNumber - convert, o, to a cardinal and increment the length, l,
128 : by the number of characters required to represent, o.
129 : */
130 :
131 : static DynamicStrings_String doNumber (DynamicStrings_String p, unsigned int o);
132 :
133 : /*
134 : doSymbol - handles a symbol indicated by, o.
135 : */
136 :
137 : static DynamicStrings_String doSymbol (DynamicStrings_String p, unsigned int o);
138 :
139 : /*
140 : doOperand -
141 : */
142 :
143 : static DynamicStrings_String doOperand (DynamicStrings_String p, DynamicStrings_String s, int *i, int e, unsigned int o);
144 :
145 : /*
146 : doPercent -
147 : */
148 :
149 : static DynamicStrings_String doPercent (DynamicStrings_String o, DynamicStrings_String s, int *i, int e, unsigned int n);
150 :
151 : /*
152 : doNameLength - increment, l, by the ascii length of string determined by, o.
153 : */
154 :
155 : static void doNameLength (unsigned int *l, unsigned int o);
156 :
157 : /*
158 : doSymNameLength - increment, l, by the ascii length of symbol, o.
159 : */
160 :
161 : static void doSymNameLength (unsigned int *l, unsigned int o);
162 :
163 : /*
164 : doNumberLength - convert, o, to a cardinal and increment the length, l,
165 : by the number of characters required to represent, o.
166 : */
167 :
168 : static void doNumberLength (unsigned int *l, unsigned int o);
169 :
170 : /*
171 : doSymbolLength - handles a symbol indicated by, o.
172 : */
173 :
174 : static void doSymbolLength (unsigned int *l, unsigned int o);
175 :
176 : /*
177 : doOperandLength -
178 : */
179 :
180 : static void doOperandLength (DynamicStrings_String s, int *i, int e, unsigned int *l, unsigned int o);
181 :
182 : /*
183 : doPercentLength -
184 : */
185 :
186 : static void doPercentLength (DynamicStrings_String s, int *i, int e, unsigned int *l, unsigned int n);
187 :
188 : /*
189 : doFieldLength - compute the string length given in annotation
190 : at position, n, on the stack between characters
191 : b and e.
192 :
193 : The string description between: b..e can contain any
194 : of these patterns:
195 :
196 : %a ascii name key.
197 : %s symbol number.
198 : %d decimal cardinal number.
199 : | indicates the next field.
200 : */
201 :
202 : static unsigned int doFieldLength (int b, int e, unsigned int n);
203 :
204 : /*
205 : stop -
206 : */
207 :
208 : static void stop (void);
209 :
210 : /*
211 : doMaxCard - returns the maximum of two CARDINALs.
212 : */
213 :
214 : static unsigned int doMaxCard (unsigned int a, unsigned int b);
215 :
216 : /*
217 : GetAnnotationFieldLength -
218 : */
219 :
220 : static unsigned int GetAnnotationFieldLength (unsigned int n, unsigned int f);
221 :
222 : /*
223 : GetAnnotationLength -
224 : */
225 :
226 : static unsigned int GetAnnotationLength (unsigned int n, unsigned int f);
227 :
228 : /*
229 : GetFieldLength - returns the number of characters used in field, f,
230 : at position, n, on the stack.
231 : */
232 :
233 : static unsigned int GetFieldLength (unsigned int n, unsigned int f);
234 :
235 : /*
236 : GetMaxFieldAnno - returns the maximum number of characters required
237 : by either the annotation or field, f, at position, n,
238 : on the stack.
239 : */
240 :
241 : static unsigned int GetMaxFieldAnno (unsigned int n, unsigned int f);
242 :
243 : /*
244 : GetStackFieldLengths - assigns, tn, and, fn, with the
245 : maximum field width values.
246 : */
247 :
248 : static void GetStackFieldLengths (unsigned int *tn, unsigned int *fn, unsigned int *tk, unsigned int amount);
249 :
250 : /*
251 : DisplayRow -
252 : */
253 :
254 : static void DisplayRow (unsigned int tn, unsigned int fn, unsigned int tk, bool initOrFinal);
255 :
256 : /*
257 : SkipToField -
258 : */
259 :
260 : static int SkipToField (DynamicStrings_String s, unsigned int n);
261 :
262 : /*
263 : Pad - padds out string, s, to paddedLength characters.
264 : */
265 :
266 : static DynamicStrings_String Pad (DynamicStrings_String o, unsigned int paddedLength);
267 :
268 : /*
269 : doField - compute the string length given in annotation
270 : at position, n, on the stack between characters
271 : b and e.
272 :
273 : The string description between: b..e can contain any
274 : of these patterns:
275 :
276 : %a ascii name key.
277 : %s symbol number.
278 : %d decimal cardinal number.
279 : | indicates the next field.
280 : */
281 :
282 : static DynamicStrings_String doField (DynamicStrings_String s, unsigned int n, unsigned int f, unsigned int l);
283 :
284 : /*
285 : doAnnotation -
286 : */
287 :
288 : static DynamicStrings_String doAnnotation (DynamicStrings_String s, unsigned int n, unsigned int field, unsigned int width);
289 :
290 : /*
291 : DisplayFields -
292 : */
293 :
294 : static void DisplayFields (unsigned int n, unsigned int tn, unsigned int fn, unsigned int tk);
295 :
296 :
297 : /*
298 : x - checks to see that a=b.
299 : */
300 :
301 0 : static DynamicStrings_String x (DynamicStrings_String a, DynamicStrings_String b)
302 : {
303 0 : if (a != b)
304 : {
305 0 : M2Error_InternalError ((const char *) "different string returned", 25);
306 : }
307 0 : return a;
308 : /* static analysis guarentees a RETURN statement will be used before here. */
309 : __builtin_unreachable ();
310 : }
311 :
312 :
313 : /*
314 : IsWhite - returns TRUE if, ch, is a space.
315 : */
316 :
317 0 : static bool IsWhite (char ch)
318 : {
319 0 : return ch == ' ';
320 : /* static analysis guarentees a RETURN statement will be used before here. */
321 : __builtin_unreachable ();
322 : }
323 :
324 :
325 : /*
326 : ConCatWord - joins sentances, a, b, together.
327 : */
328 :
329 0 : static DynamicStrings_String ConCatWord (DynamicStrings_String a, DynamicStrings_String b)
330 : {
331 0 : if (((DynamicStrings_Length (a)) == 1) && ((DynamicStrings_char (a, 0)) == 'a'))
332 : {
333 0 : a = x (a, DynamicStrings_ConCatChar (a, 'n'));
334 : }
335 0 : else if ((((DynamicStrings_Length (a)) > 1) && ((DynamicStrings_char (a, -1)) == 'a')) && (IsWhite (DynamicStrings_char (a, -2))))
336 : {
337 : /* avoid dangling else. */
338 0 : a = x (a, DynamicStrings_ConCatChar (a, 'n'));
339 : }
340 0 : if (((DynamicStrings_Length (a)) > 0) && (! (IsWhite (DynamicStrings_char (a, -1)))))
341 : {
342 0 : a = x (a, DynamicStrings_ConCatChar (a, ' '));
343 : }
344 0 : return x (a, DynamicStrings_ConCat (a, b));
345 : /* static analysis guarentees a RETURN statement will be used before here. */
346 : __builtin_unreachable ();
347 : }
348 :
349 :
350 : /*
351 : symDesc -
352 : */
353 :
354 0 : static DynamicStrings_String symDesc (unsigned int sym, DynamicStrings_String o)
355 : {
356 0 : if (sym == SymbolTable_NulSym)
357 : {
358 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "NulSym", 6)));
359 : }
360 0 : else if (SymbolTable_IsConstLit (sym))
361 : {
362 : /* avoid dangling else. */
363 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "constant literal", 16)));
364 : }
365 0 : else if (SymbolTable_IsConstSet (sym))
366 : {
367 : /* avoid dangling else. */
368 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "constant set", 12)));
369 : }
370 0 : else if (SymbolTable_IsConstructor (sym))
371 : {
372 : /* avoid dangling else. */
373 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "constructor", 11)));
374 : }
375 0 : else if (SymbolTable_IsConst (sym))
376 : {
377 : /* avoid dangling else. */
378 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "constant", 8)));
379 : }
380 0 : else if (SymbolTable_IsArray (sym))
381 : {
382 : /* avoid dangling else. */
383 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "array", 5)));
384 : }
385 0 : else if (SymbolTable_IsVar (sym))
386 : {
387 : /* avoid dangling else. */
388 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "variable", 8)));
389 : }
390 0 : else if (SymbolTable_IsEnumeration (sym))
391 : {
392 : /* avoid dangling else. */
393 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "enumeration type", 16)));
394 : }
395 0 : else if (SymbolTable_IsFieldEnumeration (sym))
396 : {
397 : /* avoid dangling else. */
398 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "enumeration field", 17)));
399 : }
400 0 : else if (SymbolTable_IsUnbounded (sym))
401 : {
402 : /* avoid dangling else. */
403 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "unbounded parameter", 19)));
404 : }
405 0 : else if (SymbolTable_IsProcType (sym))
406 : {
407 : /* avoid dangling else. */
408 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "procedure type", 14)));
409 : }
410 0 : else if (SymbolTable_IsProcedure (sym))
411 : {
412 : /* avoid dangling else. */
413 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "procedure", 9)));
414 : }
415 0 : else if (SymbolTable_IsPointer (sym))
416 : {
417 : /* avoid dangling else. */
418 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "pointer", 7)));
419 : }
420 0 : else if (SymbolTable_IsParameter (sym))
421 : {
422 : /* avoid dangling else. */
423 0 : if (SymbolTable_IsParameterVar (sym))
424 : {
425 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "var parameter", 13)));
426 : }
427 : else
428 : {
429 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "parameter", 9)));
430 : }
431 : }
432 0 : else if (SymbolTable_IsType (sym))
433 : {
434 : /* avoid dangling else. */
435 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "type", 4)));
436 : }
437 0 : else if (SymbolTable_IsRecord (sym))
438 : {
439 : /* avoid dangling else. */
440 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "record", 6)));
441 : }
442 0 : else if (SymbolTable_IsRecordField (sym))
443 : {
444 : /* avoid dangling else. */
445 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "record field", 12)));
446 : }
447 0 : else if (SymbolTable_IsVarient (sym))
448 : {
449 : /* avoid dangling else. */
450 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "varient record", 14)));
451 : }
452 0 : else if (SymbolTable_IsModule (sym))
453 : {
454 : /* avoid dangling else. */
455 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "module", 6)));
456 : }
457 0 : else if (SymbolTable_IsDefImp (sym))
458 : {
459 : /* avoid dangling else. */
460 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "definition or implementation module", 35)));
461 : }
462 0 : else if (SymbolTable_IsSet (sym))
463 : {
464 : /* avoid dangling else. */
465 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "set", 3)));
466 : }
467 0 : else if (SymbolTable_IsSubrange (sym))
468 : {
469 : /* avoid dangling else. */
470 0 : return ConCatWord (o, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "subrange", 8)));
471 : }
472 : else
473 : {
474 : /* avoid dangling else. */
475 : return o;
476 : }
477 : /* static analysis guarentees a RETURN statement will be used before here. */
478 : __builtin_unreachable ();
479 : }
480 :
481 :
482 : /*
483 : Output - output string, s, to Stdout. It also disposes of the string, s.
484 : */
485 :
486 0 : static void Output (DynamicStrings_String s)
487 : {
488 0 : s = SFIO_WriteS (FIO_StdOut, s);
489 0 : s = DynamicStrings_KillString (s);
490 0 : }
491 :
492 :
493 : /*
494 : GetComment -
495 : */
496 :
497 0 : static int GetComment (DynamicStrings_String s)
498 : {
499 0 : int c;
500 :
501 0 : c = DynamicStrings_Index (s, '|', 0);
502 0 : while (c >= 0)
503 : {
504 0 : c += 1;
505 0 : if (c >= ((int ) (DynamicStrings_Length (s))))
506 : {
507 : return -1;
508 : }
509 0 : else if ((DynamicStrings_char (s, c)) == '|')
510 : {
511 : /* avoid dangling else. */
512 0 : return c+1;
513 : }
514 0 : c = DynamicStrings_Index (s, '|', static_cast<unsigned int> (c));
515 : }
516 : return -1;
517 : /* static analysis guarentees a RETURN statement will be used before here. */
518 : __builtin_unreachable ();
519 : }
520 :
521 :
522 : /*
523 : doName - concatenate namekey, o, to, p.
524 : */
525 :
526 0 : static DynamicStrings_String doName (DynamicStrings_String p, unsigned int o)
527 : {
528 0 : return DynamicStrings_ConCat (p, DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (o)));
529 : /* static analysis guarentees a RETURN statement will be used before here. */
530 : __builtin_unreachable ();
531 : }
532 :
533 :
534 : /*
535 : doSymName - concatenate symbol, o, name to, p.
536 : */
537 :
538 0 : static DynamicStrings_String doSymName (DynamicStrings_String p, unsigned int o)
539 : {
540 0 : return DynamicStrings_ConCat (p, DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (o))));
541 : /* static analysis guarentees a RETURN statement will be used before here. */
542 : __builtin_unreachable ();
543 : }
544 :
545 :
546 : /*
547 : doNumber - convert, o, to a cardinal and increment the length, l,
548 : by the number of characters required to represent, o.
549 : */
550 :
551 0 : static DynamicStrings_String doNumber (DynamicStrings_String p, unsigned int o)
552 : {
553 0 : return DynamicStrings_ConCat (p, StringConvert_CardinalToString ((unsigned int ) (o), 0, ' ', 10, true));
554 : /* static analysis guarentees a RETURN statement will be used before here. */
555 : __builtin_unreachable ();
556 : }
557 :
558 :
559 : /*
560 : doSymbol - handles a symbol indicated by, o.
561 : */
562 :
563 0 : static DynamicStrings_String doSymbol (DynamicStrings_String p, unsigned int o)
564 : {
565 0 : return symDesc (o, p);
566 : /* static analysis guarentees a RETURN statement will be used before here. */
567 : __builtin_unreachable ();
568 : }
569 :
570 :
571 : /*
572 : doOperand -
573 : */
574 :
575 0 : static DynamicStrings_String doOperand (DynamicStrings_String p, DynamicStrings_String s, int *i, int e, unsigned int o)
576 : {
577 0 : (*i) += 1;
578 0 : if ((*i) < e)
579 : {
580 0 : switch (DynamicStrings_char (s, (*i)))
581 : {
582 0 : case 's':
583 0 : (*i) += 1; /* symbol number */
584 0 : return doSymbol (p, o);
585 0 : break;
586 :
587 0 : case 'd':
588 0 : (*i) += 1; /* decimal number */
589 0 : return doNumber (p, o);
590 0 : break;
591 :
592 0 : case 'a':
593 0 : (*i) += 1; /* symbol name key */
594 0 : return doSymName (p, o);
595 0 : break;
596 :
597 0 : case 'n':
598 0 : (*i) += 1; /* ascii name key */
599 0 : return doName (p, o);
600 0 : break;
601 :
602 :
603 0 : default:
604 0 : M2Error_InternalError ((const char *) "incorrect format specifier expecting one of 's', 'd' or 'a'", 59);
605 : break;
606 : }
607 : }
608 : return p;
609 : /* static analysis guarentees a RETURN statement will be used before here. */
610 : __builtin_unreachable ();
611 : }
612 :
613 :
614 : /*
615 : doPercent -
616 : */
617 :
618 0 : static DynamicStrings_String doPercent (DynamicStrings_String o, DynamicStrings_String s, int *i, int e, unsigned int n)
619 : {
620 0 : (*i) += 1;
621 0 : if ((*i) < e)
622 : {
623 0 : switch (DynamicStrings_char (s, (*i)))
624 : {
625 0 : case '1':
626 0 : return doOperand (o, s, i, e, (unsigned int ) ((*OperandT.proc) (n)));
627 0 : break;
628 :
629 0 : case '2':
630 0 : return doOperand (o, s, i, e, (unsigned int ) ((*OperandF.proc) (n)));
631 0 : break;
632 :
633 0 : case '3':
634 0 : return doOperand (o, s, i, e, (unsigned int ) ((*OperandTok.proc) (n)));
635 0 : break;
636 :
637 :
638 0 : default:
639 0 : M2Error_InternalError ((const char *) "unrecognised format specifier - expecting 1, 2 or 3 after the %", 63);
640 0 : break;
641 : }
642 : }
643 0 : M2Error_InternalError ((const char *) "end of field found before format specifier - expecting 1, 2 or 3 after the %", 76);
644 : ReturnException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2DebugStack.def", 20, 1);
645 : __builtin_unreachable ();
646 : }
647 :
648 :
649 : /*
650 : doNameLength - increment, l, by the ascii length of string determined by, o.
651 : */
652 :
653 0 : static void doNameLength (unsigned int *l, unsigned int o)
654 : {
655 0 : DynamicStrings_String s;
656 :
657 0 : s = DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (o));
658 0 : (*l) += DynamicStrings_Length (s);
659 0 : s = DynamicStrings_KillString (s);
660 0 : }
661 :
662 :
663 : /*
664 : doSymNameLength - increment, l, by the ascii length of symbol, o.
665 : */
666 :
667 0 : static void doSymNameLength (unsigned int *l, unsigned int o)
668 : {
669 0 : DynamicStrings_String s;
670 :
671 0 : s = DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (o)));
672 0 : (*l) += DynamicStrings_Length (s);
673 0 : s = DynamicStrings_KillString (s);
674 0 : }
675 :
676 :
677 : /*
678 : doNumberLength - convert, o, to a cardinal and increment the length, l,
679 : by the number of characters required to represent, o.
680 : */
681 :
682 0 : static void doNumberLength (unsigned int *l, unsigned int o)
683 : {
684 0 : DynamicStrings_String s;
685 :
686 0 : s = StringConvert_CardinalToString ((unsigned int ) (o), 0, ' ', 10, true);
687 0 : (*l) += DynamicStrings_Length (s);
688 0 : s = DynamicStrings_KillString (s);
689 0 : }
690 :
691 :
692 : /*
693 : doSymbolLength - handles a symbol indicated by, o.
694 : */
695 :
696 0 : static void doSymbolLength (unsigned int *l, unsigned int o)
697 : {
698 0 : DynamicStrings_String s;
699 :
700 0 : s = symDesc (o, DynamicStrings_InitString ((const char *) "", 0));
701 0 : (*l) += DynamicStrings_Length (s);
702 0 : s = DynamicStrings_KillString (s);
703 0 : }
704 :
705 :
706 : /*
707 : doOperandLength -
708 : */
709 :
710 0 : static void doOperandLength (DynamicStrings_String s, int *i, int e, unsigned int *l, unsigned int o)
711 : {
712 0 : (*i) += 1;
713 0 : if ((*i) < e)
714 : {
715 0 : switch (DynamicStrings_char (s, (*i)))
716 : {
717 0 : case 's':
718 0 : (*i) += 1; /* symbol number */
719 0 : doSymbolLength (l, o);
720 0 : break;
721 :
722 0 : case 'd':
723 0 : (*i) += 1; /* decimal number */
724 0 : doNumberLength (l, o);
725 0 : break;
726 :
727 0 : case 'a':
728 0 : (*i) += 1; /* ascii name key */
729 0 : doSymNameLength (l, o);
730 0 : break;
731 :
732 0 : case 'n':
733 0 : (*i) += 1; /* ascii name key */
734 0 : doNameLength (l, o);
735 0 : break;
736 :
737 :
738 0 : default:
739 0 : M2Error_InternalError ((const char *) "incorrect format specifier expecting one of 's', 'd' or 'a'", 59);
740 : break;
741 : }
742 : }
743 0 : }
744 :
745 :
746 : /*
747 : doPercentLength -
748 : */
749 :
750 0 : static void doPercentLength (DynamicStrings_String s, int *i, int e, unsigned int *l, unsigned int n)
751 : {
752 0 : (*i) += 1;
753 0 : if ((*i) < e)
754 : {
755 0 : switch (DynamicStrings_char (s, (*i)))
756 : {
757 0 : case '1':
758 0 : doOperandLength (s, i, e, l, (unsigned int ) ((*OperandT.proc) (n)));
759 0 : break;
760 :
761 0 : case '2':
762 0 : doOperandLength (s, i, e, l, (unsigned int ) ((*OperandF.proc) (n)));
763 0 : break;
764 :
765 0 : case '3':
766 0 : doOperandLength (s, i, e, l, (unsigned int ) ((*OperandTok.proc) (n)));
767 0 : break;
768 :
769 :
770 0 : default:
771 0 : M2Error_InternalError ((const char *) "unrecognised format specifier - expecting 1, 2 or 3 after the %", 63);
772 : break;
773 : }
774 : }
775 0 : }
776 :
777 :
778 : /*
779 : doFieldLength - compute the string length given in annotation
780 : at position, n, on the stack between characters
781 : b and e.
782 :
783 : The string description between: b..e can contain any
784 : of these patterns:
785 :
786 : %a ascii name key.
787 : %s symbol number.
788 : %d decimal cardinal number.
789 : | indicates the next field.
790 : */
791 :
792 0 : static unsigned int doFieldLength (int b, int e, unsigned int n)
793 : {
794 0 : unsigned int l;
795 0 : int i;
796 0 : DynamicStrings_String s;
797 :
798 0 : if (b == -1)
799 : {
800 : return 0;
801 : }
802 0 : s = static_cast<DynamicStrings_String> ((*OperandAnno.proc) (n));
803 0 : if (e == -1)
804 : {
805 0 : e = DynamicStrings_Length (s);
806 : }
807 0 : l = 0;
808 0 : i = b;
809 0 : while (i < e)
810 : {
811 0 : switch (DynamicStrings_char (s, i))
812 : {
813 0 : case '|':
814 0 : return l;
815 0 : break;
816 :
817 0 : case '%':
818 0 : doPercentLength (s, &i, e, &l, n);
819 0 : break;
820 :
821 :
822 0 : default:
823 0 : l += 1;
824 0 : break;
825 : }
826 0 : i += 1;
827 : }
828 0 : return l;
829 : /* static analysis guarentees a RETURN statement will be used before here. */
830 : __builtin_unreachable ();
831 : }
832 :
833 :
834 : /*
835 : stop -
836 : */
837 :
838 0 : static void stop (void)
839 : {
840 0 : }
841 :
842 :
843 : /*
844 : doMaxCard - returns the maximum of two CARDINALs.
845 : */
846 :
847 0 : static unsigned int doMaxCard (unsigned int a, unsigned int b)
848 : {
849 0 : if ((a > 100) || (b > 100))
850 : {
851 0 : stop ();
852 : }
853 0 : if (a > b)
854 : {
855 : return a;
856 : }
857 : else
858 : {
859 : return b;
860 : }
861 : /* static analysis guarentees a RETURN statement will be used before here. */
862 : __builtin_unreachable ();
863 : }
864 :
865 :
866 : /*
867 : GetAnnotationFieldLength -
868 : */
869 :
870 0 : static unsigned int GetAnnotationFieldLength (unsigned int n, unsigned int f)
871 : {
872 0 : int c;
873 0 : int e;
874 :
875 0 : c = GetComment ((DynamicStrings_String) ((*OperandAnno.proc) (n)));
876 0 : if (c > 0)
877 : {
878 0 : if (Debugging)
879 : {
880 : M2Printf_printf0 ((const char *) "full anno is: ", 14);
881 : Output (DynamicStrings_Dup ((DynamicStrings_String) ((*OperandAnno.proc) (n))));
882 : M2Printf_printf0 ((const char *) "\\n", 2);
883 : M2Printf_printf0 ((const char *) "comment field is: ", 18);
884 : Output (DynamicStrings_Slice ((DynamicStrings_String) ((*OperandAnno.proc) (n)), c, 0));
885 : M2Printf_printf0 ((const char *) "\\n", 2);
886 : }
887 0 : e = DynamicStrings_Index ((DynamicStrings_String) ((*OperandAnno.proc) (n)), '|', static_cast<unsigned int> (c));
888 0 : if (f == 0)
889 : {
890 0 : return doFieldLength (c, e, n);
891 : }
892 : else
893 : {
894 0 : if (e >= 0)
895 : {
896 0 : e += 1;
897 : }
898 0 : return doFieldLength (e, -1, n);
899 : }
900 : }
901 : else
902 : {
903 : return 0;
904 : }
905 : /* static analysis guarentees a RETURN statement will be used before here. */
906 : __builtin_unreachable ();
907 : }
908 :
909 :
910 : /*
911 : GetAnnotationLength -
912 : */
913 :
914 0 : static unsigned int GetAnnotationLength (unsigned int n, unsigned int f)
915 : {
916 0 : unsigned int l;
917 :
918 0 : if (((*OperandAnno.proc) (n)) == NULL)
919 : {
920 0 : l = 0;
921 0 : if (f == 0)
922 : {
923 0 : doNumberLength (&l, (unsigned int ) ((*OperandT.proc) (n)));
924 : }
925 : else
926 : {
927 0 : doNumberLength (&l, (unsigned int ) ((*OperandF.proc) (n)));
928 : }
929 0 : return l;
930 : }
931 : else
932 : {
933 0 : return GetAnnotationFieldLength (n, f);
934 : }
935 : /* static analysis guarentees a RETURN statement will be used before here. */
936 : __builtin_unreachable ();
937 : }
938 :
939 :
940 : /*
941 : GetFieldLength - returns the number of characters used in field, f,
942 : at position, n, on the stack.
943 : */
944 :
945 0 : static unsigned int GetFieldLength (unsigned int n, unsigned int f)
946 : {
947 0 : int c;
948 0 : int b;
949 0 : int e;
950 :
951 0 : c = GetComment ((DynamicStrings_String) ((*OperandAnno.proc) (n)));
952 0 : if (c > 1)
953 : {
954 0 : e = c-2;
955 : }
956 : else
957 : {
958 0 : e = DynamicStrings_Length ((DynamicStrings_String) ((*OperandAnno.proc) (n)));
959 : }
960 0 : if (f == 0)
961 : {
962 : b = 0;
963 : }
964 : else
965 : {
966 0 : b = DynamicStrings_Index ((DynamicStrings_String) ((*OperandAnno.proc) (n)), '|', 0);
967 0 : if (b == -1)
968 : {
969 : return 0;
970 : }
971 : else
972 : {
973 0 : b += 1;
974 : }
975 : }
976 0 : return doFieldLength (b, e, n);
977 : /* static analysis guarentees a RETURN statement will be used before here. */
978 : __builtin_unreachable ();
979 : }
980 :
981 :
982 : /*
983 : GetMaxFieldAnno - returns the maximum number of characters required
984 : by either the annotation or field, f, at position, n,
985 : on the stack.
986 : */
987 :
988 0 : static unsigned int GetMaxFieldAnno (unsigned int n, unsigned int f)
989 : {
990 0 : return doMaxCard (GetAnnotationLength (n, f), GetFieldLength (n, f));
991 : /* static analysis guarentees a RETURN statement will be used before here. */
992 : __builtin_unreachable ();
993 : }
994 :
995 :
996 : /*
997 : GetStackFieldLengths - assigns, tn, and, fn, with the
998 : maximum field width values.
999 : */
1000 :
1001 0 : static void GetStackFieldLengths (unsigned int *tn, unsigned int *fn, unsigned int *tk, unsigned int amount)
1002 : {
1003 0 : unsigned int i;
1004 :
1005 0 : i = 1;
1006 0 : (*tn) = 0;
1007 0 : (*fn) = 0;
1008 0 : (*tk) = 0;
1009 0 : while (i <= amount)
1010 : {
1011 0 : (*tn) = doMaxCard ((*tn), GetMaxFieldAnno (i, 0));
1012 0 : (*fn) = doMaxCard ((*fn), GetMaxFieldAnno (i, 1));
1013 0 : (*tk) = doMaxCard ((*tk), GetMaxFieldAnno (i, 2));
1014 0 : i += 1;
1015 : }
1016 0 : }
1017 :
1018 :
1019 : /*
1020 : DisplayRow -
1021 : */
1022 :
1023 0 : static void DisplayRow (unsigned int tn, unsigned int fn, unsigned int tk, bool initOrFinal)
1024 : {
1025 0 : unsigned int i;
1026 :
1027 0 : M2Printf_printf0 ((const char *) "+-", 2);
1028 0 : for (i=1; i<=tn; i++)
1029 : {
1030 0 : M2Printf_printf0 ((const char *) "-", 1);
1031 : }
1032 0 : if ((fn == 0) && (tk == 0))
1033 : {
1034 0 : if (initOrFinal)
1035 : {
1036 0 : M2Printf_printf0 ((const char *) "-+-", 3);
1037 : }
1038 : else
1039 : {
1040 0 : M2Printf_printf0 ((const char *) "-|-", 3);
1041 : }
1042 : }
1043 : else
1044 : {
1045 0 : if (initOrFinal)
1046 : {
1047 0 : M2Printf_printf0 ((const char *) "-+-", 3);
1048 : }
1049 : else
1050 : {
1051 0 : M2Printf_printf0 ((const char *) "-|-", 3);
1052 : }
1053 0 : if (fn != 0)
1054 : {
1055 0 : for (i=1; i<=fn; i++)
1056 : {
1057 0 : M2Printf_printf0 ((const char *) "-", 1);
1058 : }
1059 : }
1060 0 : if (initOrFinal)
1061 : {
1062 0 : M2Printf_printf0 ((const char *) "-+-", 3);
1063 : }
1064 : else
1065 : {
1066 0 : M2Printf_printf0 ((const char *) "-|-", 3);
1067 : }
1068 0 : if (tk != 0)
1069 : {
1070 0 : for (i=1; i<=tk; i++)
1071 : {
1072 0 : M2Printf_printf0 ((const char *) "-", 1);
1073 : }
1074 0 : M2Printf_printf0 ((const char *) "-+\\n", 4);
1075 : }
1076 : }
1077 0 : }
1078 :
1079 :
1080 : /*
1081 : SkipToField -
1082 : */
1083 :
1084 0 : static int SkipToField (DynamicStrings_String s, unsigned int n)
1085 : {
1086 0 : int i;
1087 0 : int h;
1088 :
1089 0 : i = 0;
1090 0 : h = DynamicStrings_Length (s);
1091 0 : while ((n > 0) && (i < h))
1092 : {
1093 0 : if ((DynamicStrings_Index (s, '|', static_cast<unsigned int> (i))) > 0)
1094 : {
1095 0 : n -= 1;
1096 0 : if ((i < h) && ((DynamicStrings_char (s, i+1)) == '|'))
1097 : {
1098 : /* comment seen, no field available */
1099 : return -1;
1100 : }
1101 0 : i = DynamicStrings_Index (s, '|', static_cast<unsigned int> (i));
1102 : }
1103 : else
1104 : {
1105 : return -1;
1106 : }
1107 0 : i += 1;
1108 : }
1109 0 : if (i == h)
1110 : {
1111 0 : i = -1;
1112 : }
1113 : return i;
1114 : /* static analysis guarentees a RETURN statement will be used before here. */
1115 : __builtin_unreachable ();
1116 : }
1117 :
1118 :
1119 : /*
1120 : Pad - padds out string, s, to paddedLength characters.
1121 : */
1122 :
1123 0 : static DynamicStrings_String Pad (DynamicStrings_String o, unsigned int paddedLength)
1124 : {
1125 0 : unsigned int i;
1126 :
1127 0 : i = DynamicStrings_Length (o);
1128 0 : if (i < paddedLength)
1129 : {
1130 0 : do {
1131 0 : o = DynamicStrings_ConCatChar (o, ' ');
1132 0 : i += 1;
1133 0 : } while (! (i == paddedLength));
1134 : }
1135 0 : return o;
1136 : /* static analysis guarentees a RETURN statement will be used before here. */
1137 : __builtin_unreachable ();
1138 : }
1139 :
1140 :
1141 : /*
1142 : doField - compute the string length given in annotation
1143 : at position, n, on the stack between characters
1144 : b and e.
1145 :
1146 : The string description between: b..e can contain any
1147 : of these patterns:
1148 :
1149 : %a ascii name key.
1150 : %s symbol number.
1151 : %d decimal cardinal number.
1152 : | indicates the next field.
1153 : */
1154 :
1155 0 : static DynamicStrings_String doField (DynamicStrings_String s, unsigned int n, unsigned int f, unsigned int l)
1156 : {
1157 0 : int h;
1158 0 : int i;
1159 0 : int j;
1160 0 : DynamicStrings_String o;
1161 :
1162 0 : h = DynamicStrings_Length (s);
1163 0 : i = SkipToField (s, f);
1164 0 : o = DynamicStrings_InitString ((const char *) "", 0);
1165 0 : if (i >= 0)
1166 : {
1167 0 : j = SkipToField (s, f+1);
1168 0 : if (j == -1)
1169 : {
1170 0 : j = h;
1171 : }
1172 0 : while (i < h)
1173 : {
1174 0 : switch (DynamicStrings_char (s, i))
1175 : {
1176 0 : case '|':
1177 0 : i = h;
1178 0 : break;
1179 :
1180 0 : case '%':
1181 0 : o = doPercent (o, s, &i, h, n);
1182 0 : break;
1183 :
1184 :
1185 0 : default:
1186 0 : o = DynamicStrings_ConCatChar (o, DynamicStrings_char (s, i));
1187 0 : i += 1;
1188 0 : break;
1189 : }
1190 : }
1191 : }
1192 0 : o = Pad (o, l);
1193 0 : return o;
1194 : /* static analysis guarentees a RETURN statement will be used before here. */
1195 : __builtin_unreachable ();
1196 : }
1197 :
1198 :
1199 : /*
1200 : doAnnotation -
1201 : */
1202 :
1203 0 : static DynamicStrings_String doAnnotation (DynamicStrings_String s, unsigned int n, unsigned int field, unsigned int width)
1204 : {
1205 0 : int c;
1206 0 : DynamicStrings_String cf;
1207 0 : DynamicStrings_String o;
1208 :
1209 0 : c = GetComment (s);
1210 0 : if (c >= 0)
1211 : {
1212 0 : cf = DynamicStrings_Slice (s, c, 0);
1213 0 : o = doField (cf, n, field, width);
1214 0 : cf = DynamicStrings_KillString (cf);
1215 0 : return o;
1216 : }
1217 : else
1218 : {
1219 0 : return DynamicStrings_InitString ((const char *) "", 0);
1220 : }
1221 : /* static analysis guarentees a RETURN statement will be used before here. */
1222 : __builtin_unreachable ();
1223 : }
1224 :
1225 :
1226 : /*
1227 : DisplayFields -
1228 : */
1229 :
1230 0 : static void DisplayFields (unsigned int n, unsigned int tn, unsigned int fn, unsigned int tk)
1231 : {
1232 0 : DynamicStrings_String s;
1233 0 : unsigned int t;
1234 0 : unsigned int f;
1235 0 : unsigned int k;
1236 :
1237 0 : s = static_cast<DynamicStrings_String> ((*OperandAnno.proc) (n));
1238 0 : if (s == NULL)
1239 : {
1240 0 : t = static_cast<unsigned int> ((*OperandT.proc) (n));
1241 0 : f = static_cast<unsigned int> ((*OperandF.proc) (n));
1242 0 : k = static_cast<unsigned int> ((*OperandTok.proc) (n));
1243 0 : M2Printf_printf0 ((const char *) "| ", 2);
1244 0 : Output (Pad (StringConvert_CardinalToString ((unsigned int ) (t), 0, ' ', 10, true), tn));
1245 0 : M2Printf_printf0 ((const char *) " | ", 3);
1246 0 : Output (Pad (StringConvert_CardinalToString ((unsigned int ) (f), 0, ' ', 10, true), fn));
1247 0 : M2Printf_printf0 ((const char *) " | ", 3);
1248 0 : Output (Pad (StringConvert_CardinalToString ((unsigned int ) (k), 0, ' ', 10, true), tk));
1249 0 : M2Printf_printf0 ((const char *) " |\\n", 4);
1250 : }
1251 : else
1252 : {
1253 0 : if (tn > 0)
1254 : {
1255 0 : M2Printf_printf0 ((const char *) "| ", 2);
1256 0 : Output (doField (s, n, 0, tn));
1257 : }
1258 0 : if (fn > 0)
1259 : {
1260 0 : M2Printf_printf0 ((const char *) " | ", 3);
1261 0 : Output (doField (s, n, 1, fn));
1262 : }
1263 0 : if (tk > 0)
1264 : {
1265 0 : M2Printf_printf0 ((const char *) " | ", 3);
1266 0 : Output (doField (s, n, 2, tk));
1267 : }
1268 0 : M2Printf_printf0 ((const char *) " |\\n", 4);
1269 0 : if (tn > 0)
1270 : {
1271 0 : M2Printf_printf0 ((const char *) "| ", 2);
1272 0 : Output (doAnnotation (s, n, 0, tn));
1273 : }
1274 0 : if (fn > 0)
1275 : {
1276 0 : M2Printf_printf0 ((const char *) " | ", 3);
1277 0 : Output (doAnnotation (s, n, 1, fn));
1278 : }
1279 0 : if (tk > 0)
1280 : {
1281 0 : M2Printf_printf0 ((const char *) " | ", 3);
1282 0 : Output (doAnnotation (s, n, 2, tk));
1283 : }
1284 0 : M2Printf_printf0 ((const char *) " |\\n", 4);
1285 : }
1286 0 : }
1287 :
1288 :
1289 : /*
1290 : DebugStack - displays the stack.
1291 : */
1292 :
1293 0 : extern "C" void M2DebugStack_DebugStack (unsigned int amount, M2DebugStack_ProcedureWord opt, M2DebugStack_ProcedureWord opf, M2DebugStack_ProcedureWord opa, M2DebugStack_ProcedureWord opd, M2DebugStack_ProcedureWord oprw, M2DebugStack_ProcedureWord optk, M2DebugStack_ProcedureString opanno)
1294 : {
1295 0 : unsigned int i;
1296 0 : unsigned int tn;
1297 0 : unsigned int fn;
1298 0 : unsigned int tk;
1299 :
1300 0 : OperandT = opt;
1301 0 : OperandF = opf;
1302 0 : OperandA = opa;
1303 0 : OperandD = opd;
1304 0 : OperandRW = oprw;
1305 0 : OperandAnno = opanno;
1306 0 : OperandTok = optk;
1307 0 : GetStackFieldLengths (&tn, &fn, &tk, amount);
1308 0 : i = 1;
1309 0 : while (i <= amount)
1310 : {
1311 0 : if (i == 1)
1312 : {
1313 0 : DisplayRow (tn, fn, tk, true);
1314 : }
1315 0 : DisplayFields (i, tn, fn, tk);
1316 0 : DisplayRow (tn, fn, tk, i == amount);
1317 0 : i += 1;
1318 : }
1319 0 : }
1320 :
1321 0 : extern "C" void _M2_M2DebugStack_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
1322 : {
1323 0 : }
1324 :
1325 0 : extern "C" void _M2_M2DebugStack_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
1326 : {
1327 0 : }
|