📄 filecontainer.cpp
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2002 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * * 惧淡螟侯涪荚は·Free Software Foundation によって给山されている * GNU General Public License の Version 2 に淡揭されている掘凤か·笆 * 布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェ * アを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを浩网脱材墙なバイナリコ〖ド∈リロケ〖タブルオブ * ジェクトファイルやライブラリなど∷の妨で网脱する眷圭には·网脱 * に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯涪山绩· * この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを浩网脱稍材墙なバイナリコ〖ドの妨または怠达に寥 * み哈んだ妨で网脱する眷圭には·肌のいずれかの掘凤を塔たすことˉ * (a) 网脱に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 网脱の妨轮を·侍に年める数恕によって·惧淡螟侯涪荚に鼠桂する * ことˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚を倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚は· * 塑ソフトウェアに簇して·その努脱材墙拉も崔めて·いかなる瘦沮も乖わ * ないˉまた·塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じたい * かなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: filecontainer.cpp,v 1.5 2002/04/14 08:54:25 takayuki Exp $ */#ifdef _MSC_VER#pragma warning(disable:4786)#endif#include <stdio.h>#include "except.h"#include "filecontainer.h"using namespace std;filecontainer * filecontainer::instance;static char * parse_uint(char * src, unsigned int * dest, unsigned int default_value = 0){ while(*src >= '0' && *src <='9') default_value = default_value * 10 + *(src++) - '0'; *dest = default_value; return src;}bool filecontainer::attach_infofile(const char * filename){ char buffer[256]; FILE * f; char * work; struct tagStructureInformation info; f = fopen(filename,"rt"); if(f == NULL) Exception("Structure information file(%s) was not found. ","菇陇挛攫鼠ファイル(%s)が斧つかりません ").format(filename); while(fgets(buffer, 255, f) != NULL) { work = buffer + strlen(buffer) -1; if(*work == '\n') *work = '\x0'; switch(buffer[0]) { case 's': work = buffer+1; while(*work != ',' && *work != '\x0') work++; if(*work == '\x0') continue; *work = '\x0'; work = parse_uint(work+1,&info.size); work = parse_uint(work+1,&info.offset); structure_information[string(buffer+1)] = info; break; case 'd': work = buffer+1; while(*work != ',' && *work != '\x0') work++; if(*work == '\x0') continue; *work = '\x0'; objectname[string(buffer+1)] = string(work+1); break; default: Exception("Unknown information type identifier found - [%s]","踏梦の房急侍灰 - [%s]").format(buffer[0]); } } fclose(f); return true;}bool filecontainer::load_variable(void * dest, unsigned int size, const char * name){ map<string, struct tagStructureInformation>::iterator scope; unsigned long address; scope = structure_information.find(string(name)); if(scope == structure_information.end()) return false; if((*scope).second.size > size) return false; if((*scope).second.size < size) { memset(dest, 0, size); size = (*scope).second.size; } address = get_symbol_address(name); if(address == 0 || !load_contents(dest, address + (*scope).second.offset, size)) return false; if(!change_endian(dest,size)) return false; return true;}bool filecontainer::load_variable(void * dest, unsigned int size, unsigned long address, const char * name){ map<string, struct tagStructureInformation>::iterator scope; scope = structure_information.find(string(name)); if(scope == structure_information.end()) return false; if(size < (*scope).second.size) return false; if((*scope).second.size < size) size = (*scope).second.size; if(!load_contents(dest, address + (*scope).second.offset, size)) return false; if(!change_endian(dest,size)) return false; return true;}struct variable_information filecontainer::get_variable_information(const char * name, unsigned long base){ struct variable_information result; map<string, struct tagStructureInformation>::iterator scope; string work; result.address = 0; result.size = 0; work.assign(name); scope = structure_information.find(work); if(scope != structure_information.end()) { if(work.find_first_of(':') == string::npos) { result.address = this->get_symbol_address(name); if(result.address == 0) result.value = (long)((*scope).second.size); else result.size = (*scope).second.size; }else { result.address = base + (*scope).second.offset; result.size = (*scope).second.size; } } return result;}string filecontainer::get_objectname(int id, const char * type){ char buffer[32]; string work; map<string, string>::iterator scope; work = type; sprintf(buffer, "_%d", id); work += buffer; scope = objectname.find(work); if(scope != objectname.end()) work = (*scope).second; else work.erase(); return work;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -