| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include "../lib/unbuffer_output.c" |
| |
| /************************************************************************** |
| * TESTS : |
| * -- function arguments that are enumerated types |
| * -- small structure arguments ( <= 64 bits ) |
| * -- stored in registers |
| * -- stored on the stack |
| * -- large structure arguments ( > 64 bits ) |
| * -- stored in registers |
| * -- stored on the stack |
| * -- array arguments |
| * -- caller is a leaf routine : |
| * -- use the call command from within an init routine (i.e. |
| * init_bit_flags, init_bit_flags_combo, init_array_rep) |
| * -- caller doesn't have enough space for all the function arguments : |
| * -- call print_long_arg_list from inside print_small_structs |
| ***************************************************************************/ |
| |
| /* Some enumerated types -- used to test that the structureal data type is |
| * retrieved for function arguments with typedef data types. |
| */ |
| typedef int id_int; |
| |
| typedef enum { |
| BLACK, |
| BLUE, |
| BROWN, |
| ECRUE, |
| GOLD, |
| GRAY, |
| GREEN, |
| IVORY, |
| MAUVE, |
| ORANGE, |
| PINK, |
| PURPLE, |
| RED, |
| SILVER, |
| TAN, |
| VIOLET, |
| WHITE, |
| YELLOW} colors; |
| |
| /* A large structure (> 64 bits) used to test passing large structures as |
| * parameters |
| */ |
| |
| struct array_rep_info_t { |
| int next_index[10]; |
| int values[10]; |
| int head; |
| }; |
| |
| /***************************************************************************** |
| * Small structures ( <= 64 bits). These are used to test passing small |
| * structures as parameters and test argument size promotion. |
| *****************************************************************************/ |
| |
| /* 64 bits |
| */ |
| struct small_rep_info_t { |
| int value; |
| int head; |
| }; |
| |
| /* 6 bits : really fits in 8 bits and is promoted to 32 bits |
| */ |
| struct bit_flags_t { |
| unsigned alpha :1; |
| unsigned beta :1; |
| unsigned gamma :1; |
| unsigned delta :1; |
| unsigned epsilon :1; |
| unsigned omega :1; |
| }; |
| |
| /* 22 bits : really fits in 40 bits and is promoted to 64 bits |
| */ |
| struct bit_flags_combo_t { |
| unsigned alpha :1; |
| unsigned beta :1; |
| char ch1; |
| unsigned gamma :1; |
| unsigned delta :1; |
| char ch2; |
| unsigned epsilon :1; |
| unsigned omega :1; |
| }; |
| |
| /* 64 bits |
| */ |
| struct one_double_t { |
| double double1; |
| }; |
| |
| /* 64 bits |
| */ |
| struct two_floats_t { |
| float float1; |
| float float2; |
| }; |
| |
| /* 16 bits : promoted to 32 bits |
| */ |
| struct two_char_t { |
| char ch1; |
| char ch2; |
| }; |
| |
| /* 24 bits : promoted to 32 bits |
| */ |
| struct three_char_t { |
| char ch1; |
| char ch2; |
| char ch3; |
| }; |
| |
| /* 40 bits : promoted to 64 bits |
| */ |
| struct five_char_t { |
| char ch1; |
| char ch2; |
| char ch3; |
| char ch4; |
| char ch5; |
| }; |
| |
| /* 40 bits : promoted to 64 bits |
| */ |
| struct int_char_combo_t { |
| int int1; |
| char ch1; |
| }; |
| |
| /***************************************************************** |
| * PRINT_STUDENT_ID_SHIRT_COLOR : |
| * IN id_int student -- enumerated type |
| * IN colors shirt -- enumerated type |
| *****************************************************************/ |
| void print_student_id_shirt_color (id_int student, colors shirt) |
| { |
| |
| printf("student id : %d\t", student); |
| printf("shirt color : "); |
| switch (shirt) { |
| case BLACK : printf("BLACK\n"); |
| break; |
| case BLUE : printf("BLUE\n"); |
| break; |
| case BROWN : printf("BROWN\n"); |
| break; |
| case ECRUE : printf("ECRUE\n"); |
| break; |
| case GOLD : printf("GOLD\n"); |
| break; |
| case GRAY : printf("GRAY\n"); |
| break; |
| case GREEN : printf("GREEN\n"); |
| break; |
| case IVORY : printf("IVORY\n"); |
| break; |
| case MAUVE : printf("MAUVE\n"); |
| break; |
| case ORANGE : printf("ORANGE\n"); |
| break; |
| case PINK : printf("PINK\n"); |
| break; |
| case PURPLE : printf("PURPLE\n"); |
| break; |
| case RED : printf("RED\n"); |
| break; |
| case SILVER : printf("SILVER\n"); |
| break; |
| case TAN : printf("TAN\n"); |
| break; |
| case VIOLET : printf("VIOLET\n"); |
| break; |
| case WHITE : printf("WHITE\n"); |
| break; |
| case YELLOW : printf("YELLOW\n"); |
| break; |
| } |
| } |
| |
| /***************************************************************** |
| * PRINT_CHAR_ARRAY : |
| * IN char array_c[] -- character array |
| *****************************************************************/ |
| void print_char_array (char array_c[]) |
| { |
| |
| int index; |
| |
| printf("array_c :\n"); |
| printf("=========\n\n"); |
| for (index = 0; index < 120; index++) { |
| printf("%1c", array_c[index]); |
| if ((index%50) == 0) printf("\n"); |
| } |
| printf("\n\n"); |
| } |
| |
| /***************************************************************** |
| * PRINT_DOUBLE_ARRAY : |
| * IN double array_d[] -- array of doubles |
| *****************************************************************/ |
| void print_double_array (double array_d[]) |
| { |
| |
| int index; |
| |
| printf("array_d :\n"); |
| printf("=========\n\n"); |
| for (index = 0; index < 9; index++) { |
| printf("%f ", array_d[index]); |
| if ((index%8) == 0) printf("\n"); |
| } |
| printf("\n\n"); |
| } |
| |
| /***************************************************************** |
| * PRINT_FLOAT_ARRAY: |
| * IN float array_f[] -- array of floats |
| *****************************************************************/ |
| void print_float_array (float array_f[]) |
| { |
| |
| int index; |
| |
| printf("array_f :\n"); |
| printf("=========\n\n"); |
| for (index = 0; index < 15; index++) { |
| printf("%f ", array_f[index]); |
| if ((index%8) == 0) printf("\n"); |
| |
| } |
| printf("\n\n"); |
| } |
| |
| /***************************************************************** |
| * PRINT_INT_ARRAY: |
| * IN int array_i[] -- array of integers |
| *****************************************************************/ |
| void print_int_array (int array_i[]) |
| { |
| |
| int index; |
| |
| printf("array_i :\n"); |
| printf("=========\n\n"); |
| for (index = 0; index < 50; index++) { |
| printf("%d ", array_i[index]); |
| if ((index%8) == 0) printf("\n"); |
| } |
| printf("\n\n"); |
| |
| } |
| |
| /***************************************************************** |
| * PRINT_ALL_ARRAYS: |
| * IN int array_i[] -- array of integers |
| * IN char array_c[] -- array of characters |
| * IN float array_f[] -- array of floats |
| * IN double array_d[] -- array of doubles |
| *****************************************************************/ |
| void print_all_arrays(int array_i[], char array_c[], float array_f[], double array_d[]) |
| { |
| print_int_array(array_i); /* -step1- */ |
| print_char_array(array_c); /* -next1- */ |
| print_float_array(array_f); |
| print_double_array(array_d); |
| } |
| |
| /***************************************************************** |
| * LOOP_COUNT : |
| * A do nothing function. Used to provide a point at which calls can be made. |
| *****************************************************************/ |
| void loop_count () { |
| |
| int index; |
| |
| for (index=0; index<4; index++); |
| } |
| |
| /***************************************************************** |
| * COMPUTE_WITH_SMALL_STRUCTS : |
| * A do nothing function. Used to provide a point at which calls can be made. |
| * IN int seed |
| *****************************************************************/ |
| void compute_with_small_structs (int seed) |
| { |
| |
| struct small_rep_info_t array[4]; |
| int index; |
| |
| for (index = 0; index < 4; index++) { |
| array[index].value = index*seed; |
| array[index].head = (index+1)*seed; |
| } |
| |
| for (index = 1; index < 4; index++) { |
| array[index].value = array[index].value + array[index-1].value; |
| array[index].head = array[index].head + array[index-1].head; |
| } |
| } |
| |
| /***************************************************************** |
| * INIT_BIT_FLAGS : |
| * Initializes a bit_flags_t structure. Can call this function see |
| * the call command behavior when integer arguments do not fit into |
| * registers and must be placed on the stack. |
| * OUT struct bit_flags_t *bit_flags -- structure to be filled |
| * IN unsigned a -- 0 or 1 |
| * IN unsigned b -- 0 or 1 |
| * IN unsigned g -- 0 or 1 |
| * IN unsigned d -- 0 or 1 |
| * IN unsigned e -- 0 or 1 |
| * IN unsigned o -- 0 or 1 |
| *****************************************************************/ |
| void init_bit_flags (struct bit_flags_t *bit_flags, unsigned a, unsigned b, unsigned g, unsigned d, unsigned e, unsigned o) |
| { |
| |
| bit_flags->alpha = a; |
| bit_flags->beta = b; |
| bit_flags->gamma = g; |
| bit_flags->delta = d; |
| bit_flags->epsilon = e; |
| bit_flags->omega = o; |
| } |
| |
| /***************************************************************** |
| * INIT_BIT_FLAGS_COMBO : |
| * Initializes a bit_flags_combo_t structure. Can call this function |
| * to see the call command behavior when integer and character arguments |
| * do not fit into registers and must be placed on the stack. |
| * OUT struct bit_flags_combo_t *bit_flags_combo -- structure to fill |
| * IN unsigned a -- 0 or 1 |
| * IN unsigned b -- 0 or 1 |
| * IN char ch1 |
| * IN unsigned g -- 0 or 1 |
| * IN unsigned d -- 0 or 1 |
| * IN char ch2 |
| * IN unsigned e -- 0 or 1 |
| * IN unsigned o -- 0 or 1 |
| *****************************************************************/ |
| 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) |
| { |
| |
| bit_flags_combo->alpha = a; /* -step3- */ |
| bit_flags_combo->beta = b; |
| bit_flags_combo->ch1 = ch1; |
| bit_flags_combo->gamma = g; |
| bit_flags_combo->delta = d; |
| bit_flags_combo->ch2 = ch2; |
| bit_flags_combo->epsilon = e; |
| bit_flags_combo->omega = o; |
| } |
| |
| |
| /***************************************************************** |
| * INIT_ONE_DOUBLE : |
| * OUT struct one_double_t *one_double -- structure to fill |
| * IN double init_val |
| *****************************************************************/ |
| void init_one_double (struct one_double_t *one_double, double init_val) |
| { |
| |
| one_double->double1 = init_val; |
| } |
| |
| /***************************************************************** |
| * INIT_TWO_FLOATS : |
| * OUT struct two_floats_t *two_floats -- structure to be filled |
| * IN float init_val1 |
| * IN float init_val2 |
| *****************************************************************/ |
| void init_two_floats (struct two_floats_t *two_floats, float init_val1, float init_val2) |
| { |
| two_floats->float1 = init_val1; |
| two_floats->float2 = init_val2; |
| } |
| |
| /***************************************************************** |
| * INIT_TWO_CHARS : |
| * OUT struct two_char_t *two_char -- structure to be filled |
| * IN char init_val1 |
| * IN char init_val2 |
| *****************************************************************/ |
| void init_two_chars (struct two_char_t *two_char, char init_val1, char init_val2) |
| { |
| |
| two_char->ch1 = init_val1; |
| two_char->ch2 = init_val2; |
| } |
| |
| /***************************************************************** |
| * INIT_THREE_CHARS : |
| * OUT struct three_char_t *three_char -- structure to be filled |
| * IN char init_val1 |
| * IN char init_val2 |
| * IN char init_val3 |
| *****************************************************************/ |
| void init_three_chars (struct three_char_t *three_char, char init_val1, char init_val2, char init_val3) |
| { |
| |
| three_char->ch1 = init_val1; |
| three_char->ch2 = init_val2; |
| three_char->ch3 = init_val3; |
| } |
| |
| /***************************************************************** |
| * INIT_FIVE_CHARS : |
| * OUT struct five_char_t *five_char -- structure to be filled |
| * IN char init_val1 |
| * IN char init_val2 |
| * IN char init_val3 |
| * IN char init_val4 |
| * IN char init_val5 |
| *****************************************************************/ |
| 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) |
| { |
| five_char->ch1 = init_val1; |
| five_char->ch2 = init_val2; |
| five_char->ch3 = init_val3; |
| five_char->ch4 = init_val4; |
| five_char->ch5 = init_val5; |
| } |
| |
| /***************************************************************** |
| * INIT_INT_CHAR_COMBO : |
| * OUT struct int_char_combo_t *combo -- structure to be filled |
| * IN int init_val1 |
| * IN char init_val2 |
| *****************************************************************/ |
| void init_int_char_combo (struct int_char_combo_t *combo, int init_val1, char init_val2) |
| { |
| |
| combo->int1 = init_val1; |
| combo->ch1 = init_val2; |
| } |
| |
| /***************************************************************** |
| * INIT_STRUCT_REP : |
| * OUT struct small_rep_into_t *small_struct -- structure to be filled |
| * IN int seed |
| *****************************************************************/ |
| void init_struct_rep(struct small_rep_info_t *small_struct, int seed) |
| { |
| |
| small_struct->value = 2 + (seed*2); |
| small_struct->head = 0; |
| } |
| |
| /***************************************************************** |
| * INIT_SMALL_STRUCTS : |
| * Takes all the small structures as input and calls the appropriate |
| * initialization routine for each structure |
| *****************************************************************/ |
| void 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) |
| { |
| |
| init_bit_flags(flags, (unsigned)1, (unsigned)0, (unsigned)1, |
| (unsigned)0, (unsigned)1, (unsigned)0 ); |
| init_bit_flags_combo(flags_combo, (unsigned)1, (unsigned)0, 'y', |
| (unsigned)1, (unsigned)0, 'n', |
| (unsigned)1, (unsigned)0 ); |
| init_three_chars(three_char, 'a', 'b', 'c'); |
| init_five_chars(five_char, 'l', 'm', 'n', 'o', 'p'); |
| init_int_char_combo(int_char_combo, 123, 'z'); |
| init_struct_rep(struct1, 2); |
| init_struct_rep(struct2, 4); |
| init_struct_rep(struct3, 5); |
| init_struct_rep(struct4, 6); |
| init_one_double ( d1, 10.5); |
| init_one_double ( d2, -3.375); |
| init_one_double ( d3, 675.09375); |
| init_two_floats ( f1, 45.234, 43.6); |
| init_two_floats ( f2, 78.01, 122.10); |
| init_two_floats ( f3, -1232.345, -199.21); |
| } |
| |
| /***************************************************************** |
| * PRINT_TEN_DOUBLES : |
| * ????????????????????????????? |
| ****************************************************************/ |
| void print_ten_doubles ( |
| double d1, |
| double d2, |
| double d3, |
| double d4, |
| double d5, |
| double d6, |
| double d7, |
| double d8, |
| double d9, |
| double d10) |
| { |
| |
| printf("Two Doubles : %f\t%f\n", d1, d2); |
| printf("Two Doubles : %f\t%f\n", d3, d4); |
| printf("Two Doubles : %f\t%f\n", d5, d6); |
| printf("Two Doubles : %f\t%f\n", d7, d8); |
| printf("Two Doubles : %f\t%f\n", d9, d10); |
| } |
| |
| /***************************************************************** |
| * PRINT_BIT_FLAGS : |
| * IN struct bit_flags_t bit_flags |
| ****************************************************************/ |
| void print_bit_flags (struct bit_flags_t bit_flags) |
| { |
| |
| if (bit_flags.alpha) printf("alpha\n"); |
| if (bit_flags.beta) printf("beta\n"); |
| if (bit_flags.gamma) printf("gamma\n"); |
| if (bit_flags.delta) printf("delta\n"); |
| if (bit_flags.epsilon) printf("epsilon\n"); |
| if (bit_flags.omega) printf("omega\n"); |
| } |
| |
| /***************************************************************** |
| * PRINT_BIT_FLAGS_COMBO : |
| * IN struct bit_flags_combo_t bit_flags_combo |
| ****************************************************************/ |
| void print_bit_flags_combo (struct bit_flags_combo_t bit_flags_combo) |
| { |
| |
| if (bit_flags_combo.alpha) printf("alpha\n"); |
| if (bit_flags_combo.beta) printf("beta\n"); |
| if (bit_flags_combo.gamma) printf("gamma\n"); |
| if (bit_flags_combo.delta) printf("delta\n"); |
| if (bit_flags_combo.epsilon) printf("epsilon\n"); |
| if (bit_flags_combo.omega) printf("omega\n"); |
| printf("ch1: %c\tch2: %c\n", bit_flags_combo.ch1, bit_flags_combo.ch2); |
| } |
| |
| /***************************************************************** |
| * PRINT_ONE_DOUBLE : |
| * IN struct one_double_t one_double |
| ****************************************************************/ |
| void print_one_double (struct one_double_t one_double) |
| { |
| |
| printf("Contents of one_double_t: \n\n"); |
| printf("%f\n", one_double.double1); |
| } |
| |
| /***************************************************************** |
| * PRINT_TWO_FLOATS : |
| * IN struct two_floats_t two_floats |
| ****************************************************************/ |
| void print_two_floats (struct two_floats_t two_floats) |
| { |
| |
| printf("Contents of two_floats_t: \n\n"); |
| printf("%f\t%f\n", two_floats.float1, two_floats.float2); |
| } |
| |
| /***************************************************************** |
| * PRINT_TWO_CHARS : |
| * IN struct two_char_t two_char |
| ****************************************************************/ |
| void print_two_chars (struct two_char_t two_char) |
| { |
| |
| printf("Contents of two_char_t: \n\n"); |
| printf("%c\t%c\n", two_char.ch1, two_char.ch2); |
| } |
| |
| /***************************************************************** |
| * PRINT_THREE_CHARS : |
| * IN struct three_char_t three_char |
| ****************************************************************/ |
| void print_three_chars (struct three_char_t three_char) |
| { |
| |
| printf("Contents of three_char_t: \n\n"); |
| printf("%c\t%c\t%c\n", three_char.ch1, three_char.ch2, three_char.ch3); |
| } |
| |
| /***************************************************************** |
| * PRINT_FIVE_CHARS : |
| * IN struct five_char_t five_char |
| ****************************************************************/ |
| void print_five_chars (struct five_char_t five_char) |
| { |
| |
| printf("Contents of five_char_t: \n\n"); |
| printf("%c\t%c\t%c\t%c\t%c\n", five_char.ch1, five_char.ch2, |
| five_char.ch3, five_char.ch4, |
| five_char.ch5); |
| } |
| |
| /***************************************************************** |
| * PRINT_INT_CHAR_COMBO : |
| * IN struct int_char_combo_t int_char_combo |
| ****************************************************************/ |
| void print_int_char_combo (struct int_char_combo_t int_char_combo) |
| { |
| |
| printf("Contents of int_char_combo_t: \n\n"); |
| printf("%d\t%c\n", int_char_combo.int1, int_char_combo.ch1); |
| } |
| |
| /***************************************************************** |
| * PRINT_STRUCT_REP : |
| * The last parameter must go onto the stack rather than into a register. |
| * This is a good function to call to test small structures. |
| * IN struct small_rep_info_t struct1 |
| * IN struct small_rep_info_t struct2 |
| * IN struct small_rep_info_t struct3 |
| ****************************************************************/ |
| void print_struct_rep( |
| struct small_rep_info_t struct1, |
| struct small_rep_info_t struct2, |
| struct small_rep_info_t struct3) |
| { |
| |
| |
| printf("Contents of struct1: \n\n"); |
| printf("%10d%10d\n", struct1.value, struct1.head); |
| printf("Contents of struct2: \n\n"); |
| printf("%10d%10d\n", struct2.value, struct2.head); |
| printf("Contents of struct3: \n\n"); |
| printf("%10d%10d\n", struct3.value, struct3.head); |
| |
| } |
| |
| /***************************************************************** |
| * SUM_STRUCT_PRINT : |
| * The last two parameters must go onto the stack rather than into a register. |
| * This is a good function to call to test small structures. |
| * IN struct small_rep_info_t struct1 |
| * IN struct small_rep_info_t struct2 |
| * IN struct small_rep_info_t struct3 |
| * IN struct small_rep_info_t struct4 |
| ****************************************************************/ |
| void 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) |
| { |
| int sum; |
| |
| printf("Sum of the 4 struct values and seed : \n\n"); |
| sum = seed + struct1.value + struct2.value + struct3.value + struct4.value; |
| printf("%10d\n", sum); |
| } |
| |
| /***************************************************************** |
| * PRINT_SMALL_STRUCTS : |
| * This is a good function to call to test small structures. |
| * All of the small structures of odd sizes (40 bits, 8bits, etc.) |
| * are pushed onto the stack. |
| ****************************************************************/ |
| void 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) |
| { |
| print_bit_flags(flags); |
| print_bit_flags_combo(flags_combo); |
| print_three_chars(three_char); |
| print_five_chars(five_char); |
| print_int_char_combo(int_char_combo); |
| sum_struct_print(10, struct1, struct2, struct3, struct4); |
| print_struct_rep(struct1, struct2, struct3); |
| print_one_double(d1); |
| print_one_double(d2); |
| print_one_double(d3); |
| print_two_floats(f1); |
| print_two_floats(f2); |
| print_two_floats(f3); |
| } |
| |
| /***************************************************************** |
| * PRINT_LONG_ARG_LIST : |
| * This is a good function to call to test small structures. |
| * The first two parameters ( the doubles ) go into registers. The |
| * remaining arguments are pushed onto the stack. Depending on where |
| * print_long_arg_list is called from, the size of the argument list |
| * may force more space to be pushed onto the stack as part of the callers |
| * frame. |
| ****************************************************************/ |
| void 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) |
| { |
| printf("double : %f\n", a); /* -step2- */ |
| printf("double : %f\n", b); |
| printf("int : %d\n", c); |
| printf("int : %d\n", d); |
| printf("int : %d\n", e); |
| printf("int : %d\n", f); |
| print_small_structs( struct1, struct2, struct3, struct4, flags, flags_combo, |
| three_char, five_char, int_char_combo, d1, d2, d3, |
| f1, f2, f3); |
| } |
| |
| |
| void print_one_large_struct (struct array_rep_info_t linked_list1) |
| { |
| |
| /* printf("Contents of linked list1: \n\n"); |
| printf("Element Value | Index of Next Element\n"); |
| printf("-------------------------------------\n"); |
| printf(" | \n");*/ |
| /*for (index = 0; index < 10; index++) {*/ |
| |
| printf("%10d%10d\n", linked_list1.values[0], |
| linked_list1.next_index[0]); |
| /*}*/ |
| } |
| |
| /***************************************************************** |
| * PRINT_ARRAY_REP : |
| * The three structure parameters should fit into registers. |
| * IN struct array_rep_info_t linked_list1 |
| * IN struct array_rep_info_t linked_list2 |
| * IN struct array_rep_info_t linked_list3 |
| ****************************************************************/ |
| void print_array_rep( |
| struct array_rep_info_t linked_list1, |
| struct array_rep_info_t linked_list2, |
| struct array_rep_info_t linked_list3) |
| { |
| |
| int index; |
| |
| printf("Contents of linked list1: \n\n"); |
| printf("Element Value | Index of Next Element\n"); |
| printf("-------------------------------------\n"); |
| printf(" | \n"); |
| for (index = 0; index < 10; index++) { |
| |
| printf("%10d%10d\n", linked_list1.values[index], |
| linked_list1.next_index[index]); |
| } |
| |
| printf("Contents of linked list2: \n\n"); |
| printf("Element Value | Index of Next Element\n"); |
| printf("-------------------------------------\n"); |
| printf(" | \n"); |
| for (index = 0; index < 10; index++) { |
| |
| printf("%10d%10d\n", linked_list2.values[index], |
| linked_list2.next_index[index]); |
| } |
| |
| printf("Contents of linked list3: \n\n"); |
| printf("Element Value | Index of Next Element\n"); |
| printf("-------------------------------------\n"); |
| printf(" | \n"); |
| for (index = 0; index < 10; index++) { |
| |
| printf("%10d%10d\n", linked_list3.values[index], |
| linked_list3.next_index[index]); |
| } |
| |
| } |
| |
| /***************************************************************** |
| * SUM_ARRAY_PRINT : |
| * The last structure parameter must be pushed onto the stack |
| * IN int seed |
| * IN struct array_rep_info_t linked_list1 |
| * IN struct array_rep_info_t linked_list2 |
| * IN struct array_rep_info_t linked_list3 |
| * IN struct array_rep_info_t linked_list4 |
| ****************************************************************/ |
| void 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) |
| { |
| int index; |
| int sum; |
| |
| printf("Sum of 4 arrays, by element (add in seed as well): \n\n"); |
| printf("Seed: %d\n", seed); |
| printf("Element Index | Sum \n"); |
| printf("-------------------------\n"); |
| printf(" | \n"); |
| |
| for (index = 0; index < 10; index++) { |
| |
| sum = seed + linked_list1.values[index] + linked_list2.values[index] + |
| linked_list3.values[index] + linked_list4.values[index]; |
| printf("%10d%10d\n", index, sum); |
| } |
| } |
| |
| /***************************************************************** |
| * INIT_ARRAY_REP : |
| * IN struct array_rep_info_t *linked_list |
| * IN int seed |
| ****************************************************************/ |
| void init_array_rep( |
| struct array_rep_info_t *linked_list, |
| int seed) |
| { |
| |
| int index; |
| |
| for (index = 0; index < 10; index++) { |
| |
| linked_list->values[index] = (2*index) + (seed*2); |
| linked_list->next_index[index] = index + 1; |
| } |
| linked_list->head = 0; |
| } |
| |
| |
| int main () { |
| |
| /* variables for array and enumerated type testing |
| */ |
| static char char_array[121]; |
| static double double_array[9]; |
| static float float_array[15]; |
| static int integer_array[50]; |
| static int index; |
| static id_int student_id = 23; |
| static colors my_shirt = YELLOW; |
| |
| /* variables for large structure testing |
| */ |
| static int number = 10; |
| static struct array_rep_info_t *list1; |
| static struct array_rep_info_t *list2; |
| static struct array_rep_info_t *list3; |
| static struct array_rep_info_t *list4; |
| |
| /* variables for testing a very long argument list |
| */ |
| static double a; |
| static double b; |
| static int c; |
| static int d; |
| static int e; |
| static int f; |
| |
| /* variables for testing a small structures and a very long argument list |
| */ |
| static struct small_rep_info_t *struct1; |
| static struct small_rep_info_t *struct2; |
| static struct small_rep_info_t *struct3; |
| static struct small_rep_info_t *struct4; |
| static struct bit_flags_t *flags; |
| static struct bit_flags_combo_t *flags_combo; |
| static struct three_char_t *three_char; |
| static struct five_char_t *five_char; |
| static struct int_char_combo_t *int_char_combo; |
| static struct one_double_t *d1; |
| static struct one_double_t *d2; |
| static struct one_double_t *d3; |
| static struct two_floats_t *f1; |
| static struct two_floats_t *f2; |
| static struct two_floats_t *f3; |
| |
| gdb_unbuffer_output (); |
| |
| /* Initialize arrays |
| */ |
| for (index = 0; index < 120; index++) { |
| if ((index%2) == 0) char_array[index] = 'Z'; |
| else char_array[index] = 'a'; |
| } |
| char_array[120] = '\0'; |
| |
| for (index = 0; index < 9; index++) { |
| double_array[index] = index*23.4567; |
| } |
| |
| for (index = 0; index < 15; index++) { |
| float_array[index] = index/7.02; |
| } |
| |
| for (index = 0; index < 50; index++) { /* -tbreak1- */ |
| integer_array[index] = -index; |
| } |
| |
| /* Print arrays |
| */ |
| print_char_array(char_array); |
| print_double_array(double_array); /* -tbreak2- */ |
| print_float_array(float_array); |
| print_student_id_shirt_color(student_id, my_shirt); |
| print_int_array(integer_array); |
| print_all_arrays(integer_array, char_array, float_array, double_array); /* -tbreak3- */ |
| |
| /* Allocate space for large structures |
| */ |
| list1 = (struct array_rep_info_t *)malloc(sizeof(struct array_rep_info_t)); |
| list2 = (struct array_rep_info_t *)malloc(sizeof(struct array_rep_info_t)); |
| list3 = (struct array_rep_info_t *)malloc(sizeof(struct array_rep_info_t)); |
| list4 = (struct array_rep_info_t *)malloc(sizeof(struct array_rep_info_t)); |
| |
| /* Initialize large structures |
| */ |
| init_array_rep(list1, 2); |
| init_array_rep(list2, 4); |
| init_array_rep(list3, 5); |
| init_array_rep(list4, 10); |
| printf("HELLO WORLD\n"); |
| printf("BYE BYE FOR NOW\n"); /* -tbreak4- */ |
| printf("VERY GREEN GRASS\n"); /* -next2- */ |
| |
| /* Print large structures |
| */ |
| sum_array_print(10, *list1, *list2, *list3, *list4); /* -tbreak5- */ |
| print_array_rep(*list1, *list2, *list3); |
| print_one_large_struct(*list1); |
| |
| /* Allocate space for small structures |
| */ |
| struct1 = (struct small_rep_info_t *)malloc(sizeof(struct small_rep_info_t)); |
| struct2 = (struct small_rep_info_t *)malloc(sizeof(struct small_rep_info_t)); |
| struct3 = (struct small_rep_info_t *)malloc(sizeof(struct small_rep_info_t)); |
| struct4 = (struct small_rep_info_t *)malloc(sizeof(struct small_rep_info_t)); |
| flags = (struct bit_flags_t *)malloc(sizeof(struct bit_flags_t)); |
| flags_combo = (struct bit_flags_combo_t *)malloc(sizeof(struct bit_flags_combo_t)); |
| three_char = (struct three_char_t *)malloc(sizeof(struct three_char_t)); |
| five_char = (struct five_char_t *)malloc(sizeof(struct five_char_t)); |
| int_char_combo = (struct int_char_combo_t *)malloc(sizeof(struct int_char_combo_t)); |
| |
| d1 = (struct one_double_t *)malloc(sizeof(struct one_double_t)); |
| d2 = (struct one_double_t *)malloc(sizeof(struct one_double_t)); |
| d3 = (struct one_double_t *)malloc(sizeof(struct one_double_t)); |
| |
| f1 = (struct two_floats_t *)malloc(sizeof(struct two_floats_t)); |
| f2 = (struct two_floats_t *)malloc(sizeof(struct two_floats_t)); |
| f3 = (struct two_floats_t *)malloc(sizeof(struct two_floats_t)); |
| |
| /* Initialize small structures |
| */ |
| init_small_structs ( struct1, struct2, struct3, struct4, flags, |
| flags_combo, three_char, five_char, int_char_combo, |
| d1, d2, d3, f1, f2, f3); |
| |
| /* Print small structures |
| */ |
| print_small_structs ( *struct1, *struct2, *struct3, *struct4, *flags, |
| *flags_combo, *three_char, *five_char, *int_char_combo, |
| *d1, *d2, *d3, *f1, *f2, *f3); |
| |
| /* Print a very long arg list |
| */ |
| a = 22.25; |
| b = 33.375; |
| c = 0; /* -tbreak6- */ |
| d = -25; |
| e = 100; |
| f = 2345; |
| |
| print_long_arg_list ( a, b, c, d, e, f, *struct1, *struct2, *struct3, *struct4, /* -tbreak7- */ |
| *flags, *flags_combo, *three_char, *five_char, *int_char_combo, |
| *d1, *d2, *d3, *f1, *f2, *f3); |
| |
| /* Initialize small structures |
| */ |
| init_one_double ( d1, 1.11111); |
| init_one_double ( d2, -345.34); |
| init_one_double ( d3, 546464.2); |
| init_two_floats ( f1, 0.234, 453.1); |
| init_two_floats ( f2, 78.345, 23.09); |
| init_two_floats ( f3, -2.345, 1.0); |
| init_bit_flags(flags, (unsigned)1, (unsigned)0, (unsigned)1, |
| (unsigned)0, (unsigned)1, (unsigned)0 ); |
| init_bit_flags_combo(flags_combo, (unsigned)1, (unsigned)0, 'y', /* -tbreak8- */ |
| (unsigned)1, (unsigned)0, 'n', |
| (unsigned)1, (unsigned)0 ); |
| init_three_chars(three_char, 'x', 'y', 'z'); |
| init_five_chars(five_char, 'h', 'e', 'l', 'l', 'o'); |
| init_int_char_combo(int_char_combo, 13, '!'); /* -tbreak9- */ |
| init_struct_rep(struct1, 10); |
| init_struct_rep(struct2, 20); |
| init_struct_rep(struct3, 30); |
| init_struct_rep(struct4, 40); |
| |
| compute_with_small_structs(35); /* -tbreak10- */ |
| loop_count(); |
| printf("HELLO WORLD\n"); |
| printf("BYE BYE FOR NOW\n"); |
| printf("VERY GREEN GRASS\n"); |
| |
| /* Print small structures |
| */ |
| print_one_double(*d1); |
| print_one_double(*d2); |
| print_one_double(*d3); |
| print_two_floats(*f1); |
| print_two_floats(*f2); |
| print_two_floats(*f3); |
| print_bit_flags(*flags); |
| print_bit_flags_combo(*flags_combo); |
| print_three_chars(*three_char); |
| print_five_chars(*five_char); |
| print_int_char_combo(*int_char_combo); |
| sum_struct_print(10, *struct1, *struct2, *struct3, *struct4); |
| print_struct_rep(*struct1, *struct2, *struct3); |
| |
| return 0; |
| } |
| |
| |
| |
| |
| |