3030#include "xtag.h"
3131#include "promise.h"
3232
33+ #include "dependency.h"
34+ #include "cxx/cxx_tag.h"
35+
3336/*
3437 * On-line "Oracle Database PL/SQL Language Reference":
3538 * http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/toc.htm
@@ -505,6 +508,8 @@ static struct SqlReservedWord SqlReservedWord [SQLKEYWORD_COUNT] = {
505508 [KEYWORD_without ] = {0 & 0 & 1 & 1 & 0 & 0 & 0 & 0 },
506509};
507510
511+ static langType Lang_c ;
512+
508513/*
509514 * FUNCTION DECLARATIONS
510515 */
@@ -2203,6 +2208,16 @@ static void parseBlock (tokenInfo *const token, const bool local)
22032208 parseBlockFull (token , local , LANG_IGNORE );
22042209}
22052210
2211+ static void makeSqlTagForInternalFunction (tokenInfo * const token )
2212+ {
2213+ tagEntryInfo foreignEntry ;
2214+ initForeignRefTagEntry (
2215+ & foreignEntry , vStringValue (token -> string ), Lang_c ,
2216+ CXXTagKindFUNCTION , CXXTagFUNCTIONRoleFOREIGNCALL );
2217+ updateTagLine (& foreignEntry , token -> lineNumber , token -> filePosition );
2218+ makeTagEntry (& foreignEntry );
2219+ }
2220+
22062221static void parseBlockFull (tokenInfo * const token , const bool local , langType lang )
22072222{
22082223 int promise = -1 ;
@@ -2222,6 +2237,9 @@ static void parseBlockFull (tokenInfo *const token, const bool local, langType l
22222237 promise = token -> promise ;
22232238 token -> promise = -1 ;
22242239
2240+ tokenInfo * const body = newToken ();
2241+ copyToken (body , token );
2242+
22252243 readToken (token );
22262244 while (! isCmdTerm (token )
22272245 && !isType (token , TOKEN_EOF ))
@@ -2233,10 +2251,16 @@ static void parseBlockFull (tokenInfo *const token, const bool local, langType l
22332251 lang = getNamedLanguageFromToken (token );
22342252 if (lang != LANG_IGNORE )
22352253 readToken (token );
2254+ else if (vStringEqC (token -> string , "internal" ))
2255+ {
2256+ makeSqlTagForInternalFunction (body );
2257+ readToken (token );
2258+ }
22362259 }
22372260 else
22382261 readToken (token );
22392262 }
2263+ deleteToken (body );
22402264
22412265 if (promise != -1 && lang != LANG_IGNORE )
22422266 promiseUpdateLanguage (promise , lang );
@@ -3384,6 +3408,10 @@ extern parserDefinition* SqlParser (void)
33843408 static const char * const extensions [] = { "sql" , NULL };
33853409 static const char * const aliases [] = {"pgsql" , NULL };
33863410 parserDefinition * def = parserNew ("SQL" );
3411+ static parserDependency dependencies [] = {
3412+ [0 ] = { DEPTYPE_FOREIGNER , "C" , & Lang_c },
3413+ };
3414+
33873415 def -> kindTable = SqlKinds ;
33883416 def -> kindCount = ARRAY_SIZE (SqlKinds );
33893417 def -> extensions = extensions ;
@@ -3393,5 +3421,7 @@ extern parserDefinition* SqlParser (void)
33933421 def -> keywordTable = SqlKeywordTable ;
33943422 def -> keywordCount = ARRAY_SIZE (SqlKeywordTable );
33953423 def -> useCork = CORK_QUEUE | CORK_SYMTAB ;
3424+ def -> dependencies = dependencies ;
3425+ def -> dependencyCount = ARRAY_SIZE (dependencies );
33963426 return def ;
33973427}
0 commit comments