string len field is now 1 byte only
6 files changed, 51 insertions(+), 36 deletions(-)

M bootstrap.asm
M bootstrap2.fox
M elf64.fox
M swapwm-config.def.fox
M swapwm.fox
M system.fox
M bootstrap.asm +25 -22
@@ 29,9 29,12 @@ global _start
 ; pointer size for operands
 %define ptr qword
 
+%define strlensize 1
+%define strlentype byte
+
 %macro string 1
 	%strlen len %1
-	dq len
+	db len
 	db %1, 0
 %endmacro
 

          
@@ 341,8 344,8 @@ fcreate number
 	mov r9, [base]
 	mov r8, 1
 	xor rbp, rbp
-	lea rdx, [tos+ptrsize]
-	mov tos, [tos]	; fetch len of string
+	lea rdx, [tos+strlensize]
+	movzx tos, strlentype [tos]	; fetch len of string
 	; set rbx to the last char, so -1, otherwise we would be
 	; at the first byte after the string
 	lea rbx, [rdx+tos-1]

          
@@ 376,7 379,7 @@ fcreate number
 	mpop
 	ret
 
-; ( number base -- saddr )
+; ( number base -- *str )
 ; be aware: ".s" uses itoa, so it will overwrite the result in repl mode !
 fcreate itoa
 	mpush rbx, rbp, rcx, rdi, rdx

          
@@ 423,8 426,8 @@ fcreate itoa
 .positive2:
 	; save len of string
 	sub rdi, rcx ; rdi: #chars
-	lea rdx, [rcx-ptrsize+1] ; only -(ptrsize-1) because of last dec in loop
-	mov [rdx], rdi
+	lea rdx, [rcx-strlensize+1] ; only -(strlensize-1) because of last dec in loop
+	mov [rdx],  dil				; strlen
 	; push addr of string
 	mov tos, rdx
 	

          
@@ 444,9 447,9 @@ fcreate printstr, `".`
 ; ( fd addr - )
 fcreate writestr, `"write`
 	dup
-	mov tos, [tos]		; load len
+	movzx tos, strlentype [tos]		; strlen
 	 ; skip len field to push data buffer
-	add  ptr nos, ptrsize
+	add  ptr nos, strlensize
 	exec write
 	; todo: error handling
 	drop

          
@@ 464,13 467,13 @@ fcreate cmpstr, `"=?`
 	
 	mov rsi, tos
 	; compare len field
-	mov rcx, ptr [rsi]
-	cmp rcx, ptr [rdi]
+	movzx rcx, strlentype [rsi]		; strlen
+	cmp cl, strlentype [rdi]		; strlen
 	jnz .quit
 	
 	; same len, compare data, rcx is counted down
-	lea rdi, [rdi+ptrsize]
-	lea rsi, [rsi+ptrsize]
+	lea rdi, [rdi+strlensize]
+	lea rsi, [rsi+strlensize]
 	repz cmpsb
 .quit:
 	pop rsi

          
@@ 503,7 506,7 @@ fcreate getc
 	cmp tos4, [buflen]
 	je .readmore
 	; lea tos, [buf]	; need this step because of rpi relative addressing
-	movzx tos4, byte [buf+tos]; fetch char from bufcurr	
+	movzx tos, byte [buf+tos]; fetch char from bufcurr	
 	inc ptr [bufcurr]
 	ret
 .readmore:

          
@@ 546,9 549,9 @@ fcreate word
 ; fcreate doword, "(word)"
 	mpush rbx, rcx
 	mov rbx, tos
-	lea rbx, [rbx+ptrsize]	; skip len field
+	lea rbx, [rbx+strlensize]	; skip len to string data field
 	call skipws
-	mov rcx, rbx			; ecx = counter
+	mov rcx, rbx			; rcx = begin of string data field
 	; ( c saddr c )
 .nextchar:
 	mov [rbx], al

          
@@ 568,7 571,7 @@ fcreate word
 	neg rcx
 	mov rbx, nos	; len address
 	nip
-	mov [rbx], rcx
+	mov [rbx], cl	; strlen
 	mov tos, rbx
 	mpop
 	ret

          
@@ 577,7 580,7 @@ fcreate word
 fcreate find, "(find)"
 	mpush rbx, rcx
 	
-	mov rbx, [tos]
+	mov rbx, [tos]	; rbx = dict address 
 	drop
 .prev:
 	; ( *str )

          
@@ 837,7 840,7 @@ create:
 	; save word name
 	exec word
 	drop
-	
+	; ( *dp -- )	
 	; rbx holds dp
 	mov rbx, [dictp]
 	; save new prev

          
@@ 852,12 855,12 @@ create:
 	mov [rbx], rcx
 	lea rbx, [rbx+ptrsize]
 	; name len field comes now, skip string
-	mov rcx, [rbx]
+	movzx rcx, strlentype [rbx]		; fetch strlen
 	; skip len field, string and \0 at the end
-	lea rbx, [rcx+rbx+ptrsize+1]
+	lea rbx, [rcx+rbx+strlensize+1]
 	; append empty symbol field name
-	mov ptr [rbx], 0
-	lea rbx, [rbx+ptrsize]
+	mov strlentype [rbx], 0
+	lea rbx, [rbx+strlensize]
 	; save new dp
 	mov [dictp], rbx
 	mpop

          
