|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: B T
Length: 24965 (0x6185) Types: TextFile Names: »Bintopsb.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/gnu-31mar87/scheme/microcode/Bintopsb.c«
/* Emacs, -*-C-*-an't you guess? */ /**************************************************************** * * * Copyright (c) 1986 * * Massachusetts Institute of Technology * * * * This material was developed by the Scheme project at the * * Massachusetts Institute of Technology, Department of * * Electrical Engineering and Computer Science. Permission to * * copy this software, to redistribute it, and to use it for any * * purpose is granted, subject to the following restrictions and * * understandings. * * * * 1. Any copy made of this software must include this copyright * * notice in full. * * * * 2. Users of this software agree to make their best efforts (a)* * to return to the MIT Scheme project any improvements or * * extensions that they make, so that these may be included in * * future releases; and (b) to inform MIT of noteworthy uses of * * this software. * * * * 3. All materials developed as a consequence of the use of * * this software shall duly acknowledge such use, in accordance * * with the usual standards of acknowledging credit in academic * * research. * * * * 4. MIT has made no warrantee or representation that the * * operation of this software will be error-free, and MIT is * * under no obligation to provide any services, by way of * * maintenance, update, or otherwise. * * * * 5. In conjunction with products arising from the use of this * * material, there shall be no use of the name of the * * Massachusetts Institute of Technology nor of any adaptation * * thereof in any advertising, promotional, or sales literature * * without prior written consent from MIT in each case. * * * ****************************************************************/ /* File: TO_PORTABLE.C * * This File contains the code to translate internal format binary * files to portable format. * */ \f /* Cheap renames */ #define Internal_File Input_File #define Portable_File Output_File #include "translate.h" static Boolean Shuffle_Bytes = false; static Boolean Padded_Strings = true; static Boolean Dense_Types = true; static Pointer *Mem_Base; static long Heap_Relocation, Constant_Relocation; static long Free, Scan, Free_Constant, Scan_Constant; static long Objects, Constant_Objects; static long NFlonums, NIntegers, NStrings; static long NBits, NChars; static Pointer *Free_Objects, *Free_Cobjects; Load_Data(Count, To_Where) long Count; char *To_Where; { fread(To_Where, sizeof(Pointer), Count, Internal_File); } #define Reloc_or_Load_Debug false #include "load.c" \f /* Utility macros and procedures Pointer Objects handled specially in the portable format. */ #ifndef isalpha /* Just in case the stdio library atypically contains the character macros, just like the C book claims. */ #include <ctype.h> #endif #ifndef ispunct /* This is in some libraries but not others */ static char punctuation[] = "'\",<.>/?;:{}[]|`~=+-_()*&^%$#@!"; Boolean ispunct(c) fast char c; { fast char *s = &punctuation[0]; while (*s != '\0') if (*s++ == c) return true; return false; } #endif #define OUT(s) \ fprintf(Portable_File, s); \ break print_a_char(c, name) fast char c; char *name; { switch(c) { case '\n': OUT("\\n"); case '\t': OUT("\\t"); case '\b': OUT("\\b"); case '\r': OUT("\\r"); case '\f': OUT("\\f"); case '\\': OUT("\\\\"); case '\0': OUT("\\0"); case ' ' : OUT(" "); default: if ((isalpha(c)) || (isdigit(c)) || (ispunct(c))) putc(c, Portable_File); else { fprintf(stderr, "%s: %s: File may not be portable: c = 0x%x\n", Program_Name, name, ((int) c)); /* This does not follow C conventions, but eliminates ambiguity */ fprintf(Portable_File, "\X%x ", ((int) c)); } } } \f #define Do_String(Code, Rel, Fre, Scn, Obj, FObj) \ { Old_Address += (Rel); \ Old_Contents = *Old_Address; \ if (Type_Code(Old_Contents) == TC_BROKEN_HEART) \ Mem_Base[(Scn)] = \ Make_New_Pointer((Code), Old_Contents); \ else \ { fast long i; \ Mem_Base[(Scn)] = Make_Non_Pointer((Code), (Obj)); \ *Old_Address++ = Make_Non_Pointer(TC_BROKEN_HEART, (Obj)); \ (Obj) += 1; \ *(FObj)++ = STRING_0; \ *(FObj)++ = Old_Contents; \ i = Get_Integer(Old_Contents); \ NStrings += 1; \ NChars += (Padded_Strings ? \ pointer_to_char(i-1) : \ (1 + pointer_to_char(i-1))); \ while(--i >= 0) *(FObj)++ = *Old_Address++; \ } \ if (Dangerous(This)) Set_Danger_Bit(Mem_Base[(Scn)]); \ } print_a_string(from) Pointer *from; { fast long len; fast char *string; long maxlen = pointer_to_char((Get_Integer(*from++))-1); if (!Padded_Strings) maxlen += 1; len = Get_Integer(*from++); fprintf(Portable_File, "%02x %ld %ld ", TC_CHARACTER_STRING, (Compact_P ? len : maxlen), len); string = ((char *) from); if (Shuffle_Bytes) { while(len > 0) { print_a_char(string[3], "print_a_string"); if (len > 1) print_a_char(string[2], "print_a_string"); if (len > 2) print_a_char(string[1], "print_a_string"); if (len > 3) print_a_char(string[0], "print_a_string"); len -= 4; string += 4; } } else while(--len >= 0) print_a_char(*string++, "print_a_string"); putc('\n', Portable_File); return; } \f print_a_fixnum(val) long val; { fast long size_in_bits; fast unsigned long temp = ((val < 0) ? -val : val); for (size_in_bits = 0; temp != 0; size_in_bits += 1) temp = temp >> 1; fprintf(Portable_File, "%02x %c ", TC_FIXNUM, (val < 0 ? '-' : '+')); if (val == 0) fprintf(Portable_File, "0\n"); else { fprintf(Portable_File, "%ld ", size_in_bits); temp = ((val < 0) ? -val : val); while (temp != 0) { fprintf(Portable_File, "%01lx", (temp % 16)); temp = temp >> 4; } fprintf(Portable_File, "\n"); } return; } \f #define Do_Bignum(Code, Rel, Fre, Scn, Obj, FObj) \ { Old_Address += (Rel); \ Old_Contents = *Old_Address; \ if (Type_Code(Old_Contents) == TC_BROKEN_HEART) \ Mem_Base[(Scn)] = \ Make_New_Pointer((Code), Old_Contents); \ else \ { fast long length; \ Mem_Base[(Scn)] = Make_Non_Pointer((Code), (Obj)); \ NIntegers += 1; \ NBits += bignum_to_bits(LEN(BIGNUM(Old_Address))); \ *Old_Address++ = Make_Non_Pointer(TC_BROKEN_HEART, (Obj)); \ (Obj) += 1; \ *(FObj)++ = Make_Non_Pointer(TC_BIG_FIXNUM, 0); \ *(FObj)++ = Old_Contents; \ for (length = Get_Integer(Old_Contents); \ --length >= 0; ) \ *(FObj)++ = *Old_Address++; \ } \ if (Dangerous(This)) Set_Danger_Bit(Mem_Base[(Scn)]); \ } print_a_bignum(from) Pointer *from; { fast bigdigit *the_number, *the_top; fast long size_in_bits; fast unsigned long temp; /* Potential signed problems */ the_number = BIGNUM(from); temp = LEN(the_number); if (temp == 0) fprintf(Portable_File, "%02x + 0\n", (Compact_P ? TC_FIXNUM : TC_BIG_FIXNUM)); else { fast long tail; for (size_in_bits = ((temp - 1) * SHIFT), temp = ((long) (*Bignum_Top(the_number))); temp != 0; size_in_bits += 1) temp = temp >> 1; fprintf(Portable_File, "%02x %c %ld ", (Compact_P ? TC_FIXNUM : TC_BIG_FIXNUM), (NEG_BIGNUM(the_number) ? '-' : '+'), size_in_bits); tail = size_in_bits % SHIFT; if (tail == 0) tail = SHIFT; temp = 0; size_in_bits = 0; the_top = Bignum_Top(the_number); for(the_number = Bignum_Bottom(the_number); the_number <= the_top; the_number += 1) { temp |= (((unsigned long) (*the_number)) << size_in_bits); for (size_in_bits += ((the_number != the_top) ? SHIFT : tail); size_in_bits > 3; size_in_bits -= 4) { fprintf(Portable_File, "%01lx", temp % 16); temp = temp >> 4; } } if (size_in_bits > 0) fprintf(Portable_File, "%01lx\n", temp); else fprintf(Portable_File, "\n"); } return; } \f #define Do_Flonum(Code, Rel, Fre, Scn, Obj, FObj) \ { Old_Address += (Rel); \ Old_Contents = *Old_Address; \ if (Type_Code(Old_Contents) == TC_BROKEN_HEART) \ Mem_Base[(Scn)] = \ Make_New_Pointer((Code), Old_Contents); \ else \ { *Old_Address++ = Make_Non_Pointer(TC_BROKEN_HEART, (Obj)); \ Mem_Base[(Scn)] = Make_Non_Pointer((Code), (Obj)); \ (Obj) += 1; \ *(FObj)++ = Make_Non_Pointer(TC_BIG_FLONUM, 0); \ *((double *) (FObj)) = *((double *) Old_Address); \ (FObj) += float_to_pointer; \ NFlonums += 1; \ } \ if (Dangerous(This)) Set_Danger_Bit(Mem_Base[(Scn)]); \ } print_a_flonum(val) double val; { fast long size_in_bits; fast double mant, temp; int expt; extern double frexp(); fprintf(Portable_File, "%02x %c ", TC_BIG_FLONUM, ((val < 0.0) ? '-' : '+')); if (val == 0.0) { fprintf(Portable_File, "0\n"); return; } mant = frexp(((val < 0.0) ? -val : val), &expt); size_in_bits = 1; for(temp = ((mant * 2.0) - 1.0); temp != 0; size_in_bits += 1) { temp *= 2.0; if (temp >= 1.0) temp -= 1.0; } fprintf(Portable_File, "%ld %ld ", expt, size_in_bits); for (size_in_bits = hex_digits(size_in_bits); size_in_bits > 0; size_in_bits -= 1) { fast unsigned int digit = 0; for (expt = 4; --expt >= 0;) { mant *= 2.0; digit = digit << 1; if (mant >= 1.0) { mant -= 1.0; digit += 1; } } fprintf(Portable_File, "%01x", digit); } fprintf(Portable_File, "\n"); return; } \f /* Normal Objects */ #define Do_Cell(Code, Rel, Fre, Scn, Obj, FObj) \ { Old_Address += (Rel); \ Old_Contents = *Old_Address; \ if (Type_Code(Old_Contents) == TC_BROKEN_HEART) \ Mem_Base[(Scn)] = \ Make_New_Pointer(Type_Code(This), Old_Contents); \ else \ { *Old_Address++ = Make_Non_Pointer(TC_BROKEN_HEART, (Fre)); \ Mem_Base[(Scn)] = Make_Non_Pointer(Type_Code(This), (Fre)); \ Mem_Base[(Fre)++] = Old_Contents; \ } \ } #define Do_Pair(Code, Rel, Fre, Scn, Obj, FObj) \ { Old_Address += (Rel); \ Old_Contents = *Old_Address; \ if (Type_Code(Old_Contents) == TC_BROKEN_HEART) \ Mem_Base[(Scn)] = \ Make_New_Pointer(Type_Code(This), Old_Contents); \ else \ { *Old_Address++ = Make_Non_Pointer(TC_BROKEN_HEART, (Fre)); \ Mem_Base[(Scn)] = Make_Non_Pointer(Type_Code(This), (Fre)); \ Mem_Base[(Fre)++] = Old_Contents; \ Mem_Base[(Fre)++] = *Old_Address++; \ } \ } #define Do_Triple(Code, Rel, Fre, Scn, Obj, FObj) \ { Old_Address += (Rel); \ Old_Contents = *Old_Address; \ if (Type_Code(Old_Contents) == TC_BROKEN_HEART) \ Mem_Base[(Scn)] = \ Make_New_Pointer(Type_Code(This), Old_Contents); \ else \ { *Old_Address++ = Make_Non_Pointer(TC_BROKEN_HEART, (Fre)); \ Mem_Base[(Scn)] = Make_Non_Pointer(Type_Code(This), (Fre)); \ Mem_Base[(Fre)++] = Old_Contents; \ Mem_Base[(Fre)++] = *Old_Address++; \ Mem_Base[(Fre)++] = *Old_Address++; \ } \ } #define Do_Vector(Code, Rel, Fre, Scn, Obj, FObj) \ { Old_Address += (Rel); \ Old_Contents = *Old_Address; \ if (Type_Code(Old_Contents) == TC_BROKEN_HEART) \ Mem_Base[(Scn)] = \ Make_New_Pointer(Type_Code(This), Old_Contents); \ else \ { fast long len = Get_Integer(Old_Contents); \ *Old_Address++ = Make_Non_Pointer(TC_BROKEN_HEART, (Fre)); \ Mem_Base[(Scn)] = Make_Non_Pointer(Type_Code(This), (Fre)); \ Mem_Base[(Fre)++] = Old_Contents; \ while (len > 0) \ { Mem_Base[(Fre)++] = *Old_Address++; \ len -= 1; \ } \ } \ } \f /* Common Pointer Code */ #define Do_Pointer(Scn, Action) \ Old_Address = ((Pointer *) Address(This)); \ if (Old_Address < ((Pointer *) Const_Base)) \ Action(HEAP_CODE, Heap_Relocation, Free, \ Scn, Objects, Free_Objects) \ else if (Old_Address < ((Pointer *) Dumped_Constant_Top)) \ Action(CONSTANT_CODE, Constant_Relocation, Free_Constant, \ Scn, Constant_Objects, Free_Cobjects) \ else \ { fprintf(stderr, \ "%s: File is not portable: Pointer to stack\n", \ Program_Name); \ exit(1); \ } \ (Scn) += 1; \ break \f /* Processing of a single area */ #define Do_Area(Code, Area, Bound, Obj, FObj) \ Process_Area(Code, &Area, &Bound, &Obj, &FObj) #ifdef DEBUG #define Show_Upgrade(This, New_Type) \ fprintf(stderr, "Upgrading from 0x%02x|%06x to 0x%x\n", \ Type_Code(This), Address(This), New_Type); #else #define Show_Upgrade(This, New_Type) #endif #define Upgrade(New_Type) \ { Boolean Was_Dangerous = Dangerous(This); \ Show_Upgrade(This, New_Type); \ if (Dense_Types) goto Bad_Type; \ This = Make_New_Pointer(New_Type, Datum(This)); \ if (Was_Dangerous) Set_Danger_Bit(This); \ Mem_Base[*Area] = This; \ break; \ } Process_Area(Code, Area, Bound, Obj, FObj) int Code; fast long *Area, *Bound; fast long *Obj; fast Pointer **FObj; { fast Pointer This, *Old_Address, Old_Contents; while(*Area != *Bound) { This = Mem_Base[*Area]; Switch_by_GC_Type(This) { case TC_MANIFEST_NM_VECTOR: if (Null_NMV) { fast int i = Get_Integer(This); *Area += 1; for ( ; --i >= 0; *Area += 1) Mem_Base[*Area] = NIL; break; } /* else, Unknown object! */ fprintf(stderr, "%s: File is not portable: NMH found\n", Program_Name); *Area += 1 + Get_Integer(This); break; case TC_BROKEN_HEART: /* [Broken Heart 0] is the cdr of fasdumped symbols. */ if (Get_Integer(This) != 0) { fprintf(stderr, "%s: Broken Heart found in scan.\n", Program_Name); exit(1); } *Area += 1; break; case TC_FIXNUM: NIntegers += 1; NBits += fixnum_to_bits; /* Fall Through */ #if (TC_CHARACTER != TC_FIXNUM) case TC_CHARACTER: #endif Process_Character: Mem_Base[*Area] = Make_Non_Pointer(Code, *Obj); *Obj += 1; **FObj = This; if (Dangerous(This)) { Set_Danger_Bit(Mem_Base[*Area]); Clear_Danger_Bit(**FObj); } *FObj += 1; /* Fall through */ case TC_MANIFEST_SPECIAL_NM_VECTOR: case TC_PRIMITIVE_EXTERNAL: case_simple_Non_Pointer: *Area += 1; break; case_Cell: Do_Pointer(*Area, Do_Cell); case_Pair: Do_Pointer(*Area, Do_Pair); case_Triple: Do_Pointer(*Area, Do_Triple); case TC_BIG_FLONUM: Do_Pointer(*Area, Do_Flonum); case TC_BIG_FIXNUM: Do_Pointer(*Area, Do_Bignum); case TC_CHARACTER_STRING: Do_Pointer(*Area, Do_String); case TC_ENVIRONMENT: case TC_FUTURE: case_simple_Vector: Do_Pointer(*Area, Do_Vector); case OLD_TC_BROKEN_HEART: Upgrade(TC_BROKEN_HEART); case OLD_TC_SPECIAL_NM_VECTOR: Upgrade(TC_MANIFEST_SPECIAL_NM_VECTOR); case OLD_TC_UNASSIGNED: Upgrade(TC_UNASSIGNED); case OLD_TC_RETURN_CODE: Upgrade(TC_RETURN_CODE); case OLD_TC_PCOMB0: Upgrade(TC_PCOMB0); case OLD_TC_THE_ENVIRONMENT: Upgrade(TC_THE_ENVIRONMENT); case OLD_TC_CHARACTER: Upgrade(TC_CHARACTER); case OLD_TC_FIXNUM: Upgrade(TC_FIXNUM); case OLD_TC_SEQUENCE_3: Upgrade(TC_SEQUENCE_3); case OLD_TC_MANIFEST_NM_VECTOR: Upgrade(TC_MANIFEST_NM_VECTOR); case OLD_TC_VECTOR: Upgrade(TC_VECTOR); case OLD_TC_ENVIRONMENT: Upgrade(TC_ENVIRONMENT); case OLD_TC_CONTROL_POINT: Upgrade(TC_CONTROL_POINT); case OLD_TC_COMBINATION: Upgrade(TC_COMBINATION); case OLD_TC_PCOMB3: Upgrade(TC_PCOMB3); case OLD_TC_PCOMB2: Upgrade(TC_PCOMB2); default: Bad_Type: fprintf(stderr, "%s: Unknown Type Code 0x%x found.\n", Program_Name, Type_Code(This)); exit(1); } } } \f /* Output macros */ #define print_an_object(obj) \ fprintf(Portable_File, "%02x %lx\n", \ Type_Code(obj), Get_Integer(obj)) #define print_external_object(from) \ { switch(Type_Code(*from)) \ { case TC_FIXNUM: \ { long Value; \ Sign_Extend(*from++, Value); \ print_a_fixnum(Value); \ break; \ } \ case TC_BIG_FIXNUM: \ from += 1; \ print_a_bignum(from); \ from += 1 + Get_Integer(*from); \ break; \ case TC_CHARACTER_STRING: \ from += 1; \ print_a_string(from); \ from += 1 + Get_Integer(*from); \ break; \ case TC_BIG_FLONUM: \ print_a_flonum(*((double *) (from+1))); \ from += 1 + float_to_pointer; \ break; \ More_Cases() \ default: \ fprintf(stderr, \ "%s: Bad Object to print externally %lx\n", \ Program_Name, *from); \ exit(1); \ } \ } #if (TC_CHARACTER != TC_FIXNUM) #define More_Cases() \ case TC_CHARACTER: \ fprintf(Portable_File, "%02x \n", TC_CHARACTER); \ print_a_char(Get_Integer(*from), "print_a_char"); \ from += 1; \ break; #else #define More_Cases() #endif \f /* Debugging Aids and Consistency Checks */ #ifdef DEBUG When(what, message) Boolean what; char *message; { if (what) { fprintf(stderr, "%s: Inconsistency: %s!\n", Program_Name, (message)); exit(1); } return; } #define print_header(name, obj, format) \ fprintf(Portable_File, (format), (obj)); \ fprintf(stderr, "%s: ", (name)); \ fprintf(stderr, (format), (obj)) #else #define When(what, message) #define print_header(name, obj, format) \ fprintf(Portable_File, (format), (obj)) #endif \f /* The main program */ do_it() { Pointer *Heap; long Initial_Free; /* Load the Data */ if (!Read_Header()) { fprintf(stderr, "%s: Input file does not appear to be in FASL format.\n", Program_Name); exit(1); } if ((Version != FASL_FORMAT_VERSION) || (Sub_Version > FASL_SUBVERSION) || (Sub_Version < FASL_OLDEST_SUPPORTED) || ((Machine_Type != FASL_INTERNAL_FORMAT) && (!Shuffle_Bytes))) { fprintf(stderr, "%s:\n", Program_Name); fprintf(stderr, "FASL File Version %ld Subversion %ld Machine Type %ld\n", Version, Sub_Version , Machine_Type); fprintf(stderr, "Expected: Version %d Subversion %d Machine Type %d\n", FASL_FORMAT_VERSION, FASL_SUBVERSION, FASL_INTERNAL_FORMAT); exit(1); } if (Machine_Type == FASL_INTERNAL_FORMAT) Shuffle_Bytes = false; if (Sub_Version < FASL_PADDED_STRINGS) Padded_Strings = false; if (Sub_Version < FASL_DENSE_TYPES) Dense_Types = false; /* Constant Space not currently supported */ if (Const_Count != 0) { fprintf(stderr, "%s: Input file has a constant space area.\n", Program_Name); exit(1); } { long Size = ((3 * (Heap_Count + Const_Count)) + NROOTS + 1); Allocate_Heap_Space(Size); if (Heap == NULL) { fprintf(stderr, "%s: Memory Allocation Failed. Size = %ld Scheme Pointers\n", Program_Name, Size); exit(1); } } Load_Data(Heap_Count, &Heap[0]); Heap_Relocation = (&Heap[0]) - ((Pointer *) Heap_Base); Load_Data(Const_Count, &Heap[Heap_Count]); Constant_Relocation = (&Heap[Heap_Count]) - ((Pointer *) Const_Base); #ifdef DEBUG fprintf(stderr, "Dumped Heap Base = 0x%08x\n", Heap_Base); fprintf(stderr, "Dumped Constant Base = 0x%08x\n", Const_Base); fprintf(stderr, "Dumped Constant Top = 0x%08x\n", Dumped_Constant_Top); fprintf(stderr, "Heap Count = %6d\n", Heap_Count); fprintf(stderr, "Constant Count = %6d\n", Const_Count); #endif \f /* Reformat the data */ NFlonums = NIntegers = NStrings = NBits = NChars = 0; Mem_Base = &Heap[Heap_Count + Const_Count]; if (Ext_Prim_Vector == NIL) { Mem_Base[0] = Make_Non_Pointer(TC_CELL, 2); Mem_Base[1] = Make_New_Pointer(TC_CELL, Dumped_Object); Mem_Base[2] = NIL; Initial_Free = NROOTS + 1; Scan = 1; } else { Mem_Base[0] = Ext_Prim_Vector; /* Has CELL TYPE */ Mem_Base[1] = Make_New_Pointer(TC_CELL, Dumped_Object); Initial_Free = NROOTS; Scan = 0; } Free = Initial_Free; Free_Objects = &Mem_Base[Heap_Count + Initial_Free]; Objects = 0; Free_Constant = (2 * Heap_Count) + Initial_Free; Scan_Constant = Free_Constant; Free_Cobjects = &Mem_Base[Const_Count + Free_Constant]; Constant_Objects = 0; #if true Do_Area(HEAP_CODE, Scan, Free, Objects, Free_Objects); #else /* When Constant Space finally becomes supported, something like this must be done. */ while (true) { Do_Area(HEAP_CODE, Scan, Free, Objects, Free_Objects); Do_Area(CONSTANT_CODE, Scan_Constant, Free_Constant, Constant_Objects, Free_Cobjects); Do_Area(PURE_CODE, Scan_Pure, Fre_Pure, Pure_Objects, Free_Pobjects); if (Scan == Free) break; } #endif \f /* Consistency checks */ When(((Free - Initial_Free) > Heap_Count), "Free overran Heap"); When(((Free_Objects - &Mem_Base[Initial_Free + Heap_Count]) > Heap_Count), "Free_Objects overran Heap Object Space"); When(((Free_Constant - (Initial_Free + (2 * Heap_Count))) > Const_Count), "Free_Constant overran Constant Space"); When(((Free_Cobjects - &Mem_Base[Initial_Free + (2 * Heap_Count) + Const_Count]) > Const_Count), "Free_Cobjects overran Constant Object Space"); \f /* Output the data */ /* Header */ print_header("Portable Version", PORTABLE_VERSION, "%ld\n"); print_header("Flags", Make_Flags(), "%ld\n"); print_header("Version", FASL_FORMAT_VERSION, "%ld\n"); print_header("Sub Version", FASL_SUBVERSION, "%ld\n"); print_header("Heap Count", (Free - NROOTS), "%ld\n"); print_header("Heap Base", NROOTS, "%ld\n"); print_header("Heap Objects", Objects, "%ld\n"); /* Currently Constant and Pure not supported, but the header is ready */ print_header("Pure Count", 0, "%ld\n"); print_header("Pure Base", Free_Constant, "%ld\n"); print_header("Pure Objects", 0, "%ld\n"); print_header("Constant Count", 0, "%ld\n"); print_header("Constant Base", Free_Constant, "%ld\n"); print_header("Constant Objects", 0, "%ld\n"); print_header("Number of flonums", NFlonums, "%ld\n"); print_header("Number of integers", NIntegers, "%ld\n"); print_header("Number of strings", NStrings, "%ld\n"); print_header("Number of bits in integers", NBits, "%ld\n"); print_header("Number of characters in strings", NChars, "%ld\n"); print_header("& Dumped Object", (Get_Integer(Mem_Base[1])), "%ld\n"); print_header("& Ext Prim Vector", (Get_Integer(Mem_Base[0])), "%ld\n"); \f /* External Objects */ /* Heap External Objects */ Free_Objects = &Mem_Base[Initial_Free + Heap_Count]; for (; Objects > 0; Objects -= 1) print_external_object(Free_Objects); #if false /* Pure External Objects */ Free_Cobjects = &Mem_Base[Pure_Objects_Start]; for (; Pure_Objects > 0; Pure_Objects -= 1) print_external_object(Free_Cobjects); /* Constant External Objects */ Free_Cobjects = &Mem_Base[Constant_Objects_Start]; for (; Constant_Objects > 0; Constant_Objects -= 1) print_external_object(Free_Cobjects); #endif \f /* Pointer Objects */ /* Heap Objects */ Free_Cobjects = &Mem_Base[Free]; for (Free_Objects = &Mem_Base[NROOTS]; Free_Objects < Free_Cobjects; Free_Objects += 1) print_an_object(*Free_Objects); #if false /* Pure Objects */ Free_Cobjects = &Mem_Base[Free_Pure]; for (Free_Objects = &Mem_Base[Pure_Start]; Free_Objects < Free_Cobjects; Free_Objects += 1) print_an_object(*Free_Objects); /* Constant Objects */ Free_Cobjects = &Mem_Base[Free_Constant]; for (Free_Objects = &Mem_Base[Constant_Start]; Free_Objects < Free_Cobjects; Free_Objects += 1) print_an_object(*Free_Objects); #endif return; } \f /* Top Level */ static int Noptions = 3; static struct Option_Struct Options[] = {{"Do_Not_Compact", false, &Compact_P}, {"Null_Out_NMVs", true, &Null_NMV}, {"Swap_Bytes", true, &Shuffle_Bytes}}; main(argc, argv) int argc; char *argv[]; { Setup_Program(argc, argv, Noptions, Options); return; }