コード例 #1
0
StackValue *compiledVFrame::create_stack_value(ScopeValue *sv) const {
  return StackValue::create_stack_value(&_fr, register_map(), sv);
}
コード例 #2
0
ファイル: device.c プロジェクト: ruedagato/arqui
/* read the file with all the pic14 definitions and pick out the definition
 * for a processor if specified. if pic_name is NULL reads everything */
static PIC_device *
find_device (char *pic_name)
{
    FILE *pic_file;
    char pic_buf[PIC14_STRING_LEN];
    int found_processor = FALSE;
    int done = FALSE;
    char **processor_name;
    int num_processor_names = 0;
    int pic_maxram = 0;
    int pic_bankmsk = 0;
    int pic_confsiz = 0;
    int pic_program = 0;
    int pic_data = 0;
    int pic_eeprom = 0;
    int pic_io = 0;
    char *simple_pic_name;
    char *dir;
    char filename[512];
    int len = 512;
    char **pic_word;
    int num_pic_words;
    int wcount;

    pic_word = Safe_calloc (sizeof (char *), SPLIT_WORDS_MAX);
    processor_name = Safe_calloc (sizeof (char *), SPLIT_WORDS_MAX);

    /* allow abbreviations of the form "f877" - convert to "16f877" */
    simple_pic_name = sanitise_processor_name (pic_name);
    num_of_supported_PICS = 0;

    /* open the piclist file */
    /* first scan all include directories */
    pic_file = NULL;
    //fprintf (stderr, "%s: searching %s\n", __FUNCTION__, DEVICE_FILE_NAME);
    for (dir = setFirstItem (userIncDirsSet);
            !pic_file && dir;
            dir = setNextItem (userIncDirsSet))
    {
        //fprintf (stderr, "searching1 %s\n", dir);
        SNPRINTF (&filename[0], len, "%s%s", dir,
                  DIR_SEPARATOR_STRING DEVICE_FILE_NAME);
        pic_file = fopen (filename, "rt");
        if (pic_file) break;
    } // for

    for (dir = setFirstItem (includeDirsSet);
            !pic_file && dir;
            dir = setNextItem (includeDirsSet))
    {
        //fprintf (stderr, "searching2 %s\n", dir);
        SNPRINTF (&filename[0], len, "%s%s", dir,
                  DIR_SEPARATOR_STRING DEVICE_FILE_NAME);
        pic_file = fopen (filename, "rt");
        if (pic_file) break;
    } // for

    for (dir = setFirstItem (libDirsSet);
            !pic_file && dir;
            dir = setNextItem (libDirsSet))
    {
        //fprintf (stderr, "searching3 %s\n", dir);
        SNPRINTF (&filename[0], len, "%s%s", dir,
                  DIR_SEPARATOR_STRING DEVICE_FILE_NAME);
        pic_file = fopen (filename, "rt");
        if (pic_file) break;
    } // for

    for (dir = setFirstItem (libPathsSet);
            !pic_file && dir;
            dir = setNextItem (libPathsSet))
    {
        //fprintf (stderr, "searching4 %s\n", dir);
        SNPRINTF (&filename[0], len, "%s%s", dir,
                  DIR_SEPARATOR_STRING DEVICE_FILE_NAME);
        pic_file = fopen (filename, "rt");
        if (pic_file) break;
    } // for

    if (!pic_file)
    {
        SNPRINTF (&filename[0], len, "%s",
                  DATADIR LIB_DIR_SUFFIX
                  DIR_SEPARATOR_STRING "pic"
                  DIR_SEPARATOR_STRING DEVICE_FILE_NAME);
        pic_file = fopen (filename, "rt");
    } // if

    if (pic_file == NULL)
    {
        fprintf (stderr, "can't find %s\n", DEVICE_FILE_NAME);
        return NULL;
    } // if

    if (options.verbose)
        printf ("Using devices from %s.\n", filename);

    /* read line by line */
    pic_buf[sizeof (pic_buf)-1] = '\0';
    while (fgets (pic_buf, sizeof (pic_buf)-1, pic_file) != NULL && !done)
    {
        /* strip comments */
        {
            char *comment = strchr (pic_buf, '#');
            if (comment)
                *comment = 0;
        }

        /* split into fields */
        num_pic_words = split_words (pic_word, pic_buf);

        /* ignore comment / empty lines */
        if (num_pic_words > 0)
        {

            if (STRCASECMP (pic_word[0], "processor") == 0)
            {
                if (pic_name == NULL)
                {
                    int dcount;

                    /* this is the mode where we read all the processors in - store the names for now */
                    if (num_processor_names > 0)
                    {
                        /* store away all the previous processor definitions */
                        for (dcount = 1; dcount < num_processor_names; dcount++)
                        {
                            create_pic (processor_name[dcount], pic_maxram,
                                        pic_bankmsk, pic_confsiz, pic_program,
                                        pic_data, pic_eeprom, pic_io);
                        } // for
                    } // if

                    /* copy processor names */
                    num_processor_names = num_pic_words;
                    for (dcount = 1; dcount < num_processor_names; dcount++)
                    {
                        processor_name[dcount] = pic_word[dcount];
                        pic_word[dcount] = NULL;
                    } // for
                } // if
                else
                {
                    /* if we've just completed reading a processor definition stop now */
                    if (found_processor)
                        done = TRUE;
                    else
                    {
                        /* check if this processor name is a match */
                        for (wcount = 1; wcount < num_pic_words; wcount++)
                        {
                            /* skip uninteresting prefixes */
                            char *found_name = sanitise_processor_name (pic_word[wcount]);

                            if (STRCASECMP (found_name, simple_pic_name) == 0)
                                found_processor = TRUE;
                        } // for
                    } // if
                } // if
            } // if
            else
            {
                if (found_processor || pic_name == NULL)
                {
                    /* only parse a processor section if we've found the one we want */
                    if (STRCASECMP (pic_word[0], "maxram") == 0 && num_pic_words > 1)
                    {
                        pic_maxram = parse_config_value (pic_word[1]);
                        setMaxRAM (pic_maxram);
                    } // if

                    else if (STRCASECMP (pic_word[0], "bankmsk") == 0 && num_pic_words > 1)
                        pic_bankmsk = parse_config_value (pic_word[1]);

                    else if (STRCASECMP (pic_word[0], "confsiz") == 0 && num_pic_words > 1)
                        pic_confsiz = parse_config_value (pic_word[1]);

                    else if (STRCASECMP (pic_word[0], "program") == 0 && num_pic_words > 1)
                        pic_program = parse_config_value (pic_word[1]);

                    else if (STRCASECMP (pic_word[0], "data") == 0 && num_pic_words > 1)
                        pic_data = parse_config_value (pic_word[1]);

                    else if (STRCASECMP (pic_word[0], "eeprom") == 0 && num_pic_words > 1)
                        pic_eeprom = parse_config_value (pic_word[1]);

                    else if (STRCASECMP (pic_word[0], "io") == 0 && num_pic_words > 1)
                        pic_io = parse_config_value (pic_word[1]);

                    else if (STRCASECMP (pic_word[0], "regmap") == 0 && num_pic_words > 2)
                    {
                        if (found_processor)
                            register_map (num_pic_words, pic_word);
                    } // if

                    else if (STRCASECMP (pic_word[0], "memmap") == 0 && num_pic_words > 2)
                    {
                        if (found_processor)
                            ram_map (num_pic_words, pic_word);
                    } // if

                    else
                    {
                        fprintf (stderr, "WARNING: %s: bad syntax `%s'\n",
                                 DEVICE_FILE_NAME, pic_word[0]);
                    } // if
                } // if
            } // if
        } // if
    } // while

    fclose (pic_file);

    split_words (pic_word, NULL);
    free (pic_word);

    /* if we're in read-the-lot mode then create the final processor definition */
    if (pic_name == NULL)
    {
        if (num_processor_names > 0)
        {
            /* store away all the previous processor definitions */
            int dcount;

            for (dcount = 1; dcount < num_processor_names; dcount++)
            {
                create_pic (processor_name[dcount], pic_maxram, pic_bankmsk,
                            pic_confsiz, pic_program, pic_data, pic_eeprom,
                            pic_io);
            } // for
        } // if
    } // if
    else
    {
        /* in search mode */
        if (found_processor)
        {
            split_words (processor_name, NULL);
            free (processor_name);

            /* create a new pic entry */
            return create_pic (pic_name, pic_maxram, pic_bankmsk,
                               pic_confsiz, pic_program, pic_data,
                               pic_eeprom, pic_io);
        } // if
    } // if

    split_words (processor_name, NULL);
    free (processor_name);

    return NULL;
}