SerialFlashFile SerialFlashChip::open(const char *filename) { uint32_t maxfiles, straddr; uint16_t hash, hashtable[8]; uint32_t i, n, index=0; uint32_t buf[3]; SerialFlashFile file; maxfiles = check_signature(); //Serial.printf("sig: %08X\n", maxfiles); if (!maxfiles) return file; maxfiles &= 0xFFFF; hash = filename_hash(filename); //Serial.printf("hash %04X for \"%s\"\n", hash, filename); while (index < maxfiles) { n = 8; if (n > maxfiles - index) n = maxfiles - index; SerialFlash.read(8 + index * 2, hashtable, n * 2); //Serial.printf(" read %u: ", 8 + index * 2); //pbuf(hashtable, n * 2); for (i=0; i < n; i++) { if (hashtable[i] == hash) { //Serial.printf(" hash match at index %u\n", index+i); buf[2] = 0; SerialFlash.read(8 + maxfiles * 2 + (index+i) * 10, buf, 10); //Serial.printf(" maxf=%d, index=%d, i=%d\n", maxfiles, index, i); //Serial.printf(" read %u: ", 8 + maxfiles * 2 + (index+i) * 10); //pbuf(buf, 10); straddr = 8 + maxfiles * 12 + buf[2] * 4; //Serial.printf(" straddr = %u\n", straddr); if (filename_compare(filename, straddr)) { //Serial.printf(" match!\n"); //Serial.printf(" addr = %u\n", buf[0]); //Serial.printf(" len = %u\n", buf[1]); file.address = buf[0]; file.length = buf[1]; file.offset = 0; file.dirindex = index + i; return file; } } else if (hashtable[i] == 0xFFFF) { return file; } } index += n; } return file; }
list_iter boxpath_first_part(boxpath * bpath) { list_iter it; boxfile * part; if(!boxpath_getfile(bpath)) return NULL; it = list_get_iter(bpath->dir->pieces); while(it && (filename_compare(bpath->file, list_iter_getval(it)) > 0)) it = list_iter_next(it); if(it) { part = (boxfile*) list_iter_getval(it); if(strncmp(bpath->base, part->name, strlen(bpath->base))) return NULL; } return it; }