Example #1
0
/* Entry point for the assembler. code_ref is assumed to be attached
   to the gc. */
size_t asm_string(gc_type *gc, char *str, uint8_t **code_ref) {
    yyscan_t scanner = 0;
    op_type token = 0;
    buffer_type *buf = 0;
    hashtable_type *labels = 0;
    jump_type *jump_list = 0;
    size_t length = 0;
    
    
    gc_register_root(gc, &buf);
    gc_register_root(gc, &labels);
    gc_register_root(gc, (void **)&jump_list);

    /* create an output buffer */
    buffer_create(gc, &buf);
    hash_create_string(gc, &labels);

    yylex_init(&scanner);
    /* yyset_debug(1, scanner); */


    /* set the scanners input */
    yy_scan_string(str, scanner);

    /* match until there is nothing left to match */
    while((token = yylex(scanner)) != END_OF_FILE) {

        /* Handle individual tokens */
        switch((int)token) {
        case OP_LIT_FIXNUM:
            asm_lit_fixnum(buf, scanner);
            break;

        case OP_LIT_CHAR:
            asm_lit_char(buf, scanner);
            break;

        case STRING_START_TOKEN:
            EMIT(buf, OP_LIT_STRING, 1);
            asm_lit_string(buf, scanner);
            break;

        case SYMBOL_START_TOKEN:
            EMIT(buf, OP_LIT_SYMBOL, 1);
            asm_lit_string(buf, scanner);
            break;

        case OP_JMP:            
        case OP_JNF:
        case OP_CALL:
        case OP_PROC:
        case OP_CONTINUE:
            EMIT(buf, token, 1); /* emit the jump operation */
            asm_jump(gc, buf, scanner, &jump_list);
            break;                

        case LABEL_TOKEN:
            asm_label(gc, buf, labels, get_text(scanner));
            break;

            /* All otherwise not defined tokens are
               their opcode */
        default:
            EMIT(buf, token, 1);
            break;

        }
    }

    yylex_destroy(scanner);


    /* build a code_ref */
    length = buffer_size(buf);
    /* *code_ref = gc_alloc(gc, 0, length); */
    gc_alloc(gc, 0, length, (void **)code_ref);
    length = buffer_read(buf, *code_ref, length);

    /* replace jump address fields */
    rewrite_jumps(*code_ref, jump_list, labels);

    gc_unregister_root(gc, &buf);
    gc_unregister_root(gc, &labels);
    gc_unregister_root(gc, (void **)&jump_list);

    return length;
}
Example #2
0
void
DefineStdlib(SymbolTable *symbolTable, llvm::LLVMContext *ctx, llvm::Module *module,
             bool includeStdlibISPC) {
    // Add the definitions from the compiled builtins-c.c file
    if (g->target.is32Bit) {
        extern unsigned char builtins_bitcode_c_32[];
        extern int builtins_bitcode_c_32_length;
        AddBitcodeToModule(builtins_bitcode_c_32, builtins_bitcode_c_32_length, 
                           module, symbolTable);
    }
    else {
        extern unsigned char builtins_bitcode_c_64[];
        extern int builtins_bitcode_c_64_length;
        AddBitcodeToModule(builtins_bitcode_c_64, builtins_bitcode_c_64_length, 
                           module, symbolTable);
    }

    // Next, add the target's custom implementations of the various needed
    // builtin functions (e.g. __masked_store_32(), etc).
    switch (g->target.isa) {
    case Target::SSE2:
        extern unsigned char builtins_bitcode_sse2[];
        extern int builtins_bitcode_sse2_length;
        extern unsigned char builtins_bitcode_sse2_x2[];
        extern int builtins_bitcode_sse2_x2_length;
        switch (g->target.vectorWidth) {
        case 4: 
            AddBitcodeToModule(builtins_bitcode_sse2, builtins_bitcode_sse2_length, 
                               module, symbolTable);
            break;
        case 8:
            AddBitcodeToModule(builtins_bitcode_sse2_x2, builtins_bitcode_sse2_x2_length, 
                               module, symbolTable);
            break;
        default:
            FATAL("logic error in DefineStdlib");
        }
        break;
    case Target::SSE4:
        extern unsigned char builtins_bitcode_sse4[];
        extern int builtins_bitcode_sse4_length;
        extern unsigned char builtins_bitcode_sse4_x2[];
        extern int builtins_bitcode_sse4_x2_length;
        switch (g->target.vectorWidth) {
        case 4: 
            AddBitcodeToModule(builtins_bitcode_sse4,
                               builtins_bitcode_sse4_length, 
                               module, symbolTable);
            break;
        case 8:
            AddBitcodeToModule(builtins_bitcode_sse4_x2, 
                               builtins_bitcode_sse4_x2_length, 
                               module, symbolTable);
            break;
        default:
            FATAL("logic error in DefineStdlib");
        }
        break;
    case Target::AVX:
        switch (g->target.vectorWidth) {
        case 8:
            extern unsigned char builtins_bitcode_avx1[];
            extern int builtins_bitcode_avx1_length;
            AddBitcodeToModule(builtins_bitcode_avx1, 
                               builtins_bitcode_avx1_length, 
                               module, symbolTable);
            break;
        case 16:
            extern unsigned char builtins_bitcode_avx1_x2[];
            extern int builtins_bitcode_avx1_x2_length;
            AddBitcodeToModule(builtins_bitcode_avx1_x2, 
                               builtins_bitcode_avx1_x2_length,
                               module,  symbolTable);
            break;
        default:
            FATAL("logic error in DefineStdlib");
        }
        break;
    case Target::AVX2:
        switch (g->target.vectorWidth) {
        case 8:
            extern unsigned char builtins_bitcode_avx2[];
            extern int builtins_bitcode_avx2_length;
            AddBitcodeToModule(builtins_bitcode_avx2, 
                               builtins_bitcode_avx2_length, 
                               module, symbolTable);
            break;
        case 16:
            extern unsigned char builtins_bitcode_avx2_x2[];
            extern int builtins_bitcode_avx2_x2_length;
            AddBitcodeToModule(builtins_bitcode_avx2_x2, 
                               builtins_bitcode_avx2_x2_length,
                               module,  symbolTable);
            break;
        default:
            FATAL("logic error in DefineStdlib");
        }
        break;
    case Target::GENERIC:
        switch (g->target.vectorWidth) {
        case 4:
            extern unsigned char builtins_bitcode_generic_4[];
            extern int builtins_bitcode_generic_4_length;
            AddBitcodeToModule(builtins_bitcode_generic_4, 
                               builtins_bitcode_generic_4_length, 
                               module, symbolTable);
            break;
        case 8:
            extern unsigned char builtins_bitcode_generic_8[];
            extern int builtins_bitcode_generic_8_length;
            AddBitcodeToModule(builtins_bitcode_generic_8, 
                               builtins_bitcode_generic_8_length, 
                               module, symbolTable);
            break;
        case 16:
            extern unsigned char builtins_bitcode_generic_16[];
            extern int builtins_bitcode_generic_16_length;
            AddBitcodeToModule(builtins_bitcode_generic_16, 
                               builtins_bitcode_generic_16_length, 
                               module, symbolTable);
            break;
	case 1:
            extern unsigned char builtins_bitcode_generic_1[];
            extern int builtins_bitcode_generic_1_length;
            AddBitcodeToModule(builtins_bitcode_generic_1, 
                               builtins_bitcode_generic_1_length, 
                               module, symbolTable);
            break;
        default:
            FATAL("logic error in DefineStdlib");
        }
        break;
    default:
        FATAL("logic error");
    }

    // define the 'programCount' builtin variable
    lDefineConstantInt("programCount", g->target.vectorWidth, module, symbolTable);

    // define the 'programIndex' builtin
    lDefineProgramIndex(module, symbolTable);

    // Define __math_lib stuff.  This is used by stdlib.ispc, for example, to
    // figure out which math routines to end up calling...
    lDefineConstantInt("__math_lib", (int)g->mathLib, module, symbolTable);
    lDefineConstantInt("__math_lib_ispc", (int)Globals::Math_ISPC, module,
                       symbolTable);
    lDefineConstantInt("__math_lib_ispc_fast", (int)Globals::Math_ISPCFast, 
                       module, symbolTable);
    lDefineConstantInt("__math_lib_svml", (int)Globals::Math_SVML, module,
                       symbolTable);
    lDefineConstantInt("__math_lib_system", (int)Globals::Math_System, module,
                       symbolTable);
    lDefineConstantIntFunc("__fast_masked_vload", (int)g->opt.fastMaskedVload, module,
                           symbolTable);

    lDefineConstantInt("__have_native_half", (g->target.isa == Target::AVX2),
                       module, symbolTable);

    if (includeStdlibISPC) {
        // If the user wants the standard library to be included, parse the
        // serialized version of the stdlib.ispc file to get its
        // definitions added.
      if (g->target.isa == Target::GENERIC&&g->target.vectorWidth!=1) { // 1 wide uses x86 stdlib
            extern char stdlib_generic_code[];
            yy_scan_string(stdlib_generic_code);
            yyparse();
        }
        else {
            extern char stdlib_x86_code[];
            yy_scan_string(stdlib_x86_code);
            yyparse();
        }
    }
}
Example #3
0
void inicializa_analise(char *str)
{
  buffer = yy_scan_string(str);
}
Example #4
0
int main(int argc, char** argv) {
    // Various things log information to stdout or stderr more or less
    // at random (though we've tried to standardize on stdout).  The
    // log file makes more sense if buffering is turned off so things
    // appear in the right order.
    setbuf(stdout, NULL);
    setbuf(stderr, NULL);

    if (argc != 4) {
        fprintf(stderr, "unexpected number of arguments (%d)\n", argc);
        return 1;
    }

    char* version = argv[1];
    if ((version[0] != '1' && version[0] != '2' && version[0] != '3') ||
        version[1] != '\0') {
        // We support version 1, 2, or 3.
        fprintf(stderr, "wrong updater binary API; expected 1, 2, or 3; "
                        "got %s\n",
                argv[1]);
        return 2;
    }

    // Set up the pipe for sending commands back to the parent process.

    int fd = atoi(argv[2]);
    FILE* cmd_pipe = fdopen(fd, "wb");
    setlinebuf(cmd_pipe);

    // Extract the script from the package.

    char* package_data = argv[3];
    ZipArchive za;
    int err;
    err = mzOpenZipArchive(package_data, &za);
    if (err != 0) {
        fprintf(stderr, "failed to open package %s: %s\n",
                package_data, strerror(err));
        return 3;
    }

    const ZipEntry* script_entry = mzFindZipEntry(&za, SCRIPT_NAME);
    if (script_entry == NULL) {
        fprintf(stderr, "failed to find %s in %s\n", SCRIPT_NAME, package_data);
        return 4;
    }

    char* script = malloc(script_entry->uncompLen+1);
    if (!mzReadZipEntry(&za, script_entry, script, script_entry->uncompLen)) {
        fprintf(stderr, "failed to read script from package\n");
        return 5;
    }
    script[script_entry->uncompLen] = '\0';
#if 1 //wschen 2012-06-01
    fprintf(stderr, "====== Updater-Script:\n");
    fprintf(stderr, "%s\n\n", script);
#endif
    // Configure edify's functions.

    RegisterBuiltins();
    RegisterInstallFunctions();
    RegisterDeviceExtensions();
    FinishRegistration();

    // Parse the script.

    Expr* root;
    int error_count = 0;
    yy_scan_string(script);
    int error = yyparse(&root, &error_count);
    if (error != 0 || error_count > 0) {
        fprintf(stderr, "%d parse errors\n", error_count);
        return 6;
    }

    struct selinux_opt seopts[] = {
      { SELABEL_OPT_PATH, "/file_contexts" }
    };

    sehandle = selabel_open(SELABEL_CTX_FILE, seopts, 1);

    if (!sehandle) {
        fprintf(stderr, "Warning:  No file_contexts\n");
        fprintf(cmd_pipe, "ui_print Warning: No file_contexts\n");
    }

    // Evaluate the parsed script.

    UpdaterInfo updater_info;
    updater_info.cmd_pipe = cmd_pipe;
    updater_info.package_zip = &za;
    updater_info.version = atoi(version);

    State state;
    state.cookie = &updater_info;
    state.script = script;
    state.errmsg = NULL;

    char* result = Evaluate(&state, root);
    if (result == NULL) {
        if (state.errmsg == NULL) {
            fprintf(stderr, "script aborted (no error message)\n");
            fprintf(cmd_pipe, "ui_print script aborted (no error message)\n");
        } else {
            fprintf(stderr, "script aborted: %s\n", state.errmsg);
            char* line = strtok(state.errmsg, "\n");
            while (line) {
                fprintf(cmd_pipe, "ui_print %s\n", line);
                line = strtok(NULL, "\n");
            }
            fprintf(cmd_pipe, "ui_print\n");
        }
        free(state.errmsg);
        return 7;
    } else {
        fprintf(stderr, "script result was [%s]\n", result);
        free(result);
    }

    if (updater_info.package_zip) {
        mzCloseZipArchive(updater_info.package_zip);
    }
    free(script);

    return 0;
}
Example #5
0
int main(int argc, char *argv[]) {
    struct ritual_instance scheme;
    struct parse_context my;
	struct rflo_filehandle *flo_stdout; 

    ritual_global_initialize();
    ritual_select_instance( &scheme ); // Life's easy when you're single-threaded..

    int failure = ritual_initialize_instance( &scheme );
    if( failure ) {
        fprintf(stderr, "fatal error: unable to initialize Scheme instance\n" );
        return 1;
    }
    if( RITUAL_TOP_LEVEL_ERROR( &scheme ) ) {
        fprintf(stderr, "fatal error: %s\n", scheme.error->reason );
        ritual_deinitialize_instance( &scheme );
        return 1;
    }

    flo_stdout = rflo_filehandle_create( &scheme, stdout );

    pctx_init( &my, &scheme );
    yylex_init( &my.scanner );
    yyset_extra( &my, my.scanner );

    struct rl3_global_context gctx_s;
    struct rl3_global_context *gctx = &gctx_s;
    rl3_initialize(gctx );

    struct rl3_context rl3ctx;

    rl3_context_init( &rl3ctx, gctx, &scheme );

    struct rl3_instr *program = 0;
    struct rl3_instr *jpt = program = rl3_mkinstr( &scheme, gctx->IS_NULL, 0, program );
    program = rl3_mkinstr( &scheme, gctx->BRANCH, 0, program );
    program = rl3_mkinstr( &scheme, gctx->SPLIT_PAIR, 0, program );
    program = rl3_mkinstr( &scheme, gctx->PRINT, 0, program );
    program = rl3_mkinstr( &scheme, gctx->JUMP, &jpt->header, program );
    program = rl3_reverse( program );

    struct rl3_instr *print_forwards = program;

    struct rl3_instr *dsc = rl3_mkinstr( &scheme, gctx->DISCARD, 0, 0);
/*
    program = 0;
    program = rl3_mkinstr( &scheme, gctx->STORE, 0, program );
    jpt = program = rl3_mkinstr( &scheme, gctx->SWAP, 0, program );
    program = rl3_mkinstr( &scheme, gctx->IS_NULL, 0, program );
    program = rl3_mkinstr( &scheme, gctx->BRANCH, &dsc->header, program );
    program = rl3_mkinstr( &scheme, gctx->SPLIT_PAIR, 0, program );
    program = rl3_mkinstr( &scheme, gctx->ROTATE, 0, program );
    program = rl3_mkinstr( &scheme, gctx->SWAP, 0, program );
    program = rl3_mkinstr( &scheme, gctx->CONS, 0, program );
    program = rl3_mkinstr( &scheme, gctx->JUMP, &jpt->header, program );
    program = rl3_reverse( program );
    */
    program = 0;
    struct rl3_instr **writep = &program;
    writep = rl3_seqinstr( &scheme, gctx->STORE, 0, writep, 0 );
    writep = rl3_seqinstr( &scheme, gctx->SWAP, 0, writep, &jpt );
    writep = rl3_seqinstr( &scheme, gctx->IS_NULL, 0, writep, 0 );
    writep = rl3_seqinstr( &scheme, gctx->BRANCH, &dsc->header, writep, 0 );
    writep = rl3_seqinstr( &scheme, gctx->SPLIT_PAIR, 0, writep, 0 );
    writep = rl3_seqinstr( &scheme, gctx->ROTATE, 0, writep, 0 );
    writep = rl3_seqinstr( &scheme, gctx->SWAP, 0, writep, 0 );
    writep = rl3_seqinstr( &scheme, gctx->CONS, 0, writep, 0 );
    writep = rl3_seqinstr( &scheme, gctx->JUMP, &jpt->header, writep, 0 );

	while( 1 ) {
		char data[1024];
		fputs( ">>> ", stdout );
		fflush( stdout );
		void* fgrv = fgets( data, sizeof data, stdin );
        if( !fgrv ) {
            puts("");
            break;
        }

		int len = strlen( data );
		if( data[len-1] != '\n' ) {
			puts( "error: line too long" );
		} else {
			data[len-1] = '\0';
			if( !strlen(data) ) {
				continue;
			}
            if( RITUAL_INTERACTIVE_LEVEL_ERROR( &scheme ) ) {
                fprintf( stderr, "error: %s\n", scheme.error->reason );
            } else {
                YY_BUFFER_STATE buffer = yy_scan_string( data, my.scanner );
                yyparse( &my );
                yy_delete_buffer( buffer, my.scanner );
                while( pctx_has_more( &my ) ) {
                    ritual_object_t * object = pctx_pop( &my );
                    ritual_list_push( &scheme, &rl3ctx.values, object ); 
                    ritual_list_push( &scheme, &rl3ctx.sequences, (void*) program );
                    fprintf(stderr, "\n" );
                    while( rl3_running( &rl3ctx ) ) {
                        fprintf(stderr, "." );
                        rl3_run_one( &rl3ctx );
                    }
                    fprintf(stderr, "\n" );
                    object = ritual_list_next( &scheme, &rl3ctx.values );
                    fputs( "-> ", stdout );
                    ritual_print( &scheme, &flo_stdout->flo, object );
                    puts( "" );
                }
            }
		}
	}

	rflo_filehandle_destroy( &scheme, flo_stdout );
    yylex_destroy( my.scanner );
    pctx_destroy( &my );

    rl3_deinitialize( gctx );

    ritual_deinitialize_instance( &scheme );

    ritual_global_deinitialize();
    return 0;
}
Example #6
0
/*!
 * \brief       Main program
 * \param[argc] Number of command line arguments
 * \param[argv] Array of strings with the command line arguments
 * \return      Exit status
 */
