%!PS-Adobe-3.0
%%Title: oddcopy.c
%%For: U-PANAMINT\acn1
%%Creator: a2ps version 4.13
%%CreationDate: Fri Jan 19 20:29:34 2007
%%BoundingBox: 24 50 571 750
%%DocumentData: Clean7Bit
%%Orientation: Portrait
%%Pages: 7
%%PageOrder: Ascend
%%DocumentMedia: A4acn 595 842 0 () ()
%%DocumentNeededResources: font Courier
%%+ font Courier-Bold
%%+ font Courier-BoldOblique
%%+ font Courier-Oblique
%%+ font Helvetica
%%+ font Helvetica-Bold
%%+ font Symbol
%%+ font Times-Bold
%%+ font Times-Roman
%%DocumentProcessColors: Black 
%%DocumentSuppliedResources: procset a2ps-a2ps-hdr
%%+ procset a2ps-black+white-Prolog
%%+ encoding ISO-8859-1Encoding
%%EndComments
/a2psdict 200 dict def
a2psdict begin
%%BeginProlog
%%Copyright: (c) 1988, 89, 90, 91, 92, 93 Miguel Santana
%%Copyright: (c) 1995, 96, 97, 98 Akim Demaille, Miguel Santana
% Check PostScript language level.
/languagelevel where {
  pop /gs_languagelevel languagelevel def
} {
  /gs_languagelevel 1 def
} ifelse

% EPSF import as in the Red Book
/BeginInclude {
  /b4_Inc_state save def    		% Save state for cleanup
  /dict_count countdictstack def	% Count objects on dict stack
  /op_count count 1 sub def		% Count objects on operand stack 
  userdict begin
    0 setgray 0 setlinecap
    1 setlinewidth 0 setlinejoin
    10 setmiterlimit [ ] 0 setdash newpath
    gs_languagelevel 1 ne {
      false setstrokeadjust false setoverprint 
    } if
} bind def

/EndInclude {
  count op_count sub { pos } repeat	% Clean up stacks
  countdictstack dict_count sub { end } repeat
  b4_Inc_state restore
} bind def

/BeginEPSF {
  BeginInclude
  /showpage { } def
} bind def

/EndEPSF {
  EndInclude
} bind def

% Page prefeed
/page_prefeed {         % bool -> -
  statusdict /prefeed known {
    statusdict exch /prefeed exch put
  } {
    pop
  } ifelse
} bind def

/deffont {
  findfont exch scalefont def
} bind def

/reencode_font {
  findfont reencode 2 copy definefont pop def
} bind def

% Function c-show (str => -)
% centers text only according to x axis.
/c-show { 
  dup stringwidth pop
  2 div neg 0 rmoveto
  show
} bind def

% Function l-show (str => -)
% prints texts so that it ends at currentpoint
/l-show {
  dup stringwidth pop neg 
  0 
  rmoveto show
} bind def

% center-fit show (str w => -)
% show centered, and scale currentfont so that the width is less than w
/cfshow {
  exch dup stringwidth pop
  % If the title is too big, try to make it smaller
  3 2 roll 2 copy
  gt
  { % if, i.e. too big
    exch div
    currentfont exch scalefont setfont
  } { % ifelse
    pop pop 
  }
  ifelse
  c-show			% center title
} bind def

% Return the y size of the current font
% - => fontsize
/currentfontsize {
  currentfont /FontMatrix get 3 get 1000 mul
} bind def

