diff options
Diffstat (limited to 'src/interfaces')
| -rw-r--r-- | src/interfaces/ecpg/preproc/pgc.l | 29 | 
1 files changed, 21 insertions, 8 deletions
| diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l index 405dee73b03..9ad50b99119 100644 --- a/src/interfaces/ecpg/preproc/pgc.l +++ b/src/interfaces/ecpg/preproc/pgc.l @@ -690,20 +690,33 @@ cppline			{space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+  						 * to forbid operator names like '?-' that could not be  						 * sequences of SQL operators.  						 */ -						while (nchars > 1 && -							   (yytext[nchars-1] == '+' || -								yytext[nchars-1] == '-')) +						if (nchars > 1 && +							(yytext[nchars - 1] == '+' || +							 yytext[nchars - 1] == '-'))  						{  							int		ic; -							for (ic = nchars-2; ic >= 0; ic--) +							for (ic = nchars - 2; ic >= 0; ic--)  							{ -								if (strchr("~!@#^&|`?%", yytext[ic])) +								char c = yytext[ic]; +								if (c == '~' || c == '!' || c == '@' || +									c == '#' || c == '^' || c == '&' || +									c == '|' || c == '`' || c == '?' || +									c == '%')  									break;  							} -							if (ic >= 0) -								break; /* found a char that makes it OK */ -							nchars--; /* else remove the +/-, and check again */ +							if (ic < 0) +							{ +								/* +								 * didn't find a qualifying character, so remove +								 * all trailing [+-] +								 */ +								do { +									nchars--; +								} while (nchars > 1 && +									 (yytext[nchars - 1] == '+' || +									  yytext[nchars - 1] == '-')); +							}  						}  						if (nchars < yyleng) | 
