rtoss

Subversion Repositories:
Compare Path: Rev
With Path: Rev
/satoriya-utf8/ @ 39  →  /satoriya-utf8/ @ 40
/satoriya-utf8/_/Sender.h
@@ -1,12 +1,11 @@
#ifndef SENDER_H
#define SENDER_H
 
/*
ログアプリケーション「れしば」にメッセージを送信。
*/
/*ログ関連一式*/
 
#include <iostream>
#include <stdio.h>
#include <vector>
#include <stdio.h>
using namespace std;
 
#ifndef POSIX
@@ -34,6 +33,32 @@
char line[MAX+1];
int pos;
};
 
class error_buf : public streambuf
{
public:
error_buf() { line[0]='\0'; pos=0; log_mode=false; }
virtual int overflow(int c=EOF);
 
void set_log_mode(bool is_log) { log_mode = is_log; }
bool get_log_mode(void) { return log_mode; }
 
const std::vector<string> & get_log(void) { return log_data; }
void clear_log(void) { log_data.clear(); }
 
enum const_value {
MAX=8191
};
private:
void send(const std::string &str);
 
char line[MAX+1];
int pos;
 
bool log_mode;
std::vector<string> log_data;
};
 
static bool sm_sender_flag; // 動作有効可否
 
Sender();
@@ -46,6 +71,19 @@
sender_stream() : ostream(&buf) {}
};
 
class error_stream : public ostream
{
error_buf buf;
public:
error_stream() : ostream(&buf) {}
 
void set_log_mode(bool is_log) { buf.set_log_mode(is_log); }
bool get_log_mode(void) { return buf.get_log_mode(); }
 
const std::vector<string> & get_log(void) { return buf.get_log(); }
void clear_log(void) { buf.clear_log(); }
};
 
// このクラスのインスタンスのライフタイムに合わせ、ログ表示の際にネストを行う
class nest_object
{
@@ -66,6 +104,7 @@
};
 
// ログ出力ストリーム
extern Sender::sender_stream sender;
extern Sender::sender_stream sender;
extern Sender::error_stream errsender;
 
#endif // SENDER_H
/satoriya-utf8/_/random.cpp
@@ -4,8 +4,25 @@
 
#include "mt19937ar.h"
 
void randomize(unsigned int dwSeed)
#ifdef POSIX
#include <sys/time.h>
#else
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
 
void randomize(void)
{
unsigned int dwSeed;
 
#ifdef POSIX
struct timeval tv;
gettimeofday(&tv,NULL);
dwSeed = tv.tv_usec;
#else
dwSeed = ::GetTickCount();
#endif
 
init_genrand(dwSeed);
}
 
/satoriya-utf8/_/random.h
@@ -1,7 +1,7 @@
#ifndef RANDOM_H
#define RANDOM_H
#include <stdlib.h>
void randomize(unsigned int seed);
void randomize(void);
int gen_random(void);
inline int random(int max) {
if ( max <= 0 ) {
/satoriya-utf8/_/Sender.cpp
@@ -21,6 +21,7 @@
 
// グローバルオブジェクト
Sender::sender_stream sender;
Sender::error_stream errsender;
 
// staticメンバ
bool Sender::sm_sender_flag = true;
@@ -145,3 +146,49 @@
}
return c;
}
 
void Sender::error_buf::send(const std::string &line)
{
if ( ! line.length() ) { return; }
if ( log_mode ) {
log_data.push_back(line);
}
else {
#ifdef POSIX
cerr << "error - SATORI : " << line << endl;
#else
::MessageBox(NULL, line.c_str(), "error - SATORI", MB_OK|MB_SYSTEMMODAL);
#endif
}
}
 
