home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2000 December
/
VPR0012B.BIN
/
APUPDATE
/
VC
/
TXC0620A
/
TXC0620A.LZH
/
_IDMLIB.C
< prev
next >
Wrap
C/C++ Source or Header
|
2000-03-06
|
30KB
|
1,187 lines
/*
TXAPI_()にする必要はないが、EXEと_idmXXX両方で使い、複数の_idmXXXで使われる関数群
99年11月28日 日曜 start
TXAPIにするもの: 統一管理する関数、大規模な関数、速度が必要な関数。
*/
#if __TXC__
#include <_wz.h>
#include <windows.h>
#include <windowsx.h>
#pragma multidef+
#include <commctrl.h>
#pragma multidef-
#include <_idm.h>
#define UNIX_TXC UNIX // UNIX&&__TXC__
#else
#include "_sys.h"
#define UNIX_TXC 0
#endif
#include "_idmlib.h"
#include "_list.h"
#if __TXC__
mchar _szuiwz[] = "uieditor"; // UI定義ファイルの名前
mchar szclassList[] = "txList"; // "list"コントロール名
wchar wszclassList[] = TWCHAR("txList"); // "list"コントロール名
mchar szclassListH[] = "txListH"; // ヘッダ付き"list"コントロール名
wchar wszclassListH[] = TWCHAR("txListH"); // ヘッダ付き"list"コントロール名
wchar wszclassText[] = TWCHAR("txText");// TXウィンドウコントロール名
wchar wszclassPartition[] = TWCHAR("txPartition");
#endif
BOOL txJumpFileLink(TX* text);
//##比較
int txCmpIParatopLen(TX* text,mchar* szstr,int lch)
{
// カーソル段落の先頭が文字列szstr:lchと等しいか返す
// 等しければlch、等しくなければ0を返す
// 比較できない場合もある。この場合は0を返す
// 英大/小を区別しないで調べる
//WZ3.90I 981030 new
if (!strnicmp(text->buff + text->curpara,szstr,lch)) return lch;
return 0;
}
int txCmpParaOffset(TX* text,mchar* szstr,IBUFF offset)
{
// カーソル段落+offset以降の段落が文字列szstrと等しいか返す
// 等しければszstrの長さ、等しくなければ0を返す
// 比較できない場合もある。この場合は0を返す
// 英大/小を区別して調べる
//WZ3.90I 981017 new
int lch = strlen(szstr);
mchar* p = text->buff + text->curpara + offset;
mchar c = p[lch];
if (
(c == CHAR_CR || c == CHAR_LF) &&
!strncmp(p,szstr,lch)
) return lch;
return 0;
}
int txCmpIParatop(TX* text,mchar* szstr)
{
// カーソル段落の先頭が文字列szstrと等しいか返す
// 等しければszstrの長さ、等しくなければ0を返す
// 比較できない場合もある。この場合は0を返す
// 英大/小を区別しないで調べる
//WZ3.90E 980805 new
int lch = strlen(szstr);
if (!strnicmp(text->buff + text->curpara,szstr,lch)) return lch;
return 0;
}
BOOL txIbuffIsNspace(TX* text,IBUFF ibuff,int n)
{
// ibuffがn個以上の半角空白かどうか返す。
mchar* p = text->buff + ibuff;
BOOL f = TRUE;
for (;n--;p++) {
if (*p != ' ') {f = FALSE;break;}
}
return f;
}
//##text操作
BOOL txSelectGetOverwrite(TX* text)
{
return (text->fClip && text->fClipMouse);
}
void txFlushMenuCheckAll(TX* text)
{
//WZ3.90J 981109 new
txFlushMenuCheck(text,FMC_ALL);
}
#if !UNIX_TXC
void txRulerFlushDisp(TX* text)
{
if (text->hwndRuler) InvalidateRect(text->hwndRuler,NULL,TRUE);
}
#endif
TX* textmsgopenWzapp(mchar* szName)
{
return textmsgopen("wzapp",szName); //WZ4.00Bg 990719 小文字化
}
//##検索置換ダイアログ
#if SEARCHOPT_DIALOG_NEW //WZ3.90J 981112
void searchoptSetupMode(SEARCHOPT* opt)
{
//WZ3.90L 981123 new
opt->mode = 0;
if (opt->fRe) {
opt->mode = 3;
} else if (opt->fFuzzy) {
opt->mode = 1;
} else if (opt->fWord) {
opt->mode = 2;
}
}
#endif
SEARCHMODE searchoptToSearchmode(SEARCHOPT* opt)
{
//WZ3.90H 980910 new
SEARCHMODE searchmode = SEARCH_NOSENSECASE;
#if SEARCHOPT_DIALOG_NEW //WZ3.90J 981112
opt->fRe = (opt->mode == 3);
opt->fFuzzy = (opt->mode == 1);
opt->fWord = (opt->mode == 2);
#endif
if (opt->fFuzzy) {
searchmode |= SEARCH_NOSENSEZENHAN|SEARCH_NOSENSECASE;
} else {
if (opt->fWord) searchmode |= SEARCH_WORD;
if (opt->fSenseCase) searchmode &= ~SEARCH_NOSENSECASE;
}
if (opt->fSearchNoSymbol) searchmode |= SEARCH_NOSYMBOL;
if (opt->fPrev) searchmode |= SEARCH_PREV;
if (opt->fReplaceConfirm) searchmode |= REPLACE_CONFIRM;
if (opt->fRe) searchmode |= SEARCH_RE;
if (opt->fNoEsc) searchmode |= SEARCH_NOESC; //WZ4.00Bl 990908
if (opt->fAllText) searchmode |= SEARCH_ALLTEXT;//WZ4.00Bl 990916
return searchmode;
}
void searchoptFromSearchmode(SEARCHOPT* opt,SEARCHMODE searchmode)
{
opt->fWord = (searchmode & SEARCH_WORD);
opt->fSenseCase = !(searchmode & SEARCH_NOSENSECASE);
opt->fSearchNoSymbol = (searchmode & SEARCH_NOSYMBOL);
opt->fFuzzy = (searchmode & SEARCH_NOSENSEZENHAN);
opt->fPrev = (searchmode & SEARCH_PREV);
opt->fReplaceConfirm = (searchmode & REPLACE_CONFIRM);
opt->fRe = (searchmode & SEARCH_RE); //WZ3.90G 980905
opt->fNoEsc = !!(searchmode & SEARCH_NOESC); //WZ4.00Bl 990908
opt->fAllText = !!(searchmode & SEARCH_ALLTEXT);//WZ4.00Bl 990916
#if SEARCHOPT_DIALOG_NEW //WZ3.90J 981112
searchoptSetupMode(opt); //WZ3.90L 981123
#endif
}
void dialogAddSearchopt(HDIALOG hd,SEARCHOPT* opt,int mode)
{
//WZ3.90J 981112 モードとオプションに分離。
BOOL fGrep = (mode == 3);
BOOL fSearch = (mode == 0 || fGrep);
BOOL fReplace = (mode == 1);
BOOL fSearchlist = (mode == 2);
//
#if SEARCHOPT_DIALOG_NEW //WZ3.90J 981112
dialogControlID(hd,IDD_SEARCHMODE);
dialogControlRadioV(hd);
dialogControlHelp(hd,-222);
dialogChoiceRadio(hd,&opt->mode,"基本(&M)","曖昧(&X)","単語(&W)","正規(&E)",NULL);
#else
dialogControlID(hd,IDD_WORD);
dialogCheck(hd,"単語を検索(&W)",&opt->fWord);
dialogControlID(hd,IDD_FUZZY);
dialogCheck(hd,"曖昧な検索(&X)",&opt->fFuzzy);
dialogControlID(hd,IDD_RE);
dialogCheck(hd,"正規表現を使用(&E)",&opt->fRe); //WZ3.90G 980905
#endif
dialogLFV(hd);
dialogControlID(hd,IDD_SENSECASE);
dialogControlHelp(hd,226);
dialogCheck(hd,PSPC?"大小文字を区別":"大文字と小文字を区別(&C)",&opt->fSenseCase);
//WZ4.00Bl 990908 "\を通常文字として検索"オプションを追加。
dialogControlID(hd,IDD_NOESC);
dialogControlHelp(hd,433); //WZ4.00Bq 991015
dialogCheck(hd,"\\を通常文字として検索(&Y)",&opt->fNoEsc);
//
dialogControlID(hd,IDD_NOSYMBOL); //WZ3.90H 980908
dialogControlHelp(hd,227);
dialogCheck(hd,PSPC?"空白記号スキップ":"空白と記号をスキップ(&O)",&opt->fSearchNoSymbol);
if (fSearch) {
if (!fGrep) {
dialogControlHelp(hd,230);
dialogCheck(hd,"上方向へ検索(&P)",&opt->fPrev);
#if !WINDOWSCE && WZFUNC_EDITOR
if (!fSearchlist) {
//WZ4.00Bl 990916 (!PWZ)オープン中の全WZを対象とする検索置換ができるようにした。強いユーザ要望。
dialogSetH(hd);
dialogControlHelp(hd,434); //WZ4.00Bq 991015
dialogCheck(hd,UNIX?"全XZを対象(&T)":"全WZを対象(&T)",&opt->fAllText);
#if !__TXC__
dialogControlHelp(hd,231);
dialogCheck(hd,"多重化(&I)",&opt->fOpenTempWindow);
#endif
dialogLFSetV(hd);
}
#endif
}
} else {
dialogControlID(hd,IDD_REPLACECONFIRM);
dialogControlHelp(hd,234);
dialogCheck(hd,"置換の確認(&K)",&opt->fReplaceConfirm);
if (fReplace) {
#if !WINDOWSCE && WZFUNC_EDITOR
dialogCheck(hd,UNIX?"全XZを対象(&T)":"全WZを対象(&T)",&opt->fAllText); //WZ4.00Bl 990916
#endif
dialogControlHelp(hd,235);
dialogCheck(hd,"すべて置換(&A)",&opt->fAll);
dialogControlEnable(hd,opt->fArea);
dialogControlHelp(hd,236);
dialogCheck(hd,"範囲内の置換(&B)",&opt->fArea);
}
}
}
#if !UNIX_TXC
void wndSetEnableSearchOption(HWND hwnd)
{
BOOL fRE = FALSE;
BOOL fFuzzy = FALSE;
#if SEARCHOPT_DIALOG_NEW
int id;
for (id = IDD_SEARCHMODE;id < IDD_SEARCHMODE+4;id++) {
if (IsDlgButtonChecked(hwnd,id)) {
break;
}
}
id -= IDD_SEARCHMODE;
fRE = (id == 3);
fFuzzy = (id == 1);
#else
fRE = IsDlgButtonChecked(hwnd,IDD_RE);
fFuzzy = IsDlgButtonChecked(hwnd,IDD_FUZZY);
#endif
EnableDlgItem(hwnd,IDD_WORD,!(fRE|fFuzzy));
EnableDlgItem(hwnd,IDD_SENSECASE,!fFuzzy);
EnableDlgItem(hwnd,IDD_NOSYMBOL,!fRE);
EnableDlgItem(hwnd,IDD_FUZZY,!fRE);
}
#endif
//##文字列
mchar* sepastrGetIndexStr(mchar* str,int i,int* pLch)
{
// '|'で区切られた文字列のi番目のポインタと長さを返す。
int n = i;
mchar* p = str;
while(n--) {
mchar* p1 = strchr(p,'|');
if (!p1) {p += strlen(p);break;}
p = p1 + 1;
}
{
mchar* p1 = strchr(p,'|');
if (!p1) p1 = p + strlen(p);
*pLch = (p1 - p);
return p;
}
}
void strDeleteTailSpaceTab(mchar* sz)
{
// szの末尾の空白・全角空白・タブを削除
mchar* p = sz;
mchar* p0 = p;
while(*p) {
if (*p == ' ' || *p == CHAR_TAB) {
p++;
#if TB_EUC
} else if (*p == 0xA1 && p[1] == 0xA1) {
#else
} else if (*p == 0x81 && p[1] == 0x40) {
#endif
p += 2;
} else {
p += 1 + (tbiskanji(*p) && p[1]);
p0 = p;
}
}
*p0 = 0;
}
#if defined(__TXC__) && defined(UNICODE)
int sprintf_A(LPSTR szDst,LPCSTR szFormat,...)
{
return vsprintf_A(szDst,szFormat,(void*)(&szFormat + 1));
}
#endif
#if !UNIX_TXC
void sprintSizePrim(mchar* szbuff,UINT size)
{
//WZ4.00Ca 991215 new
BOOL f = FALSE;
UCHAR c;
mchar buff[20];
mchar* dst = buff + sizeof(buff);
*--dst = 0;
#define OUT_DIGIT {c = size % 10;size /= 10;*--dst = c + '0';f = (!size);}
OUT_DIGIT;
if (!f) {
OUT_DIGIT;
if (!f) {
OUT_DIGIT;
if (!f) {
*--dst = ',';
OUT_DIGIT;
if (!f) {
OUT_DIGIT;
if (!f) {
OUT_DIGIT;
if (!f) {
*--dst = ',';
OUT_DIGIT;
if (!f) {
OUT_DIGIT;
if (!f) {
OUT_DIGIT;
if (!f) {
*--dst = ',';
OUT_DIGIT;
}
}
}
}
}
}
}
}
}
strcpy(szbuff,dst);
}
#endif
mchar* wpathExtractRejectMask(wchar* wszpath,mchar* szReject,int cch)
{
//WZ4.00Ca 991218 new
// wszpathの^指定を取り出して削除してszRejectに入れる。
wchar* p = wpathGetFileName(wszpath);
mchar* dst = szReject;
mchar* dst0 = dst;
while(1) {
wchar* p1 = wstrchr(p,L';');
if (p[0] == '^') {
if (p[1] != '^') { // szReject
if (dst > dst0) *dst++ = ';';
{
mchar buff[40];
int lchbuff = wstrtostr(p,p1?p1-p:wstrlen(p),buff,cchof(buff)-1);
buff[lchbuff] = 0;
if (dst - dst0 + cchof(buff) + 5 > cch) break;
strcpy(dst,buff+1);dst += strlen(dst);
}
if (p1) {
wstrcpy(p,p1 + 1);
} else {
*p = 0;
break;
}
} else {
wstrcpy(p,p + 1);
if (p1) {
p = p1;
} else {
break;
}
}
} else {
if (p1) {
p = p1 + 1;
} else {
break;
}
}
}
*dst = 0;
if (wpathGetFileName(wszpath)[0] == 0) {
//WZ4.00Cb 000117 "^*.c"等のNOT指定は、通常マスク指定に続けて"*.*;^*.c"と記述する必要があったのを、いきなり"^*.c"の指定もできるようにした。
wpathSetFileName(wszpath,L"*.*");
}
return szReject;
}
static int patoi(mchar** pp)
{
mchar* p = *pp;
int ret = atoi(p);
if (*p == '-') p++;
while(isdigit(*p)) p++;
if (*p == ',') p++;
*pp = p;
return ret;
}
void strToRect(mchar* p,RECT* r)
{
r->left = patoi(&p);
r->top = patoi(&p);
r->right = patoi(&p);
r->bottom = patoi(&p);
//information("%d,%d,%d,%d",r->left,r->top,r->right,r->bottom);
}
//##ファイル名
BOOL wpathIsCszFiletype(wchar* wszfilename,mchar* cszExt)
{
// wszfilenameの拡張子がcszExtに含まれるかどうかを返す。
//WZ4.00Bl 990915 new
wchar* wszExt = wpathGetExt(wszfilename);
mchar szExt[CCHWORD];
wstrtostr(wszExt,-1,szExt,cchof(szExt));
{
mchar* p = cszExt;
while(1) {
mchar* p1 = strchr(p,';');
if (p1) {
if (!strnicmp(szExt,p,p1-p)) return TRUE;
p = p1 + 1;
} else {
if (!stricmp(szExt,p)) return TRUE;
break;
}
}
}
return FALSE;
}
BOOL wpathIsBinaryFiletype(wchar* wszfilename)
{
return wpathIsCszFiletype(wszfilename,sh->cszExtBinary);
}
//##Windows API 拡張
#if defined(__TXC__) && defined(UNICODE)
//WCE1.01 980508 CCHWORDを変換バッファに使っていたらログインスクリプトが切れた。wstrdupに変更。
BOOL WINAPI SetWindowText_A(HWND hwnd,LPCSTR lpsz)
{
wchar* wsz = wstrdupA(lpsz);
int ret = wsz ? SetWindowText(hwnd,wsz) : FALSE;
free(wsz);
return ret;
}
int WINAPI GetWindowText_A(HWND hwnd,LPSTR lpsz,int cchMax)
{
wchar* wsz = malloc(cchMax * sizeof(wchar));
int ret = 0;
if (wsz) {
GetWindowText(hwnd,wsz,cchMax);
ret = wstrtostr(wsz,-1,lpsz,cchMax);
}
if (ret) return ret-1;
return 0;
}
BOOL SetDlgItemText_A(HWND hwndDlg,int idControl,LPCSTR lpsz)
{
return SetWindowText_A(GetDlgItem(hwndDlg,idControl),lpsz);
}
BOOL GetDlgItemText_A(HWND hwndDlg,int idControl,LPSTR lpsz,int cchMax)
{
return GetWindowText_A(GetDlgItem(hwndDlg,idControl),lpsz,cchMax);
}
void ListBox_AddString_A(HWND hctrl,mchar* sz)
{
//WCE1.01 980115 new
wchar* wsz = wstrdupA(sz);
ListBox_AddString(hctrl,wsz);
free(wsz);
}
int ListBox_FindStringExact_A(HWND hctrl,int i,mchar* sz)
{
//WCE1.01 980118 new
wchar* wsz = wstrdupA(sz);
int ret = ListBox_FindStringExact(hctrl,i,wsz);
free(wsz);
return ret;
}
BOOL WinExecEx_W(wchar* wszfilenameExe,wchar* wszCmdline)
{
PROCESS_INFORMATION procinfo;
return CreateProcess(
wszfilenameExe,
wszCmdline,
NULL,NULL,
FALSE,0,
NULL,NULL,
NULL,
&procinfo
);
}
#endif
#if defined(__TXC__) && WINDOWSCE
BOOL IsIconic(HWND hwnd)
{
// CEでは実現できない
return FALSE;
}
#endif
#if !UNIX_TXC
mchar* GetWindowTextAlloc_A(HWND hwnd)
{
int lch = GetWindowTextLength(hwnd);
#ifdef UNICODE
int cch = (lch + 1) * sizeof(wchar);
#else
int cch = (lch + 1);
#endif
mchar* ret = malloc(cch);
if (ret) {
GetWindowText_A(hwnd,ret,cch);
}
return ret;
}
#endif
#if defined(__TXC__) && !defined(UNICODE) && !UNIX_TXC
BOOL CopyFile_W(LPCWSTR lpszSrc,LPCWSTR lpszDst,BOOL fFailIfExists)
{
mchar* szsrc = strdupW(lpszSrc);
mchar* szdst = strdupW(lpszDst);
BOOL ret = CopyFile(szsrc,szdst,fFailIfExists);
free(szsrc);
free(szdst);
return ret;
}
BOOL MoveFile_W(LPCWSTR lpszSrc,LPCWSTR lpszDst)
{
mchar* szsrc = strdupW(lpszSrc);
mchar* szdst = strdupW(lpszDst);
BOOL ret = MoveFile(szsrc,szdst);
free(szsrc);
free(szdst);
return ret;
}
BOOL DeleteFile_W(LPCWSTR lpszFileName)
{
mchar* szfilename = strdupW(lpszFileName);
BOOL ret = DeleteFile(szfilename);
free(szfilename);
return ret;
}
BOOL CreateDirectory_W(LPCWSTR lpszPath,LPSECURITY_ATTRIBUTES lpsa)
{
mchar* szpath = strdupW(lpszPath);
BOOL ret = CreateDirectory(szpath,lpsa);
free(szpath);
return ret;
}
#endif
#if !UNIX_TXC
BOOL wndGetRect(HWND hwnd,RECT* r)
{
// アイコン化されていてもオリジナル位置を返すGetWindowRect
// アイコン化されているFILERなどを閉じるとウィンドウ位置の復活ができなくなった。
//WZ3.90N 981202 new
#if WINDOWSCE || UNIX
GetWindowRect(hwnd,r);
return TRUE;
#else
WINDOWPLACEMENT p;
structClear(p);
p.length = sizeof(p);
GetWindowPlacement(hwnd,&p);
*r = p.rcNormalPosition;
return TRUE; //WZ3.90P 981206
#endif
}
#endif
void filetimeAdd(FILETIME* ft,FILETIME* ftAdd)
{
// ftにftAddを足す
DWORD dwLowDateTime0 = ft->dwLowDateTime;
ft->dwLowDateTime += ftAdd->dwLowDateTime;
if (ft->dwLowDateTime < dwLowDateTime0) ft->dwHighDateTime++;
ft->dwHighDateTime += ftAdd->dwHighDateTime;
}
//##最近ジャンプした位置
#ifdef _LIST_H
void histjumpstrAnalyze(mchar* sz,JH_ITEM* item)
{
item->npara = atoi(sz);
//
item->szfilename[0] = 0;
sz = strchr(sz,',');
if (sz) {
sz++;
sstrcpy(item->szfilename,sz);
}
}
void jumphistAdd(TX* text)
{
if (text->fFrame && text->fOpen) {
JH_ITEM item;
HSTRBLK sb = sbFromHist(HIST_JUMP);
int n = sbGetCount(sb);
if (n) {
// 近い場所は追加しない。
histjumpstrAnalyze(sbRead(sb,n-1),&item);
if (!stricmp(item.szfilename,text->szfilename)) {
if (myabs(text->npara - item.npara) < 10) return;
}
}
{
mchar buff[CCHPATHNAME + 20];
mchar* dst = buff;
itoa(text->npara,dst,10);dst += strlen(dst);
*dst++ = ',';
strcpy(dst,text->szfilename);
sbAddHist(sb,buff);
}
}
}
#endif
//##タグジャンプ
// 行番号指定なし、検索文字列指定に対応
#if WZFUNC_EDITOR
static mchar* tagjumpGetFilename(TX* text,mchar* p,mchar szfilename[CCHPATHNAME])
{
// テキストバッファポインタpから行末まで、存在するファイル名の記述があれば
// szfilenameに取得してファイル名の末尾の次の文字へのテキストバッファポインタを返す
// なければNULLを返す
mchar path[CCHPATHNAME];
if (text->modeTagJump != TAGJUMP_VZ && !strncmp(p,"・",2)) {
// grep形式。高速化のため直ぐに判別
p += 2;
while(isspace(*p)) p++;
if (isdigit(*p)) return NULL;
}
while(1) {
BOOL fdq = FALSE;
mchar *top;
// get top
while(1) {
mchar c = *p;
if (c == 0x0A || c == 0x1A || c == 0) {
return NULL;
} else if (c <= ' ' || c == '(' || c == ')' || c == ':') {
p++;
} else {
break;
}
}
top = p;
// get tail
while(1) {
mchar c = *p;
if (c == 0x0A || c == 0x1A || c == 0) {
#if 1//3.00A2 970504 「ファイル名+改行」でもタグジャンプするようにした(従来は「ファイル名+スペース+改行」でタグジャンプした)。
break;
#else
return NULL;
#endif
} else if (c == '"') {
fdq ^= 1;
p++;
} else if (c < ' ' || ((c == ' ' || c == '(' || c == ')') && !fdq)) { //WZ4.00Bl 990925 タグジャンプ指定で""内の(と)はファイル名とみなすようにした。ユーザ要望。
break;
} else if (c == ':' && isdigit(p[1])) {
//2.00E "D:\WZ\TEST.C:256 void function()"の様な"ファイル名:行番号"形式のタグジャンプができなかった
break;
} else {
p++;
}
}
if (p > top && p[-1] == ':') p--;//1.00C タグジャンプを「ファイル名: 行番号」に対応させた
{
IBUFF len = p - top;
if (len < CCHPATHNAME) {
strcpylen(szfilename,top,len);
if (text->modeTagJump != TAGJUMP_VZ && iskanji(szfilename[0])) {
//2.92 標準では、漢字はファイル名としては認識しない
break;
}
pathFormLong(szfilename);
//information("%s",szfilename);
// [1]フルパスならそれでジャンプ
if (pathIsFull(szfilename) && fileIsExist(szfilename)) return p;
// [1.5]サブフォルダ指定があれば、フルパスに変換してジャンプ //WZ4.00Bl 990907 タグジャンプでサブフォルダ\ファイル名も使える様にした。ユーザ要望。
if (pathGetFileName(szfilename) != szfilename) {
mchar szbuff[CCHPATHNAME];
wpathtopath(text->wszfilename,szbuff);
pathSetFileName(szbuff,szfilename);
if (fileIsExist(szbuff)) {
strcpy(szfilename,szbuff);
return p;
}
}
//
strcpy(szfilename,pathGetFileName(szfilename));
// [2]現在の文書のフォルダでファイルを検索
{
mchar szbuff[CCHPATHNAME];
wstrtostr(text->wszfilename,-1,szbuff,CCHPATHNAME);
pathSetFileName(szbuff,szfilename);
if (fileIsExist(szbuff)) {
strcpy(szfilename,szbuff);
return p;
}
}
// [3]標準フォルダでファイルを検索
if (sh->szFolderDefault[0]) {
mchar szbuff[CCHPATHNAME];
strcpy(szbuff,sh->szFolderDefault);
pathSetDir(szbuff);
pathSetFileName(szbuff,szfilename);
//information(szbuff);
if (fileIsExist(szbuff)) {
strcpy(szfilename,szbuff);
return p;
}
}
// [4]文書パスのフォルダでファイルを検索
{
wchar wszfilename[CCHPATHNAME];
strtowstr(szfilename,-1,wszfilename,CCHPATHNAME);
if (wpathSearchPathtext(wszfilename)) {
wstrtostr(wszfilename,-1,szfilename,CCHPATHNAME);
return p;
}
}
}
}
if (text->modeTagJump != TAGJUMP_VZ) {
break;//2.92
}
}
return NULL;
}
static NPARA tagjumpGetNline(mchar* p,int* pLx,mchar szFind[CCHWORD],RECT* r)
{
//WZ3.90I 981030 rを追加
int a = 0;
r->left = INT_MAX;
szFind[0] = 0;
while(1) {
mchar c = *p;
int a0 = a;
a = 0;
if (c == 0x0A || c == 0) {
return 0;
} else if (c == '"') {
strcpylenmax(szFind,p,strGetWordLen(p),CCHWORD);
pathFormLong(szFind);
{
mchar* p = strchrs(szFind," \t");
if (p) {
// 空白やタブは検索できない
*p = 0;
}
}
return 0;
} else if (!a0 && isdigit(c)) {
IFILE line = 0;
IBUFF lch = 0;
while(1) {
mchar c = *p;
if (isdigit(c)) {
line *= 10;
line += c - '0';
p++;
} else {
break;
}
}
if (*p == ',') {
lch = atoi(p + 1);
{ //WZ3.90I 981030
p++;
while(isdigit(*p)) p++;
if (*p == ',' && p[1] == '(') {
p += 2;
strToRect(p,r);
}
}
}
if (pLx) *pLx = lch;
return line;
} else if (iskanji(c)) {
p += 2;
} else {
if (isalpha(c)) {
a = 1;
}
p++;
}
}
}
static BOOL txJumpTagExec(TX* text,mchar* szfilename,NPARA npara,int lx,mchar* szFind,RECT* r)
{
// npara == 0 指定なし
// lx < 0 指定なし
// !szFind||!szFind[0] 指定なし
// r:ウィンドウ位置 //WZ3.90I 981030
wchar wsw[CCHWORD] = {0};
wchar wszfilename[CCHPATHNAME];
strtowstr(szfilename,-1,wszfilename,CCHPATHNAME);
if (szFind && szFind[0]) {
#if 1//WCE0.95 970923
if (strlen(szFind) < 5 + CCHWORD) {
mchar sw[CCHWORD];
#if UNIX
sprintf(sw,"-s%s",szFind);
#else
sprintf(sw,"/s%s",szFind);
#endif
strtowstr(sw,-1,wsw,wcchof(wsw));
forkstdW(wszfilename,wsw);
}
#else
wsprintf(wsw,L"/s%hs",szFind);
forkstdW(wszfilename,wsw);
#endif
} else {
//WZ4.00Bl 990912 プロジェクトのオープンでウィンドウ位置がTPJの内容に従ってなかったのを修正。
if (npara) {
//WZ4.00Bl 990922 /k -> /kpj for 「設定の切り替え」の記憶を読むように。
if (lx >= 0) {
#if UNIX
sprintf_W(wsw,L"-kpj -J%ld,%d -Yc",npara,lx);
#else
sprintf_W(wsw,L"/kpj /J%ld,%d /Yc",npara,lx);
#endif
} else {
#if UNIX
sprintf_W(wsw,L"-kpj -J%ld -Yc",npara);
#else
sprintf_W(wsw,L"/kpj /J%ld /Yc",npara);
#endif
}
}
if (r) {
#if UNIX
sprintf_W(wsw + wstrlen(wsw),L" -ow%d,%d,%d,%d",r->left,r->top,r->right,r->bottom);
#else
sprintf_W(wsw + wstrlen(wsw),L" /ow%d,%d,%d,%d",r->left,r->top,r->right,r->bottom);
#endif
}
//winformation(wsw);
forkstdW(wszfilename,wsw);
}
return TRUE;
}
BOOL txJumpTagPrim(TX* text,int mode)
{
// タグジャンプ
// mode=1: PROJECTのオープン
mchar szfilename[CCHPATHNAME];
mchar szpara[CCHLINE*4];
if (mode == 0 && txfIbuffIsLink(text,text->cur)) { //WZ4.00Ab 990125 TMLのリンクにカーソルを置いてタグジャンプしたときは、リンク先にジャンプするようにした。
txIbuffJumpLink(text,text->cur);
return TRUE;
}
#if !WINDOWSCE
if (mode == 0 && txIbuffIsUrl(text,text->cur)) { //WZ4.00Bl 990908 (!PWZ)クリッカブルURL,E-Mailにカーソルを置いてタグジャンプできるようにした。ユーザ要望(音声化)。WZ3と同じ仕様。
txIbuffJumpLink(text,text->cur);
return TRUE;
}
#endif
txGetParaEx(text,szpara,cchof(szpara));
if (!strnicmp(szpara,"shell",5)) {
#if !UNIX && !__TXC__
mchar* p = szpara + 5;
if (*p == '(') {
p = strchr(p,')');
if (!p) return FALSE;
p++;
}
p = strGetWordTop(p);
{
SHELLEXECUTEINFOW info;
wchar wszfilename[CCHPATHNAME];
wchar* wszPara = NULL;
strtowstr(p,-1,wszfilename,CCHPATHNAME);
{
int lch = wstrGetWordLen(wszfilename);
wchar* p = wszfilename + lch;
if (*p) {
*p = 0;
wszPara = p + 1;
}
}
structClear(info);
info.cbSize = sizeof(info);
info.lpVerb = L"Open";
info.lpFile = wszfilename;
info.lpParameters = wszPara;
info.nShow = SW_SHOWNORMAL; //WCE1.01 980226
return ShellExecuteEx_W(&info);
}
#endif // !UNIX
} else {
mchar* p = szpara;
p = tagjumpGetFilename(text,p,szfilename);
if (!p) {
#if !__TXC__ && WZFUNC_EDITOR
if (txGrepTagJump(text)) {
// grep結果のタグジャンプ及び"ファイル名"へのジャンプ
return TRUE;
}
#endif // !__TXC__
// THP用参照
#if 0 //WZ4.00Ab 990118 THP参照用のコードがあったので廃止。
{
mchar* p = strstr(szpara,"≪");
if (p) {
mchar* p1;
p += 2;
p1 = strstr(p,"≫");
if (p1) {
mchar szHeadline[CCHWORD];
sstrcpylen(szHeadline,p,p1-p);
return txJumpThp(text,szHeadline);
}
}
}
#endif
if (mode == 0 && txJumpFileLink(text)) return TRUE; //WZ4.00Bk 990904 WZ3の簡易リンクを復活。IDM_JUMPTAGでタグがない場合、カーソル位置の"ファイル名"または段落先頭の"ファイル名"のファイルを開く。
return FALSE;
}
{
mchar szFind[CCHWORD];
RECT r;
int lx = -1;
NPARA npara = tagjumpGetNline(p,&lx,szFind,&r);
//information("%d",npara);
if (mode == 1) {
// プロジェクトオープンではカーソル位置の指定は無視して
// プロファイルのカーソル位置を優先。
lx = -1;
npara = 0;
}
//information("%d %d %d %d",r.left,r.top,r.right,r.bottom);
return txJumpTagExec(text,szfilename,npara,lx,szFind,r.left == INT_MAX ? NULL : &r);
}
}
return FALSE;
}
BOOL txJumpFileLink(TX* text)
{
// カーソル段落が簡易リンクならジャンプする。
//WZ4.00Bk 990904 new
mchar* ppara = text->buff + text->curpara;
mchar* pend = ppara + txGetParaContentLen(text);
mchar* p = text->buff + text->cur;
mchar* p1;
mchar* p2;
if (p2 = memchr(p,'"',pend - p)) {
p1 = p;
for (;p1>=ppara;p1--) {
if (*p1 == '"') {
int len = p2-p1-1;
if (len > 0) {
mchar szfilename[CCHPATHNAME];
sstrcpylen(szfilename,p1+1,len);
//information("[%s] %d",szfilename,len);
forkstd(szfilename,NULL);
return TRUE;
} else {
break;
}
}
}
}
if (p1 = memchr(ppara,'"',pend-ppara)) {
if (p2 = memchr(p1+1,'"',pend-p1-1)) {
int len = p2-p1-1;
if (len > 0) {
mchar szfilename[CCHPATHNAME];
sstrcpylen(szfilename,p1+1,len);
forkstd(szfilename,NULL);
//information(szfilename);
return TRUE;
}
}
}
return FALSE;
}
void tagjumpreturnAdd(mchar* szfilename,IFILE adr);
#if !__TXC__ && WZFUNC_EDITOR
BOOL TXAPI txJumpTagEx(TX* text)
{
// タグジャンプ
return txJumpTagPrim(text,0);
}
#endif // !__TXC__
#endif // WZFUNC_EDITOR
//##ダイアログ
#if !UNIX_TXC
int questionOverwrite(wchar* wszfilename)
{
//WCE0.93 970920
HDIALOG hd = dialog("上書き確認");
mchar szfilename[CCHPATHNAME];
wstrtostr(wszfilename,-1,szfilename,CCHPATHNAME);
dialogCaption(hd,szfilename);
dialogCaption(hd,"は存在します。");
dialogCaption(hd,"上書きしてもよろしいですか?"); //WZ4.00Db 000210 「移動」にも使われるので、「コピー」の語句を外した。
dialogSetFocus(hd,IDNO);
dialogSetH(hd);
dialogControlID(hd,IDYES);
dialogCmd(hd,"はい(&Y)",10);
dialogControlID(hd,IDNO);
dialogControlStyle(hd,WS_TABSTOP); //XZ0.10 990623 方向キーでボタンを選べるようにした。
dialogCmdDefault(hd,"いいえ(&N)",10);
dialogControlID(hd,IDCANCEL);
dialogCmd(hd,"キャンセル",10);
dialogControlID(hd,IDIGNORE);
dialogCmd(hd,"すべて上書き(&A)",15);
{
int ret = dialogOpen(hd);
if (ret) return ret;
}
return IDCANCEL; //WZ4.00Bj 990814
}
#endif
//## sub dialog proc
#if !UNIX_TXC
BOOL subdlgprocSblist(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam,HSTRBLK sb)
{
// sbをListBoxで選択し、メンテナンス
HDIALOG hd = dialogFromHwnd(hwnd);
switch(message) {
case WM_COMMAND: {
int cmd = GET_WM_COMMAND_CMD(wParam,lParam);
int id;
switch(id = GET_WM_COMMAND_ID(wParam,lParam)) {
case IDD_SBLIST_ADD: {
HDIALOG hd = dialog("名前を付けて追加");
mchar szName[CCHNAME] = {0};
dialogString(hd,"名前(&N):",10,szName,CCHNAME,20);
if (dialogOpen(hd)) {
SendMessage(hwnd,SBLISTN_ADD,0,szName);
}
break;
}
case IDD_SBLIST_UP:
case IDD_SBLIST_DOWN: {
HWND hctrl = GetDlgItem(hwnd,IDD_SBLIST);
int isel = ListBox_GetCurSel(hctrl);
int i = isel;
mchar* sz = sbRead(sb,i);
if (id == IDD_SBLIST_UP && i == 0) break;
if (id == IDD_SBLIST_DOWN && i + 1 == sbGetCount(sb)) break;
if (sz) {
mchar* szInsert = strdup(sz);
if (szInsert) {
sbDelI(sb,i);
(id == IDD_SBLIST_UP) ? i-- : i++;
sbInsert(sb,i,szInsert);
SendMessage(hwnd,SBLISTN_FLUSHLIST,0,0);
ListBox_SetCurSel(hctrl,i);
free(szInsert);
}
}
break;
}
case IDD_SBLIST_DEL:
case IDD_SBLIST_SET: {
HWND hctrl = GetDlgItem(hwnd,IDD_SBLIST);
int isel = ListBox_GetCurSel(hctrl);
mchar szName[CCHNAME];
ListBox_GetItemText_A(hctrl,isel,szName,CCHNAME);
if (!szName[0]) break;
if (id == IDD_SBLIST_DEL) {
wchar wszName[CCHNAME];
strtowstr(szName,-1,wszName,CCHNAME);
if (wquestionYesNo(L"%sを削除しますか?",wszName) == IDYES) {
sbDelI(sb,isel);
SendMessage(hwnd,SBLISTN_FLUSHLIST,0,0);
ListBox_SetCurSel(hctrl,isel);
SendMessage(hwnd,SBLISTN_FLUSHCONTENT,0,0);
}
} else {
SendMessage(hwnd,SBLISTN_SET,0,szName);
}
break;
}
case IDD_SBLIST: {
if (cmd == LBN_SELCHANGE) {
SendMessage(hwnd,SBLISTN_FLUSHCONTENT,0,0);
}
break;
}
}
break;
}
}
return FALSE;
}
#endif
//##インクリメンタル検索
void txIsearchStatprintf(TX* text,BOOL find,SEARCHMODE searchmode)
{
mchar sz[CCHTXSTR] = {0};
if (!find) strcat(sz,"Failing ");
if (text->isearch->fIsearchWrapped) strcat(sz,"Wrapped ");
if (searchmode & SEARCH_REWZ) strcat(sz,"Regexp ");
strcat(sz,"I-search");
if (searchmode & SEARCH_PREV) strcat(sz," backward");
strcat(sz,": ");
sstrcat(sz,text->isearch->szIsearch);
txStatusbarPrintf(text,sz);
}
BOOL txIsearchIsContinueIdm(TX* text,int idm)
{
//WZ4.00Ab 990124 new
if (idm == IDM_ISEARCHPREV) return TRUE;
if (idm == IDM_ISEARCH) return TRUE;
if (idm == IDM_ISEARCHRE) return TRUE;
if (idm == IDM_DELETEPREV && text->isearch->szIsearch[0]) return TRUE; //WZ4.00Bl 990909
return FALSE;
}
BOOL txIsearchQuit(TX* text)
{
//WZ4.00Ab 990124 new
if (text->isearch && text->isearch->fIsearching) {
text->isearch->fIsearching = FALSE;
txStatusbarPrintf(text,NULL);
return TRUE;
}
return FALSE;
}
void txIsearchQuitEm(TX* text)
{
// for emacs
txIsearchQuit(text);
if (txIsearchIsContinueIdm(text,text->idmPrev)) {
txJumpAddress(text,text->isearch->adrIsearch0);
}
}