//UDT to mimic an anypointer
TYPE UDT1
STRUCT
ID:BYTE;
TYP:BYTE;
NUM:INT;
DBN:INT;
PTR:Dint;
END_STRUCT
END_TYPE
[b]// char *my_strcpy(char *destination, char *source)[/b]
FUNCTION FC445:udt1
VAR_INPUT
Destination:ANY;
Source:ANY;
END_VAR
VAR_TEMP
SrcPtr:ANY;
DestPtr:ANY;
SrcAny AT SrcPtr:STRUCT ID:BYTE;TYP:BYTE;NUM:INT;DBN:INT;PTR:DINT;END_STRUCT;
DestAny AT DestPtr:STRUCT ID:BYTE;TYP:BYTE;NUM:INT;DBN:INT;PTR:Dint;END_STRUCT;
iSFC20Return:INT;
RetVal:udt1;
cChar:BYTE;
END_VAR
BEGIN
//copy ANY pointers locally to allow pointer elements to be manipulated
SrcPtr:=Source;
[b]// Char *p = destination;[/b]
DestPtr:=Destination;
//Set length of ANY pointers to 1 to copy a byte at a time
SrcAny.NUM:=1;
DestAny.NUM:=1;
//
[b]// While (*source != '\0')[/b]
WHILE SFC20(SRCBLK:=SrcPtr,DSTBLK:=cChar)=0 AND cChar <> B#16#0 DO
[b]// *p++ = *source++;[/b]
iSFC20Return:=SFC20(SRCBLK:=SrcPtr,DSTBLK:=DestPtr);
SrcAny.PTR:= SrcAny.PTR + 8;
DestAny.PTR:=DestAny.PTR + 8;
END_WHILE;
[b]// *p = '\0';[/b]
cChar:=B#16#0;
iSFC20Return:=SFC20(SRCBLK:=cChar,DSTBLK:=DestPtr);
[b]//Return destination;[/b]
DestPtr:=Destination;
RetVal.ID:=DestAny.ID;
RetVal.TYP:=DestAny.TYP;
RetVal.NUM:=DestAny.NUM;
RetVal.DBN:=DestAny.DBN;
RetVal.PTR:=DestAny.PTR;
fc445:=Retval;
END_FUNCTION