int Sender::error_buf::overflow(int c)
{
if ( c=='\n' || c=='\0' || c==EOF )
{
send(line);
line[0]='\0';
pos = 0;
}
else
{
// バッファにためる
line[pos++] = c;
line[pos] = '\0';
 
if ( pos+1>=MAX ) {
if ( _ismbblead(c) ) {
line[pos-1]='\0';
send(line);
line[0]=c;
line[1]='\0';
pos = 1;
} else {
send(line);
line[0]='\0';
pos = 0;
}
}
}
return c;
}
/satoriya-utf8/satori/ssu.cpp
@@ -12,7 +12,7 @@
class ssu : public SaoriHost {
public:
ssu() {
randomize(time(NULL));
randomize();
}
virtual SRV request(deque<string>& iArguments, deque<string>& oValues);
};
/satoriya-utf8/satori/satori_Kakko.cpp
@@ -418,7 +418,7 @@
const char* p = NULL;
enum { NO_CALL, SAORI_CALL, INC_CALL } state = NO_CALL;
 
if ( mShioriPlugins.find(iName) ) {
if ( mShioriPlugins->find(iName) ) {
thePluginName=iName;
state = SAORI_CALL;
} else {
@@ -445,7 +445,7 @@
if ( p==NULL )
continue;
string str(iName.c_str(), p-iName.c_str());
if ( mShioriPlugins.find(str) ) { // 存在確認
if ( mShioriPlugins->find(str) ) { // 存在確認
thePluginName=str;
theDelimiter=i;
state = SAORI_CALL;
@@ -507,7 +507,7 @@
for ( strvec::iterator i=theArguments.begin() ; i!=theArguments.end() ; ++i ) {
m_escaper.unescape(*i);
}
oResult = mShioriPlugins.request(thePluginName, theArguments, mKakkoCallResults, secure_flag ? "Local" : "External" );
oResult = mShioriPlugins->request(thePluginName, theArguments, mKakkoCallResults, secure_flag ? "Local" : "External" );
}
else {
oResult = inc_call(thePluginName, theArguments, mKakkoCallResults, secure_flag);
/satoriya-utf8/satori/satori_CreateResponce.cpp
@@ -29,6 +29,15 @@
}
#endif
}
else if ( mRequestID=="capability" ) {
bool isErrorHeader = false;
for ( strvec::const_iterator it = mReferences.begin() ; it != mReferences.end(); ++it ) {
if ( *it == "response.errorlevel" ) {
isErrorHeader = true;
}
}
errsender.set_log_mode(isErrorHeader);
}
}
 
string result;
/satoriya-utf8/satori/satori.cpp
@@ -13,7 +13,7 @@
const char* gSatoriNameW = "里々";
const char* gSatoriCraftman = "Yagi Kushigahama/The Maintenance Shop";
const char* gSatoriCraftmanW = "櫛ヶ浜やぎ/整備班";
const char* gSatoriVersion = "phase Mc143-10";
const char* gSatoriVersion = "phase Mc144-1";
const char* gShioriVersion = "3.0";
const char* gSaoriVersion = "1.0";
 
@@ -78,3 +78,12 @@
}
return ( zen2int(r) != 0 );
}
 
Satori::Satori()
{
mShioriPlugins = new ShioriPlugins(this);
}
 
Satori::~Satori() {
delete mShioriPlugins;
}
/satoriya-utf8/satori/satori_load_unload.cpp
@@ -17,7 +17,6 @@
 
#include <fstream>
#include <cassert>
#include <ctime> // for randomize
#include <locale.h>
 
#include "../_/Utilities.h"
@@ -228,7 +227,7 @@
// cout << j->first << ": " << j->second << endl;
 
// ランダマイズ
randomize(time(NULL));
randomize();
 
 
//------------------------------------------
@@ -246,10 +245,10 @@
vector<const Word*> els;
f->get_elements_pointers(els);
 
