Difference between revisions of "MB ElementCount"

From WikiPrizm
Jump to navigationJump to search
(Simply example code. Also the second example was dangerous as the buffer was smaller than the string.)
Line 30: Line 30:
 
locate_OS(2,3);
 
locate_OS(2,3);
 
Print_OS(MBstring, 0, 0); // will print "Empty box: " followed by a square.
 
Print_OS(MBstring, 0, 0); // will print "Empty box: " followed by a square.
 +
</nowiki>
 +
comments =
 +
Here is a disassembly of the function.
 +
<nowiki>! =============== S U B R O U T I N E =======================================
 +
 +
 +
MB_ElementCount:
 +
tst r4, r4 ! Is r4 NULL?
 +
bt MB_ElementCount_exit ! If yes, branch.
 +
mov #0xFFFFFFE5, r1
 +
mov #0xFFFFFFE6, r7
 +
extu.b r1, r1 ! r1=229
 +
mov #0, r5
 +
bra loc_801A3478
 +
extu.b r7, r7 ! r7=230
 +
! ---------------------------------------------------------------------------
 +
 +
MB_ElementCount_charLoop:
 +
cmp/eq #0x7F, r0
 +
bt loc_801A3472
 +
cmp/eq r1, r0
 +
bt loc_801A3472
 +
cmp/eq r7, r0
 +
bt loc_801A3472
 +
mov #0xFFFFFFE7, r2
 +
extu.b r2, r2
 +
cmp/eq r2, r0
 +
bt loc_801A3472
 +
mov #0xFFFFFFF7, r2
 +
extu.b r2, r2
 +
cmp/eq r2, r0
 +
bt loc_801A3472
 +
mov #0xFFFFFFF9, r2
 +
extu.b r2, r2
 +
cmp/eq r2, r0
 +
bf loc_801A3474
 +
 +
loc_801A3472:
 +
add #1, r4
 +
 +
loc_801A3474:
 +
add #1, r4
 +
add #1, r5
 +
 +
loc_801A3478:
 +
mov.b @r4, r2
 +
extu.b r2, r0
 +
tst r0, r0
 +
bf MB_ElementCount_charLoop ! Branch if the character has a non-zero value.
 +
rts
 +
mov r5, r0
 +
! ---------------------------------------------------------------------------
 +
 +
MB_ElementCount_exit:
 +
rts
 +
mov #0, r0
 +
! End of function MB_ElementCount
 
</nowiki>
 
</nowiki>
 
}}
 
}}

Revision as of 21:25, 14 February 2015


Synopsis

Header: fxcg/system.h
Syscall index: 0x1163
Function signature: int MB_ElementCount(const char* buf)

Counts the number of characters, as printed on screen, of a multi-byte string.

Parameters

  • buf - pointer to the string to measure.

Returns

The number of characters in the string, as printed by multi-byte-aware syscalls.

Example

The following example shows how a multi-byte string can take a memory space that's twice as large as the number of printed characters, and demonstrates how to count both size in bytes and graphical size:

const char*MBstring="\xe6\x92\xe6\x93\xe6\xa5"
int bytelen = strlen(MBstring);
// bytelen has a value of 6
int elemlen = MB_ElementCount(MBstring);
// elemlen has a value of 3

locate_OS(2,3);
Print_OS(MBstring, 0, 0); // will print three symbols on screen: an arrow up, an arrow down and a square.

Another example, which mixes standard and multi-byte characters:

const char*MBstring="Empty box: \xe6\xa5";
int bytelen = strlen(MBstring);
// bytelen has a value of 13
int elemlen = MB_ElementCount(MBstring);
// elemlen has a value of 12

locate_OS(2,3);
Print_OS(MBstring, 0, 0); // will print "Empty box: " followed by a square.

comments = Here is a disassembly of the function.

! =============== S U B	R O U T	I N E =======================================


MB_ElementCount:
		tst	r4, r4		! Is r4	NULL?
		bt	MB_ElementCount_exit ! If yes, branch.
		mov	#0xFFFFFFE5, r1
		mov	#0xFFFFFFE6, r7
		extu.b	r1, r1		! r1=229
		mov	#0, r5
		bra	loc_801A3478
		extu.b	r7, r7		! r7=230
! ---------------------------------------------------------------------------

MB_ElementCount_charLoop:
		cmp/eq	#0x7F, r0
		bt	loc_801A3472
		cmp/eq	r1, r0
		bt	loc_801A3472
		cmp/eq	r7, r0
		bt	loc_801A3472
		mov	#0xFFFFFFE7, r2
		extu.b	r2, r2
		cmp/eq	r2, r0
		bt	loc_801A3472
		mov	#0xFFFFFFF7, r2
		extu.b	r2, r2
		cmp/eq	r2, r0
		bt	loc_801A3472
		mov	#0xFFFFFFF9, r2
		extu.b	r2, r2
		cmp/eq	r2, r0
		bf	loc_801A3474

loc_801A3472:
		add	#1, r4

loc_801A3474:
		add	#1, r4
		add	#1, r5

loc_801A3478:
		mov.b	@r4, r2
		extu.b	r2, r0
		tst	r0, r0
		bf	MB_ElementCount_charLoop ! Branch if the character has a non-zero value.
		rts
		mov	r5, r0
! ---------------------------------------------------------------------------

MB_ElementCount_exit:
		rts
		mov	#0, r0
! End of function MB_ElementCount