% reencode the font
% <encoding-vector> <fontdict> -> <newfontdict>
/reencode { %def
  dup length 5 add dict begin
    { %forall
      1 index /FID ne 
      { def }{ pop pop } ifelse
    } forall
    /Encoding exch def

    % Use the font's bounding box to determine the ascent, descent,
    % and overall height; don't forget that these values have to be
    % transformed using the font's matrix.
    % We use `load' because sometimes BBox is executable, sometimes not.
    % Since we need 4 numbers an not an array avoid BBox from being executed
    /FontBBox load aload pop
    FontMatrix transform /Ascent exch def pop
    FontMatrix transform /Descent exch def pop
    /FontHeight Ascent Descent sub def

    % Define these in case they're not in the FontInfo (also, here
    % they're easier to get to.
    /UnderlinePosition 1 def
    /UnderlineThickness 1 def
    
    % Get the underline position and thickness if they're defined.
    currentdict /FontInfo known {
      FontInfo
      
      dup /UnderlinePosition known {
	dup /UnderlinePosition get
	0 exch FontMatrix transform exch pop
	/UnderlinePosition exch def
      } if
      
      dup /UnderlineThickness known {
	/UnderlineThickness get
	0 exch FontMatrix transform exch pop
	/UnderlineThickness exch def
      } if
      
    } if
    currentdict 
  end 
} bind def

% Function print line number (<string> # -)
/# {
  gsave
    sx cw mul neg 2 div 0 rmoveto
    f# setfont
    c-show
  grestore
} bind def

% -------- Some routines to enlight plain b/w printings ---------

% Underline
% width --
/dounderline {
  currentpoint
  gsave
    moveto
    0 currentfont /Descent get currentfontsize mul rmoveto
    0 rlineto
    stroke
  grestore
} bind def

% Underline a string
% string --
/dounderlinestring {
  stringwidth pop
  dounderline
} bind def

/UL {
  /ul exch store
} bind def

% Draw a box of WIDTH wrt current font
% width --
/dobox {
  currentpoint
  gsave
    newpath
    moveto
    0 currentfont /Descent get currentfontsize mul rmoveto
    dup 0 rlineto
    0 currentfont /FontHeight get currentfontsize mul rlineto
    neg 0 rlineto
    closepath
    stroke
  grestore
} bind def

/BX {
  /bx exch store
} bind def

% Box a string
% string --
/doboxstring {
  stringwidth pop
  dobox
} bind def

%
% ------------- Color routines ---------------
%
/FG /setrgbcolor load def

% Draw the background
% width --
/dobackground {
  currentpoint
  gsave
    newpath
    moveto
    0 currentfont /Descent get currentfontsize mul rmoveto
    dup 0 rlineto
    0 currentfont /FontHeight get currentfontsize mul rlineto
    neg 0 rlineto
    closepath
    bgcolor aload pop setrgbcolor
    fill
  grestore
} bind def

% Draw bg for a string
% string --
/dobackgroundstring {
  stringwidth pop
  dobackground
} bind def


/BG {
  dup /bg exch store
  { mark 4 1 roll ] /bgcolor exch store } if
} bind def


/Show {
  bg { dup dobackgroundstring } if
  ul { dup dounderlinestring } if
  bx { dup doboxstring } if
  show
} bind def

% Function T(ab), jumps to the n-th tabulation in the current line
/T {
  cw mul x0 add
  bg { dup currentpoint pop sub dobackground } if
  ul { dup currentpoint pop sub dounderline } if
  bx { dup currentpoint pop sub dobox } if
  y0 moveto
} bind def

% Function n: move to the next line
/n {
  /y0 y0 bfs sub store
  x0 y0 moveto
} bind def

% Function N: show and move to the next line
/N {
  Show
  /y0 y0 bfs sub store
  x0 y0 moveto
} bind def

/S {
  Show
} bind def

%%BeginResource: procset a2ps-a2ps-hdr 2.0 2
%%Copyright: (c) 1988, 89, 90, 91, 92, 93 Miguel Santana
%%Copyright: (c) 1995, 96, 97, 98 Akim Demaille, Miguel Santana
% Function title: prints page header.
% <ct> <rt> <lt> are passed as argument
/title { 
  % 1. Draw the background
  x v get y v get moveto
  gsave
    0 th 2 div neg rmoveto 
    th setlinewidth
    0.95 setgray
    pw 0 rlineto stroke
  grestore
  % 2. Border it
  gsave
    0.7 setlinewidth
    pw 0 rlineto
    0 th neg rlineto
    pw neg 0 rlineto
    closepath stroke
  grestore
  % stk: ct rt lt
  x v get y v get th sub 1 add moveto
%%IncludeResource: font Helvetica
  fHelvetica fnfs 0.8 mul scalefont setfont
  % 3. The left title
  gsave
    dup stringwidth pop fnfs 0.8 mul add exch % leave space took on stack
    fnfs 0.8 mul hm rmoveto
    show			% left title
  grestore
  exch
  % stk: ct ltw rt
  % 4. the right title
  gsave
    dup stringwidth pop fnfs 0.8 mul add exch % leave space took on stack
    dup
    pw exch stringwidth pop fnfs 0.8 mul add sub
    hm
    rmoveto
    show			% right title
  grestore
  % stk: ct ltw rtw
  % 5. the center title
  gsave
    pw 3 1 roll
    % stk: ct pw ltw rtw
    3 copy 
    % Move to the center of the left room
    sub add 2 div hm rmoveto
    % What is the available space in here?
    add sub fnfs 0.8 mul sub fnfs 0.8 mul sub
    % stk: ct space_left
%%IncludeResource: font Helvetica-Bold
  fHelvetica-Bold fnfs scalefont setfont
    cfshow
  grestore
} bind def

% Function border: prints virtual page border
/border { %def
  gsave				% print four sides
    0 setgray
    x v get y v get moveto
    0.7 setlinewidth		% of the square
    pw 0 rlineto
    0 ph neg rlineto
    pw neg 0 rlineto
    closepath stroke
  grestore
} bind def

% Function water: prints a water mark in background
/water { %def
  gsave
    scx scy moveto rotate
%%IncludeResource: font Times-Bold
  fTimes-Bold 100 scalefont setfont
    .97 setgray
    dup stringwidth pop 2 div neg -50 rmoveto
    show
  grestore
} bind def

% Function rhead: prints the right header
/rhead {  %def
  lx ly moveto
  fHelvetica fnfs 0.8 mul scalefont setfont
  l-show
} bind def

% Function footer (cf rf lf -> -)
/footer {
  fHelvetica fnfs 0.8 mul scalefont setfont
  dx dy moveto
  show

  snx sny moveto
  l-show
  
  fnx fny moveto
  c-show
} bind def
%%EndResource
%%BeginResource: procset a2ps-black+white-Prolog 2.0 1

% Function T(ab), jumps to the n-th tabulation in the current line
/T { 
  cw mul x0 add y0 moveto
} bind def

% Function n: move to the next line
/n { %def
  /y0 y0 bfs sub store
  x0 y0 moveto
} bind def

% Function N: show and move to the next line
/N {
  Show
  /y0 y0 bfs sub store
  x0 y0 moveto
}  bind def

/S {
  Show
} bind def

/p {
  false UL
  false BX
  fCourier bfs scalefont setfont
  Show
} bind def

/sy {
  false UL
  false BX
  fSymbol bfs scalefont setfont
  Show
} bind def

/k {
  false UL
  false BX
  fCourier-Oblique bfs scalefont setfont
  Show
} bind def

/K {
  false UL
  false BX
  fCourier-Bold bfs scalefont setfont
  Show
} bind def

/c {
  false UL
  false BX
  fCourier-Oblique bfs scalefont setfont
  Show
} bind def

/C {
  false UL
  false BX
  fCourier-BoldOblique bfs scalefont setfont
  Show 
} bind def

/l {
  false UL
  false BX
  fHelvetica bfs scalefont setfont
  Show
} bind def

/L {
  false UL
  false BX
  fHelvetica-Bold bfs scalefont setfont
  Show 
} bind def

/str{
  false UL
  false BX
  fTimes-Roman bfs scalefont setfont
  Show
} bind def

/e{
  false UL
  true BX
  fHelvetica-Bold bfs scalefont setfont
  Show
} bind def

%%EndResource
%%EndProlog
%%BeginSetup
%%IncludeResource: font Courier
%%IncludeResource: font Courier-Oblique
%%IncludeResource: font Courier-Bold
%%IncludeResource: font Times-Roman
%%IncludeResource: font Symbol
%%IncludeResource: font Courier-BoldOblique
%%BeginResource: encoding ISO-8859-1Encoding
/ISO-8859-1Encoding [
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef 
/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright 
/parenleft /parenright /asterisk /plus /comma /minus /period /slash 
/zero /one /two /three /four /five /six /seven 
/eight /nine /colon /semicolon /less /equal /greater /question 
/at /A /B /C /D /E /F /G 
/H /I /J /K /L /M /N /O 
/P /Q /R /S /T /U /V /W 
/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore 
/quoteleft /a /b /c /d /e /f /g 
/h /i /j /k /l /m /n /o 
/p /q /r /s /t /u /v /w 
/x /y /z /braceleft /bar /braceright /asciitilde /.notdef 
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef 
/space /exclamdown /cent /sterling /currency /yen /brokenbar /section 
/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron 
/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /bullet 
/cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown 
/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla 
/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis 
/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply 
/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls 
/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla 
/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis 
/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide 
/oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis 
] def
%%EndResource
% Initialize page description variables.
/sh 842 def
/sw 595 def
/llx 24 def
/urx 571 def
/ury 750 def
/lly 50 def
/#copies 1 def
/th 20.000000 def
/fnfs 15 def
/bfs 11.199836 def
/cw 6.719901 def

% Dictionary for ISO-8859-1 support
/iso1dict 8 dict begin
  /fCourier ISO-8859-1Encoding /Courier reencode_font
  /fCourier-Bold ISO-8859-1Encoding /Courier-Bold reencode_font
  /fCourier-BoldOblique ISO-8859-1Encoding /Courier-BoldOblique reencode_font
  /fCourier-Oblique ISO-8859-1Encoding /Courier-Oblique reencode_font
  /fHelvetica ISO-8859-1Encoding /Helvetica reencode_font
  /fHelvetica-Bold ISO-8859-1Encoding /Helvetica-Bold reencode_font
  /fTimes-Bold ISO-8859-1Encoding /Times-Bold reencode_font
  /fTimes-Roman ISO-8859-1Encoding /Times-Roman reencode_font
currentdict end def
/bgcolor [ 0 0 0 ] def
/bg false def
/ul false def
/bx false def
% The font for line numbering
/f# /Helvetica findfont bfs .6 mul scalefont def
/fSymbol /Symbol findfont def
/hm fnfs 0.25 mul def
/pw
   cw 81.400000 mul
def
/ph
   646.230524 th add
def
/pmw 0 def
/pmh 0 def
/v 0 def
/x [
  0
] def
/y [
  pmh ph add 0 mul ph add
] def
/scx sw 2 div def
/scy sh 2 div def
/snx urx def
/sny lly 2 add def
/dx llx def
/dy sny def
/fnx scx def
/fny dy def
/lx snx def
/ly ury fnfs 0.8 mul sub def
/sx 0 def
/tab 8 def
/x0 0 def
/y0 0 def
%%EndSetup

%%Page: (1) 1
%%BeginPageSetup
/pagesave save def
%%EndPageSetup
iso1dict begin
gsave
llx lly 12 add translate
/v 0 store
/x0 x v get 4.703931 add sx cw mul add store
/y0 y v get bfs th add sub store
x0 y0 moveto
(/*) c n
( * This is going to be a version of the copying garbage collector for use) N
( * on 64-bit machines when it has just loaded a 32-bit image file.) N
( * its job is then to do a copying-style garbage collection where the) N
( * source space is set up to be in 32-bit format and the destination) N
( * is in 64-bit form! One nasty issue is that of forwarding addresses, which) N
( * can no longer be normal native references - in the 32-bit space ALL) N
( * addresses will have to live in a fort of segmented form) N
( *    -----------------------------------------------) N
( *   | <page number> | <offset within page> | <tags> |) N
( *    -----------------------------------------------) N
( * whh=ich is the form that the have while in an image file.) N
( */) N
() p n
(static) K
( ) p
(int) k
( trailing_heap_pages_count,) p n
(           trailing_vheap_pages_count;) N
() N
(typedef) K
( ) p
(int) k
(32_t Source_Object;) p n
(typedef) K
( Lisp_Object Destination_Object;) p n
() N
(/*) c n
( * This is going to be "just" the code from the regular garbage collector) N
( * adjusted so that the source space is in smaller items. Well perhaps if I) N
( * was clever enough I could make it such that it just had one type for its) N
( * source and another for its destination half-space and one bit of) N
( * code here could copy either preserving, widening or narrowing) N
( * representation.) N
( */) N
() p n
(static) K
( ) p
(void) k
( copy\(Source_Object *p\)) p n
(/*) c n
( * This copies the object pointed at by p from the old to the new semi-space,) N
( * and returns a copy to the pointer.  If scans the copied material to copy) N
( * all relevent sub-structures to the new semi-space.) N
( */) N
({) p n
(    Lisp_Object nil = C_nil;) N
(    ) S
(char) k
( *fr = \() p
(char) k
( *\)fringe, *vfr = \() p
(char) k
( *\)vfringe;) p n
(    ) S
(char) k
( *tr_fr = fr, *tr_vfr = vfr;) p n
(    ) S
(void) k
( *p1;) p n
(#define) K
( CONT           0) p n
(#define) K
( DONE_CAR      -1) p n
(#define) K
( DONE_VALUE    -2) p n
(#define) K
( DONE_ENV      -3) p n
(#define) K
( DONE_PNAME    -4) p n
(#define) K
( DONE_PLIST    -5) p n
(#define) K
( DONE_FASTGETS -6) p n
(    ) S
(int) k
( next = CONT;) p n
(    ) S
(char) k
( *tr=) p
(NULL) K
(;) p n
(#ifdef) K
( DEBUG_GC) p n
(    term_printf\(") S
(Copy [%p] %p\\n) str
(", \() p
(void) k
( *\)p, \() p
(void) k
( *\)*p\);) p n
(#endif) K n
(/*) c n
( * The code here is a simulation of multiple procedure calls to the) N
( * code that copies a single object.  What might otherwise have been) N
( * a "return address" in the calls is handled by the variable "next" which) N
( * takes positive values while copying vectors, and negative ones in) N
(oddcopy.c) (Page 1/7) (Jan 19, 07 20:29) title
border
grestore
(Printed by U-PANAMINT\\acn1) rhead
() (1/7) (Friday January 19, 2007) footer
end % of iso1dict
pagesave restore
showpage
%%Page: (2) 2
%%BeginPageSetup
/pagesave save def
%%EndPageSetup
iso1dict begin
gsave
llx lly 12 add translate
/v 0 store
/x0 x v get 4.703931 add sx cw mul add store
/y0 y v get bfs th add sub store
x0 y0 moveto
( * the more common cases. I use "for \(;;\)" blocks a lot so that I can) c n
( * use "break" and "continue" to leap around in the code - maybe I) N
( * would do better to be honest and use regular labels and "goto") N
( * statements.) N
( */) N
(    ) p
(for) K
( \(;;\)) p n
(    {) N
(/*) c n
( * Copy one object, pointed at by p, from the old semi-space into the new) N
( * one.) N
( */) N
(        Lisp_Object a = *p;) p n
(#ifdef) K
( DEBUG_GC) p n
(    term_printf\(") S
(Next copy [%p] %p\\n) str
(", \() p
(void) k
( *\)p, \() p
(void) k
( *\)*p\);) p n
(#endif) K n
(        ) p
(for) K
( \(;;\)) p n
(        {) N
(            ) S
(if) K
( \(a == nil\) ) p
(break) K
(;    ) p
(/* common and cheap enough to test here */) c n
(            ) p
(else) K
( ) p
(if) K
( \(is_immed_or_cons\(a\)\)) p n
(            {   ) S
(if) K
( \(is_cons\(a\)\)) p n
(                {) N
(                    Lisp_Object w;) N
(                    w = qcar\(a\);) N
(                    ) S
(if) K
( \(is_cons\(w\) && is_marked_p\(w\)\) ) p
(/* a forwarding address */) c n
(                    {   *p = flip_mark_bit_p\(w\);) p n
(                        ) S
(break) K
(;) p n
(                    }) N
(                    fr = fr - ) S
(sizeof) K
(\(Cons_Cell\);) p n
(                    cons_cells += 2*CELL;) N
(/*) c n
( * When I am doing regular calculation I leave myself a bunch of spare) N
( * words \(size SPARE bytes\) so that I can afford to do several cons operations) N
( * between tests.  Here I do careful tests on every step, and so I can) N
( * sail much closer to the wind wrt filling up space.) N
( */) N
(                    ) p
(if) K
( \(fr <= \() p
(char) k
( *\)heaplimit - SPARE + 32\)) p n
(                    {   ) S
(char) k
( *hl = \() p
(char) k
( *\)heaplimit;) p n
(                        ) S
(void) k
( *p;) p n
(                        uintptr_t len = \(uintptr_t\)\(fr - \(hl - SPARE\) +) N
(                                                      ) S
(sizeof) K
(\(Cons_Cell\)\);) p n
(                        car32\(hl - SPARE\) = len;) N
(                        qcar\(fr\) = SPID_GCMARK;) N
(                        ) S
(if) K
( \(pages_count == 0\)) p n
(                        {   term_printf\(") S
(pages_count = 0 in GC\\n) str
("\);) p n
(                            ensure_screen\(\);) N
(                            abort\(\);) N
(                            ) S
(return) K
(;) p n
(                        }) N
(                        p = pages[--pages_count];) N
(                        zero_out\(p\);) N
(                        new_heap_pages[new_heap_pages_count++] = p;) N
(                        heaplimit = quadword_align_up\(\(intptr_t\)p\);) N
(                        hl = \() S
(char) k
( *\)heaplimit;) p n
(                        car32\(heaplimit\) = CSL_PAGE_SIZE;) N
(                        fr = hl + CSL_PAGE_SIZE - ) S
(sizeof) K
(\(Cons_Cell\);) p n
(                        heaplimit = \(Lisp_Object\)\(hl + SPARE\);) N
(                    }) N
(oddcopy.c) (Page 2/7) (Jan 19, 07 20:29) title
border
grestore
(Printed by U-PANAMINT\\acn1) rhead
() (Friday January 19, 2007) (2/7) footer
end % of iso1dict
pagesave restore
showpage
%%Page: (3) 3
%%BeginPageSetup
/pagesave save def
%%EndPageSetup
iso1dict begin
gsave
llx lly 12 add translate
/v 0 store
/x0 x v get 4.703931 add sx cw mul add store
/y0 y v get bfs th add sub store
x0 y0 moveto
(                    qcar\(fr\) = w;) p n
(                    qcdr\(fr\) = qcdr\(a\);) N
(                    *p = w = \(Lisp_Object\)\(fr + TAG_CONS\);) N
(                    qcar\(a\) = flip_mark_bit_p\(w\);) N
(                    ) S
(break) K
(;) p n
(                }) N
(                ) S
(else) K
( ) p
(if) K
( \(is_bps\(a\)\)) p n
(                {   ) S
(char) k
( *d = data_of_bps\(a\) - CELL, *rr;) p n
(                    intptr_t alloc_size;) N
(                    Header h = *\(Header *\)d;) N
(                    intptr_t len;) N
(                    ) S
(if) K
( \(is_bps\(h\)\)  ) p
(/* Replacement handle in header field? */) c n
(                    {   *p = h ;) p n
(                        ) S
(break) K
(;) p n
(                    }) N
(                    len = length_of_header\(h\);) N
(                    alloc_size = \(intptr_t\)doubleword_align_up\(len\);) N
(                    bytestreams += alloc_size;) N
(                    ) S
(for) K
( \(;;\)) p n
(                    {   ) S
(char) k
( *cf = \() p
(char) k
( *\)codefringe,) p n
(                             *cl = \() S
(char) k
( *\)codelimit;) p n
(                        uintptr_t free = \(uintptr_t\)\(cf - cl\);) N
(                        ) S
(if) K
( \(alloc_size > \(intptr_t\)free\)) p n
(                        {) N
(                            ) S
(void) k
( *p;) p n
(                            ) S
(if) K
( \(codelimit != 0\)) p n
(                            {   uintptr_t len = \(uintptr_t\)\(cf - \(cl - 8\)\);) N
(                                car32\(cl - 8\) = len;) N
(                            }) N
(                            ) S
(if) K
( \(pages_count == 0\)) p n
(                            {   term_printf\(") S
(pages_count = 0 in GC\\n) str
("\);) p n
(                                ensure_screen\(\);) N
(                                abort\(\);) N
(                                ) S
(return) K
(;) p n
(                            }) N
(                            p = pages[--pages_count];) N
(                            zero_out\(p\);) N
(                            new_bps_pages[new_bps_pages_count++] = p;) N
(                            cl = \() S
(char) k
( *\)doubleword_align_up\(\(intptr_t\)p\);) p n
(                            codefringe = \(Lisp_Object\)\(cl + CSL_PAGE_SIZE\);) N
(                            codelimit = \(Lisp_Object\)\(cl + 8\);) N
(                            ) S
(continue) K
(;) p n
(                        }) N
(                        rr = cf - alloc_size;) N
(                        codefringe = \(Lisp_Object\)rr;) N
(/*) c n
( * See comments in fns2.c for the curious packing here!) N
( */) N
(                        *\(Header *\)d = *p = TAG_BPS +) p n
(                           \(\(\(intptr_t\)\(\(rr + CELL\) - \(cl - 8\)\) &) N
(                             \(PAGE_POWER_OF_TWO-4\)\) << 6\) +) N
(                           \(\(\(intptr_t\)\(new_bps_pages_count-1\)\)<<\(PAGE_BITS+6\)\);) N
(                        ) S
(/* Wow! How obscure!! */) c n
(                        *\(Header *\)rr = h;) p n
(                        memcpy\(rr+CELL, d+CELL, alloc_size-CELL\);) N
(                        ) S
(break) K
(;) p n
(                    }) N
(oddcopy.c) (Page 3/7) (Jan 19, 07 20:29) title
border
grestore
(Printed by U-PANAMINT\\acn1) rhead
() (3/7) (Friday January 19, 2007) footer
end % of iso1dict
pagesave restore
showpage
%%Page: (4) 4
%%BeginPageSetup
/pagesave save def
%%EndPageSetup
iso1dict begin
gsave
llx lly 12 add translate
/v 0 store
/x0 x v get 4.703931 add sx cw mul add store
/y0 y v get bfs th add sub store
x0 y0 moveto
(                    ) p
(break) K
(;) p n
(                }) N
(                ) S
(else) K
( ) p
(break) K
(;        ) p
(/* Immediate data drops out here */) c n
(            }) p n
(            ) S
(else) K
(                    ) p
(/* Here I have a symbol or vector */) c n
(            {   Header h;) p n
(                ) S
(int) k
( tag;) p n
(                intptr_t len;) N
(                tag = \(\() S
(int) k
(\)a\) & TAG_BITS;) p n
(                a = \(Lisp_Object\)\(\() S
(char) k
( *\)a - tag\);) p n
(                h = *\(Header *\)a;) N
(#ifdef) K
( DEBUG_GC) p n
(                term_printf\(") S
(Header is %p\\n) str
(", \() p
(void) k
( *\)h\);) p n
(#endif) K n
(                ) p
(if) K
( \(!is_odds\(h\)\)) p n
(                {   *p = h;) N
(                    ) S
(break) K
(;) p n
(                }) N
(                ) S
(if) K
( \(tag == TAG_SYMBOL\)) p n
(                    len = symhdr_length, symbol_heads += symhdr_length;) N
(                ) S
(else) K n
(                {   len = doubleword_align_up\(length_of_header\(h\)\);) p n
(                    ) S
(switch) K
( \(type_of_header\(h\)\)) p n
(                    {) N
(                ) S
(case) K
( TYPE_STRING:) p n
(                        strings += len; ) S
(break) K
(;) p n
(                ) S
(case) K
( TYPE_BIGNUM:) p n
(                        big_numbers += len; ) S
(break) K
(;) p n
(#ifdef) K
( COMMON) p n
(                ) S
(case) K
( TYPE_SINGLE_FLOAT:) p n
(                ) S
(case) K
( TYPE_LONG_FLOAT:) p n
(#endif) K n
(                ) p
(case) K
( TYPE_DOUBLE_FLOAT:) p n
(                        box_floats += len; ) S
(break) K
(;) p n
(                ) S
(case) K
( TYPE_SIMPLE_VEC:) p n
(                        user_vectors += len; ) S
(break) K
(;) p n
(                ) S
(default) K
(:) p n
(                        other_mem += len; ) S
(break) K
(;) p n
(                    }) N
(                }) N
(                ) S
(for) K
( \(;;\)) p n
(                {   ) S
(char) k
( *vl = \() p
(char) k
( *\)vheaplimit;) p n
(                    uintptr_t free = \(uintptr_t\)\(vl - vfr\);) N
(                    ) S
(if) K
( \(len > \(intptr_t\)free\)) p n
(                    {   uintptr_t free1 =) N
(                            \(uintptr_t\)\(vfr - \(vl - \(CSL_PAGE_SIZE - 8\)\)\);) N
(                        car32\(vl - \(CSL_PAGE_SIZE - 8\)\) = free1;) N
(                        qcar\(vfr\) = 0;          ) S
(/* sentinel value */) c n
(                        ) p
(if) K
( \(pages_count == 0\)) p n
(                        {   term_printf\(") S
(pages_count = 0 in GC\\n) str
("\);) p n
(                            ensure_screen\(\);) N
(                            abort\(\);) N
(                            ) S
(return) K
(;) p n
(                        }) N
(                        p1 = pages[--pages_count];) N
(                        zero_out\(p1\);) N
(                        new_vheap_pages[new_vheap_pages_count++] = p1;) N
(oddcopy.c) (Page 4/7) (Jan 19, 07 20:29) title
border
grestore
(Printed by U-PANAMINT\\acn1) rhead
() (Friday January 19, 2007) (4/7) footer
end % of iso1dict
pagesave restore
showpage
%%Page: (5) 5
%%BeginPageSetup
/pagesave save def
%%EndPageSetup
iso1dict begin
gsave
llx lly 12 add translate
/v 0 store
/x0 x v get 4.703931 add sx cw mul add store
/y0 y v get bfs th add sub store
x0 y0 moveto
(                        vfr = \() p
(char) k
( *\)doubleword_align_up\(\(intptr_t\)p1\) + 8;) p n
(                        vl = vfr + \(CSL_PAGE_SIZE - 16\);) N
(                        vheaplimit = \(Lisp_Object\)vl;) N
(                        free1 = \(uintptr_t\)\(vfr - \(vl - \(CSL_PAGE_SIZE - 8\)\)\);) N
(                        car32\(vl - \(CSL_PAGE_SIZE - 8\)\) = free1;) N
(                        ) S
(continue) K
(;) p n
(                    }) N
(                    *\(Lisp_Object *\)a = *p = \(Lisp_Object\)\(vfr + tag\);) N
(                    *\(Header *\)vfr = h;) N
(                    memcpy\(\() S
(char) k
( *\)vfr+CELL, \() p
(char) k
( *\)a+CELL, len-CELL\);) p n
(                    vfr += len;) N
(                    ) S
(break) K
(;) p n
(                }) N
(                ) S
(break) K
(;) p n
(            }) N
(        }) N
(/*) c n
( * Now I have copied one object - the next thing to do is to scan to see) N
( * if any further items are in the new space, and if so I will copy) N
( * their offspring.) N
( */) N
(        ) p
(for) K
( \(;;\)) p n
(        {) N
(            ) S
(switch) K
( \(next\)) p n
(            {) N
(        ) S
(case) K
( CONT:) p n
(                ) S
(if) K
( \(tr_fr != fr\)) p n
(                {   tr_fr = tr_fr - ) S
(sizeof) K
(\(Cons_Cell\);) p n
(                    ) S
(if) K
( \(qcar\(tr_fr\) == SPID_GCMARK\)) p n
(                    {   ) S
(char) k
( *w;) p n
(                        p1 = new_heap_pages[trailing_heap_pages_count++];) N
(                        w = \() S
(char) k
( *\)quadword_align_up\(\(intptr_t\)p1\);) p n
(                        tr_fr = w + \(CSL_PAGE_SIZE - ) S
(sizeof) K
(\(Cons_Cell\)\);) p n
(                    }) N
(                    next = DONE_CAR;) N
(                    p = &qcar\(tr_fr\);) N
(                    ) S
(break) K
(;              ) p
(/* Takes me to the outer loop */) c n
(                }) p n
(                ) S
(else) K
( ) p
(if) K
( \(tr_vfr != vfr\)) p n
(                {   Header h;) N
(                    h = *\(Header *\)tr_vfr;) N
(                    ) S
(if) K
( \(h == 0\)) p n
(                    {   ) S
(char) k
( *w;) p n
(                        p1 = new_vheap_pages[trailing_vheap_pages_count++];) N
(                        w = \() S
(char) k
( *\)doubleword_align_up\(\(intptr_t\)p1\);) p n
(                        tr_vfr = w + 8;) N
(                        h = *\(Header *\)tr_vfr;) N
(                    }) N
(                    ) S
(if) K
( \(is_symbol_header\(h\)\)) p n
(                    {   next = DONE_VALUE;   ) N
(                        p = &\(\(\(Symbol_Head *\)tr_vfr\)->value\);) N
(                        ) S
(break) K
(;) p n
(                    }) N
(                    ) S
(else) K n
(                    {   intptr_t len = doubleword_align_up\(length_of_header\(h\)\);) p n
(                        tr = tr_vfr;) N
(                        tr_vfr = tr_vfr + len;) N
(oddcopy.c) (Page 5/7) (Jan 19, 07 20:29) title
border
grestore
(Printed by U-PANAMINT\\acn1) rhead
() (5/7) (Friday January 19, 2007) footer
end % of iso1dict
pagesave restore
showpage
%%Page: (6) 6
%%BeginPageSetup
/pagesave save def
%%EndPageSetup
iso1dict begin
gsave
llx lly 12 add translate
/v 0 store
/x0 x v get 4.703931 add sx cw mul add store
/y0 y v get bfs th add sub store
x0 y0 moveto
(                        ) p
(switch) K
( \(type_of_header\(h\)\)) p n
(                        {) N
(#ifdef) K
( COMMON) p n
(                    ) S
(case) K
( TYPE_SINGLE_FLOAT:) p n
(                    ) S
(case) K
( TYPE_LONG_FLOAT:) p n
(#endif) K n
(                    ) p
(case) K
( TYPE_DOUBLE_FLOAT:) p n
(                    ) S
(case) K
( TYPE_BIGNUM:) p n
(                            ) S
(continue) K
(;) p n
(                    ) S
(case) K
( TYPE_MIXED1: ) p
(case) K
( TYPE_MIXED2:) p n
(                    ) S
(case) K
( TYPE_MIXED3: ) p
(case) K
( TYPE_STREAM:) p n
(                            next = 2*CELL;) N
(                            ) S
(break) K
(;) p n
(/*) c n
( * There is a slight delight here. The test "vector_holds_binary" is only) N
( * applicable if the header to be checked is a header of a genuine vector,) N
( * ie something that would have TAG_VECTOR in the pointer to it. But here) N
( * various numeric data types also live in the vector heap, so I need to) N
( * separate them out explicitly. The switch block here does slightly more than) N
( * it actually HAS to, since the vector_holds_binary test would happen to) N
( * deal with several of the numeric types "by accident", but I feel that) N
( * the security of listing them as separate cases is more important than the) N
( * minor speed-up that might come from exploiting such marginal behaviour.) N
( */) N
(                    ) p
(default) K
(:) p n
(                            ) S
(if) K
( \(vector_holds_binary\(h\)\) ) p
(continue) K
(;) p n
(#ifdef) K
( COMMON) p n
(                    ) S
(case) K
( TYPE_RATNUM:) p n
(                    ) S
(case) K
( TYPE_COMPLEX_NUM:) p n
(#endif) K n
(                            next = len - 2*CELL;) p n
(                            ) S
(break) K
(;) p n
(                        }) N
(                        p = \(Lisp_Object *\)\(tr + next + CELL\);) N
(                        ) S
(break) K
(;) p n
(                    }) N
(                }) N
(                ) S
(else) K n
(                {   fringe = \(Lisp_Object\)fr;) p n
(                    vfringe = \(Lisp_Object\)vfr;) N
(                    ) S
(return) K
(;        ) p
(/* Final exit when all has been copied */) c n
(                }) p n
(        ) S
(case) K
( DONE_CAR:) p n
(                next = CONT;) N
(                p = &qcdr\(tr_fr\);) N
(                ) S
(break) K
(;) p n
(        ) S
(case) K
( DONE_VALUE:) p n
(                next = DONE_ENV;   ) N
(                p = &\(\(\(Symbol_Head *\)tr_vfr\)->env\);) N
(                ) S
(break) K
(;) p n
(        ) S
(case) K
( DONE_ENV:) p n
(                next = DONE_FASTGETS;   ) N
(                p = &\(\(\(Symbol_Head *\)tr_vfr\)->fastgets\);) N
(                ) S
(break) K
(;) p n
(        ) S
(case) K
( DONE_FASTGETS:) p n
(                next = DONE_PNAME;   ) N
(                p = &\(\(\(Symbol_Head *\)tr_vfr\)->pname\);) N
(oddcopy.c) (Page 6/7) (Jan 19, 07 20:29) title
border
grestore
(Printed by U-PANAMINT\\acn1) rhead
() (Friday January 19, 2007) (6/7) footer
end % of iso1dict
pagesave restore
showpage
%%Page: (7) 7
%%BeginPageSetup
/pagesave save def
%%EndPageSetup
iso1dict begin
gsave
llx lly 12 add translate
/v 0 store
/x0 x v get 4.703931 add sx cw mul add store
/y0 y v get bfs th add sub store
x0 y0 moveto
(                ) p
(break) K
(;) p n
(        ) S
(case) K
( DONE_PNAME:) p n
(#ifndef) K
( COMMON) p n
(                next = CONT;) N
(                p = &\(\(\(Symbol_Head *\)tr_vfr\)->plist\);) N
(                tr_vfr = tr_vfr + symhdr_length;) N
(                ) S
(break) K
(;) p n
(#else) K n
(                next = DONE_PLIST;   ) p n
(                p = &\(\(\(Symbol_Head *\)tr_vfr\)->plist\);) N
(                ) S
(break) K
(;) p n
(        ) S
(case) K
( DONE_PLIST:) p n
(                next = CONT;) N
(                p = &\(\(\(Symbol_Head *\)tr_vfr\)->package\);) N
(                tr_vfr = tr_vfr + symhdr_length;) N
(                ) S
(break) K
(;) p n
(#endif) K n
(        ) p
(default) K
(:) p n
(                p = \(Lisp_Object *\)\(tr + next\);) N
(                next -= CELL;) N
(                ) S
(break) K
(;) p n
(            }) N
(            ) S
(break) K
(;) p n
(        }) N
(    }) N
(}) N
() N
(oddcopy.c) (Page 7/7) (Jan 19, 07 20:29) title
border
grestore
(Printed by U-PANAMINT\\acn1) rhead
() (7/7) (Friday January 19, 2007) footer
end % of iso1dict
pagesave restore
showpage

%%Trailer
end
%%EOF