mShioriPlugins.load(mBaseFolder);
mShioriPlugins->load(mBaseFolder);
for ( vector<const Word*>::const_iterator i=els.begin(); i!=els.end() ; ++i)
{
if ( (*i)->size()>0 && !mShioriPlugins.load_a_plugin(**i) )
if ( (*i)->size()>0 && !mShioriPlugins->load_a_plugin(**i) )
{
sender << "SAORI読み込み中にエラーが発生: " << **i << endl;
}
@@ -438,7 +437,7 @@
is_dic_loaded = false;
 
// プラグイン解放
mShioriPlugins.unload();
mShioriPlugins->unload();
 
sender << "■SATORI::Unload ---------------------" << endl;
return true;
/satoriya-utf8/satori/satori_load_dict.cpp
@@ -275,8 +275,7 @@
if ( false == pre_process(file_vec, preprocessed_vec, m_escaper, replace_before_dic) )
{
#ifdef POSIX
// MessageBoxなんて無い!
std::cerr <<
errsender <<
"syntax error - SATORI : " << iFileName << std::endl <<
std::endl <<
"There are some mismatched parenthesis." << std::endl <<
@@ -285,14 +284,12 @@
"If you want to display parenthesis independently," << std::endl <<
"use \"phi\" symbol to escape it." << std::endl;
#else
::MessageBox(NULL,
(string() + iFileName + "\n\n"
errsender << iFileName + "\n\n"
"\n"
"カッコの対応関係が正しくない部分があります。" "\n"
"辞書は正しく読み込まれていません。" "\n"
"\n"
"カッコを単独で表示する場合は φ( と記述してください。").c_str(),
"syntax error - SATORI", MB_OK|MB_SYSTEMMODAL);
"カッコを単独で表示する場合は φ( と記述してください。" << std::endl;
#endif
}
 
/satoriya-utf8/satori/satori.h
@@ -278,7 +278,7 @@
string on_unloading_script;
 
// 栞プラグイン
ShioriPlugins mShioriPlugins;
ShioriPlugins *mShioriPlugins;
string inc_call(const string&, const strvec&, strvec&, bool is_secure);
 
// 安全?
@@ -363,8 +363,8 @@
 
public:
 
Satori() {}
virtual ~Satori() {}
Satori();
virtual ~Satori();
 
// SHIORI/3.0インタフェース
virtual bool load(const string& i_base_folder);
/satoriya-utf8/satori/shiori_plugin.cpp
@@ -27,17 +27,7 @@
////////////////////////////////////////
 
 
// どうにかしたい
void PluginError(const string& str)
{
#ifdef POSIX
cerr << "error - SAORI : " << str << endl;
#else
::MessageBox(NULL, str.c_str(), "error - SAORI", MB_OK|MB_SYSTEMMODAL);
#endif
}
 
#ifdef POSIX
// dllサーチパス関連。
// POSIX上では、ある特定の場所にDLLと同名のライブラリを置く事でSAORIに対応する。
// DLLと同名とは云っても、それはシンボリックリンクであるべきで、例えば次のようにである。
@@ -99,11 +89,11 @@
strvec vec;
split(iPluginLine, ",", vec); // カンマ区切りで分割
if ( vec.size()<2 || vec[0].size()==0 ) { // 呼び出し名と相対パスが必須
PluginError(iPluginLine + ": 設定ファイルの書式が正しくありません。");
errsender << iPluginLine + ": 設定ファイルの書式が正しくありません。" << std::endl;
return false;
}
if ( mCallData.find(vec[0]) != mCallData.end() ) {
PluginError(vec[0] + ": 同じ呼び出し名が複数定義されています。");
errsender << vec[0] + ": 同じ呼び出し名が複数定義されています。" << std::endl;
return false;
}
 
@@ -143,9 +133,9 @@
if ( fp == NULL )
{
#ifdef POSIX
PluginError(fullpath + ": failed to open");
errsender << fullpath + ": failed to open" << std::endl;
#else
PluginError(fullpath + ": プラグインが存在しません。");
errsender << fullpath + ": プラグインが存在しません。" << std::endl;
#endif
return false;
}
@@ -209,10 +199,13 @@
string fallback_path =
(cstr_path == NULL ?
"(environment variable `SAORI_FALLBACK_PATH' is empty)" : cstr_path);
PluginError(
errsender <<
fullpath+": This is not usable in this platform.\n"+
"Fallback library `"+filename+"."+extention+"' doesn't exist: "+fallback_path);
"Fallback library `"+filename+"."+extention+"' doesn't exist: "+fallback_path) << std::endl;
mDllData.erase(fullpath);
 
