LCOV - code coverage report
Current view: top level - bifs - script_dec.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 444 472 94.1 %
Date: 2021-04-29 23:48:07 Functions: 27 27 100.0 %

          Line data    Source code
       1             : /*
       2             :  *                      GPAC - Multimedia Framework C SDK
       3             :  *
       4             :  *                      Authors: Jean Le Feuvre
       5             :  *                      Copyright (c) Telecom ParisTech 2000-2012
       6             :  *                                      All rights reserved
       7             :  *
       8             :  *  This file is part of GPAC / BIFS codec sub-project
       9             :  *
      10             :  *  GPAC is free software; you can redistribute it and/or modify
      11             :  *  it under the terms of the GNU Lesser General Public License as published by
      12             :  *  the Free Software Foundation; either version 2, or (at your option)
      13             :  *  any later version.
      14             :  *
      15             :  *  GPAC is distributed in the hope that it will be useful,
      16             :  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
      17             :  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      18             :  *  GNU Lesser General Public License for more details.
      19             :  *
      20             :  *  You should have received a copy of the GNU Lesser General Public
      21             :  *  License along with this library; see the file COPYING.  If not, write to
      22             :  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
      23             :  *
      24             :  */
      25             : 
      26             : 
      27             : #include "script.h"
      28             : 
      29             : #if !defined(GPAC_DISABLE_BIFS) && defined(GPAC_HAS_QJS)
      30             : 
      31             : #define BINOP_MINVAL ET_EQ
      32             : 
      33             : typedef struct
      34             : {
      35             :         GF_Node *script;
      36             :         GF_BifsDecoder *codec;
      37             :         GF_BitStream *bs;
      38             :         char *string;
      39             :         u32 length;
      40             :         GF_List *identifiers;
      41             :         char *new_line;
      42             :         u32 indent;
      43             : } ScriptParser;
      44             : 
      45             : 
      46             : void SFS_Identifier(ScriptParser *parser);
      47             : void SFS_Arguments(ScriptParser *parser, Bool is_var);
      48             : void SFS_StatementBlock(ScriptParser *parser, Bool functBody);
      49             : void SFS_Statement(ScriptParser *parser);
      50             : void SFS_IfStatement(ScriptParser *parser);
      51             : void SFS_SwitchStatement(ScriptParser *parser);
      52             : void SFS_ForStatement(ScriptParser *parser);
      53             : void SFS_WhileStatement(ScriptParser *parser);
      54             : void SFS_ReturnStatement(ScriptParser *parser);
      55             : void SFS_CompoundExpression(ScriptParser *parser);
      56             : void SFS_OptionalExpression(ScriptParser *parser);
      57             : void SFS_Expression(ScriptParser *parser);
      58             : void SFS_NewObject(ScriptParser *parser);
      59             : void SFS_ArrayDeref(ScriptParser *parser);
      60             : void SFS_FunctionCall(ScriptParser *parser);
      61             : void SFS_ObjectMemberAccess(ScriptParser *parser);
      62             : void SFS_ObjectMethodCall(ScriptParser *parser);
      63             : void SFS_Params(ScriptParser *parser);
      64             : void SFS_GetNumber(ScriptParser *parser);
      65             : void SFS_GetString(ScriptParser *parser);
      66             : void SFS_GetBoolean(ScriptParser *parser);
      67             : 
      68             : #define PARSER_STEP_ALLOC       500
      69             : 
      70        7804 : static void SFS_AddString(ScriptParser *parser, char *str)
      71             : {
      72             :         char *new_str;
      73        7804 :         if (!str) return;
      74        7801 :         if (strlen(parser->string) + strlen(str) >= parser->length) {
      75          27 :                 parser->length += PARSER_STEP_ALLOC;
      76          27 :                 new_str = (char *)gf_malloc(sizeof(char)*parser->length);
      77          27 :                 strcpy(new_str, parser->string);
      78          27 :                 gf_free(parser->string);
      79          27 :                 parser->string = new_str;
      80             :         }
      81        7801 :         strcat(parser->string, str);
      82             : }
      83             : 
      84         600 : static void SFS_AddInt(ScriptParser *parser, s32 val)
      85             : {
      86             :         char msg[500];
      87             :         sprintf(msg, "%d", val);
      88         600 :         SFS_AddString(parser, msg);
      89         600 : }
      90          20 : static void SFS_AddChar(ScriptParser *parser, char c)
      91             : {
      92             :         char msg[2];
      93          20 :         sprintf(msg, "%c", c);
      94          20 :         SFS_AddString(parser, msg);
      95          20 : }
      96             : 
      97             : 
      98          30 : GF_Err ParseScriptField(ScriptParser *parser)
      99             : {
     100             :         GF_ScriptField *field;
     101             :         GF_Err e;
     102             :         u32 eventType, fieldType;
     103             :         char name[1000];
     104             :         GF_FieldInfo info;
     105             : 
     106          30 :         eventType = gf_bs_read_int(parser->bs, 2);
     107          30 :         fieldType = gf_bs_read_int(parser->bs, 6);
     108          30 :         gf_bifs_dec_name(parser->bs, name);
     109          30 :         field = gf_sg_script_field_new(parser->script, eventType, fieldType, name);
     110          30 :         if (!field) return GF_NON_COMPLIANT_BITSTREAM;
     111             : 
     112             :         //save the name in the list of identifiers
     113          30 :         gf_list_add(parser->identifiers, gf_strdup(name));
     114             : 
     115          30 :         if (parser->codec->pCurrentProto) {
     116           0 :                 Bool isISfield = (Bool)gf_bs_read_int(parser->bs, 1);
     117           0 :                 if (isISfield) {
     118           0 :                         u32 numProtoField = gf_sg_proto_get_field_count(parser->codec->pCurrentProto);
     119           0 :                         u32 numBits = gf_get_bit_size(numProtoField - 1);
     120           0 :                         u32 field_all = gf_bs_read_int(parser->bs, numBits);
     121           0 :                         e = gf_sg_script_field_get_info(field, &info);
     122           0 :                         if (e) return e;
     123           0 :                         e = gf_sg_proto_field_set_ised(parser->codec->pCurrentProto, field_all, parser->script, info.fieldIndex);
     124           0 :                         return e;
     125             :                 }
     126             :         }
     127             :         /*get default value*/
     128          30 :         if (eventType == GF_SG_SCRIPT_TYPE_FIELD) {
     129          15 :                 if (gf_bs_read_int(parser->bs, 1)) {
     130          15 :                         e = gf_sg_script_field_get_info(field, &info);
     131          15 :                         if (e) return e;
     132          15 :                         gf_bifs_dec_field(parser->codec, parser->bs, parser->script, &info, GF_FALSE);
     133             :                 }
     134             :         }
     135             : 
     136          30 :         return parser->codec->LastError;
     137             : }
     138             : 
     139             : static void SFS_IncIndent(ScriptParser *pars) {
     140         270 :         pars->indent++;
     141             : }
     142             : static void SFS_DecIndent(ScriptParser *pars) {
     143         270 :         pars->indent--;
     144             : }
     145             : static void SFS_Space(ScriptParser *pars) {
     146          30 :         if (pars->new_line) SFS_AddString(pars, " ");
     147             : }
     148        1265 : static void SFS_Indent(ScriptParser *pars)
     149             : {
     150             :         u32 i;
     151        1265 :         if (pars->new_line) {
     152        1036 :                 for (i=0; i<pars->indent; i++) SFS_AddString(pars, " ");
     153             :         }
     154        1265 : }
     155             : static GFINLINE void SFS_Line(ScriptParser *parser)
     156             : {
     157        1355 :         if (parser->new_line) {
     158        1084 :                 SFS_AddString(parser, parser->new_line);
     159             :         }
     160             : }
     161             : 
     162             : 
     163          15 : GF_Err SFScript_Parse(GF_BifsDecoder *codec, SFScript *script_field, GF_BitStream *bs, GF_Node *n)
     164             : {
     165             :         GF_Err e;
     166             :         u32 i, count, nbBits;
     167             :         char *ptr;
     168             :         ScriptParser parser;
     169             :         e = GF_OK;
     170          15 :         if (gf_node_get_tag(n) != TAG_MPEG4_Script) return GF_NON_COMPLIANT_BITSTREAM;
     171             : 
     172          15 :         parser.codec = codec;
     173          15 :         parser.script = n;
     174          15 :         parser.bs = bs;
     175          15 :         parser.length = 500;
     176          15 :         parser.string = (char *) gf_malloc(sizeof(char)* parser.length);
     177          15 :         parser.string[0] = 0;
     178          15 :         parser.identifiers = gf_list_new();
     179          15 :         parser.new_line = (char *) (codec->dec_memory_mode ? "\n" : NULL);
     180          15 :         parser.indent = 0;
     181             : 
     182             :         //first parse fields
     183             : 
     184          15 :         if (gf_bs_read_int(bs, 1)) {
     185             :                 //endFlag
     186          45 :                 while (!gf_bs_read_int(bs, 1)) {
     187          30 :                         e = ParseScriptField(&parser);
     188          30 :                         if (e) goto exit;
     189             :                 }
     190             :         } else {
     191           0 :                 nbBits = gf_bs_read_int(bs, 4);
     192           0 :                 count = gf_bs_read_int(bs, nbBits);
     193           0 :                 for (i=0; i<count; i++) {
     194           0 :                         e = ParseScriptField(&parser);
     195           0 :                         if (e) goto exit;
     196             :                 }
     197             :         }
     198             :         //reserevd
     199          15 :         gf_bs_read_int(bs, 1);
     200             :         //then parse
     201          15 :         SFS_AddString(&parser, "javascript:");
     202          15 :         SFS_AddString(&parser, parser.new_line);
     203             : 
     204             :         //hasFunction
     205          60 :         while (gf_bs_read_int(bs, 1)) {
     206          30 :                 SFS_AddString(&parser, "function ");
     207          30 :                 SFS_Identifier(&parser);
     208          30 :                 SFS_Arguments(&parser, GF_FALSE);
     209             :                 SFS_Space(&parser);
     210          30 :                 SFS_StatementBlock(&parser, GF_TRUE);
     211             :                 SFS_Line(&parser);
     212             :         }
     213             : 
     214             :         SFS_Line(&parser);
     215             : 
     216          15 :         if (script_field->script_text) gf_free(script_field->script_text);
     217          15 :         script_field->script_text = (char *) gf_strdup(parser.string);
     218             : 
     219           0 : exit:
     220             :         //clean up
     221         210 :         while (gf_list_count(parser.identifiers)) {
     222         195 :                 ptr = (char *)gf_list_get(parser.identifiers, 0);
     223         195 :                 gf_free(ptr);
     224         195 :                 gf_list_rem(parser.identifiers, 0);
     225             :         }
     226          15 :         gf_list_del(parser.identifiers);
     227          15 :         if (parser.string) gf_free(parser.string);
     228             :         return e;
     229             : }
     230             : 
     231             : 
     232             : 
     233        1445 : void SFS_Identifier(ScriptParser *parser)
     234             : {
     235             :         u32 index;
     236             :         char name[500];
     237             : 
     238        1445 :         if (parser->codec->LastError) return;
     239             : 
     240             :         //received
     241        1445 :         if (gf_bs_read_int(parser->bs, 1)) {
     242        1280 :                 index = gf_bs_read_int(parser->bs, gf_get_bit_size(gf_list_count(parser->identifiers) - 1));
     243        1280 :                 SFS_AddString(parser, (char *)gf_list_get(parser->identifiers, index));
     244             :         }
     245             :         //parse
     246             :         else {
     247         165 :                 gf_bifs_dec_name(parser->bs, name);
     248         165 :                 gf_list_add(parser->identifiers, gf_strdup(name));
     249         165 :                 SFS_AddString(parser, name);
     250             :         }
     251             : }
     252             : 
     253          60 : void SFS_Arguments(ScriptParser *parser, Bool is_var)
     254             : {
     255             :         u32 val;
     256          60 :         if (parser->codec->LastError) return;
     257          60 :         if (!is_var) SFS_AddString(parser, "(");
     258             : 
     259          60 :         val = gf_bs_read_int(parser->bs, 1);
     260         165 :         while (val) {
     261          45 :                 SFS_Identifier(parser);
     262          45 :                 val = gf_bs_read_int(parser->bs, 1);
     263          45 :                 if (val) SFS_AddString(parser, ",");
     264             :         }
     265          60 :         if (!is_var) SFS_AddString(parser, ")");
     266             : }
     267             : 
     268         270 : void SFS_StatementBlock(ScriptParser *parser, Bool funcBody)
     269             : {
     270         270 :         if (parser->codec->LastError) return;
     271             : 
     272         270 :         if (gf_bs_read_int(parser->bs, 1)) {
     273         270 :                 SFS_AddString(parser, "{");
     274             :                 SFS_IncIndent(parser);
     275             : 
     276        1220 :                 while (gf_bs_read_int(parser->bs, 1)) {
     277             :                         SFS_Line(parser);
     278         950 :                         SFS_Indent(parser);
     279         950 :                         SFS_Statement(parser);
     280             :                 }
     281             :                 SFS_DecIndent(parser);
     282             :                 SFS_Line(parser);
     283         270 :                 SFS_Indent(parser);
     284         270 :                 SFS_AddString(parser, "}");
     285           0 :         } else if (funcBody) {
     286           0 :                 SFS_AddString(parser, "{");
     287           0 :                 SFS_Statement(parser);
     288           0 :                 SFS_AddString(parser, "}");
     289             :         } else {
     290           0 :                 SFS_Statement(parser);
     291             :         }
     292             : }
     293             : 
     294             : 
     295         950 : void SFS_Statement(ScriptParser *parser)
     296             : {
     297             :         u32 val;
     298         950 :         if (parser->codec->LastError) return;
     299             : 
     300         950 :         val = gf_bs_read_int(parser->bs, NUMBITS_STATEMENT);
     301         950 :         switch (val) {
     302         150 :         case ST_IF:
     303         150 :                 SFS_IfStatement(parser);
     304         150 :                 break;
     305          15 :         case ST_FOR:
     306          15 :                 SFS_ForStatement(parser);
     307          15 :                 break;
     308          15 :         case ST_WHILE:
     309          15 :                 SFS_WhileStatement(parser);
     310          15 :                 break;
     311          15 :         case ST_RETURN:
     312          15 :                 SFS_ReturnStatement(parser);
     313          15 :                 break;
     314          30 :         case ST_BREAK:
     315          30 :                 SFS_AddString(parser, "break;");
     316          30 :                 break;
     317          15 :         case ST_CONTINUE:
     318          15 :                 SFS_AddString(parser, "continue;");
     319          15 :                 break;
     320         695 :         case ST_COMPOUND_EXPR:
     321         695 :                 SFS_CompoundExpression(parser);
     322         695 :                 SFS_AddString(parser, ";");
     323         695 :                 break;
     324          15 :         case ST_SWITCH:
     325          15 :                 SFS_SwitchStatement(parser);
     326          15 :                 break;
     327             :         }
     328             : }
     329             : 
     330         150 : void SFS_IfStatement(ScriptParser *parser)
     331             : {
     332         150 :         if (parser->codec->LastError) return;
     333         150 :         SFS_AddString(parser, "if (");
     334         150 :         SFS_CompoundExpression(parser);
     335         150 :         SFS_AddString(parser, ") ");
     336         150 :         SFS_StatementBlock(parser, GF_FALSE);
     337             :         //has else
     338         150 :         if (gf_bs_read_int(parser->bs, 1)) {
     339             :                 SFS_Line(parser);
     340          15 :                 SFS_Indent(parser);
     341          15 :                 SFS_AddString(parser, "else ");
     342          15 :                 SFS_StatementBlock(parser, GF_FALSE);
     343             :         }
     344             : }
     345             : 
     346          15 : void SFS_SwitchStatement(ScriptParser *parser)
     347             : {
     348             :         u32 numBits, caseValue;
     349             : 
     350          15 :         if (parser->codec->LastError) return;
     351          15 :         SFS_AddString(parser, "switch (");
     352          15 :         SFS_CompoundExpression(parser);
     353          15 :         SFS_AddString(parser, ")");
     354          15 :         SFS_AddString(parser, "{");
     355             :         SFS_Line(parser);
     356             : 
     357          15 :         numBits = gf_bs_read_int(parser->bs, 5);
     358             :         do {
     359          15 :                 SFS_Indent(parser);
     360          15 :                 SFS_AddString(parser, "case ");
     361          15 :                 caseValue = gf_bs_read_int(parser->bs, numBits);
     362          15 :                 SFS_AddInt(parser, caseValue);
     363          15 :                 SFS_AddString(parser, ":");
     364             :                 SFS_Line(parser);
     365          15 :                 SFS_Indent(parser);
     366          15 :                 SFS_StatementBlock(parser, GF_FALSE);
     367             :                 SFS_Line(parser);
     368             :         }
     369          15 :         while (gf_bs_read_int(parser->bs, 1));
     370             : 
     371             :         //default
     372          15 :         if (gf_bs_read_int(parser->bs, 1)) {
     373          15 :                 SFS_AddString(parser, "default:");
     374             :                 SFS_Line(parser);
     375          15 :                 SFS_StatementBlock(parser, GF_FALSE);
     376             :         }
     377          15 :         SFS_AddString(parser, "}");
     378             : }
     379             : 
     380          15 : void SFS_ForStatement(ScriptParser *parser)
     381             : {
     382          15 :         if (parser->codec->LastError) return;
     383          15 :         SFS_AddString(parser, "for (");
     384          15 :         SFS_OptionalExpression(parser);
     385          15 :         SFS_AddString(parser, ";");
     386          15 :         SFS_OptionalExpression(parser);
     387          15 :         SFS_AddString(parser, ";");
     388          15 :         SFS_OptionalExpression(parser);
     389          15 :         SFS_AddString(parser, ")");
     390             : 
     391          15 :         SFS_StatementBlock(parser, GF_FALSE);
     392             : }
     393             : 
     394          15 : void SFS_WhileStatement(ScriptParser *parser)
     395             : {
     396          15 :         if (parser->codec->LastError) return;
     397          15 :         SFS_AddString(parser, "while (");
     398          15 :         SFS_CompoundExpression(parser);
     399          15 :         SFS_AddString(parser, ")");
     400             : 
     401          15 :         SFS_StatementBlock(parser, GF_FALSE);
     402             : }
     403             : 
     404          15 : void SFS_ReturnStatement(ScriptParser *parser)
     405             : {
     406          15 :         if (parser->codec->LastError) return;
     407          15 :         SFS_AddString(parser, "return");
     408          15 :         if (gf_bs_read_int(parser->bs, 1)) {
     409           0 :                 SFS_AddString(parser, " ");
     410           0 :                 SFS_CompoundExpression(parser);
     411             :         }
     412          15 :         SFS_AddString(parser, ";");
     413             :         SFS_Line(parser);
     414             : }
     415             : 
     416         965 : void SFS_CompoundExpression(ScriptParser *parser)
     417             : {
     418         965 :         if (parser->codec->LastError) return;
     419         965 :         SFS_Expression(parser);
     420         965 :         if (! gf_bs_read_int(parser->bs, 1)) return;
     421           0 :         SFS_AddString(parser, ",");
     422             :         SFS_CompoundExpression(parser);
     423             : }
     424             : 
     425          45 : void SFS_OptionalExpression(ScriptParser *parser)
     426             : {
     427          45 :         if (parser->codec->LastError) return;
     428          45 :         if (gf_bs_read_int(parser->bs, 1)) {
     429          45 :                 SFS_CompoundExpression(parser);
     430             :         }
     431             : }
     432             : 
     433             : 
     434        2140 : void SFS_Expression(ScriptParser *parser)
     435             : {
     436        3180 :         u32 val = gf_bs_read_int(parser->bs, NUMBITS_EXPR_TYPE);
     437        3180 :         if (parser->codec->LastError) return;
     438             : 
     439        3180 :         switch(val) {
     440          15 :         case ET_CURVED_EXPR:
     441          15 :                 SFS_AddString(parser, "(");
     442          15 :                 SFS_CompoundExpression(parser);
     443          15 :                 SFS_AddString(parser, ")");
     444          15 :                 break;
     445          15 :         case ET_NEGATIVE:
     446          15 :                 SFS_AddString(parser, "-");
     447             :                 SFS_Expression(parser);
     448          15 :                 break;
     449          30 :         case ET_NOT:
     450          30 :                 SFS_AddString(parser, "!");
     451             :                 SFS_Expression(parser);
     452          30 :                 break;
     453          15 :         case ET_ONESCOMP:
     454          15 :                 SFS_AddString(parser, "~");
     455             :                 SFS_Expression(parser);
     456          15 :                 break;
     457          15 :         case ET_INCREMENT:
     458          15 :                 SFS_AddString(parser, "++");
     459             :                 SFS_Expression(parser);
     460          15 :                 break;
     461          15 :         case ET_DECREMENT:
     462          15 :                 SFS_AddString(parser, "--");
     463             :                 SFS_Expression(parser);
     464          15 :                 break;
     465          30 :         case ET_POST_INCREMENT:
     466          30 :                 SFS_Expression(parser);
     467          30 :                 SFS_AddString(parser, "++");
     468          30 :                 break;
     469          15 :         case ET_POST_DECREMENT:
     470          15 :                 SFS_Expression(parser);
     471          15 :                 SFS_AddString(parser, "--");
     472          15 :                 break;
     473          45 :         case ET_CONDTEST:
     474          45 :                 SFS_Expression(parser);
     475          45 :                 SFS_AddString(parser, " ? ");
     476          45 :                 SFS_Expression(parser);
     477          45 :                 SFS_AddString(parser, " : ");
     478             :                 SFS_Expression(parser);
     479          45 :                 break;
     480          45 :         case ET_STRING:
     481          45 :                 SFS_AddString(parser, "'");
     482          45 :                 SFS_GetString(parser);
     483          45 :                 SFS_AddString(parser, "'");
     484          45 :                 break;
     485         590 :         case ET_NUMBER:
     486         590 :                 SFS_GetNumber(parser);
     487         590 :                 break;
     488        1280 :         case ET_IDENTIFIER:
     489        1280 :                 SFS_Identifier(parser);
     490        1280 :                 break;
     491          15 :         case ET_FUNCTION_CALL:
     492          15 :                 SFS_FunctionCall(parser);
     493          15 :                 break;
     494          15 :         case ET_NEW:
     495          15 :                 SFS_NewObject(parser);
     496          15 :                 break;
     497          30 :         case ET_OBJECT_MEMBER_ACCESS:
     498          30 :                 SFS_ObjectMemberAccess(parser);
     499          30 :                 break;
     500          30 :         case ET_OBJECT_METHOD_CALL:
     501          30 :                 SFS_ObjectMethodCall(parser);
     502          30 :                 break;
     503          30 :         case ET_ARRAY_DEREFERENCE:
     504          30 :                 SFS_ArrayDeref(parser);
     505          30 :                 break;
     506             : 
     507          15 :         case ET_MULTIPLY:
     508          15 :                 SFS_Expression(parser);
     509          15 :                 SFS_AddString(parser, "*");
     510             :                 SFS_Expression(parser);
     511          15 :                 break;
     512          15 :         case ET_DIVIDE:
     513          15 :                 SFS_Expression(parser);
     514          15 :                 SFS_AddString(parser, "/");
     515             :                 SFS_Expression(parser);
     516          15 :                 break;
     517          15 :         case ET_MOD:
     518          15 :                 SFS_Expression(parser);
     519          15 :                 SFS_AddString(parser, "%");
     520             :                 SFS_Expression(parser);
     521          15 :                 break;
     522          15 :         case ET_PLUS:
     523          15 :                 SFS_Expression(parser);
     524          15 :                 SFS_AddString(parser, "+");
     525             :                 SFS_Expression(parser);
     526          15 :                 break;
     527          15 :         case ET_MINUS:
     528          15 :                 SFS_Expression(parser);
     529          15 :                 SFS_AddString(parser, "-");
     530             :                 SFS_Expression(parser);
     531          15 :                 break;
     532          15 :         case ET_LSHIFT:
     533          15 :                 SFS_Expression(parser);
     534          15 :                 SFS_AddString(parser, "<<");
     535             :                 SFS_Expression(parser);
     536          15 :                 break;
     537          15 :         case ET_RSHIFT:
     538          15 :                 SFS_Expression(parser);
     539          15 :                 SFS_AddString(parser, ">>");
     540             :                 SFS_Expression(parser);
     541          15 :                 break;
     542          15 :         case ET_RSHIFTFILL:
     543          15 :                 SFS_Expression(parser);
     544          15 :                 SFS_AddString(parser, ">>>");
     545             :                 SFS_Expression(parser);
     546          15 :                 break;
     547          15 :         case ET_AND:
     548          15 :                 SFS_Expression(parser);
     549          15 :                 SFS_AddString(parser, "&");
     550             :                 SFS_Expression(parser);
     551          15 :                 break;
     552          15 :         case ET_XOR:
     553          15 :                 SFS_Expression(parser);
     554          15 :                 SFS_AddString(parser, "^");
     555             :                 SFS_Expression(parser);
     556          15 :                 break;
     557          15 :         case ET_OR:
     558          15 :                 SFS_Expression(parser);
     559          15 :                 SFS_AddString(parser, "|");
     560             :                 SFS_Expression(parser);
     561          15 :                 break;
     562          30 :         case ET_LT:
     563          30 :                 SFS_Expression(parser);
     564          30 :                 SFS_AddString(parser, "<");
     565             :                 SFS_Expression(parser);
     566          30 :                 break;
     567          15 :         case ET_LE:
     568          15 :                 SFS_Expression(parser);
     569          15 :                 SFS_AddString(parser, "<=");
     570             :                 SFS_Expression(parser);
     571          15 :                 break;
     572          15 :         case ET_GT:
     573          15 :                 SFS_Expression(parser);
     574          15 :                 SFS_AddString(parser, ">");
     575             :                 SFS_Expression(parser);
     576          15 :                 break;
     577          15 :         case ET_GE:
     578          15 :                 SFS_Expression(parser);
     579          15 :                 SFS_AddString(parser, ">=");
     580             :                 SFS_Expression(parser);
     581          15 :                 break;
     582          30 :         case ET_EQ:
     583          30 :                 SFS_Expression(parser);
     584          30 :                 SFS_AddString(parser, "==");
     585             :                 SFS_Expression(parser);
     586          30 :                 break;
     587          15 :         case ET_NE:
     588          15 :                 SFS_Expression(parser);
     589          15 :                 SFS_AddString(parser, "!=");
     590             :                 SFS_Expression(parser);
     591          15 :                 break;
     592          15 :         case ET_LAND:
     593          15 :                 SFS_Expression(parser);
     594          15 :                 SFS_AddString(parser, "&&");
     595             :                 SFS_Expression(parser);
     596          15 :                 break;
     597          15 :         case ET_LOR:
     598          15 :                 SFS_Expression(parser);
     599          15 :                 SFS_AddString(parser, "||");
     600             :                 SFS_Expression(parser);
     601          15 :                 break;
     602         410 :         case ET_ASSIGN:
     603         410 :                 SFS_Expression(parser);
     604         410 :                 SFS_AddString(parser, "=");
     605             :                 SFS_Expression(parser);
     606         410 :                 break;
     607          15 :         case ET_PLUSEQ:
     608          15 :                 SFS_Expression(parser);
     609          15 :                 SFS_AddString(parser, "+=");
     610             :                 SFS_Expression(parser);
     611          15 :                 break;
     612          15 :         case ET_MINUSEQ:
     613          15 :                 SFS_Expression(parser);
     614          15 :                 SFS_AddString(parser, "-=");
     615             :                 SFS_Expression(parser);
     616          15 :                 break;
     617          15 :         case ET_MULTIPLYEQ:
     618          15 :                 SFS_Expression(parser);
     619          15 :                 SFS_AddString(parser, "*=");
     620             :                 SFS_Expression(parser);
     621          15 :                 break;
     622          15 :         case ET_DIVIDEEQ:
     623          15 :                 SFS_Expression(parser);
     624          15 :                 SFS_AddString(parser, "/=");
     625             :                 SFS_Expression(parser);
     626          15 :                 break;
     627          30 :         case ET_MODEQ:
     628          30 :                 SFS_Expression(parser);
     629          30 :                 SFS_AddString(parser, "%=");
     630             :                 SFS_Expression(parser);
     631          30 :                 break;
     632          15 :         case ET_LSHIFTEQ:
     633          15 :                 SFS_Expression(parser);
     634          15 :                 SFS_AddString(parser, "<<=");
     635             :                 SFS_Expression(parser);
     636          15 :                 break;
     637          15 :         case ET_RSHIFTEQ:
     638          15 :                 SFS_Expression(parser);
     639          15 :                 SFS_AddString(parser, ">>=");
     640             :                 SFS_Expression(parser);
     641          15 :                 break;
     642          15 :         case ET_RSHIFTFILLEQ:
     643          15 :                 SFS_Expression(parser);
     644          15 :                 SFS_AddString(parser, ">>>=");
     645             :                 SFS_Expression(parser);
     646          15 :                 break;
     647          15 :         case ET_ANDEQ:
     648          15 :                 SFS_Expression(parser);
     649          15 :                 SFS_AddString(parser, "&=");
     650             :                 SFS_Expression(parser);
     651          15 :                 break;
     652          15 :         case ET_XOREQ:
     653          15 :                 SFS_Expression(parser);
     654          15 :                 SFS_AddString(parser, "^=");
     655             :                 SFS_Expression(parser);
     656          15 :                 break;
     657          15 :         case ET_OREQ:
     658          15 :                 SFS_Expression(parser);
     659          15 :                 SFS_AddString(parser, "|=");
     660             :                 SFS_Expression(parser);
     661          15 :                 break;
     662          15 :         case ET_BOOLEAN:
     663          15 :                 SFS_GetBoolean(parser);
     664          15 :                 break;
     665          15 :         case ET_VAR:
     666          15 :                 SFS_AddString(parser, "var ");
     667          15 :                 SFS_Arguments(parser, GF_TRUE);
     668          15 :                 break;
     669          15 :         case ET_FUNCTION_ASSIGN:
     670          15 :                 SFS_AddString(parser, "function ");
     671          15 :                 SFS_Arguments(parser, GF_FALSE);
     672          15 :                 SFS_StatementBlock(parser, GF_TRUE);
     673          15 :                 break;
     674             :         default:
     675             :                 assert(0);
     676             :                 break;
     677             :         }
     678             : }
     679             : 
     680          15 : void SFS_NewObject(ScriptParser *parser)
     681             : {
     682          15 :         if (parser->codec->LastError) return;
     683          15 :         SFS_AddString(parser, "new ");
     684          15 :         SFS_Identifier(parser);
     685          15 :         SFS_AddString(parser, "(");
     686          15 :         SFS_Params(parser);
     687          15 :         SFS_AddString(parser, ") ");
     688             : }
     689             : 
     690          30 : void SFS_ArrayDeref(ScriptParser *parser)
     691             : {
     692          30 :         if (parser->codec->LastError) return;
     693          30 :         SFS_Expression(parser);
     694          30 :         SFS_AddString(parser, "[");
     695          30 :         SFS_CompoundExpression(parser);
     696          30 :         SFS_AddString(parser, "]");
     697             : }
     698             : 
     699          15 : void SFS_FunctionCall(ScriptParser *parser)
     700             : {
     701          15 :         if (parser->codec->LastError) return;
     702          15 :         SFS_Identifier(parser);
     703          15 :         SFS_AddString(parser, "(");
     704          15 :         SFS_Params(parser);
     705          15 :         SFS_AddString(parser, ")");
     706             : }
     707             : 
     708          30 : void SFS_ObjectMemberAccess(ScriptParser *parser)
     709             : {
     710          30 :         if (parser->codec->LastError) return;
     711          30 :         SFS_Expression(parser);
     712          30 :         SFS_AddString(parser, ".");
     713          30 :         SFS_Identifier(parser);
     714             : }
     715             : 
     716             : 
     717          30 : void SFS_ObjectMethodCall(ScriptParser *parser)
     718             : {
     719          30 :         if (parser->codec->LastError) return;
     720          30 :         SFS_Expression(parser);
     721          30 :         SFS_AddString(parser, ".");
     722          30 :         SFS_Identifier(parser);
     723          30 :         SFS_AddString(parser, "(");
     724          30 :         SFS_Params(parser);
     725          30 :         SFS_AddString(parser, ")");
     726             : }
     727             : 
     728          60 : void SFS_Params(ScriptParser *parser)
     729             : {
     730             :         u32 val;
     731          60 :         if (parser->codec->LastError) return;
     732          60 :         val = gf_bs_read_int(parser->bs, 1);
     733         165 :         while (val) {
     734          45 :                 SFS_Expression(parser);
     735          45 :                 val = gf_bs_read_int(parser->bs, 1);
     736          45 :                 if(val) SFS_AddString(parser, ",");
     737             :         }
     738             : }
     739             : 
     740         590 : void SFS_GetNumber(ScriptParser *parser)
     741             : {
     742             :         u32 val, nbBits;
     743             : 
     744         590 :         if (parser->codec->LastError) return;
     745             :         // integer
     746         590 :         if (gf_bs_read_int(parser->bs, 1)) {
     747         585 :                 nbBits = gf_bs_read_int(parser->bs, 5);
     748         585 :                 val = gf_bs_read_int(parser->bs, nbBits);
     749         585 :                 SFS_AddInt(parser, val);
     750         585 :                 return;
     751             :         }
     752             :         // real number
     753           5 :         val = gf_bs_read_int(parser->bs, 4);
     754          30 :         while ( val != 15) {
     755          20 :                 if (val<=9) {
     756          15 :                         SFS_AddChar(parser, (char) (val + '0') );
     757           5 :                 } else if (val==10) {
     758           5 :                         SFS_AddChar(parser, '.');
     759           0 :                 } else if (val==11) {
     760           0 :                         SFS_AddChar(parser, 'E');
     761           0 :                 } else if (val==12) {
     762           0 :                         SFS_AddChar(parser, '-');
     763             :                 }
     764          20 :                 val = gf_bs_read_int(parser->bs, 4);
     765             :         }
     766             : }
     767             : 
     768          45 : void SFS_GetString(ScriptParser *parser)
     769             : {
     770             :         char name[1000];
     771          45 :         if (parser->codec->LastError) return;
     772          45 :         gf_bifs_dec_name(parser->bs, name);
     773          45 :         SFS_AddString(parser, name);
     774             : }
     775             : 
     776          15 : void SFS_GetBoolean(ScriptParser *parser)
     777             : {
     778          15 :         if (parser->codec->LastError) return;
     779          15 :         if (gf_bs_read_int(parser->bs, 1)) {
     780          15 :                 SFS_AddString(parser, "true");
     781             :         } else {
     782           0 :                 SFS_AddString(parser, "false");
     783             :         }
     784             : }
     785             : 
     786             : #endif /*!defined(GPAC_DISABLE_BIFS) && defined(GPAC_HAS_QJS)*/

Generated by: LCOV version 1.13