⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tagz.cpp

📁 这是著名的TCPMP播放器在WINDWOWS,和WINCE下编译通过的源程序.笔者对其中的LIBMAD库做了针对ARM MPU的优化. 并增加了词幕功能.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include "tagz.h"

#ifdef TAGZ_UNICODE

#define _TX(X)      L##X
#define t_strdup    wcsdup
#define t_strlen    wcslen
#define t_strnicmp  wcsnicmp
#define t_atoi(x)   wcstol(x,0,10)
#define t_stricmp   wcsicmp
#define t_strstr    wcsstr
#define sprintf     swprintf

#else

#define _TX(X)      X
#define t_strdup    strdup
#define t_strlen    strlen
#define t_strnicmp  strnicmp
#define t_atoi      atoi
#define t_stricmp   stricmp
#define t_strstr    strstr

#endif

#define TABSIZE(x) (sizeof(x)/sizeof(x[0]))


class T_String
{
private:
	T_CHAR * data;
	UINT size,used;
public:
	T_String() {data=0;size=0;used=0;}
	void AddChar(T_CHAR c)
	{
		if (!data)
		{
			data=(T_CHAR*)malloc((size=512)*sizeof(T_CHAR));
			used=0;
		}
		else if (size==used)
		{
			size<<=1;
			data=(T_CHAR*)realloc((char*)data,size*sizeof(T_CHAR));
		}
		if (data) data[used++]=c;		
	}
	void AddInt(int i)
	{
		T_CHAR foo[16];
		sprintf(foo,_TX("%i"),i);
		AddString(foo);
	}
	void AddString(const T_CHAR * z)
	{
		while(*z) {AddChar(*z);z++;}
	}
	void AddString(T_String & s)
	{
		AddString(s.Peek());
	}
	~T_String()
	{
		if (data) free(data);
	}
	T_CHAR * GetBuf()
	{
		if (!data) return ::t_strdup(_TX(""));
		T_CHAR * r=(T_CHAR*)realloc(data,(used+1)*sizeof(T_CHAR));
		r[used]=0;
		data=0;
		return r;
	}
	T_CHAR operator[](UINT i)
	{
		if (!data || i>=used) return 0;
		else return data[i];
	}
	UINT Len() {return data ? used : 0;}
	void Reset()
	{
		if (data) {free(data);data=0;}		
	}
	const T_CHAR * Peek()
	{
		AddChar(0);
		used--;
		return data;
	}
	T_CHAR * strdup()
	{
		return ::t_strdup(Peek());
	}
};




static int separator(T_CHAR x)
{
	if (!x || x==' ') return 1;
	if (x=='\'' || x=='_') return 0;
#ifdef TAGZ_UNICODE
	return !iswalnum(x);
#else
	return !isalnum(x);
#endif
}

static int sepcmp(T_CHAR* src,T_CHAR* val)
{
	UINT l=t_strlen(val);
	return !t_strnicmp(src,val,l) && separator(src[l]);
}

static char roman_num[]=
{
	'I','V','X','L','C','D','M'
};


static int is_roman(T_CHAR * ptr)/* could be more smart i think */
{
	if (ptr[0]==']' && ptr[1]=='[' && separator(ptr[2])) return 1;
	while(!separator(*ptr))
	{
		UINT n;
		bool found=0;
		for(n=0;n<TABSIZE(roman_num);n++)
		{
			if (*ptr==roman_num[n]) {found=1;break;}
		}
		if (!found) return 0;
		ptr++;
	}
	return 1;
}

static int need_full(T_CHAR* ptr)
{
	if (is_roman(ptr)) return 1;
	if (sepcmp(ptr,_TX("RPG"))) return 1;
	while(!separator(*ptr))
	{
		if (*ptr<'0' || *ptr>'9') return 0;
		ptr++;
	}
	return 1;
}

typedef bool (*TEXTFUNC)(UINT n_src,T_CHAR **src,UINT*,T_String &out);

#define MAKEFUNC(X) static bool X(UINT n_src,T_CHAR ** src,UINT *found_src,T_String &out)


MAKEFUNC(If)
{
	if (n_src!=3) return false;

	out.AddString(src[found_src[0] ? 1 : 2]);
	return true;
}

MAKEFUNC(If2)
{
	if (n_src!=2) return false;

	out.AddString(src[found_src[0] ? 0 : 1]);
	return true;
}


MAKEFUNC(Iflonger)
{
	if (n_src!=4) return false;

	out.AddString(src[(int)t_strlen(src[0])>t_atoi(src[1]) ? 2 : 3]);
	return true;
}

MAKEFUNC(Ifgreater)
{
	if (n_src!=4) return false;

	out.AddString(src[t_atoi(src[0])>t_atoi(src[1]) ? 2 : 3]);
	return true;
}

MAKEFUNC(Upper)
{
	if (n_src!=1) return false;

	T_CHAR * s=src[0];

	while(*s)
		out.AddChar(toupper(*(s++)));

	return true;
}

MAKEFUNC(Lower)
{
	if (n_src!=1) return false;

	T_CHAR * s=src[0];

	while(*s)
		out.AddChar(tolower(*(s++)));

	return true;
}