return false;
}
else {
@@ -245,7 +238,7 @@
string ver = mDllData[fullpath].mSaoriClient.get_version("Local");
if ( ver != "SAORI/1.0" )
{
PluginError(fullpath + ": SAORI/1.0のdllではありません。GET Versionの戻り値が未対応のものでした。(" + ver + ")");
errsender << fullpath + ": SAORI/1.0のdllではありません。GET Versionの戻り値が未対応のものでした。(" + ver + ")" << std::endl;
mDllData.erase(fullpath);
return false;
}
@@ -283,7 +276,7 @@
string ShioriPlugins::request(const string& iCallName, const strvec& iArguments, strvec& oResults, const string& iSecurityLevel) {
 
if ( mCallData.find(iCallName) == mCallData.end() ) {
PluginError(iCallName + ": この呼び出し名は定義されていません。");
errsender << iCallName + ": この呼び出し名は定義されていません。" << std::endl;
return "";
}
CallData& theCallData = mCallData[iCallName];
@@ -312,7 +305,7 @@
if ( r != "" )
{
// エラー
PluginError(iCallName + ": " + r);
errsender << iCallName + ": " + r << std::endl;
return "";
}
else
@@ -353,13 +346,13 @@
case 204:
break;
case 400:
PluginError(theCallData.mDllPath + " - " + iCallName + " : 400 Bad Request / 呼び出しの不備");
errsender << theCallData.mDllPath + " - " + iCallName + " : 400 Bad Request / 呼び出しの不備" << std::endl;
break;
case 500:
PluginError(theCallData.mDllPath + " - " + iCallName + " : 500 Internal Server Error / saori内でのエラー");
errsender << theCallData.mDllPath + " - " + iCallName + " : 500 Internal Server Error / saori内でのエラー" << std::endl;
break;
default:
PluginError(theCallData.mDllPath + " - " + iCallName + " : " + itos(return_code) + "? / 定義されていないステータスを返しました。");
errsender << theCallData.mDllPath + " - " + iCallName + " : " + itos(return_code) + "? / 定義されていないステータスを返しました。" << std::endl;
break;
}
 
/satoriya-utf8/satori/OverlapController.h
@@ -26,7 +26,9 @@
// 候補は一つ以上あることが保証されている。
virtual T select(const list<T>&) =0;
 
virtual int type(void) = 0;
 
 
// イベント通知ハンドラ
 
// 候補が追加された
@@ -43,6 +45,11 @@
class OC_Random : public OverlapController<T>
{
public:
//コントローラタイプ:あたらしいのを追加するときは必ず別IDにすること!typeidの遅い処理対策。
virtual int type(void) {
return 100;
}
 
// 候補から一つを選択
virtual T select(const list<T>& i_candidates)
{
@@ -64,6 +71,11 @@
public:
OC_NonOverlap() : m_last(INVALID_VALUE) {}
 
//コントローラタイプ:あたらしいのを追加するときは必ず別IDにすること!typeidの遅い処理対策。
virtual int type(void) {
return 200;
}
 
// 候補から一つを選択
virtual T select(const list<T>&)
{
@@ -129,6 +141,11 @@
public:
OC_NonDual() : m_last(INVALID_VALUE) {}
 
//コントローラタイプ:あたらしいのを追加するときは必ず別IDにすること!typeidの遅い処理対策。
virtual int type(void) {
return 300;
}
 
// 候補から一つを選択
virtual T select(const list<T>& i_candidates)
{
@@ -182,6 +199,11 @@
public:
OC_Sequential() : m_last(INVALID_VALUE) {}
 
//コントローラタイプ:あたらしいのを追加するときは必ず別IDにすること!typeidの遅い処理対策。
virtual int type(void) {
return 400;
}
 
// 候補から一つを選択
virtual T select(const list<T>& i_candidates)
{
@@ -232,6 +254,11 @@
public:
OC_SequentialDesc() : m_last(INVALID_VALUE) {}
 
//コントローラタイプ:あたらしいのを追加するときは必ず別IDにすること!typeidの遅い処理対策。
virtual int type(void) {
return 500;
}
 
// 候補から一つを選択
virtual T select(const list<T>& i_candidates)
{
/satoriya-utf8/satori/SakuraDLLClient.cpp
@@ -17,9 +17,6 @@
#endif
////////////////////////////////////////
 
 
extern void PluginError(const string& str);
 
SakuraDLLClient::SakuraDLLClient()
{
mModule = NULL;
@@ -37,7 +34,7 @@
{
if ( mRequest==NULL )
{
PluginError("SakuraDLLClient::request: ロードしていないライブラリにrequestしようとしました。");
errsender << "SakuraDLLClient::request: ロードしていないライブラリにrequestしようとしました。" << endl;
return "";
}
 
@@ -156,14 +153,14 @@
mModule = dlopen(dll_fullpath.c_str(), RTLD_LAZY);
if (mModule == NULL) {
sender << "failed." << endl;
PluginError(dlerror());
errsender << dlerror() << endl;
return false;
}
#else
mModule = ::LoadLibraryEx(dll_fullpath.c_str(),NULL,LOAD_WITH_ALTERED_SEARCH_PATH);
if ( mModule==NULL ) {
sender << "failed." << endl;
PluginError(dll_fullpath + ": LoadLibraryで失敗。");
errsender << dll_fullpath + ": LoadLibraryで失敗。" << endl;
return false;
}
#endif
@@ -193,7 +190,7 @@
{
sender << "failed." << endl;
unload();
PluginError(dll_fullpath + ": requestがエクスポートされていません。");
errsender << dll_fullpath + ": requestがエクスポートされていません。" << endl;
return false;
}
if ( mLoad!=NULL )
@@ -209,7 +206,7 @@
{
sender << "failed." << endl;
unload();
PluginError(dll_fullpath + ": load()がFALSEを返しました。");
errsender << dll_fullpath + ": load()がFALSEを返しました。" << endl;
return false;
}
}
/satoriya-utf8/satori/main.cpp
@@ -92,8 +92,7 @@
 
//cout << ghost.request("get") << endl;
//cout << ghost.request("うんこ") << endl;
/* cout << typeid(Ghost).name() << endl;
/*
cout << ghost.request("たんご") << ghost.request("たんご") << ghost.request("たんご") << ghost.request("たんご") << endl;
cout << ghost.request("たんご") << ghost.request("たんご") << ghost.request("たんご") << ghost.request("たんご") << endl;
cout << ghost.request("たんご") << ghost.request("たんご") << ghost.request("たんご") << ghost.request("たんご") << endl;
/satoriya-utf8/satori/WinMain.cpp
@@ -145,8 +145,10 @@
string script;
if ( !satori )
{
for ( strvec::iterator i=vec.begin() ; i!=vec.end() ; ++i )
for ( strvec::iterator i=vec.begin() ; i!=vec.end() ; ++i ) {
script += *i;
}
pSatori->Translate(script);
}
else if ( like_dict )
{
@@ -184,9 +186,8 @@
} else {
// さくらスクリプト変換
script = pSatori->SentenceToSakuraScriptExec_with_PreProcess(vec) + "\\e";
pSatori->Translate(script);
}
if ( !pSatori->Translate(script) )
script="";
 
direct_sstp(script, "Satorite", hwnd);
return script;
/satoriya-utf8/satori/satori_load_dict.h
@@ -94,7 +94,7 @@
on_loaded_script = "";
on_unloading_script = "";
 
//@ mShioriPlugins.clear(); // 特殊。
//@ mShioriPlugins->clear(); // 特殊。
 
secure_flag = false;
 
/satoriya-utf8/satori/satoriTranslate.cpp
@@ -21,7 +21,7 @@
return false;
 
const bool is_OnTranslate = (mRequestID=="OnTranslate");
const bool is_AnchorEnable = is_OnTranslate ? false : mRequestID.compare(0,2,"On") == 0;
const bool is_AnchorEnable = mRequestID.empty() || (mRequestID.compare(0,2,"On") == 0); //reqidがempty=さとりてcall
 
// さくらスクリプトとそれ以外を分割して処理を加える
vector<string> vec;
@@ -147,7 +147,7 @@
// さくらスクリプト以外の文への処理
 
// アンカー挿入
if ( is_AnchorEnable ) {
if ( is_AnchorEnable && !is_OnTranslate ) {
string::size_type n = i->size();
for ( string::size_type c=0 ; c<n ; ++c ) {
for ( vector<string>::iterator j=anchors.begin() ; j!=anchors.end() ; ++j ) {
@@ -177,9 +177,11 @@
 
 
// 事後置き換え辞書を適用
if ( !is_OnTranslate )
for ( strmap::iterator di=replace_after_dic.begin() ; di!=replace_after_dic.end() ; ++di )
if ( !is_OnTranslate ) {
for ( strmap::iterator di=replace_after_dic.begin() ; di!=replace_after_dic.end() ; ++di ) {
replace(ioScript, di->first, di->second);
}
}
 
diet_script(ioScript); // ラストダイエット
 
/satoriya-utf8/satori/shiori_plugin.h
@@ -5,8 +5,10 @@
 
#include "SaoriClient.h"
 
class Satori;
 
// プラグインの総合管理
class ShioriPlugins {
class ShioriPlugins {
 
struct CallData { // 呼び出し名ごとの情報
string mDllPath;
@@ -22,7 +24,14 @@
 
string mBaseFolder;
 
Satori *pSatori;
 
ShioriPlugins(void) { }
 
public:
ShioriPlugins(Satori *pSat) : pSatori(pSat) {
}
 
bool load(const string& iBaseFolder);
bool load_a_plugin(const string& iPluginLine);
 
/satoriya-utf8/satori/Selector.h
@@ -129,7 +129,7 @@
void attach_OC(OverlapController<T>* i_OC)
{
//cout << "Selector::attach_OC(), m_OC:" << m_OC << ", this:" << this << endl;
if ( m_OC == NULL || typeid(*m_OC) != typeid(*i_OC) ) {
if ( m_OC == NULL || m_OC->type() != i_OC->type() ) {
if ( m_OC != NULL ) {
delete m_OC;
}
/satoriya-utf8/satori/SakuraDLLClient.h
@@ -54,6 +54,3 @@
BOOL (*mUnload)();
#endif
};
 
// とりあえず
extern void PluginError(const string& str);
/satoriya-utf8/satori/SSTPClient.cpp
@@ -21,10 +21,11 @@
 
string request = string() +
"SEND SSTP/1.1" + CRLF +
"Script: " + i_script + CRLF +
"Sender: " + i_client_name + CRLF +
"HWnd: " + itos((int)i_client_window) + CRLF +
"Charset: Shift_JIS" + CRLF +
"Script: " + i_script + CRLF +
"Option: notranslate" + CRLF +
CRLF;
 
COPYDATASTRUCT cds;
/satoriya-utf8/satori/satori_AnalyzeRequest.cpp
@@ -253,7 +253,32 @@
}
o_data.push_back( strpair(key, value) );
}
if ( errsender.get_log_mode() ) {
const std::vector<string> &errlog = errsender.get_log();
 
std::string errmsg;
std::string errlevel;
 
for ( std::vector<string>::const_iterator itr = errlog.begin() ; itr != errlog.end(); ++itr ) {
errmsg += "SATORI - ";
errmsg += mRequestID;
errmsg += " > ";
errmsg += *itr;
errmsg += "\1";
errlevel += "critical\1";
}
 
if ( errmsg.length() ) {
errmsg.erase(errmsg.end()-1,errmsg.end());
errlevel.erase(errlevel.end()-1,errlevel.end());
 
o_data.push_back( strpair("ErrorLevel",errlevel) );
o_data.push_back( strpair("ErrorDescription",errmsg) );
}
errsender.clear_log();
}
 
 
Sender::validate();
if(fResponseLog && logmode)
{
/satoriya-utf8/satori/satori_tool.cpp
@@ -671,12 +671,12 @@
bool r = calc(oResult);
if ( !r ) {
#ifdef POSIX
std::cerr <<
errsender <<
"error on Satori::calculate" << std::endl <<
"Error in expression: " << iExpression << std::endl;
#else
// もうちょっと抽象化を……
::MessageBox(NULL, (string() + "式が計算不能です。\n" + iExpression).c_str(), "error on Satori::calculate" , MB_OK);
errsender << string() + "式が計算不能です。\n" + iExpression << std::endl;
#endif
}
return r;