1
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 /**************************************************************************
7 * TESTS :
8 * -- function arguments that are enumerated types
9 * -- small structure arguments ( <= 64 bits )
10 * -- stored in registers
11 * -- stored on the stack
12 * -- large structure arguments ( > 64 bits )
13 * -- stored in registers
14 * -- stored on the stack
15 * -- array arguments
16 * -- caller is a leaf routine :
17 * -- use the call command from within an init routine (i.e.
18 * init_bit_flags, init_bit_flags_combo, init_array_rep)
19 * -- caller doesn't have enough space for all the function arguments :
20 * -- call print_long_arg_list from inside print_small_structs
21 ***************************************************************************/
22
23 /* Some enumerated types -- used to test that the structureal data type is
24 * retrieved for function arguments with typedef data types.
25 */
26 typedef int id_int;
27
28 typedef enum {
29 BLACK,
30 BLUE,
31 BROWN,
32 ECRUE,
33 GOLD,
34 GRAY,
35 GREEN,
36 IVORY,
37 MAUVE,
38 ORANGE,
39 PINK,
40 PURPLE,
41 RED,
42 SILVER,
43 TAN,
44 VIOLET,
45 WHITE,
46 YELLOW} colors;
47
48 /* A large structure (> 64 bits) used to test passing large structures as
49 * parameters
50 */
51
52 struct array_rep_info_t {
53 int next_index[10];
54 int values[10];
55 int head;
56 };
57
58 /*****************************************************************************
59 * Small structures ( <= 64 bits). These are used to test passing small
60 * structures as parameters and test argument size promotion.
61 *****************************************************************************/
62
63 /* 64 bits
64 */
65 struct small_rep_info_t {
66 int value;
67 int head;
68 };
69
70 /* 6 bits : really fits in 8 bits and is promoted to 32 bits
71 */
72 struct bit_flags_t {
73 unsigned alpha :1;
74 unsigned beta :1;
75 unsigned gamma :1;
76 unsigned delta :1;
77 unsigned epsilon :1;
78 unsigned omega :1;
79 };
80
81 /* 22 bits : really fits in 40 bits and is promoted to 64 bits
82 */
83 struct bit_flags_combo_t {
84 unsigned alpha :1;
85 unsigned beta :1;
86 char ch1;
87 unsigned gamma :1;
88 unsigned delta :1;
89 char ch2;
90 unsigned epsilon :1;
91 unsigned omega :1;
92 };
93
94 /* 64 bits
95 */
96 struct one_double_t {
97 double double1;
98 };
99
100 /* 64 bits
101 */
102 struct two_floats_t {
103 float float1;
104 float float2;
105 };
106
107 /* 16 bits : promoted to 32 bits
108 */
109 struct two_char_t {
110 char ch1;
111 char ch2;
112 };
113
114 /* 24 bits : promoted to 32 bits
115 */
116 struct three_char_t {
117 char ch1;
118 char ch2;
119 char ch3;
120 };
121
122 /* 40 bits : promoted to 64 bits
123 */
124 struct five_char_t {
125 char ch1;
126 char ch2;
127 char ch3;
128 char ch4;
129 char ch5;
130 };
131
132 /* 40 bits : promoted to 64 bits
133 */
134 struct int_char_combo_t {
135 int int1;
136 char ch1;
137 };
138
139 /*****************************************************************
140 * PRINT_STUDENT_ID_SHIRT_COLOR :
141 * IN id_int student -- enumerated type
142 * IN colors shirt -- enumerated type
143 *****************************************************************/
144 #ifdef PROTOTYPES
print_student_id_shirt_color(id_int student,colors shirt)145 void print_student_id_shirt_color (id_int student, colors shirt)
146 #else
147 void print_student_id_shirt_color ( student, shirt )
148 id_int student;
149 colors shirt;
150 #endif
151 {
152
153 printf("student id : %d\t", student);
154 printf("shirt color : ");
155 switch (shirt) {
156 case BLACK : printf("BLACK\n");
157 break;
158 case BLUE : printf("BLUE\n");
159 break;
160 case BROWN : printf("BROWN\n");
161 break;
162 case ECRUE : printf("ECRUE\n");
163 break;
164 case GOLD : printf("GOLD\n");
165 break;
166 case GRAY : printf("GRAY\n");
167 break;
168 case GREEN : printf("GREEN\n");
169 break;
170 case IVORY : printf("IVORY\n");
171 break;
172 case MAUVE : printf("MAUVE\n");
173 break;
174 case ORANGE : printf("ORANGE\n");
175 break;
176 case PINK : printf("PINK\n");
177 break;
178 case PURPLE : printf("PURPLE\n");
179 break;
180 case RED : printf("RED\n");
181 break;
182 case SILVER : printf("SILVER\n");
183 break;
184 case TAN : printf("TAN\n");
185 break;
186 case VIOLET : printf("VIOLET\n");
187 break;
188 case WHITE : printf("WHITE\n");
189 break;
190 case YELLOW : printf("YELLOW\n");
191 break;
192 }
193 }
194
195 /*****************************************************************
196 * PRINT_CHAR_ARRAY :
197 * IN char array_c[] -- character array
198 *****************************************************************/
199 #ifdef PROTOTYPES
print_char_array(char array_c[])200 void print_char_array (char array_c[])
201 #else
202 void print_char_array ( array_c )
203 char array_c[];
204 #endif
205 {
206
207 int index;
208
209 printf("array_c :\n");
210 printf("=========\n\n");
211 for (index = 0; index < 120; index++) {
212 printf("%1c", array_c[index]);
213 if ((index%50) == 0) printf("\n");
214 }
215 printf("\n\n");
216 }
217
218 /*****************************************************************
219 * PRINT_DOUBLE_ARRAY :
220 * IN double array_d[] -- array of doubles
221 *****************************************************************/
222 #ifdef PROTOTYPES
print_double_array(double array_d[])223 void print_double_array (double array_d[])
224 #else
225 void print_double_array (array_d)
226 double array_d[];
227 #endif
228 {
229
230 int index;
231
232 printf("array_d :\n");
233 printf("=========\n\n");
234 for (index = 0; index < 9; index++) {
235 printf("%f ", array_d[index]);
236 if ((index%8) == 0) printf("\n");
237 }
238 printf("\n\n");
239 }
240
241 /*****************************************************************
242 * PRINT_FLOAT_ARRAY:
243 * IN float array_f[] -- array of floats
244 *****************************************************************/
245 #ifdef PROTOTYPES
print_float_array(float array_f[])246 void print_float_array (float array_f[])
247 #else
248 void print_float_array ( array_f )
249 float array_f[];
250 #endif
251 {
252
253 int index;
254
255 printf("array_f :\n");
256 printf("=========\n\n");
257 for (index = 0; index < 15; index++) {
258 printf("%f ", array_f[index]);
259 if ((index%8) == 0) printf("\n");
260
261 }
262 printf("\n\n");
263 }
264
265 /*****************************************************************
266 * PRINT_INT_ARRAY:
267 * IN int array_i[] -- array of integers
268 *****************************************************************/
269 #ifdef PROTOTYPES
print_int_array(int array_i[])270 void print_int_array (int array_i[])
271 #else
272 void print_int_array ( array_i )
273 int array_i[];
274 #endif
275 {
276
277 int index;
278
279 printf("array_i :\n");
280 printf("=========\n\n");
281 for (index = 0; index < 50; index++) {
282 printf("%d ", array_i[index]);
283 if ((index%8) == 0) printf("\n");
284 }
285 printf("\n\n");
286
287 }
288
289 /*****************************************************************
290 * PRINT_ALL_ARRAYS:
291 * IN int array_i[] -- array of integers
292 * IN char array_c[] -- array of characters
293 * IN float array_f[] -- array of floats
294 * IN double array_d[] -- array of doubles
295 *****************************************************************/
296 #ifdef PROTOTYPES
print_all_arrays(int array_i[],char array_c[],float array_f[],double array_d[])297 void print_all_arrays(int array_i[], char array_c[], float array_f[], double array_d[])
298 #else
299 void print_all_arrays( array_i, array_c, array_f, array_d )
300 int array_i[];
301 char array_c[];
302 float array_f[];
303 double array_d[];
304 #endif
305 {
306 print_int_array(array_i);
307 print_char_array(array_c);
308 print_float_array(array_f);
309 print_double_array(array_d);
310 }
311
312 /*****************************************************************
313 * LOOP_COUNT :
314 * A do nothing function. Used to provide a point at which calls can be made.
315 *****************************************************************/
loop_count()316 void loop_count () {
317
318 int index;
319
320 for (index=0; index<4; index++);
321 }
322
323 /*****************************************************************
324 * COMPUTE_WITH_SMALL_STRUCTS :
325 * A do nothing function. Used to provide a point at which calls can be made.
326 * IN int seed
327 *****************************************************************/
328 #ifdef PROTOTYPES
compute_with_small_structs(int seed)329 void compute_with_small_structs (int seed)
330 #else
331 void compute_with_small_structs ( seed )
332 int seed;
333 #endif
334 {
335
336 struct small_rep_info_t array[4];
337 int index;
338
339 for (index = 0; index < 4; index++) {
340 array[index].value = index*seed;
341 array[index].head = (index+1)*seed;
342 }
343
344 for (index = 1; index < 4; index++) {
345 array[index].value = array[index].value + array[index-1].value;
346 array[index].head = array[index].head + array[index-1].head;
347 }
348 }
349
350 /*****************************************************************
351 * INIT_BIT_FLAGS :
352 * Initializes a bit_flags_t structure. Can call this function see
353 * the call command behavior when integer arguments do not fit into
354 * registers and must be placed on the stack.
355 * OUT struct bit_flags_t *bit_flags -- structure to be filled
356 * IN unsigned a -- 0 or 1
357 * IN unsigned b -- 0 or 1
358 * IN unsigned g -- 0 or 1
359 * IN unsigned d -- 0 or 1
360 * IN unsigned e -- 0 or 1
361 * IN unsigned o -- 0 or 1
362 *****************************************************************/
363 #ifdef PROTOTYPES
init_bit_flags(struct bit_flags_t * bit_flags,unsigned a,unsigned b,unsigned g,unsigned d,unsigned e,unsigned o)364 void init_bit_flags (struct bit_flags_t *bit_flags, unsigned a, unsigned b, unsigned g, unsigned d, unsigned e, unsigned o)
365 #else
366 void init_bit_flags ( bit_flags, a, b, g, d, e, o )
367 struct bit_flags_t *bit_flags;
368 unsigned a;
369 unsigned b;
370 unsigned g;
371 unsigned d;
372 unsigned e;
373 unsigned o;
374 #endif
375 {
376
377 bit_flags->alpha = a;
378 bit_flags->beta = b;
379 bit_flags->gamma = g;
380 bit_flags->delta = d;
381 bit_flags->epsilon = e;
382 bit_flags->omega = o;
383 }
384
385 /*****************************************************************
386 * INIT_BIT_FLAGS_COMBO :
387 * Initializes a bit_flags_combo_t structure. Can call this function
388 * to see the call command behavior when integer and character arguments
389 * do not fit into registers and must be placed on the stack.
390 * OUT struct bit_flags_combo_t *bit_flags_combo -- structure to fill
391 * IN unsigned a -- 0 or 1
392 * IN unsigned b -- 0 or 1
393 * IN char ch1
394 * IN unsigned g -- 0 or 1
395 * IN unsigned d -- 0 or 1
396 * IN char ch2
397 * IN unsigned e -- 0 or 1
398 * IN unsigned o -- 0 or 1
399 *****************************************************************/
400 #ifdef PROTOTYPES
init_bit_flags_combo(struct bit_flags_combo_t * bit_flags_combo,unsigned a,unsigned b,char ch1,unsigned g,unsigned d,char ch2,unsigned e,unsigned o)401 void init_bit_flags_combo (struct bit_flags_combo_t *bit_flags_combo, unsigned a, unsigned b, char ch1, unsigned g, unsigned d, char ch2, unsigned e, unsigned o)
402 #else
403 void init_bit_flags_combo ( bit_flags_combo, a, b, ch1, g, d, ch2, e, o )
404 struct bit_flags_combo_t *bit_flags_combo;
405 unsigned a;
406 unsigned b;
407 char ch1;
408 unsigned g;
409 unsigned d;
410 char ch2;
411 unsigned e;
412 unsigned o;
413 #endif
414 {
415
416 bit_flags_combo->alpha = a;
417 bit_flags_combo->beta = b;
418 bit_flags_combo->ch1 = ch1;
419 bit_flags_combo->gamma = g;
420 bit_flags_combo->delta = d;
421 bit_flags_combo->ch2 = ch2;
422 bit_flags_combo->epsilon = e;
423 bit_flags_combo->omega = o;
424 }
425
426
427 /*****************************************************************
428 * INIT_ONE_DOUBLE :
429 * OUT struct one_double_t *one_double -- structure to fill
430 * IN double init_val
431 *****************************************************************/
432 #ifdef PROTOTYPES
init_one_double(struct one_double_t * one_double,double init_val)433 void init_one_double (struct one_double_t *one_double, double init_val)
434 #else
435 void init_one_double ( one_double, init_val )
436 struct one_double_t *one_double;
437 double init_val;
438 #endif
439 {
440
441 one_double->double1 = init_val;
442 }
443
444 /*****************************************************************
445 * INIT_TWO_FLOATS :
446 * OUT struct two_floats_t *two_floats -- structure to be filled
447 * IN float init_val1
448 * IN float init_val2
449 *****************************************************************/
450 #ifdef PROTOTYPES
init_two_floats(struct two_floats_t * two_floats,float init_val1,float init_val2)451 void init_two_floats (struct two_floats_t *two_floats, float init_val1, float init_val2)
452 #else
453 void init_two_floats ( two_floats, init_val1, init_val2 )
454 struct two_floats_t *two_floats;
455 float init_val1;
456 float init_val2;
457 #endif
458 {
459 two_floats->float1 = init_val1;
460 two_floats->float2 = init_val2;
461 }
462
463 /*****************************************************************
464 * INIT_TWO_CHARS :
465 * OUT struct two_char_t *two_char -- structure to be filled
466 * IN char init_val1
467 * IN char init_val2
468 *****************************************************************/
469 #ifdef PROTOTYPES
init_two_chars(struct two_char_t * two_char,char init_val1,char init_val2)470 void init_two_chars (struct two_char_t *two_char, char init_val1, char init_val2)
471 #else
472 void init_two_chars ( two_char, init_val1, init_val2 )
473 struct two_char_t *two_char;
474 char init_val1;
475 char init_val2;
476 #endif
477 {
478
479 two_char->ch1 = init_val1;
480 two_char->ch2 = init_val2;
481 }
482
483 /*****************************************************************
484 * INIT_THREE_CHARS :
485 * OUT struct three_char_t *three_char -- structure to be filled
486 * IN char init_val1
487 * IN char init_val2
488 * IN char init_val3
489 *****************************************************************/
490 #ifdef PROTOTYPES
init_three_chars(struct three_char_t * three_char,char init_val1,char init_val2,char init_val3)491 void init_three_chars (struct three_char_t *three_char, char init_val1, char init_val2, char init_val3)
492 #else
493 void init_three_chars ( three_char, init_val1, init_val2, init_val3 )
494 struct three_char_t *three_char;
495 char init_val1;
496 char init_val2;
497 char init_val3;
498 #endif
499 {
500
501 three_char->ch1 = init_val1;
502 three_char->ch2 = init_val2;
503 three_char->ch3 = init_val3;
504 }
505
506 /*****************************************************************
507 * INIT_FIVE_CHARS :
508 * OUT struct five_char_t *five_char -- structure to be filled
509 * IN char init_val1
510 * IN char init_val2
511 * IN char init_val3
512 * IN char init_val4
513 * IN char init_val5
514 *****************************************************************/
515 #ifdef PROTOTYPES
init_five_chars(struct five_char_t * five_char,char init_val1,char init_val2,char init_val3,char init_val4,char init_val5)516 void init_five_chars (struct five_char_t *five_char, char init_val1, char init_val2, char init_val3, char init_val4, char init_val5)
517 #else
518 void init_five_chars ( five_char, init_val1, init_val2, init_val3,init_val4,init_val5 )
519 struct five_char_t *five_char;
520 char init_val1;
521 char init_val2;
522 char init_val3;
523 char init_val4;
524 char init_val5;
525 #endif
526 {
527 five_char->ch1 = init_val1;
528 five_char->ch2 = init_val2;
529 five_char->ch3 = init_val3;
530 five_char->ch4 = init_val4;
531 five_char->ch5 = init_val5;
532 }
533
534 /*****************************************************************
535 * INIT_INT_CHAR_COMBO :
536 * OUT struct int_char_combo_t *combo -- structure to be filled
537 * IN int init_val1
538 * IN char init_val2
539 *****************************************************************/
540 #ifdef PROTOTYPES
init_int_char_combo(struct int_char_combo_t * combo,int init_val1,char init_val2)541 void init_int_char_combo (struct int_char_combo_t *combo, int init_val1, char init_val2)
542 #else
543 void init_int_char_combo ( combo, init_val1, init_val2 )
544 struct int_char_combo_t *combo;
545 int init_val1;
546 char init_val2;
547 #endif
548 {
549
550 combo->int1 = init_val1;
551 combo->ch1 = init_val2;
552 }
553
554 /*****************************************************************
555 * INIT_STRUCT_REP :
556 * OUT struct small_rep_into_t *small_struct -- structure to be filled
557 * IN int seed
558 *****************************************************************/
559 #ifdef PROTOTYPES
init_struct_rep(struct small_rep_info_t * small_struct,int seed)560 void init_struct_rep(struct small_rep_info_t *small_struct, int seed)
561 #else
562 void init_struct_rep( small_struct, seed )
563 struct small_rep_info_t *small_struct;
564 int seed;
565 #endif
566 {
567
568 small_struct->value = 2 + (seed*2);
569 small_struct->head = 0;
570 }
571
572 /*****************************************************************
573 * INIT_SMALL_STRUCTS :
574 * Takes all the small structures as input and calls the appropriate
575 * initialization routine for each structure
576 *****************************************************************/
577 #ifdef PROTOTYPES
init_small_structs(struct small_rep_info_t * struct1,struct small_rep_info_t * struct2,struct small_rep_info_t * struct3,struct small_rep_info_t * struct4,struct bit_flags_t * flags,struct bit_flags_combo_t * flags_combo,struct three_char_t * three_char,struct five_char_t * five_char,struct int_char_combo_t * int_char_combo,struct one_double_t * d1,struct one_double_t * d2,struct one_double_t * d3,struct two_floats_t * f1,struct two_floats_t * f2,struct two_floats_t * f3)578 void init_small_structs (
579 struct small_rep_info_t *struct1,
580 struct small_rep_info_t *struct2,
581 struct small_rep_info_t *struct3,
582 struct small_rep_info_t *struct4,
583 struct bit_flags_t *flags,
584 struct bit_flags_combo_t *flags_combo,
585 struct three_char_t *three_char,
586 struct five_char_t *five_char,
587 struct int_char_combo_t *int_char_combo,
588 struct one_double_t *d1,
589 struct one_double_t *d2,
590 struct one_double_t *d3,
591 struct two_floats_t *f1,
592 struct two_floats_t *f2,
593 struct two_floats_t *f3)
594 #else
595 void init_small_structs (struct1, struct2, struct3,struct4,flags,flags_combo,
596 three_char, five_char,int_char_combo, d1, d2,d3,f1,f2,f3)
597 struct small_rep_info_t *struct1;
598 struct small_rep_info_t *struct2;
599 struct small_rep_info_t *struct3;
600 struct small_rep_info_t *struct4;
601 struct bit_flags_t *flags;
602 struct bit_flags_combo_t *flags_combo;
603 struct three_char_t *three_char;
604 struct five_char_t *five_char;
605 struct int_char_combo_t *int_char_combo;
606 struct one_double_t *d1;
607 struct one_double_t *d2;
608 struct one_double_t *d3;
609 struct two_floats_t *f1;
610 struct two_floats_t *f2;
611 struct two_floats_t *f3;
612 #endif
613 {
614
615 init_bit_flags(flags, (unsigned)1, (unsigned)0, (unsigned)1,
616 (unsigned)0, (unsigned)1, (unsigned)0 );
617 init_bit_flags_combo(flags_combo, (unsigned)1, (unsigned)0, 'y',
618 (unsigned)1, (unsigned)0, 'n',
619 (unsigned)1, (unsigned)0 );
620 init_three_chars(three_char, 'a', 'b', 'c');
621 init_five_chars(five_char, 'l', 'm', 'n', 'o', 'p');
622 init_int_char_combo(int_char_combo, 123, 'z');
623 init_struct_rep(struct1, 2);
624 init_struct_rep(struct2, 4);
625 init_struct_rep(struct3, 5);
626 init_struct_rep(struct4, 6);
627 init_one_double ( d1, 10.5);
628 init_one_double ( d2, -3.375);
629 init_one_double ( d3, 675.09375);
630 init_two_floats ( f1, 45.234, 43.6);
631 init_two_floats ( f2, 78.01, 122.10);
632 init_two_floats ( f3, -1232.345, -199.21);
633 }
634
635 /*****************************************************************
636 * PRINT_TEN_DOUBLES :
637 * ?????????????????????????????
638 ****************************************************************/
639 #ifdef PROTOTYPES
print_ten_doubles(double d1,double d2,double d3,double d4,double d5,double d6,double d7,double d8,double d9,double d10)640 void print_ten_doubles (
641 double d1,
642 double d2,
643 double d3,
644 double d4,
645 double d5,
646 double d6,
647 double d7,
648 double d8,
649 double d9,
650 double d10)
651 #else
652 void print_ten_doubles ( d1, d2, d3, d4, d5, d6, d7, d8, d9, d10 )
653 double d1;
654 double d2;
655 double d3;
656 double d4;
657 double d5;
658 double d6;
659 double d7;
660 double d8;
661 double d9;
662 double d10;
663 #endif
664 {
665
666 printf("Two Doubles : %f\t%f\n", d1, d2);
667 printf("Two Doubles : %f\t%f\n", d3, d4);
668 printf("Two Doubles : %f\t%f\n", d5, d6);
669 printf("Two Doubles : %f\t%f\n", d7, d8);
670 printf("Two Doubles : %f\t%f\n", d9, d10);
671 }
672
673 /*****************************************************************
674 * PRINT_BIT_FLAGS :
675 * IN struct bit_flags_t bit_flags
676 ****************************************************************/
677 #ifdef PROTOTYPES
print_bit_flags(struct bit_flags_t bit_flags)678 void print_bit_flags (struct bit_flags_t bit_flags)
679 #else
680 void print_bit_flags ( bit_flags )
681 struct bit_flags_t bit_flags;
682 #endif
683 {
684
685 if (bit_flags.alpha) printf("alpha\n");
686 if (bit_flags.beta) printf("beta\n");
687 if (bit_flags.gamma) printf("gamma\n");
688 if (bit_flags.delta) printf("delta\n");
689 if (bit_flags.epsilon) printf("epsilon\n");
690 if (bit_flags.omega) printf("omega\n");
691 }
692
693 /*****************************************************************
694 * PRINT_BIT_FLAGS_COMBO :
695 * IN struct bit_flags_combo_t bit_flags_combo
696 ****************************************************************/
697 #ifdef PROTOTYPES
print_bit_flags_combo(struct bit_flags_combo_t bit_flags_combo)698 void print_bit_flags_combo (struct bit_flags_combo_t bit_flags_combo)
699 #else
700 void print_bit_flags_combo ( bit_flags_combo )
701 struct bit_flags_combo_t bit_flags_combo;
702 #endif
703 {
704
705 if (bit_flags_combo.alpha) printf("alpha\n");
706 if (bit_flags_combo.beta) printf("beta\n");
707 if (bit_flags_combo.gamma) printf("gamma\n");
708 if (bit_flags_combo.delta) printf("delta\n");
709 if (bit_flags_combo.epsilon) printf("epsilon\n");
710 if (bit_flags_combo.omega) printf("omega\n");
711 printf("ch1: %c\tch2: %c\n", bit_flags_combo.ch1, bit_flags_combo.ch2);
712 }
713
714 /*****************************************************************
715 * PRINT_ONE_DOUBLE :
716 * IN struct one_double_t one_double
717 ****************************************************************/
718 #ifdef PROTOTYPES
print_one_double(struct one_double_t one_double)719 void print_one_double (struct one_double_t one_double)
720 #else
721 void print_one_double ( one_double )
722 struct one_double_t one_double;
723 #endif
724 {
725
726 printf("Contents of one_double_t: \n\n");
727 printf("%f\n", one_double.double1);
728 }
729
730 /*****************************************************************
731 * PRINT_TWO_FLOATS :
732 * IN struct two_floats_t two_floats
733 ****************************************************************/
734 #ifdef PROTOTYPES
print_two_floats(struct two_floats_t two_floats)735 void print_two_floats (struct two_floats_t two_floats)
736 #else
737 void print_two_floats ( two_floats )
738 struct two_floats_t two_floats;
739 #endif
740 {
741
742 printf("Contents of two_floats_t: \n\n");
743 printf("%f\t%f\n", two_floats.float1, two_floats.float2);
744 }
745
746 /*****************************************************************
747 * PRINT_TWO_CHARS :
748 * IN struct two_char_t two_char
749 ****************************************************************/
750 #ifdef PROTOTYPES
print_two_chars(struct two_char_t two_char)751 void print_two_chars (struct two_char_t two_char)
752 #else
753 void print_two_chars ( two_char )
754 struct two_char_t two_char;
755 #endif
756 {
757
758 printf("Contents of two_char_t: \n\n");
759 printf("%c\t%c\n", two_char.ch1, two_char.ch2);
760 }
761
762 /*****************************************************************
763 * PRINT_THREE_CHARS :
764 * IN struct three_char_t three_char
765 ****************************************************************/
766 #ifdef PROTOTYPES
print_three_chars(struct three_char_t three_char)767 void print_three_chars (struct three_char_t three_char)
768 #else
769 void print_three_chars ( three_char )
770 struct three_char_t three_char;
771 #endif
772 {
773
774 printf("Contents of three_char_t: \n\n");
775 printf("%c\t%c\t%c\n", three_char.ch1, three_char.ch2, three_char.ch3);
776 }
777
778 /*****************************************************************
779 * PRINT_FIVE_CHARS :
780 * IN struct five_char_t five_char
781 ****************************************************************/
782 #ifdef PROTOTYPES
print_five_chars(struct five_char_t five_char)783 void print_five_chars (struct five_char_t five_char)
784 #else
785 void print_five_chars ( five_char )
786 struct five_char_t five_char;
787 #endif
788 {
789
790 printf("Contents of five_char_t: \n\n");
791 printf("%c\t%c\t%c\t%c\t%c\n", five_char.ch1, five_char.ch2,
792 five_char.ch3, five_char.ch4,
793 five_char.ch5);
794 }
795
796 /*****************************************************************
797 * PRINT_INT_CHAR_COMBO :
798 * IN struct int_char_combo_t int_char_combo
799 ****************************************************************/
800 #ifdef PROTOTYPES
print_int_char_combo(struct int_char_combo_t int_char_combo)801 void print_int_char_combo (struct int_char_combo_t int_char_combo)
802 #else
803 void print_int_char_combo ( int_char_combo )
804 struct int_char_combo_t int_char_combo;
805 #endif
806 {
807
808 printf("Contents of int_char_combo_t: \n\n");
809 printf("%d\t%c\n", int_char_combo.int1, int_char_combo.ch1);
810 }
811
812 /*****************************************************************
813 * PRINT_STRUCT_REP :
814 * The last parameter must go onto the stack rather than into a register.
815 * This is a good function to call to test small structures.
816 * IN struct small_rep_info_t struct1
817 * IN struct small_rep_info_t struct2
818 * IN struct small_rep_info_t struct3
819 ****************************************************************/
820 #ifdef PROTOTYPES
print_struct_rep(struct small_rep_info_t struct1,struct small_rep_info_t struct2,struct small_rep_info_t struct3)821 void print_struct_rep(
822 struct small_rep_info_t struct1,
823 struct small_rep_info_t struct2,
824 struct small_rep_info_t struct3)
825 #else
826 void print_struct_rep( struct1, struct2, struct3)
827 struct small_rep_info_t struct1;
828 struct small_rep_info_t struct2;
829 struct small_rep_info_t struct3;
830 #endif
831 {
832
833
834 printf("Contents of struct1: \n\n");
835 printf("%10d%10d\n", struct1.value, struct1.head);
836 printf("Contents of struct2: \n\n");
837 printf("%10d%10d\n", struct2.value, struct2.head);
838 printf("Contents of struct3: \n\n");
839 printf("%10d%10d\n", struct3.value, struct3.head);
840
841 }
842
843 /*****************************************************************
844 * SUM_STRUCT_PRINT :
845 * The last two parameters must go onto the stack rather than into a register.
846 * This is a good function to call to test small structures.
847 * IN struct small_rep_info_t struct1
848 * IN struct small_rep_info_t struct2
849 * IN struct small_rep_info_t struct3
850 * IN struct small_rep_info_t struct4
851 ****************************************************************/
852 #ifdef PROTOTYPES
sum_struct_print(int seed,struct small_rep_info_t struct1,struct small_rep_info_t struct2,struct small_rep_info_t struct3,struct small_rep_info_t struct4)853 void sum_struct_print (
854 int seed,
855 struct small_rep_info_t struct1,
856 struct small_rep_info_t struct2,
857 struct small_rep_info_t struct3,
858 struct small_rep_info_t struct4)
859 #else
860 void sum_struct_print ( seed, struct1, struct2, struct3, struct4)
861 int seed;
862 struct small_rep_info_t struct1;
863 struct small_rep_info_t struct2;
864 struct small_rep_info_t struct3;
865 struct small_rep_info_t struct4;
866 #endif
867 {
868 int sum;
869
870 printf("Sum of the 4 struct values and seed : \n\n");
871 sum = seed + struct1.value + struct2.value + struct3.value + struct4.value;
872 printf("%10d\n", sum);
873 }
874
875 /*****************************************************************
876 * PRINT_SMALL_STRUCTS :
877 * This is a good function to call to test small structures.
878 * All of the small structures of odd sizes (40 bits, 8bits, etc.)
879 * are pushed onto the stack.
880 ****************************************************************/
881 #ifdef PROTOTYPES
print_small_structs(struct small_rep_info_t struct1,struct small_rep_info_t struct2,struct small_rep_info_t struct3,struct small_rep_info_t struct4,struct bit_flags_t flags,struct bit_flags_combo_t flags_combo,struct three_char_t three_char,struct five_char_t five_char,struct int_char_combo_t int_char_combo,struct one_double_t d1,struct one_double_t d2,struct one_double_t d3,struct two_floats_t f1,struct two_floats_t f2,struct two_floats_t f3)882 void print_small_structs (
883 struct small_rep_info_t struct1,
884 struct small_rep_info_t struct2,
885 struct small_rep_info_t struct3,
886 struct small_rep_info_t struct4,
887 struct bit_flags_t flags,
888 struct bit_flags_combo_t flags_combo,
889 struct three_char_t three_char,
890 struct five_char_t five_char,
891 struct int_char_combo_t int_char_combo,
892 struct one_double_t d1,
893 struct one_double_t d2,
894 struct one_double_t d3,
895 struct two_floats_t f1,
896 struct two_floats_t f2,
897 struct two_floats_t f3)
898 #else
899 void print_small_structs ( struct1, struct2, struct3, struct4, flags,
900 flags_combo, three_char, five_char, int_char_combo, d1, d2,d3,f1,f2,f3)
901 struct small_rep_info_t struct1;
902 struct small_rep_info_t struct2;
903 struct small_rep_info_t struct3;
904 struct small_rep_info_t struct4;
905 struct bit_flags_t flags;
906 struct bit_flags_combo_t flags_combo;
907 struct three_char_t three_char;
908 struct five_char_t five_char;
909 struct int_char_combo_t int_char_combo;
910 struct one_double_t d1;
911 struct one_double_t d2;
912 struct one_double_t d3;
913 struct two_floats_t f1;
914 struct two_floats_t f2;
915 struct two_floats_t f3;
916 #endif
917 {
918 print_bit_flags(flags);
919 print_bit_flags_combo(flags_combo);
920 print_three_chars(three_char);
921 print_five_chars(five_char);
922 print_int_char_combo(int_char_combo);
923 sum_struct_print(10, struct1, struct2, struct3, struct4);
924 print_struct_rep(struct1, struct2, struct3);
925 print_one_double(d1);
926 print_one_double(d2);
927 print_one_double(d3);
928 print_two_floats(f1);
929 print_two_floats(f2);
930 print_two_floats(f3);
931 }
932
933 /*****************************************************************
934 * PRINT_LONG_ARG_LIST :
935 * This is a good function to call to test small structures.
936 * The first two parameters ( the doubles ) go into registers. The
937 * remaining arguments are pushed onto the stack. Depending on where
938 * print_long_arg_list is called from, the size of the argument list
939 * may force more space to be pushed onto the stack as part of the callers
940 * frame.
941 ****************************************************************/
942 #ifdef PROTOTYPES
print_long_arg_list(double a,double b,int c,int d,int e,int f,struct small_rep_info_t struct1,struct small_rep_info_t struct2,struct small_rep_info_t struct3,struct small_rep_info_t struct4,struct bit_flags_t flags,struct bit_flags_combo_t flags_combo,struct three_char_t three_char,struct five_char_t five_char,struct int_char_combo_t int_char_combo,struct one_double_t d1,struct one_double_t d2,struct one_double_t d3,struct two_floats_t f1,struct two_floats_t f2,struct two_floats_t f3)943 void print_long_arg_list (
944 double a,
945 double b,
946 int c,
947 int d,
948 int e,
949 int f,
950 struct small_rep_info_t struct1,
951 struct small_rep_info_t struct2,
952 struct small_rep_info_t struct3,
953 struct small_rep_info_t struct4,
954 struct bit_flags_t flags,
955 struct bit_flags_combo_t flags_combo,
956 struct three_char_t three_char,
957 struct five_char_t five_char,
958 struct int_char_combo_t int_char_combo,
959 struct one_double_t d1,
960 struct one_double_t d2,
961 struct one_double_t d3,
962 struct two_floats_t f1,
963 struct two_floats_t f2,
964 struct two_floats_t f3)
965 #else
966 void print_long_arg_list ( a, b, c, d, e, f, struct1, struct2, struct3,
967 struct4, flags, flags_combo, three_char, five_char, int_char_combo, d1,d2,d3,
968 f1, f2, f3 )
969 double a;
970 double b;
971 int c;
972 int d;
973 int e;
974 int f;
975 struct small_rep_info_t struct1;
976 struct small_rep_info_t struct2;
977 struct small_rep_info_t struct3;
978 struct small_rep_info_t struct4;
979 struct bit_flags_t flags;
980 struct bit_flags_combo_t flags_combo;
981 struct three_char_t three_char;
982 struct five_char_t five_char;
983 struct int_char_combo_t int_char_combo;
984 struct one_double_t d1;
985 struct one_double_t d2;
986 struct one_double_t d3;
987 struct two_floats_t f1;
988 struct two_floats_t f2;
989 struct two_floats_t f3;
990 #endif
991 {
992 printf("double : %f\n", a);
993 printf("double : %f\n", b);
994 printf("int : %d\n", c);
995 printf("int : %d\n", d);
996 printf("int : %d\n", e);
997 printf("int : %d\n", f);
998 print_small_structs( struct1, struct2, struct3, struct4, flags, flags_combo,
999 three_char, five_char, int_char_combo, d1, d2, d3,
1000 f1, f2, f3);
1001 }
1002
1003
1004 #ifdef PROTOTYPES
print_one_large_struct(struct array_rep_info_t linked_list1)1005 void print_one_large_struct (struct array_rep_info_t linked_list1)
1006 #else
1007 void print_one_large_struct( linked_list1 )
1008 struct array_rep_info_t linked_list1;
1009 #endif
1010 {
1011
1012 /* printf("Contents of linked list1: \n\n");
1013 printf("Element Value | Index of Next Element\n");
1014 printf("-------------------------------------\n");
1015 printf(" | \n");*/
1016 /*for (index = 0; index < 10; index++) {*/
1017
1018 printf("%10d%10d\n", linked_list1.values[0],
1019 linked_list1.next_index[0]);
1020 /*}*/
1021 }
1022
1023 /*****************************************************************
1024 * PRINT_ARRAY_REP :
1025 * The three structure parameters should fit into registers.
1026 * IN struct array_rep_info_t linked_list1
1027 * IN struct array_rep_info_t linked_list2
1028 * IN struct array_rep_info_t linked_list3
1029 ****************************************************************/
1030 #ifdef PROTOTYPES
print_array_rep(struct array_rep_info_t linked_list1,struct array_rep_info_t linked_list2,struct array_rep_info_t linked_list3)1031 void print_array_rep(
1032 struct array_rep_info_t linked_list1,
1033 struct array_rep_info_t linked_list2,
1034 struct array_rep_info_t linked_list3)
1035 #else
1036 void print_array_rep( linked_list1, linked_list2, linked_list3 )
1037 struct array_rep_info_t linked_list1;
1038 struct array_rep_info_t linked_list2;
1039 struct array_rep_info_t linked_list3;
1040 #endif
1041 {
1042
1043 int index;
1044
1045 printf("Contents of linked list1: \n\n");
1046 printf("Element Value | Index of Next Element\n");
1047 printf("-------------------------------------\n");
1048 printf(" | \n");
1049 for (index = 0; index < 10; index++) {
1050
1051 printf("%10d%10d\n", linked_list1.values[index],
1052 linked_list1.next_index[index]);
1053 }
1054
1055 printf("Contents of linked list2: \n\n");
1056 printf("Element Value | Index of Next Element\n");
1057 printf("-------------------------------------\n");
1058 printf(" | \n");
1059 for (index = 0; index < 10; index++) {
1060
1061 printf("%10d%10d\n", linked_list2.values[index],
1062 linked_list2.next_index[index]);
1063 }
1064
1065 printf("Contents of linked list3: \n\n");
1066 printf("Element Value | Index of Next Element\n");
1067 printf("-------------------------------------\n");
1068 printf(" | \n");
1069 for (index = 0; index < 10; index++) {
1070
1071 printf("%10d%10d\n", linked_list3.values[index],
1072 linked_list3.next_index[index]);
1073 }
1074
1075 }
1076
1077 /*****************************************************************
1078 * SUM_ARRAY_PRINT :
1079 * The last structure parameter must be pushed onto the stack
1080 * IN int seed
1081 * IN struct array_rep_info_t linked_list1
1082 * IN struct array_rep_info_t linked_list2
1083 * IN struct array_rep_info_t linked_list3
1084 * IN struct array_rep_info_t linked_list4
1085 ****************************************************************/
1086 #ifdef PROTOTYPES
sum_array_print(int seed,struct array_rep_info_t linked_list1,struct array_rep_info_t linked_list2,struct array_rep_info_t linked_list3,struct array_rep_info_t linked_list4)1087 void sum_array_print (
1088 int seed,
1089 struct array_rep_info_t linked_list1,
1090 struct array_rep_info_t linked_list2,
1091 struct array_rep_info_t linked_list3,
1092 struct array_rep_info_t linked_list4)
1093 #else
1094 void sum_array_print ( seed, linked_list1, linked_list2, linked_list3,linked_list4)
1095 int seed;
1096 struct array_rep_info_t linked_list1;
1097 struct array_rep_info_t linked_list2;
1098 struct array_rep_info_t linked_list3;
1099 struct array_rep_info_t linked_list4;
1100 #endif
1101 {
1102 int index;
1103 int sum;
1104
1105 printf("Sum of 4 arrays, by element (add in seed as well): \n\n");
1106 printf("Seed: %d\n", seed);
1107 printf("Element Index | Sum \n");
1108 printf("-------------------------\n");
1109 printf(" | \n");
1110
1111 for (index = 0; index < 10; index++) {
1112
1113 sum = seed + linked_list1.values[index] + linked_list2.values[index] +
1114 linked_list3.values[index] + linked_list4.values[index];
1115 printf("%10d%10d\n", index, sum);
1116 }
1117 }
1118
1119 /*****************************************************************
1120 * INIT_ARRAY_REP :
1121 * IN struct array_rep_info_t *linked_list
1122 * IN int seed
1123 ****************************************************************/
1124 #ifdef PROTOTYPES
init_array_rep(struct array_rep_info_t * linked_list,int seed)1125 void init_array_rep(
1126 struct array_rep_info_t *linked_list,
1127 int seed)
1128 #else
1129 void init_array_rep( linked_list, seed )
1130 struct array_rep_info_t *linked_list;
1131 int seed;
1132 #endif
1133 {
1134
1135 int index;
1136
1137 for (index = 0; index < 10; index++) {
1138
1139 linked_list->values[index] = (2*index) + (seed*2);
1140 linked_list->next_index[index] = index + 1;
1141 }
1142 linked_list->head = 0;
1143 }
1144
1145
main()1146 int main () {
1147
1148 /* variables for array and enumerated type testing
1149 */
1150 static char char_array[121];
1151 static double double_array[9];
1152 static float float_array[15];
1153 static int integer_array[50];
1154 static int index;
1155 static id_int student_id = 23;
1156 static colors my_shirt = YELLOW;
1157
1158 /* variables for large structure testing
1159 */
1160 static int number = 10;
1161 static struct array_rep_info_t *list1;
1162 static struct array_rep_info_t *list2;
1163 static struct array_rep_info_t *list3;
1164 static struct array_rep_info_t *list4;
1165
1166 /* variables for testing a very long argument list
1167 */
1168 static double a;
1169 static double b;
1170 static int c;
1171 static int d;
1172 static int e;
1173 static int f;
1174
1175 /* variables for testing a small structures and a very long argument list
1176 */
1177 static struct small_rep_info_t *struct1;
1178 static struct small_rep_info_t *struct2;
1179 static struct small_rep_info_t *struct3;
1180 static struct small_rep_info_t *struct4;
1181 static struct bit_flags_t *flags;
1182 static struct bit_flags_combo_t *flags_combo;
1183 static struct three_char_t *three_char;
1184 static struct five_char_t *five_char;
1185 static struct int_char_combo_t *int_char_combo;
1186 static struct one_double_t *d1;
1187 static struct one_double_t *d2;
1188 static struct one_double_t *d3;
1189 static struct two_floats_t *f1;
1190 static struct two_floats_t *f2;
1191 static struct two_floats_t *f3;
1192
1193 /* Initialize arrays
1194 */
1195 for (index = 0; index < 120; index++) {
1196 if ((index%2) == 0) char_array[index] = 'Z';
1197 else char_array[index] = 'a';
1198 }
1199 char_array[120] = '\0';
1200
1201 for (index = 0; index < 9; index++) {
1202 double_array[index] = index*23.4567;
1203 }
1204
1205 for (index = 0; index < 15; index++) {
1206 float_array[index] = index/7.02;
1207 }
1208
1209 for (index = 0; index < 50; index++) {
1210 integer_array[index] = -index;
1211 }
1212
1213 /* Print arrays
1214 */
1215 print_char_array(char_array);
1216 print_double_array(double_array);
1217 print_float_array(float_array);
1218 print_student_id_shirt_color(student_id, my_shirt);
1219 print_int_array(integer_array);
1220 print_all_arrays(integer_array, char_array, float_array, double_array);
1221
1222 /* Allocate space for large structures
1223 */
1224 list1 = (struct array_rep_info_t *)malloc(sizeof(struct array_rep_info_t));
1225 list2 = (struct array_rep_info_t *)malloc(sizeof(struct array_rep_info_t));
1226 list3 = (struct array_rep_info_t *)malloc(sizeof(struct array_rep_info_t));
1227 list4 = (struct array_rep_info_t *)malloc(sizeof(struct array_rep_info_t));
1228
1229 /* Initialize large structures
1230 */
1231 init_array_rep(list1, 2);
1232 init_array_rep(list2, 4);
1233 init_array_rep(list3, 5);
1234 init_array_rep(list4, 10);
1235 printf("HELLO WORLD\n");
1236 printf("BYE BYE FOR NOW\n");
1237 printf("VERY GREEN GRASS\n");
1238
1239 /* Print large structures
1240 */
1241 sum_array_print(10, *list1, *list2, *list3, *list4);
1242 print_array_rep(*list1, *list2, *list3);
1243 print_one_large_struct(*list1);
1244
1245 /* Allocate space for small structures
1246 */
1247 struct1 = (struct small_rep_info_t *)malloc(sizeof(struct small_rep_info_t));
1248 struct2 = (struct small_rep_info_t *)malloc(sizeof(struct small_rep_info_t));
1249 struct3 = (struct small_rep_info_t *)malloc(sizeof(struct small_rep_info_t));
1250 struct4 = (struct small_rep_info_t *)malloc(sizeof(struct small_rep_info_t));
1251 flags = (struct bit_flags_t *)malloc(sizeof(struct bit_flags_t));
1252 flags_combo = (struct bit_flags_combo_t *)malloc(sizeof(struct bit_flags_combo_t));
1253 three_char = (struct three_char_t *)malloc(sizeof(struct three_char_t));
1254 five_char = (struct five_char_t *)malloc(sizeof(struct five_char_t));
1255 int_char_combo = (struct int_char_combo_t *)malloc(sizeof(struct int_char_combo_t));
1256
1257 d1 = (struct one_double_t *)malloc(sizeof(struct one_double_t));
1258 d2 = (struct one_double_t *)malloc(sizeof(struct one_double_t));
1259 d3 = (struct one_double_t *)malloc(sizeof(struct one_double_t));
1260
1261 f1 = (struct two_floats_t *)malloc(sizeof(struct two_floats_t));
1262 f2 = (struct two_floats_t *)malloc(sizeof(struct two_floats_t));
1263 f3 = (struct two_floats_t *)malloc(sizeof(struct two_floats_t));
1264
1265 /* Initialize small structures
1266 */
1267 init_small_structs ( struct1, struct2, struct3, struct4, flags,
1268 flags_combo, three_char, five_char, int_char_combo,
1269 d1, d2, d3, f1, f2, f3);
1270
1271 /* Print small structures
1272 */
1273 print_small_structs ( *struct1, *struct2, *struct3, *struct4, *flags,
1274 *flags_combo, *three_char, *five_char, *int_char_combo,
1275 *d1, *d2, *d3, *f1, *f2, *f3);
1276
1277 /* Print a very long arg list
1278 */
1279 a = 22.25;
1280 b = 33.375;
1281 c = 0;
1282 d = -25;
1283 e = 100;
1284 f = 2345;
1285
1286 print_long_arg_list ( a, b, c, d, e, f, *struct1, *struct2, *struct3, *struct4,
1287 *flags, *flags_combo, *three_char, *five_char, *int_char_combo,
1288 *d1, *d2, *d3, *f1, *f2, *f3);
1289
1290 /* Initialize small structures
1291 */
1292 init_one_double ( d1, 1.11111);
1293 init_one_double ( d2, -345.34);
1294 init_one_double ( d3, 546464.2);
1295 init_two_floats ( f1, 0.234, 453.1);
1296 init_two_floats ( f2, 78.345, 23.09);
1297 init_two_floats ( f3, -2.345, 1.0);
1298 init_bit_flags(flags, (unsigned)1, (unsigned)0, (unsigned)1,
1299 (unsigned)0, (unsigned)1, (unsigned)0 );
1300 init_bit_flags_combo(flags_combo, (unsigned)1, (unsigned)0, 'y',
1301 (unsigned)1, (unsigned)0, 'n',
1302 (unsigned)1, (unsigned)0 );
1303 init_three_chars(three_char, 'x', 'y', 'z');
1304 init_five_chars(five_char, 'h', 'e', 'l', 'l', 'o');
1305 init_int_char_combo(int_char_combo, 13, '!');
1306 init_struct_rep(struct1, 10);
1307 init_struct_rep(struct2, 20);
1308 init_struct_rep(struct3, 30);
1309 init_struct_rep(struct4, 40);
1310
1311 compute_with_small_structs(35);
1312 loop_count();
1313 printf("HELLO WORLD\n");
1314 printf("BYE BYE FOR NOW\n");
1315 printf("VERY GREEN GRASS\n");
1316
1317 /* Print small structures
1318 */
1319 print_one_double(*d1);
1320 print_one_double(*d2);
1321 print_one_double(*d3);
1322 print_two_floats(*f1);
1323 print_two_floats(*f2);
1324 print_two_floats(*f3);
1325 print_bit_flags(*flags);
1326 print_bit_flags_combo(*flags_combo);
1327 print_three_chars(*three_char);
1328 print_five_chars(*five_char);
1329 print_int_char_combo(*int_char_combo);
1330 sum_struct_print(10, *struct1, *struct2, *struct3, *struct4);
1331 print_struct_rep(*struct1, *struct2, *struct3);
1332
1333 return 0;
1334 }
1335
1336
1337
1338
1339
1340