MAKEFUNC(Pad)
{
	if (n_src<2 || n_src>3) return false;

	T_CHAR *fill=_TX(" ");
	if (n_src==3 && src[2][0])
		fill = src[2];

	int num = t_atoi(src[1]);
	T_CHAR *p = src[0];

	while (*p) { out.AddChar(*(p++)); num--; }

	UINT fl = t_strlen(fill);
	while (num>0)
		out.AddChar(fill[(--num)%fl]);

	return true;
}

MAKEFUNC(Cut)
{
	if (n_src!=2) return false;

	UINT num = t_atoi(src[1]);
	T_CHAR *p = src[0];

	while (*p && num>0) {out.AddChar(*(p++));num--;}

	return true;
}

MAKEFUNC(PadCut)
{
	if (n_src<2 || n_src>3) return false;

	T_CHAR *fill = _TX(" ");
	if (n_src==3 && src[2][0])
		fill = src[2];

	int num = t_atoi(src[1]);
	T_CHAR *p = src[0];

	while(*p && num>0) {out.AddChar(*(p++));num--;}

	UINT fl=t_strlen(fill);
	while (num>0)
		out.AddChar(fill[(--num)%fl]);

	return true;
}

/* abbr(string) */
/* abbr(string,len) */
MAKEFUNC(Abbr)
{
	if (n_src==0 || n_src>2) return false;


	if (n_src==2 && (int)t_strlen(src[0])<t_atoi(src[1]))
	{
		out.AddString(src[0]);
		return true;
	}

	T_CHAR * meta=src[0];
	bool w=0, r=0;

	while(*meta)
	{
		bool an=!separator(*meta) || *meta==']' || *meta=='[';

		if (w && !an)
			w=0;
		else if (!w && an)
		{
			w=1;
			r=need_full(meta)?1:0;
			out.AddChar(*meta);
		}
		else if (w && r)
			out.AddChar(*meta);
		meta++;
	}

	return true;
}



MAKEFUNC(Caps)
{
	if (n_src!=1) return false;

	T_CHAR* sp=src[0];
	int sep = 1;

	while(*sp)
	{
		T_CHAR c=*(sp++);
		int s = separator(c);
		if (!s && sep)
			c=toupper(c);
		else if (!sep) c=tolower(c);
		sep=s;
		out.AddChar(c);
	}

	return true;
}

MAKEFUNC(Caps2)
{
	if (n_src!=1) return false;

	T_CHAR* sp=src[0];
	int sep=1;

	while(*sp)
	{
		T_CHAR c=*(sp++);
		int s = separator(c);
		if (!s && sep)
			c=toupper(c);
		sep=s;
		out.AddChar(c);
	}

	return true;
}

MAKEFUNC(Longest)
{
	T_CHAR *ptr=0;
	UINT n, m=0;

	for(n=0;n<n_src;n++)
	{
		UINT l=t_strlen(src[n]);
		if (l>m) {m=l;ptr=src[n];}
	}

	if (ptr) out.AddString(ptr);
	return true;
}

MAKEFUNC(Shortest)
{
	T_CHAR * ptr=0;
	UINT n,m=(UINT)(-1);

	for(n=0;n<n_src;n++)
	{
		UINT l=t_strlen(src[n]);
		if (l<m) {m=l;ptr=src[n];}
	}

	if (ptr) out.AddString(ptr);
	return true;
}

MAKEFUNC(Num)
{
	if (n_src!=2) return false;

	T_CHAR tmp[16];
	T_CHAR tmp1[16];
	sprintf(tmp1,_TX("%%0%uu"),t_atoi(src[1]));
	sprintf(tmp,tmp1,t_atoi(src[0]));
	out.AddString(tmp);

	return true;
}

MAKEFUNC(Hex)
{
	if (n_src!=2) return false;

	T_CHAR tmp[16];
	T_CHAR tmp1[16];
	sprintf(tmp1,_TX("%%0%ux"),t_atoi(src[1]));
	sprintf(tmp,tmp1,t_atoi(src[0]));
	out.AddString(tmp);

	return true;
}

MAKEFUNC(StrChr)
{
	if (n_src!=2) return false;

	T_CHAR * p=src[0];
	T_CHAR s=src[1][0];

	while (*p && *p!=s) p++;
	if (*p==s)
		out.AddInt(1+p-src[0]);
	else out.AddChar('0');

	return true;
}

MAKEFUNC(StrRChr)
{
	if (n_src!=2) return false;

	T_CHAR * p=src[0],*p1=0;
	T_CHAR s=src[1][0];

	while(*p)
	{
		if (*p==s) p1=p;
		p++;
	}

	if (p1)
		out.AddInt(1+p1-src[0]);
	else out.AddChar('0');

	return true;
}

MAKEFUNC(StrStr)
{
	if (n_src!=2) return false;

	T_CHAR * p = t_strstr(src[0],src[1]);

	if (p)
		out.AddInt(1+p-src[0]);
	else out.AddChar('0');

	return true;
}

/* substr(string, index) */
/* substr(string, index, length) */
MAKEFUNC(SubStr)
{
	if (n_src<2 || n_src>3) return false;

	int n1 = t_atoi(src[1]), n2;

⌨️ 快捷键说明

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