utilities.cpp.svn-base

来自「Complete support for EBNF notation; Obje」· SVN-BASE 代码 · 共 372 行

SVN-BASE
372
字号
#include "assert.h"#include <iostream>#include <algorithm>#include <stdio.h>#include "utilities.h"using namespace std;string roman_itoa(int n, bool use_capital_letters){	string s;	int x=(use_capital_letters ? 0 : 'a'-'A');	if(n>10000) return use_capital_letters ? "Multae milia" : "multae milia";	if(n==0) return use_capital_letters ? "Nihil" : "nihil";	if(n<0) { s=(use_capital_letters ? "Minus " : "minus "); n=-n; }	while(n>=1000) s+=char('M'+x), n-=1000;	if(n>=900) s+=(use_capital_letters ? "CM" : "cm"), n-=900;	if(n>=500) s+=char('D'+x), n-=500;	while(n>=100) s+=char('C'+x), n-=100;	if(n>=90) s+=(use_capital_letters ? "XC" : "xc"), n-=90;	if(n>=50) s+=char('L'+x), n-=50;	if(n>=40) s+=char('X'+x), s+=char('L'+x), n-=40;	while(n>=10) s+=char('X'+x), n-=10;	switch(n)	{	case 0: break;	case 1: s+=(use_capital_letters ? "I" : "i"); break;	case 2: s+=(use_capital_letters ? "II" : "ii"); break;	case 3: s+=(use_capital_letters ? "III" : "iii"); break;	case 4: s+=(use_capital_letters ? "IV" : "iv"); break;	case 5: s+=(use_capital_letters ? "V" : "v"); break;	case 6: s+=(use_capital_letters ? "VI" : "vi"); break;	case 7: s+=(use_capital_letters ? "VII" : "vii"); break;	case 8: s+=(use_capital_letters ? "VIII" : "viii"); break;	case 9: s+=(use_capital_letters ? "IX" : "ix"); break;	default: assert(false);	}	return s;}// mode=1:  one, two, three// mode=2:  first, second, thirdstring english_itoa(int n, int mode, bool use_capital_letters){	if(n==0) return use_capital_letters ? (mode==1 ? "Zero" : "Zeroth") :		(mode==1 ? "zero" : "zeroth");	else if(n<0) return (use_capital_letters ? "Minus " : "minus") +			english_itoa(-n, mode, false);	else if(n/1000>=1000)		return use_capital_letters ? (mode==1 ? "Many" : "Innumerable") :			(mode==1 ? "many" : "innumerable");	else if(n>=1000)	{		string s;		s+=english_itoa(n/1000, 1, use_capital_letters);		if(n%1000)			s+=" thousand "+english_itoa(n%1000, mode, false);		else if(mode==1)			s+=" thousand";		else			s+=" thousandth";		return s;	}	else if(n>=100)	{		string s;		s+=english_itoa(n/100, 1, use_capital_letters);		s+=" hundred";		if(n%100)			s+=" hundred "+english_itoa(n%100, mode, false);		else if(mode==1)			s+=" hundred";		else			s+=" hundredth";		return s;	}	else if(n>=20)	{		if(mode==2 && n%10==0)			switch(n/10)			{			case 2: return use_capital_letters ? "Twentieth" : "twentieth";			case 3: return use_capital_letters ? "Thirtieth" : "thirtieth";			case 4: return use_capital_letters ? "Fourtieth" : "fourtieth";			case 5: return use_capital_letters ? "Fiftieth" : "fiftieth";			case 6: return use_capital_letters ? "Sixtieth" : "sixtieth";			case 7: return use_capital_letters ? "Seventieth" : "seventieth";			case 8: return use_capital_letters ? "Eightieth" : "eightieth";			case 9: return use_capital_letters ? "Ninetieth" : "ninetieth";			default: assert(false); return "";			}		else		{			string s;			switch(n/10)			{			case 2: s=(use_capital_letters ? "Twenty" : "twenty"); break;			case 3: s=(use_capital_letters ? "Thirty" : "thirty"); break;			case 4: s=(use_capital_letters ? "Fourty" : "fourty"); break;			case 5: s=(use_capital_letters ? "Fifty" : "fifty"); break;			case 6: s=(use_capital_letters ? "Sixty" : "sixty"); break;			case 7: s=(use_capital_letters ? "Seventy" : "seventy"); break;			case 8: s=(use_capital_letters ? "Eighty" : "eighty"); break;			case 9: s=(use_capital_letters ? "Ninety" : "ninety"); break;			default: assert(false);			}			if(n%10)				s+=" "+english_itoa(n%10, mode, false);			return s;		}	}	else		switch(n)		{		case 1: return use_capital_letters ?			(mode==1 ? "One" : "First") :			(mode==1 ? "one" : "first");		case 2: return use_capital_letters ?			(mode==1 ? "Two" : "Second") :			(mode==1 ? "two" : "second");		case 3: return use_capital_letters ?			(mode==1 ? "Three" : "Third") :			(mode==1 ? "three" : "third");		case 4: return use_capital_letters ?			(mode==1 ? "Four" : "Fourth") :			(mode==1 ? "four" : "fourth");		case 5: return use_capital_letters ?			(mode==1 ? "Five" : "Fifth") :			(mode==1 ? "five" : "fifth");		case 6: return use_capital_letters ?			(mode==1 ? "Six" : "Sixth") :			(mode==1 ? "six" : "sixth");		case 7: return use_capital_letters ?			(mode==1 ? "Seven" : "Seventh") :			(mode==1 ? "seven" : "seventh");		case 8: return use_capital_letters ?			(mode==1 ? "Eight" : "Eighth") :			(mode==1 ? "eight" : "eighth");		case 9: return use_capital_letters ?			(mode==1 ? "Nine" : "Ninth") :			(mode==1 ? "nine" : "ninth");		case 10: return use_capital_letters ?			(mode==1 ? "Ten" : "Tenth") :			(mode==1 ? "ten" : "tenth");		case 11: return use_capital_letters ?			(mode==1 ? "Eleven" : "Eleventh") :			(mode==1 ? "eleven" : "eleventh");		case 12: return use_capital_letters ?			(mode==1 ? "Twelve" : "Twelveth") :			(mode==1 ? "twelve" : "twelveth");		case 13: return use_capital_letters ?			(mode==1 ? "Thirteen" : "Thirteenth") :			(mode==1 ? "thirteen" : "thirteenth");		case 14: return use_capital_letters ?			(mode==1 ? "Fourteen" : "Fourteenth") :			(mode==1 ? "fourteen" : "fourteenth");		case 15: return use_capital_letters ?			(mode==1 ? "Fifteen" : "Fifteenth") :			(mode==1 ? "fifteen" : "fifteenth");		case 16: return use_capital_letters ?			(mode==1 ? "Sixteen" : "Sixteenth") :			(mode==1 ? "sixteen" : "sixteenth");		case 17: return use_capital_letters ?			(mode==1 ? "Seventeen" : "Seventeenth") :			(mode==1 ? "seventeen" : "seventeenth");		case 18: return use_capital_letters ?			(mode==1 ? "Eighteen" : "Eighteenth") :			(mode==1 ? "eighteen" : "eighteenth");		case 19: return use_capital_letters ?			(mode==1 ? "Nineteen" : "Nineteenth") :			(mode==1 ? "nineteen" : "nineteenth");		default: assert(false);			return "";		}}string letter_itoa(int n, bool use_capital_letters){	assert(n>0);	string s;	while(n)	{		n--;		s+=char(n%26 + (use_capital_letters ? 'A' : 'a'));		n=n/26;	}	reverse(s.begin(), s.end());	return s;}string strip_dot(const string &s){	for(int i=s.size()-1; i>=0; i--)		if(s[i]=='.')			return string(s.begin(), s.begin()+i);		else if(s[i]=='/' || s[i]=='\\')			break;	return s;}std::string unquote(const std::string &s){    if (s[0] == '"')        return s.substr(1, s.size()-2);    else        return s;}// style=1: "IDENTIFIER", style=2: "Identifier".string convert_file_name_to_identifier(const string &s, int style){	int first=0;	for(int i=s.size()-1; i>=0; i--)		if(s[i]=='/' || s[i]=='\\')		{			first=i;			break;		}	string result;	for(int i=first; i<s.size(); i++)		if(isalpha(s[i]))		{			if(style==1 || (style==2 && i==first))				result+=char(toupper(s[i]));			else				result+=char(tolower(s[i]));		}		else if(isdigit(s[i]))			result+=s[i];		else			result+='_';	return result;}const char *printable_increment(int x){	static char buf[20];	if(x<0)		sprintf(buf, "%d", x);	else if(x==0)		sprintf(buf, "");	else if(x>0)		sprintf(buf, "+%u", x);	else		assert(false);	return buf;}string prepare_for_printf(const string &s){	string result;	bool after_hex_sequence=false;	for(string::const_iterator p=s.begin(); p!=s.end(); p++)		if(*p=='"')			result+="\\x22", after_hex_sequence=true;		else if(*p=='\\')			result+="\\\\", after_hex_sequence=false;		else if(after_hex_sequence && isxdigit(*p))			result+="\x22 \x22", result+=*p, after_hex_sequence=false;		else if(*p>=' ')			result+=*p, after_hex_sequence=false;		else if(*p=='\n')			result+="\\n", after_hex_sequence=false;		else if(*p=='\r')			result+="\\r", after_hex_sequence=false;		else if(*p=='\t')			result+="\\t", after_hex_sequence=false;		else if(*p=='\b')			result+="\\b", after_hex_sequence=false;		else if(*p=='\f')			result+="\\f", after_hex_sequence=false;		else			assert(false);//	cout << "'" << s << "' ----> '" << result << "'\n";	return result;}bool decode_escape_sequences(char *s, vector<int> &v){	static char *escape_sequences="n\nt\tv\vb\br\rf\fa\a\\\\??\'\'\"\"";	int length=strlen(s);	assert(length>=2 && (s[0]=='\x27' || s[0]=='\x22') && s[0]==s[length-1]);	s[length-1]=0;	for(int i=1; s[i]; i++)		if(s[i]!='\\')			v.push_back(s[i]);		else		{			i++;			if(!s[i])				return false;			bool flag=false;			for(int j=0; escape_sequences[j]; j+=2)				if(s[i]==escape_sequences[j])				{					v.push_back(escape_sequences[j+1]);					flag=true;					break;				}			if(!flag)			{				if(s[i]=='x' || s[i]=='u' || s[i]=='U')				{					i++;					int j;					for(j=0; isxdigit(s[i+j]); j++);					if(s[i-1]=='x')					{						if(!j || j>8)							return false;					}					else if(s[i-1]=='u')					{						if(j>=4)							j=4;						else							return false;					}					else if(s[i-1]=='U')					{						if(j>=8)							j=8;						else							return false;					}					else						assert(false);					char backup=s[i+j];					s[i+j]=0;					int sn;					sscanf(s+i, "%x", &sn);					v.push_back(sn);					s[i+j]=backup;					i+=j-1;				}				else if(is_octal_digit(s[i]))				{					i++;					int j;					for(j=0; is_octal_digit(s[i+j]); j++);					if(!j || j>11 || (j==11 && s[i]>='3'))						return false;					int sn=0;					int factor=1;					for(int k=j+i-1; k>=i; k--)					{						sn+=(s[k]-'8')*factor;						factor*=8;					}					v.push_back(sn);					i+=j-1;				}				else					return false;			}		}	return true;}

⌨️ 快捷键说明

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