Difference between revisions of "MB ElementCount"

From WikiPrizm
Jump to navigationJump to search
(This function should not modify the string, so it should it should take a const pointer. Also removed unneeded casts to (char*).)
m
 
(2 intermediate revisions by the same user not shown)
Line 9: Line 9:
 
| 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:
 
| 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:
 
  <nowiki>
 
  <nowiki>
char MBstring[10];
+
const char*MBstring="\xe6\x92\xe6\x93\xe6\xa5"
strcpy(MBstring, "\xe6\x92\xe6\x93\xe6\xa5");
 
 
int bytelen = strlen(MBstring);
 
int bytelen = strlen(MBstring);
 
// bytelen has a value of 6
 
// bytelen has a value of 6
Line 23: Line 22:
  
 
  <nowiki>
 
  <nowiki>
char MBstring[10];
+
const char*MBstring="Empty box: \xe6\xa5";
strcpy(MBstring, "Empty box: \xe6\xa5");
 
 
int bytelen = strlen(MBstring);
 
int bytelen = strlen(MBstring);
 
// bytelen has a value of 13
 
// bytelen has a value of 13
Line 32: 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>
 
}}
 
}}

Latest revision as of 22:26, 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.

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

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.