[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Kyan Pascal - A question



Someone sent me some mail but it got deleted accidentally.
So I am posting this.  Sorry for the inconvience. :/

-------email----email----email----email----email-----------

That is what I had thought.  A friend of mine who is a
Pascal guru basically told me I was screwed. :(  The file
thing is another idea I had come up with but I just really
didn't want to do that.

You know.  It is very frustrating to get a wonderful compiler
like Kyan Pascal and then to have to deal with something
which is fundamental to programming but which has been left
out. :{.

I have gotten around most of the string problems by (I may have
posted this already) only passing the address to the procedure 
and then having a tmpString variable declared as ^char.  It is
a lot simpler to work with and the numbers only have to be declared
as integers when they are passed.  Also, it doesn't matter if you
are calling from a subprogram or the main program because you are
dealing with an address in memory somewhere.  The only problem with
this approach is that the commands are fairly long due to having
to insert the ADDRESS() function.  Thus, string copy (ripped off
from C) becomes:

        strcpy( address(AString), address(BString) );

___
The variables are always defined as going from zero to whatever
plus one.

type
	str80 = array [0..81] of char;

var
	MyString : str80;

___
This allows for me to place a length byte into the zero position
which will tell me the maximum length of the string.  The "plus
one" location will always have a zero in it no matter what.  This
allows for the terminator (zero) to always be present.

Within the subroutine I have:

procedure strcpy( AString, BString : integer );
{
        Routine to copy a string.
}
var
        tmpString : ^char;      { Temporary String Pointer }
		tmpChar : char;			{ Temporary Character Holder }
		j :	integer;			{ Misc. Variable }
        i : integer;            { Misc. Variable }
        ALength : integer;      { Length of first String }
        BLength : integer;      { Length of second string }

begin
{
	Find the maximum length of the first string.
}
	tmpString := pointer( AString );
	ALength := tmpString^;
{
	Find the maximum length of the second string.
}
	tmpString := pointer( BString );
	BLength := tmpString^;
{
	Determine which is the longest and which the shortest.
}
	j := ALength;
	if( BLength < ALength )then
		j := BLength;
{
	Copy over the information.
}
	for i := 1 to j do
		begin
			tmpString := pointer( BString + i );
			tmpChar := tmpString^;
			tmpString := pointer( AString + i );
			tmpString^ := tmpChar;
			end;
{
	Find the zero and then expand it to the end of the string.
}
	j := 0;
	for i := 1 to ALength do
		begin
			tmpString := pointer( AString + i );
			tmpChar := tmpString^;
			if( tmpChar = chr(0) )then
				j := i;
			if( j > 0 )then
				tmpString^ := chr( 0 );
			end;
{
	We are through and can now return.
}
	end;

___
This could probably be done a lot easier in assembly language
than in Pascal.  In fact, here is a stab at doing just that:

procedure strcpy( aString, bString );

begin
#a
	stx	_T
;
;	Get Everything
;
	ldy	#$08
	lda	(_SP),y
	sta _T+2
	dey
	lda	(_SP),y
	sta	_T+1
	dey
	lda	(_SP),y
	sta	_T+4
	dey
	lda	(_SP),y
	sta	_T+3
;
;	Now see which string is shorter.
;
	ldx	#$00
	lda	(_T+1),x
	cmp	(_T+3),x
	bpl	scpy01
	lda	(_T+1),x
	sta	_T+5
	jmp	scpy02

scpy01

	lda	(_T+3),x
	sta	_T+5

scpy02
;
;	Now transfer the string
;
	ldy	#$01

scpy03

	lda	(_T+3),y
	sta	(_T+1),y
	iny
	dec	_T+5
	bne scpy03
;
;	Expand the zero field
;
scpy04

	tya
	cmp	(_T+1),x
	beq	scpy05
	lda	#$00
	sta	(_T+1),y
	iny
	jmp scpy04
;
;	Done.  Return
;
scpy05

	ldx	_T
#
	end;

___
Now, I just wrote this off the top of my head, so it may
not work correctly.  Check it out and see if it does.
At any rate, this is how I have been handling strings.

----------------------------------------------------------
If the buttered side of a piece of bread always lands face
down, and a cat always lands on its feet.  Then what
happens when you tie a piece of buttered bread to the back
of a cat and drop the cat? - Steve Wright