M bootstrap2.fox +5 -3
@@ 142,16 142,18 @@ vp
 		neg neg drop -if 2d precede then
 		\ add len of string
 		( endaddr startaddr )
-		swap over - rpush # 1 cell 1- # lit - rpop over ! ;
+		swap over - rpush 
+		( startaddr  r: strlen )
+		# "lensize 1- # lit - rpop over !"len ;
 
 			( *str -- len )
-: "len		@ ;
+: "len		"len ;
 
 			( *str -- len *data )
 : "split	dup "len swap #	\ fall through
 
 			( *str -- *data )
-: "data		# 1 cell # lit + ;
+: "data		# "lensize # lit + ;	\ break dependency on "lensize
 
 		base @ var
 base

          
M elf64.fox +0 -2
@@ 180,8 180,6 @@ elfh-size swap !2  elfh-size swap !8
 	\ 
 	\ some tools before we proceed ===============
 	\ 
-			( *string -- len )
-: "len		@ ;
 
 			( *string -- len *data )
 : "split	dup "len swap "data ;

          
M swapwm-config.def.fox +5 -2
@@ 6,12 6,15 @@ hex
 			\ don't use after connecting.
 			\ we use the len field to store struct members
 			\ of struct sockaddr_un.
-			vhere
-			" /tmp/.X11-unix/X0" string
+			\ thatswhy we don't save the string as is, but with 16 bit
+			\ in front of string data.
+			vhere 0 v,1	\ add a byte, because we need 16 bit (strlen)
+			" /tmp/.X11-unix/X0" drop dup vlabel
 socket-name
 			vhere - neg const
 sockaddr-size
 
+
 (
 xmodmap -pm on my machine:
 

          
M swapwm.fox +2 -2
@@ 59,8 59,8 @@ sockfd		\ x11 socket file handle
 			  required value. )
 			( fd --  )
 : connect	\ first write family af-unix into len field as a word
-			dodbg sockfd @ socket-name # 1 cell 2 - # lit + af-unix over !2
-			sockaddr-size ( todo: 1 cell - 2 + ) sys-connect syscall3 " connect" -panic 
+			dodbg sockfd @ socket-name af-unix over !2
+			sockaddr-size sys-connect syscall3 " connect" -panic 
 			dodbg1 ;
 
 			\ one x11 unit is 4 bytes.

          
M system.fox +14 -5
@@ 79,8 79,9 @@ m: @	rex.w, #					( REX.W for using rax 
 m: @4	008b ,2 ;					( mov eax, [rax] )
 : @8 #	: @ @ ;			: @4 @4 ;
 m: @2 	00b70f48 ,4 ;	: @2 @2 ;	( movzx rax, word ptr [rax] )
-m: @1	00b60f67 ,4 ;	: @1 @1 ;	( movzx rax, byte ptr [rax] )
-
+m: "len	#		( fetch string length )
+m: @1	00b60f67 ,4 ;				( movzx rax, byte ptr [rax] )
+: "len "len ;		: @1 @1 ;
 		( n addr --  )
 m: !8	#
 m: !	c28948 ,3 ^ drop				( mov rdx, rax )

          
@@ 89,8 90,10 @@ m: !4	c28948 ,3 ^ drop				( mov rdx, rax
 		0289 ,2 ^ drop ;	: !4 !4 ;	( mov [rdx], eax )
 m: !2	c28948 ,3 ^ drop				( mov rdx, rax )
 		028966 ,3 ^ drop ;	: !2 !2 ;	( mov [rdx], ax )
+m: !"len	#
 m: !1	c28948 ,3 ^ drop				( mov rdx, rax )
 		0288 ,2  ^ drop	;	: !1 !1 ;	( mov [rdx], al )
+: !"len !"len ;
 
 		( add n to [addr] )
 		( n addr -- )

          
@@ 257,12 260,14 @@ m: cpush	lit4 ;	( elf )
 : oct	8 base ! ;
 
 		( n -- )
+: v,"len	#		( append string length field )
 : v,1	1 vp (,) ;
 : v,2	2 vp (,) ;
 : v,4	4 vp (,) ;
 : v, 	#
 : v,8 	8 vp (,)  ;
 
+
 			
 : valloc	( n -- ) vp +! ;
 : vhere		( -- n ) vp @ ;

          
@@ 281,6 286,7 @@ m: cpush	lit4 ;	( elf )
 : vlabel # ( elf )
 : const	fcreate ^ lit ^ ;; ;
 
+
 \ todo: remove if external symbols in elf64.fox are removed
 cp vlabel cp	\ needed by asm.fox
 

          
@@ 317,12 323,12 @@ ffind fdp
 		  the string is appended to the data block )
 		( -- saddr )
 : "		vhere		\ save vp to save string len later
-		0 v,		\ leave space for string len
+		0 v,"len		\ leave space for string len
 		c"
 		\ compute and store len
 		( *str *strdata )
 		vhere 1-  - neg	\ 1- because of trailing 0
-		over ! ;
+		over !"len ;
 
 		(  m: --  i: -- saddr )
 m: "	# ffind " call, # ^ vpush ;

          
@@ 392,7 398,10 @@ dcols
 
 : ret, ^ ;; ;
 
-: "data        # 1 cell # lit + ;
+		1 const
+"lensize
+
+: "data	"lensize + ;
 
 		( dictaddr -- code field link address )
 : cfl	# 1 cell # lit + ;