C-Structure Interface MetalBase 5.0 ------------------------------------------------------------------------------- MetalBase 4.0 and up read and write database information directly from C structures, using the following assumptions: sizeof(long) = sizeof(ulong) = 4 bytes sizeof(short) = sizeof(ushort) = 2 bytes sizeof(float) = 4 bytes sizeof(double) = 8 bytes If any of the above are not valid for your system, MetalBase 5.0 will not work properly; however, this is the defacto standard, and should produce little difficulty in porting. So far, I have yet to receive even one complaint that this assumption has limited a user's use of this package (one Mac user had to change the defaults for his compiler from a 12-byte double to an 8-byte, but it worked fine after that). The main problem between machines is therefore not type sizes, but byte- aligning in C structures. At first, one would expect that the following: struct { char A[3]; long B; char C[5]; char D[5]; double E; char F[2]; } would appear like this in memory: AAABBBBCCCCCDDDDDEEEEEEEEFF Unfortunately, this is not the case for most systems. On this machine (Sun4 SunOs/cc), structures are aligned comme ca: AAAxBBBBCCCCCDDDDDxxxxxxEEEEEEEEFFxxxxxx While Xenix 2.3.2 would align them as: AAAxBBBBCCCCCDDDDDxxEEEEEEEEFF Why? Because, for the Sun, each field is aligned on 4- or 8- byte boundaries, depending on size; shorts, longs and floats to 4-byte boundaries, and doubles to 8-byte ones. Essentially, the algorithm is: start_pos = &base_of_structure; for (each field) { if (type != char) if (sizeof (type) < 8) align_to_4_byte_boundary (start_pos); else align_to_8_byte_boundary (start_pos); add_field } align_to_8_byte_boundary The last alignment is to obtain the structure size. All this crap was discovered through trial and error (yick!) If anyone encounters a structure which does not seem to meet the standards shown by struct.c, please contact me (virtual!richid@owlnet.rice.edu) and describe the structure and your machine type. If you decide to make any necessary modifications yourself, you'll find the above algorithm (in essentially that form) in the routine _fill_info() [mbase.c]--but let me know if you get it working, so I can add machine-dependency to the code with #defines. Currently, there are 4 different version supported, as shown by "make struct". In general, these conform to Sun, Coherent/Zortec, Xenix, and Mac/Microsoft C respectively (definitely not an exhaustive list of compatibility there).