StackValue *compiledVFrame::create_stack_value(ScopeValue *sv) const { return StackValue::create_stack_value(&_fr, register_map(), sv); }
/* 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; }