Fix string returns
This commit is contained in:
parent
bfe0f8a09b
commit
e5cb65a302
Binary file not shown.
11
README.md
11
README.md
|
@ -197,7 +197,16 @@ to contact me.
|
||||||
* Fix crash bug in `Socket Inet Ntoa$` if called with the BSD Socket library
|
* Fix crash bug in `Socket Inet Ntoa$` if called with the BSD Socket library
|
||||||
was not open.
|
was not open.
|
||||||
|
|
||||||
#
|
### 1.1.2 (2024-03-18)
|
||||||
|
|
||||||
|
* Fix all functions that return strings so that strings work properly
|
||||||
|
in AMOS. While you could kind of use the immediate return value of the
|
||||||
|
string, any future manipulation of that string would fail. This fixes
|
||||||
|
the following functions:
|
||||||
|
* `Socket Inet Ntoa$`
|
||||||
|
* `Dns Get Address By Name$`
|
||||||
|
* `Socket Recv$`
|
||||||
|
|
||||||
# Development
|
# Development
|
||||||
|
|
||||||
### Environment
|
### Environment
|
||||||
|
|
119
src/BSDSocket.s
119
src/BSDSocket.s
|
@ -7,7 +7,7 @@
|
||||||
; extension number 18
|
; extension number 18
|
||||||
ExtNb equ 18-1
|
ExtNb equ 18-1
|
||||||
Version MACRO
|
Version MACRO
|
||||||
dc.b "1.1.1-20240317"
|
dc.b "1.1.2-20240318"
|
||||||
ENDM
|
ENDM
|
||||||
VerNumber equ $1
|
VerNumber equ $1
|
||||||
|
|
||||||
|
@ -1184,12 +1184,12 @@ _SocketSelect_PerformSelect
|
||||||
Lib_Par SocketInetNtoA
|
Lib_Par SocketInetNtoA
|
||||||
; - - - - - - - - - - - - -
|
; - - - - - - - - - - - - -
|
||||||
PreserveStackFunction
|
PreserveStackFunction
|
||||||
EnsureBSDSocketLibrary _SocketInetNtoa_LibraryOpen
|
EnsureBSDSocketLibrary _SocketInetNtoA_LibraryOpen
|
||||||
|
|
||||||
RestoreStackFunction
|
RestoreStackFunction
|
||||||
Ret_Int
|
Ret_Int
|
||||||
|
|
||||||
_SocketInetNtoa_LibraryOpen:
|
_SocketInetNtoA_LibraryOpen:
|
||||||
MOVE.L D3,D0
|
MOVE.L D3,D0
|
||||||
WithDataStorageToA3
|
WithDataStorageToA3
|
||||||
LoadBSDSocketBaseFromA3
|
LoadBSDSocketBaseFromA3
|
||||||
|
@ -1204,22 +1204,27 @@ _SocketInetNtoA_StringSizeLoop:
|
||||||
TST.B (A0)+
|
TST.B (A0)+
|
||||||
BNE _SocketInetNtoA_StringSizeLoop
|
BNE _SocketInetNtoA_StringSizeLoop
|
||||||
|
|
||||||
MOVE.L A0,D3
|
MOVE.L A0,D4
|
||||||
SUB.L A2,D3 ; D3 = length
|
SUB.L A2,D4 ; D4 = length
|
||||||
SUBQ #1,D3 ; get rid of the null terminator
|
SUBQ #1,D4 ; get rid of the null terminator
|
||||||
|
|
||||||
|
; add 2 and even out the space
|
||||||
|
MOVE.L D4,D3
|
||||||
|
AND.W #$FFFE,D3
|
||||||
|
ADDQ.W #2,D3
|
||||||
|
|
||||||
Rjsr L_Demande ; string base address is in A0/A1
|
Rjsr L_Demande ; string base address is in A0/A1
|
||||||
|
|
||||||
MOVE.W D3,(A0)+ ; length of string
|
LEA 2(A0,D3.W),A1
|
||||||
SUBQ #1,D3
|
|
||||||
|
|
||||||
|
MOVE.L A1,HiChaine(A5)
|
||||||
|
MOVE.L A0,A1
|
||||||
|
|
||||||
|
MOVE.W D4,(A0)+ ; length of string
|
||||||
|
SUBQ #1,D4
|
||||||
_SocketInetNtoA_StringCopyLoop:
|
_SocketInetNtoA_StringCopyLoop:
|
||||||
MOVE.B (A2,D3),(A0,D3)
|
MOVE.B (A2,D4),(A0,D4)
|
||||||
DBRA D3,_SocketInetNtoA_StringCopyLoop
|
DBRA D4,_SocketInetNtoA_StringCopyLoop
|
||||||
|
|
||||||
; make the address even
|
|
||||||
EvenOutStringAddress A0,D3
|
|
||||||
|
|
||||||
MOVE.L A0,HiChaine(A5) ; Does L_Demande nuke A5 too?
|
|
||||||
|
|
||||||
MOVE.L A1,D3 ; string return
|
MOVE.L A1,D3 ; string return
|
||||||
|
|
||||||
|
@ -1267,14 +1272,12 @@ _SocketRecvString_NotNegative:
|
||||||
|
|
||||||
_SocketRecvString_NotTooLong:
|
_SocketRecvString_NotTooLong:
|
||||||
MOVE.L A3,-(SP) ; preserve A3
|
MOVE.L A3,-(SP) ; preserve A3
|
||||||
|
|
||||||
MOVE.L D0,-(SP) ; preserve D0
|
MOVE.L D0,-(SP) ; preserve D0
|
||||||
; reserve memory for recv buffer
|
; reserve memory for recv buffer
|
||||||
Rjsr L_RamFast ; D0 now contains memory pointer
|
Rjsr L_RamFast ; D0 now contains memory pointer
|
||||||
BNE _SocketRecvString_BufferAllocated
|
BNE _SocketRecvString_BufferAllocated
|
||||||
; reserve failed
|
; reserve failed
|
||||||
MOVE.L (SP)+,D0
|
MOVE.L (SP)+,D0
|
||||||
|
|
||||||
MOVE.L (SP)+,A3
|
MOVE.L (SP)+,A3
|
||||||
|
|
||||||
MOVE.L ChVide(A5),D3 ; empty string
|
MOVE.L ChVide(A5),D3 ; empty string
|
||||||
|
@ -1284,16 +1287,14 @@ _SocketRecvString_NotTooLong:
|
||||||
_SocketRecvString_BufferAllocated:
|
_SocketRecvString_BufferAllocated:
|
||||||
MOVE.L D0,A0 ; buffer address
|
MOVE.L D0,A0 ; buffer address
|
||||||
MOVE.L D1,D0 ; socket
|
MOVE.L D1,D0 ; socket
|
||||||
MOVE.L (SP)+,D1 ; length
|
MOVE.L (SP)+,D1 ; reserved ram buffer length
|
||||||
MOVEQ #0,D2 ; flags
|
MOVEQ #0,D2 ; flags
|
||||||
|
|
||||||
MOVEM.L A0-A1/D1,-(SP)
|
MOVEM.L A0-A1/D1,-(SP)
|
||||||
|
|
||||||
WithDataStorageToA3
|
WithDataStorageToA3
|
||||||
LoadBSDSocketBaseFromA3
|
LoadBSDSocketBaseFromA3
|
||||||
CALLLIB recv ; D0 has received length or -1
|
CALLLIB recv ; D0 has received length or -1
|
||||||
EndDataStorage
|
EndDataStorage
|
||||||
|
|
||||||
MOVEM.L (SP)+,A0-A1/D1
|
MOVEM.L (SP)+,A0-A1/D1
|
||||||
|
|
||||||
; did we receive data? if we didn't get a single byte, we're done
|
; did we receive data? if we didn't get a single byte, we're done
|
||||||
|
@ -1304,7 +1305,6 @@ _SocketRecvString_BufferAllocated:
|
||||||
MOVE.L D1,D0
|
MOVE.L D1,D0
|
||||||
MOVE.L A0,A1
|
MOVE.L A0,A1
|
||||||
Rjsr L_RamFree
|
Rjsr L_RamFree
|
||||||
|
|
||||||
MOVE.L (SP)+,A3
|
MOVE.L (SP)+,A3
|
||||||
|
|
||||||
MOVE.L ChVide(A5),D3
|
MOVE.L ChVide(A5),D3
|
||||||
|
@ -1314,37 +1314,37 @@ _SocketRecvString_BufferAllocated:
|
||||||
; TODO received data is wrong somewhere
|
; TODO received data is wrong somewhere
|
||||||
|
|
||||||
_SocketRecvString_DataReceived:
|
_SocketRecvString_DataReceived:
|
||||||
; D0 contains receive length
|
; D0 contains socket receive length
|
||||||
|
|
||||||
MOVE.L D1,-(SP)
|
; TODO: handle zero return length
|
||||||
|
|
||||||
|
MOVE.L A0,A2 ; A2 contains read buffer
|
||||||
|
|
||||||
|
MOVE.L D1,-(SP) ; reserved ram buffer length
|
||||||
|
; demande/hichaine string setup
|
||||||
MOVEQ #0,D3
|
MOVEQ #0,D3
|
||||||
MOVE.W D0,D3 ; prep for L_Demande. can we request a zero length string?
|
MOVE.W D0,D3
|
||||||
MOVE.L A0,A2 ; L_Demande blows away A0 and A1, A2 now contains buffer
|
AND.W #$FFFE,D3
|
||||||
|
ADDQ #2,D3
|
||||||
Rjsr L_Demande ; A0/A1 contain string address
|
Rjsr L_Demande ; A0/A1 contain string address
|
||||||
|
|
||||||
MOVE.W D3,(A0)+ ; put in string length
|
LEA 2(A0,D3.W),A1
|
||||||
SUBQ #1,D3 ; reduce by one for DBRA
|
MOVE.L A1,HiChaine(A5)
|
||||||
|
MOVE.L A0,A1
|
||||||
|
|
||||||
|
MOVE.W D0,(A1)+ ; put in string length
|
||||||
|
SUBQ #1,D0 ; reduce by one for DBRA
|
||||||
MOVE.L A2,A3 ; A3 now contains start of buffer
|
MOVE.L A2,A3 ; A3 now contains start of buffer
|
||||||
|
|
||||||
_SocketRecvString_CopyData:
|
_SocketRecvString_CopyData:
|
||||||
MOVE.B (A2,D3),(A0,D3)
|
MOVE.B (A2,D0),(A1,D0)
|
||||||
DBRA D3,_SocketRecvString_CopyData
|
DBRA D0,_SocketRecvString_CopyData
|
||||||
|
MOVE.L (SP)+,D0 ; reserved ram buffer length
|
||||||
|
|
||||||
EvenOutStringAddress A0,D2
|
MOVE.L A0,-(SP)
|
||||||
|
|
||||||
; add to string manager for garbage collection?
|
|
||||||
MOVE.L A0,HiChaine(A5)
|
|
||||||
MOVE.L (SP)+,D0
|
|
||||||
|
|
||||||
; free ram
|
|
||||||
MOVE.L A1,-(SP) ; A1 contains our string addres
|
|
||||||
|
|
||||||
;MOVE.L D1,D0
|
|
||||||
MOVE.L A3,A1
|
MOVE.L A3,A1
|
||||||
Rjsr L_RamFree
|
Rjsr L_RamFree
|
||||||
|
MOVE.L (SP)+,D3
|
||||||
MOVE.L (SP)+,D3 ; string return
|
|
||||||
|
|
||||||
MOVE.L (SP)+,A3
|
MOVE.L (SP)+,A3
|
||||||
|
|
||||||
RestoreStackFunction
|
RestoreStackFunction
|
||||||
|
@ -1735,7 +1735,7 @@ _SocketReuseAddr_LibraryOpen:
|
||||||
|
|
||||||
|
|
||||||
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
; =Dns Get Host Address By Name$(Name String)
|
; =Dns Get Address By Name$(Name String)
|
||||||
;
|
;
|
||||||
; Get the status of a socket
|
; Get the status of a socket
|
||||||
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -1789,14 +1789,6 @@ _SocketReuseAddr_LibraryOpen:
|
||||||
TST.L D0
|
TST.L D0
|
||||||
BNE .GetIPAddress
|
BNE .GetIPAddress
|
||||||
|
|
||||||
Dlea DebugArea,A0
|
|
||||||
MOVE.L D3,A1
|
|
||||||
MOVE.L #1,(A0)+
|
|
||||||
MOVE.W (A1),(A0)+
|
|
||||||
MOVE.W (A1),D2
|
|
||||||
MOVE.B 1(A1,D2),(A0)+
|
|
||||||
MOVE.B 2(A1,D2),(A0)+
|
|
||||||
|
|
||||||
RestoreStackFunction
|
RestoreStackFunction
|
||||||
|
|
||||||
MOVE.L ChVide(A5),D3
|
MOVE.L ChVide(A5),D3
|
||||||
|
@ -1813,9 +1805,6 @@ _SocketReuseAddr_LibraryOpen:
|
||||||
CALLLIB Inet_NtoA
|
CALLLIB Inet_NtoA
|
||||||
EndDataStorage
|
EndDataStorage
|
||||||
|
|
||||||
Dlea DebugArea,A0
|
|
||||||
MOVE.L D0,(A0)+
|
|
||||||
|
|
||||||
MOVE.L D0,A2
|
MOVE.L D0,A2
|
||||||
MOVE.L A2,-(SP)
|
MOVE.L A2,-(SP)
|
||||||
MOVEQ #0,D3
|
MOVEQ #0,D3
|
||||||
|
@ -1826,21 +1815,21 @@ _SocketReuseAddr_LibraryOpen:
|
||||||
BNE .GetIPAddressLength
|
BNE .GetIPAddressLength
|
||||||
MOVE.L (SP)+,A2
|
MOVE.L (SP)+,A2
|
||||||
|
|
||||||
Dlea DebugArea,A0
|
MOVE.L D3,D4
|
||||||
MOVE.L D3,(A0)+
|
AND.W #$FFFE,D3
|
||||||
|
ADDQ #2,D3
|
||||||
|
|
||||||
Rjsr L_Demande ; string is in A0/A1
|
Rjsr L_Demande ; string is in A0/A1
|
||||||
MOVE.W D3,(A0)+
|
LEA 2(A0,D3.W),A1
|
||||||
SUBQ #1,D3
|
MOVE.L A1,HiChaine(A5)
|
||||||
|
MOVE.L A0,D3
|
||||||
|
|
||||||
|
MOVE.W D4,(A0)+
|
||||||
|
SUBQ #1,D4
|
||||||
|
|
||||||
.KeepCopying:
|
.KeepCopying:
|
||||||
MOVE.B (A2,D3),(A0,D3)
|
MOVE.B (A2,D4),(A0,D4)
|
||||||
DBRA D3,.KeepCopying
|
DBRA D4,.KeepCopying
|
||||||
|
|
||||||
EvenOutStringAddress A0,D0
|
|
||||||
|
|
||||||
MOVE.L A0,HiChaine(A5)
|
|
||||||
MOVE.L A1,D3
|
|
||||||
|
|
||||||
RestoreStackFunction
|
RestoreStackFunction
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue