@@ -2972,63 +2972,37 @@ statement:
29722972 }
29732973 }
29742974
2975- | RWL_T_READLOB readlobhead maybereadlobtail terminator
2975+ | RWL_T_READLOB readlobhead maybereadlobtail terminator
29762976 {
29772977 if (rwm->loblengthvarn && rwm->loboffset)
29782978 {
29792979
29802980 rwlcodeaddpupupup (rwm, RWL_CODE_READLOB_LO, rwm->lobnam, rwm->lobvarn,
2981- rwm->lobwritenam , rwm->lobwritevarn , rwm->loblengthnam, rwm->loblengthvarn, rwm->loboffset);
2981+ rwm->lobstringnam , rwm->lobstringvarn , rwm->loblengthnam, rwm->loblengthvarn, rwm->loboffset);
29822982 }
29832983 else
29842984 {
2985- rwlcodeaddpupu (rwm, RWL_CODE_READLOB, rwm->lobnam, rwm->lobvarn, rwm->lobwritenam , rwm->lobwritevarn );
2985+ rwlcodeaddpupu (rwm, RWL_CODE_READLOB, rwm->lobnam, rwm->lobvarn, rwm->lobstringnam , rwm->lobstringvarn );
29862986 }
29872987 }
29882988
2989- | RWL_T_WRITELOB { bis(rwm->m2flags, RWL_P2_MAYBECOMMAW); } RWL_T_IDENTIFIER maybecomma
2990- {
2991- sb4 l;
2992- rwm->lobvarn = RWL_VAR_NOTFOUND;
2993- rwm->lobnam = rwm->inam;
2994- if (bit(rwm->m2flags, RWL_P2_MAYBECOMMAW))
2995- rwlerror (rwm, RWL_ERROR_COMMA_IS_RECOMMENDED, rwm->lobnam, " writelob" );
2996- /* lookup the file and check it is a file */
2997- l = rwlfindvar2(rwm->mxq, rwm->lobnam, RWL_VAR_NOGUESS, rwm->codename);
2998- if (l>=0 )
2999- {
3000- switch (rwm->mxq->evar[l].vtype)
3001- {
3002- case RWL_TYPE_BLOB:
3003- case RWL_TYPE_CLOB:
3004- rwm->lobvarn = l;
3005- break ;
3006-
3007- default :
3008- rwlerror (rwm,RWL_ERROR_INCORRECT_TYPE2
3009- , rwm->mxq->evar[l].stype, rwm->lobnam, " lob" );
3010- break ;
3011- }
3012- }
3013- }
3014- concatenation terminator
3015- {
3016- rwl_estack *estk;
3017- estk = rwlexprfinish(rwm);
3018- if (rwm->codename)
3019- rwlcodeaddpup (rwm, RWL_CODE_WRITELOB, rwm->lobnam
3020- , rwm->lobvarn, estk);
3021- else
3022- if (!bit(rwm->m2flags, RWL_P2_NOEXEC))
3023- {
3024- rwlexpreval (estk, &rwm->loc, rwm->mxq, &rwm->mxq->xqnum);
3025- if (rwm->maindb)
3026- rwlwritelob (rwm->mxq, rwm->mxq->evar[rwm->lobvarn].num.vptr, rwm->maindb
3027- , &rwm->mxq->xqnum, &rwm->loc, 0 );
3028- else
3029- rwlerror (rwm, RWL_ERROR_NOT_DONE_IN_MAIN, " writelob" );
3030- }
3031- }
2989+ | RWL_T_WRITELOB writelobhead maybewritelobtail terminator
2990+ {
2991+ if (rwm->loboffset)
2992+ {
2993+ rwlcodeaddpupup (rwm, RWL_CODE_WRITELOB, rwm->lobnam, rwm->lobvarn,
2994+ rwm->lobstringnam, rwm->lobstringvarn, rwm->loboffset);
2995+ }
2996+ else if (rwm->lobdataexpr)
2997+ {
2998+ rwlcodeaddpup (rwm, RWL_CODE_WRITELOB, rwm->lobnam
2999+ , rwm->lobvarn, rwm->lobwritedata);
3000+ }
3001+ else
3002+ {
3003+ rwlcodeaddpupu (rwm, RWL_CODE_WRITELOB, rwm->lobnam, rwm->lobvarn, rwm->lobstringnam, rwm->lobstringvarn);
3004+ }
3005+ }
30323006
30333007 | controlloopheader
30343008 {
@@ -3101,10 +3075,56 @@ statement:
31013075 ;
31023076 /* end of statement */
31033077
3104- maybecomma :
3078+ writelobhead :
3079+ RWL_T_IDENTIFIER ' ,'
3080+ {
3081+ sb4 l;
3082+ rwm->lobvarn = RWL_VAR_NOTFOUND;
3083+ rwm->lobnam = rwm->inam;
3084+ /* lookup the file and check it is a file */
3085+ l = rwlfindvar2(rwm->mxq, rwm->lobnam, RWL_VAR_NOGUESS, rwm->codename);
3086+ if (l>=0 )
3087+ {
3088+ switch (rwm->mxq->evar[l].vtype)
3089+ {
3090+ case RWL_TYPE_BLOB:
3091+ case RWL_TYPE_CLOB:
3092+ rwm->lobvarn = l;
3093+ break ;
3094+
3095+ default :
3096+ rwlerror (rwm,RWL_ERROR_INCORRECT_TYPE2
3097+ , rwm->mxq->evar[l].stype, rwm->lobnam, " lob" );
3098+ break ;
3099+ }
3100+ }
3101+ }
3102+ concatenation
3103+ {
3104+ rwl_estack *estk;
3105+ estk = rwlexprfinish(rwm);
3106+ if (rwm->codename)
3107+ {
3108+ rwm->lobdataexpr = 1 ;
3109+ rwm->lobwritedata = estk;
3110+ }
3111+ else
3112+ if (!bit(rwm->m2flags, RWL_P2_NOEXEC))
3113+ {
3114+ rwlexpreval (estk, &rwm->loc, rwm->mxq, &rwm->mxq->xqnum);
3115+ if (rwm->maindb)
3116+ rwlwritelob (rwm->mxq, rwm->mxq->evar[rwm->lobvarn].num.vptr, rwm->maindb
3117+ , &rwm->mxq->xqnum, &rwm->loc, 0 );
3118+ else
3119+ rwlerror (rwm, RWL_ERROR_NOT_DONE_IN_MAIN, " writelob" );
3120+ }
3121+ }
3122+ maybewritelobtail :
31053123 /* empty*/
3106- | ' ,' { bic(rwm->m2flags, RWL_P2_MAYBECOMMAW); }
3107- ;
3124+ | ' ,' expression
3125+ {
3126+ rwm->loboffset = rwlexprfinish(rwm);
3127+ }
31083128
31093129readlobhead :
31103130 RWL_T_IDENTIFIER ' ,'
@@ -3133,22 +3153,22 @@ readlobhead:
31333153 RWL_T_IDENTIFIER
31343154 {
31353155 sb4 l;
3136- rwm->lobwritevarn = 0 ;
3156+ rwm->lobstringvarn = 0 ;
31373157 rwm->loblengthvarn = 0 ;
31383158 rwm->loboffset = 0 ;
3139- rwm->lobwritenam = (yychar == RWL_T_IDENTIFIER)
3159+ rwm->lobstringnam = (yychar == RWL_T_IDENTIFIER)
31403160 ? rwm->previnam
31413161 : rwm->inam;
3142- l = rwlfindvar2(rwm->mxq, rwm->lobwritenam , RWL_VAR_NOGUESS, rwm->codename);
3162+ l = rwlfindvar2(rwm->mxq, rwm->lobstringnam , RWL_VAR_NOGUESS, rwm->codename);
31433163 if (l>=0 )
31443164 {
31453165 switch (rwm->mxq->evar[l].vtype)
31463166 {
31473167 case RWL_TYPE_STR:
3148- rwm->lobwritevarn = l;
3168+ rwm->lobstringvarn = l;
31493169 break ;
31503170 default :
3151- rwlerror (rwm,RWL_ERROR_INCORRECT_TYPE2, rwm->mxq->evar[l].stype, rwm->lobwritenam , " string" );
3171+ rwlerror (rwm,RWL_ERROR_INCORRECT_TYPE2, rwm->mxq->evar[l].stype, rwm->lobstringnam , " string" );
31523172 break ;
31533173 }
31543174 }
0 commit comments