int main(int argc, char **argv) {

  char   expression[EXPRESSION_SIZE];
  int    expression_size;

#ifdef HAVE_SRANDOMDEV
  srandomdev();
#else
  srand(time(NULL));
#endif
     
  while (TRUE) {

    static struct option long_options[] = {
      {"sum-series",  no_argument,       NULL, 's'},
      {"positive",    no_argument,       NULL, 'p'},
      {"verbose",     no_argument,       NULL, 'v'},
      {"version",     no_argument,       &version_flag, TRUE},
      {"help",        no_argument,       NULL, 'h'},
#ifdef DEBUG
      {"debug",       no_argument,       NULL, 'd'},
#endif
      {NULL, 0, NULL, 0}
    };

    /* getopt_long stores the option index here. */
    int option_index = 0;

    int c;
    
#ifdef DEBUG
    c = getopt_long (argc, argv, "hvspd",
		     long_options, &option_index);
#else
    c = getopt_long (argc, argv, "hvsp",
		     long_options, &option_index);
#endif
    
    /* Detect the end of the options. */
    if (c == -1)
      break;
     
    switch (c) {

    case 'v':
      verbose_flag = TRUE;
      break;

    case 's':
      sum_flag = TRUE;
      break;
      
    case 'p':
      positive_flag = TRUE;
      break;

    case 'h':
      usage();
      exit(0);

    case '?':
      usage();
      /* getopt_long already printed an error message. */
      exit(EXIT_SUCCESS);

#ifdef DEBUG
    case 'd':
      debug_flag++;
      break;      
#endif
      
    case 0:
      break;

    default:
      abort ();
    }

  }

  if (version_flag) {
    printf("%s %s\n", PACKAGE_NAME, PACKAGE_VERSION);
    exit(EXIT_SUCCESS);
  }      

  argc -= optind;
  argv += optind;         
  
  /* build string to parse */
  expression[0] = '\0';
  expression_size = 0;
  while(argc>0) {
    expression_size += strlen(*argv);
    if (expression_size >= EXPRESSION_SIZE) {
      error("Expression too long!\n");
    }
    strncat(expression, *argv, EXPRESSION_SIZE-1);
    argc--;
    argv++;
  }
  
  if (expression_size > 0) {
    
    yy_scan_string(expression);

    yyparse();

  } else {
    error("No expression provided!\nPlease use the \"-h\" option.\n");
    exit(EXIT_FAILURE);
  }

  return 0;

}
Example #7
0
static int_fast8_t CLI_execute_line()
{
    long i, j;
    char *cmdargstring;
    char str[200];
    FILE *fp;
    time_t t;
    struct tm *uttime;
    struct timespec *thetime = (struct timespec *)malloc(sizeof(struct timespec));
    char command[200];
    int r;

    if (line[0]=='!')
    {
        line[0] = ' ';
        if(system(line)==-1)
        {
            printERROR(__FILE__,__func__,__LINE__,"system call error");
            exit(1);
        }
        data.CMDexecuted = 1;
    }
    else if (line[0]=='#')
    {
        // do nothing... this is a comment
        data.CMDexecuted = 1;
    }
    else
    {
        // some initialization
        data.parseerror = 0;
        data.calctmp_imindex = 0;
        for(i=0; i<NB_ARG_MAX; i++)
            data.cmdargtoken[0].type = 0;

        if(data.CLIlogON==1)
        {
            t = time(NULL);
            uttime = gmtime(&t);
            clock_gettime(CLOCK_REALTIME, thetime);

            sprintf(data.CLIlogname, "%s/logdir/%04d%02d%02d/%04d%02d%02d_CLI-%s.log", getenv("HOME"), 1900+uttime->tm_year, 1+uttime->tm_mon, uttime->tm_mday, 1900+uttime->tm_year, 1+uttime->tm_mon, uttime->tm_mday, data.processname);

            fp = fopen(data.CLIlogname, "a");
            if(fp==NULL)
            {
                printf("ERROR: cannot log into file %s\n", data.CLIlogname);
                sprintf(command, "mkdir -p %s/logdir/%04d%02d%02d\n", getenv("HOME"), 1900+uttime->tm_year, 1+uttime->tm_mon, uttime->tm_mday);
                r = system(command);
            }
            else
            {
                fprintf(fp, "%04d/%02d/%02d %02d:%02d:%02d.%09ld %10s %6ld %s\n", 1900+uttime->tm_year, 1+uttime->tm_mon, uttime->tm_mday, uttime->tm_hour, uttime->tm_min, uttime->tm_sec, thetime->tv_nsec, data.processname, (long) getpid(), line);
                fclose(fp);
            }
        }

        data.cmdNBarg = 0;
        cmdargstring = strtok (line," ");
        while (cmdargstring!= NULL)
        {
            if((cmdargstring[0]=='\"')&&(cmdargstring[strlen(cmdargstring)-1]=='\"'))
            {
                printf("Unprocessed string : ");
                for(j=0; j<strlen(cmdargstring)-2; j++)
                    cmdargstring[j] = cmdargstring[j+1];
                cmdargstring[j] = '\0';
                printf("%s\n", cmdargstring);
                data.cmdargtoken[data.cmdNBarg].type = 6;
                sprintf(data.cmdargtoken[data.cmdNBarg].val.string, "%s", cmdargstring);
            }
            else
            {
                sprintf(str,"%s\n", cmdargstring);
                yy_scan_string(str);
                data.calctmp_imindex = 0;
                yyparse ();
            }
            cmdargstring = strtok (NULL, " ");
            data.cmdNBarg++;
        }
        data.cmdargtoken[data.cmdNBarg].type = 0;
        yylex_destroy();

        i=0;
        if(data.Debug==1)
            while(data.cmdargtoken[i].type != 0)
            {
                printf("TOKEN %ld type : %d\n", i, data.cmdargtoken[i].type);
                if(data.cmdargtoken[i].type==1) // double
                    printf("\t double : %g\n", data.cmdargtoken[i].val.numf);
                if(data.cmdargtoken[i].type==2) // long
                    printf("\t long   : %ld\n", data.cmdargtoken[i].val.numl);
                if(data.cmdargtoken[i].type==3) // new variable/image
                    printf("\t string : %s\n", data.cmdargtoken[i].val.string);
                if(data.cmdargtoken[i].type==4) // existing image
                    printf("\t string : %s\n", data.cmdargtoken[i].val.string);
                if(data.cmdargtoken[i].type==5) // command
                    printf("\t string : %s\n", data.cmdargtoken[i].val.string);
                if(data.cmdargtoken[i].type==6) // unprocessed string
                    printf("\t string : %s\n", data.cmdargtoken[i].val.string);
                i++;
            }
        if(data.parseerror==0)
        {
            if(data.cmdargtoken[0].type==5)
            {
                if(data.Debug==1)
                    printf("EXECUTING COMMAND %ld (%s)\n", data.cmdindex, data.cmd[data.cmdindex].key);
                data.cmd[data.cmdindex].fp();
                data.CMDexecuted = 1;
            }
        }
        for(i=0; i<data.calctmp_imindex; i++)
        {
            sprintf(calctmpimname,"_tmpcalc%ld",i);
            if(image_ID(calctmpimname)!=-1)
            {
                if(data.Debug==1)
                    printf("Deleting %s\n", calctmpimname);
                delete_image_ID(calctmpimname);
            }
        }


        if(!((data.cmdargtoken[0].type==3)||(data.cmdargtoken[0].type==6)))
            data.CMDexecuted = 1;


        add_history(line);

    }


    return(0);
}
void MainWindow::orEClicked()
{

    QList<QGraphicsItem *> selected_list = scene->selectedItems();
    Node* selected = (Node*)(selected_list.at(0));
    selected->setRule("orE");
    selected->update();
    int rect_x;
    int rect_y;

    bool ok;
    while(1){
             QString tekst = QInputDialog::getText(this, tr("QInputDialog::getText()"),
                                             tr("Unesite formulu:"), QLineEdit::Normal,
                                             QDir::home().dirName(), &ok);
             if (ok && !tekst.isEmpty()){
                qDebug() << "radi";
             }


            std::string formula = tekst.toUtf8().constData();
            formula += " ;";
            std::ostringstream stream;
            qDebug() << QString::fromStdString(formula);
            YY_BUFFER_STATE buffer = yy_scan_string(formula.c_str());

            if(yyparse() == 1){
                qDebug() << "Pa to ti ne radi";
             }

            if(parsed_formula->getType() == BaseFormula::T_OR){
                break;
            }
    }

    std::ostringstream stream;
    parsed_formula->printFormula(stream);
    qreal rect_width =  stream.str().length()*PARAMETER;
    qreal rect_height = 20;

    rect_x = selected->getx() - 20 - depth/2;
    rect_y = selected->gety() - 20 - depth/2;

    QVector<Formula> assumptions = selected->getAssumptions();
    assumptions.push_back(parsed_formula);

    Node* item3 = new Node( parsed_formula, rect_width, rect_height, rect_x, rect_y, selected_list.at(0), assumptions);
    scene->addNode(item3);

    Formula op1 = ((Or*)parsed_formula.get())->getOperand1();
    Formula op2 = ((Or*)parsed_formula.get())->getOperand2();

    rect_x = selected->getx() + 25 + depth/2;
    rect_y = selected->gety() - 20 - depth/2;


    assumptions.push_back(op1);
    assumptions.push_back(op2);
    op1->printFormula(stream);
    rect_width = stream.str().length()*PARAMETER;
    Node* item1 = new Node( selected->getFormula(), rect_width, rect_height, rect_x, rect_y, selected_list.at(0), assumptions);
    scene->addNode(item1);

    rect_x = selected->getx() + 50 + depth/2;
    rect_y = selected->gety() - 20 - depth/2;

    op2->printFormula(stream);
    rect_width = stream.str().length()*PARAMETER;
    Node* item2 = new Node(selected->getFormula(), rect_width, rect_height, rect_x, rect_y, selected_list.at(0), assumptions);
    scene->addNode(item2);



}
Example #9
0
KS_RESULT LoadDupl(KscServerBase* Server, PltString &ImpString)
/*****************************************************************************/
{
        /*
        *        Variablen
        */
        int                exit_status;
        size_t         i,j;            // Laufvariablen
        char        path[32];       // Hilfsstring

    InstanceItems*        pinst;
    LinksItems*                pLinks;

    PltString       VerbName;   // Name der Verbindung
    PltString       NewName;    // Neuen Name der Verbindung
    PltString       Assoc;      // Assoziations-Identifier
    
        yydebug = 0;
        current_line = 0;

    size_t    Count;            // Merker : Anzahl der Verbindungen
    KS_RESULT err;              // Ergebnis des Dienstes
    
    struct yy_buffer_state* buf;
    
        /*
        *        check option settings
        */

    if(!Server)
            return KS_ERR_SERVERUNKNOWN;

        if(!ImpString.len() ) {
                return KS_ERR_OK;
        }

        ppar = (Dienst_param*)malloc(sizeof(Dienst_param));
        if(!ppar) {
                return OV_ERR_HEAPOUTOFMEMORY;
        }
        ppar->Instance = 0;
        ppar->Set_Inst_Var = 0;
        ppar->DelInst = 0;
        ppar->OldLibs = 0;
        ppar->NewLibs = 0;
        ppar->Links = 0;
        ppar->UnLinks = 0;


        /*
        *   Eingabe parsen
        */
        buf = yy_scan_string( (char*)(const char*)ImpString );
    exit_status =  yyparse();
    yy_delete_buffer( buf );

    /* String geparst ? */
        if(exit_status != EXIT_SUCCESS) {
            memfre(ppar);
            free(ppar);
        fb_parser_freestrings();
        
        return KS_ERR_BADPARAM;
    }


///////////////////////////////////////////////////////////////////////////////
//  Es muessen Namen der Verbindungen geaendert werden                       //
///////////////////////////////////////////////////////////////////////////////

    sprintf(path, "/%s/",FB_CONN_CONTAINER);

    /* Anzahl der Verbindungen ermitteln */
    pinst = ppar->Instance;
    Count = 0;
    
    while(pinst) {

        if( !strncmp(pinst->Inst_name, path, 4) ) {
            // Verbindung gefunden
            Count++;
        }
        pinst = pinst->next;
    }
    
    PltArray<char*> Verbindung(Count);
    if(Verbindung.size() != Count) {
        // Out of memory ?
        err = OV_ERR_HEAPOUTOFMEMORY;
        goto EXIT_FNC;
    }
    // Array initialisieren
    for(j = 0; j < Count; j++) {
        Verbindung[j] = 0;
    }
    
    // Gibt es Verbindungen ?
    if(Count) {
        
        // Dann erzeugen wir neuen Name fuer Verbindungs-Objekt.
        GenerateComConName(Assoc);      // Neuen Name der Verbindung erzeugen
        NewName = path;
        NewName += Assoc;

        /* Verbindung-Namen aendern */
        pinst = ppar->Instance;
        j = 0;
        
        while(pinst) {
            char* ph;
            
            if( !strncmp(pinst->Inst_name, path, 4) ) {
                // Verbindung gefunden
                VerbName = pinst->Inst_name;    // Name der Verbindung merken

                ph = (char*)malloc(NewName.len() + 33);
                if(!ph) {
                    // Out of memory
                    for(i = 0; i < j; i++) {
                        if(Verbindung[i]) free(Verbindung[i]);
                    }
                    err = OV_ERR_HEAPOUTOFMEMORY;
                    goto EXIT_FNC;
                }
            
                // Neuen Name kopieren
                sprintf(ph, "%s%d", (const char*)NewName, j);

                pinst->Inst_name = ph;
                
                // String merken
                Verbindung[j] = ph;
                j++;
                
                for(i = 0; i < 2; i++) {
                    switch(i) {
                        case 0:
                            // Link "outputcon" suchen
                            Assoc = "outputcon";
                            break;
                        default:
                            // Link "inputcon" suchen
                            Assoc = "inputcon";
                            break;
                    }
                
                        pLinks = ppar->Links;
                        while(  (pLinks) ) {
                            if( (VerbName == pLinks->children->child_path) &&
                                (Assoc == pLinks->child_role) ) {
                                    break;
                             }
                            pLinks = pLinks->next;
                        }
                        if(!pLinks) {
                        // Link nicht gefunden
                        for(i = 0; i < j; i++) {
                            if(Verbindung[i]) free(Verbindung[i]);
                        }
                        err = KS_ERR_BADPARAM;
                        goto EXIT_FNC;
                        }

                        // Neuen Name in Link-String merken
                        pLinks->children->child_path = ph;
                    
                } // Links suchen
                } // if Verb. gefunden
            
                pinst = pinst->next;    // Naechste Instance
            
        } // while Instanzen
    } // if Verbindungen vorhanden
    
    // Alle Verbindungen und Links umbennant.
    // Instanzen anlegen :
    
    VerbName = "";
    err = import_eval(Server, ppar, VerbName);

    // Neue erzeugte Strings freigeben
    for(i = 0; i < Count; i++) {
        if(Verbindung[i]) free(Verbindung[i]);
    }
    
EXIT_FNC:
        memfre(ppar);
        free(ppar);
    fb_parser_freestrings();

    return err;
}