string.cpp

来自「SimpleGraphicOperatingSystem 32位图形化操作系统 」· C++ 代码 · 共 175 行

CPP
175
字号
#include <stdarg.h>
#include <System.h>
#include <Api.h>	//Sgos api

namespace System{
	int vsprintf(char *buf, const char *fmt, va_list args);
	int String::GetCharCount( const char* str )
	{
		int i=0;
		while(str[i]) i++;
		return i;
	}
	char* String::Copy( char* dest, const char* src )
	{
		__asm__("cld\n"
			"1:\tlodsb\n\t"
			"stosb\n\t"
			"testb %%al,%%al\n\t"
			"jne 1b"
			::"S" (src),"D" (dest));
		return dest;
	}
	char* String::Copy( char* dest, const char* src, int count )
	{
		__asm__("cld\n"
			"1:\tdecl %2\n\t"
			"js 2f\n\t"
			"lodsb\n\t"
			"stosb\n\t"
			"testb %%al,%%al\n\t"
			"jne 1b\n\t"
			"rep\n\t"
			"stosb\n"
			"2:"
			::"S" (src),"D" (dest),"c" (count));
		return dest;
	}

	int String::Format( char* buf, const char* fmt, ... ){
		va_list args;
		int i;

		va_start(args, fmt);
		i=vsprintf(buf,fmt,args);
		va_end(args);
		return i;
	}

	char* String::Append(char * dest,const char * src)
	{
	__asm__("cld\n\t"
		"repne\n\t"
		"scasb\n\t"
		"decl %1\n"
		"1:\tlodsb\n\t"
		"stosb\n\t"
		"testb %%al,%%al\n\t"
		"jne 1b"
		::"S" (src),"D" (dest),"a" (0),"c" (0xffffffff));
	return dest;
	}

	char* String::Append(char * dest,const char * src,int count)
	{
	__asm__("cld\n\t"
		"repne\n\t"
		"scasb\n\t"
		"decl %1\n\t"
		"movl %4,%3\n"
		"1:\tdecl %3\n\t"
		"js 2f\n\t"
		"lodsb\n\t"
		"stosb\n\t"
		"testb %%al,%%al\n\t"
		"jne 1b\n"
		"2:\txorl %2,%2\n\t"
		"stosb"
		::"S" (src),"D" (dest),"a" (0),"c" (0xffffffff),"g" (count)
		);
	return dest;
	}

	int String::Compare(const char * cs,const char * ct)
	{
	register int __res __asm__("ax");
	__asm__("cld\n"
		"1:\tlodsb\n\t"
		"scasb\n\t"
		"jne 2f\n\t"
		"testb %%al,%%al\n\t"
		"jne 1b\n\t"
		"xorl %%eax,%%eax\n\t"
		"jmp 3f\n"
		"2:\tmovl $1,%%eax\n\t"
		"jl 3f\n\t"
		"negl %%eax\n"
		"3:"
		:"=a" (__res):"D" (cs),"S" (ct));
	return __res;
	}

	int String::Compare(const char * cs,const char * ct,int count)
	{
	register int __res __asm__("ax");
	__asm__("cld\n"
		"1:\tdecl %3\n\t"
		"js 2f\n\t"
		"lodsb\n\t"
		"scasb\n\t"
		"jne 3f\n\t"
		"testb %%al,%%al\n\t"
		"jne 1b\n"
		"2:\txorl %%eax,%%eax\n\t"
		"jmp 4f\n"
		"3:\tmovl $1,%%eax\n\t"
		"jl 4f\n\t"
		"negl %%eax\n"
		"4:"
		:"=a" (__res):"D" (cs),"S" (ct),"c" (count));
	return __res;
	}
	int String::CompareNoCase(const char* s1, const char* s2, int len)
	{
		int i;
		for(i=0;s1[i] && s2[i];i++)
		{
			register char c = tolower(s1[i]);
			if( c!=tolower(s2[i]) )
				return 0;
		}
	}

	int String::CompareNoCase(const char* s1, const char* s2)
	{
		int i;
		for(i=0;s1[i] && s2[i];i++)
		{
			register char c = tolower(s1[i]);
			if( c!=tolower(s2[i]) )
				return 0;
		}
		if( (!s1[i] && !s2[i]) )
			return 1;
		else
			return 0;
	}

}

int strcmp(const char * cs,const char * ct)
{
	using namespace System;
	Console::Write("strcmp ");
	Console::Write(cs);
	Console::Write(" ");
	Console::WriteLine(ct);

register int __res __asm__("ax");
__asm__("cld\n"
	"1:\tlodsb\n\t"
	"scasb\n\t"
	"jne 2f\n\t"
	"testb %%al,%%al\n\t"
	"jne 1b\n\t"
	"xorl %%eax,%%eax\n\t"
	"jmp 3f\n"
	"2:\tmovl $1,%%eax\n\t"
	"jl 3f\n\t"
	"negl %%eax\n"
	"3:"
	:"=a" (__res):"D" (cs),"S" (ct));
return __res;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?