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