mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
 | 
						|
#define YYFILL(n) if (cursor >= limit) break;
 | 
						|
#define YYCTYPE char
 | 
						|
#define YYCURSOR cursor
 | 
						|
#define YYLIMIT limit
 | 
						|
#define YYMARKER marker
 | 
						|
 | 
						|
/*!re2c
 | 
						|
any     = (.|"\n");
 | 
						|
value	= (":" (.\"$")+)?;
 | 
						|
cvsdat	= "Date";
 | 
						|
cvsid	= "Id";
 | 
						|
cvslog	= "Log";
 | 
						|
cvsrev	= "Revision";
 | 
						|
cvssrc	= "Source";
 | 
						|
*/
 | 
						|
 | 
						|
#define APPEND(text) \
 | 
						|
	append(output, outsize, text, sizeof(text) - sizeof(YYCTYPE))
 | 
						|
 | 
						|
inline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len)
 | 
						|
{
 | 
						|
	memcpy(output + outsize, text, len);
 | 
						|
	outsize += (len / sizeof(YYCTYPE));
 | 
						|
}
 | 
						|
 | 
						|
void scan(YYCTYPE *pText, size_t *pSize, int *pbChanged)
 | 
						|
{
 | 
						|
	// rule
 | 
						|
	// scan lines
 | 
						|
	// find $ in lines
 | 
						|
	//   compact $<keyword>: .. $ to $<keyword>$
 | 
						|
  
 | 
						|
	YYCTYPE *output;
 | 
						|
	const YYCTYPE *cursor, *limit, *marker;
 | 
						|
 | 
						|
	cursor = marker = output = *pText;
 | 
						|
 | 
						|
	size_t insize = *pSize;
 | 
						|
	size_t outsize = 0;
 | 
						|
 | 
						|
	limit = cursor + insize;
 | 
						|
 | 
						|
	while(1) {
 | 
						|
loop:
 | 
						|
/*!re2c
 | 
						|
 | 
						|
"$" cvsdat value "$"	{ APPEND(L"$" L"Date$"); goto loop; }
 | 
						|
"$" cvsid  value "$"	{ APPEND(L"$" L"Id$"); goto loop; }
 | 
						|
"$" cvslog value "$"	{ APPEND(L"$" L"Log$"); goto loop; }
 | 
						|
"$" cvsrev value "$"	{ APPEND(L"$" L"Revision$"); goto loop; }
 | 
						|
"$" cvssrc value "$"	{ APPEND(L"$" L"Source$"); goto loop; }
 | 
						|
any						{ output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; }
 | 
						|
 | 
						|
*/
 | 
						|
	}
 | 
						|
	output[outsize] = '\0';
 | 
						|
 | 
						|
	// set the new size
 | 
						|
	*pSize = outsize;
 | 
						|
	
 | 
						|
	*pbChanged = (insize == outsize) ? 0 : 1;
 | 
						|
}
 |