Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

536 lines
16 KiB

/*************************************************
* addword.c *
* *
* Copyright (C) 1995-1999 Microsoft Inc. *
* *
*************************************************/
#include "windows.h"
#include "winuser.h"
#include "immdev.h"
#include "abc95def.h"
#include "abcw2.h"
#include "resource.h"
BOOL WINAPI ErrExit(HWND hDlg, int err_number);
WORD s_buf[0x1000];
extern struct INPT_BF kbf;
extern HWND hCrtDlg;
OFSTRUCT s_open;
BYTE str[45]={0};
/*******************************************************
write_data(): add the new word defined by the user into
the user.rem
********************************************************/
BOOL WINAPI write_data(count,temp_bf)
int count;
BYTE *temp_bf;
{
int hd;
int op_count;
hd=OpenFile(user_lib,&s_open,OF_WRITE);
if (hd==-1)
return(ErrExit(NULL,1));
_llseek(hd,(data_start+count*data_record_length),0);
op_count=_lwrite(hd,(LPSTR)temp_bf,data_record_length);
if (op_count!=data_record_length)
{_lclose(hd);
return(ErrExit(NULL,1));
}
_lclose(hd);
return(TRUE);
}
/****************************************************
write_mulu(): write the changed index on the disk
*****************************************************/
BOOL WINAPI write_mulu()
{
int hd;
int op_count;
hd=OpenFile(user_lib,&s_open,OF_WRITE);
if (hd==-1)
return(ErrExit(NULL,1));
op_count=_lwrite(hd,(LPSTR)&s_buf,mulu_true_length);
if (op_count!=mulu_true_length)
{_lclose(hd);
return(ErrExit(NULL,1));
}
_lclose(hd);
return(TRUE);
}
int WINAPI find_empty_item()
{
int i;
BYTE *p;
read_mulu();
p = (BYTE *)&s_buf[8];
i = 0;
while ( i < mulu_true_length )
{
if ( p[i] & 0x80 )
return( i );
i += mulu_record_length;
}
return(-1);
}
//---------------------------------------------------------
// ErrExit()
// for file operating erorrs
//---------------------------------------------------------
BOOL WINAPI ErrExit(hDlg,err_number)
HWND hDlg;
int err_number;
{
MessageBox(hDlg, "文件操作错",
NULL, MB_OK | MB_ICONHAND);
return(FALSE);
}
/***********************************************************
read_mulu(): read the user definition index from the tmmr.rem
*************************************************************/
BOOL WINAPI read_mulu()
{
int hd;
int op_count;
hd=OpenFile(user_lib,&reopen,OF_READ);
if (hd==-1)
return(ErrExit(NULL,1)); //error
op_count=_lread(hd,&s_buf,16);
if (op_count!=16)
{
_lclose(hd);
return(ErrExit(NULL,1)); //error
}
mulu_true_length=s_buf[3];
op_count=_lread(hd,&s_buf[8],mulu_true_length-16);
if (op_count!=mulu_true_length-16){
_lclose(hd);
return(ErrExit(NULL,1)); //error
}
_lclose(hd);
return(TRUE);
}
/*****************************************************************
listbox(hDlg): list the new word definated by the user.
******************************************************************/
int WINAPI listbox(hDlg)
HWND hDlg;
{
int i,c;
BYTE *p;
read_mulu();
i=0x10;
while (i<mulu_true_length){
if (!read_data((i-0x10)/mulu_record_length)){
MessageBox(hDlg, "记忆文件错",
NULL, MB_OK | MB_ICONHAND);
break;
}
p=(BYTE *)&s_buf[i/2];
for (c=1; c<10; c++)
out_svw[31+c]=p[c];
out_svw[41]=0;
{
char temp_bf[42];
{
int i;
for (i=0;i<41;i++)
temp_bf[i]=0x20;
//strnset(temp_bf,0x20,41);
}
temp_bf[41]=0;
for (c=0; c<9; c++)
temp_bf[c]=out_svw[32+c];
temp_bf[9]=0x20;
for(c=0; c<30;c++)
temp_bf[c+10]=out_svw[2+c];
if (out_svw[1]!=0x2a) { //1993.4.18 if the string has deleted, don't display it
SendDlgItemMessage(hDlg,ID_LISTBOX,
LB_ADDSTRING, // add these new word
0, // onto the listbox
(LPARAM)((LPSTR *)temp_bf));
}//if (out_svw)
}
i+=mulu_record_length;
}
return 0;
}
/***************************************************************
if_code_equ(): search if the code in the index
****************************************************************/
BOOL WINAPI if_code_equ(addr)
int addr;
{
int i;
BYTE *p;
p=(BYTE *)s_buf;
if (kbf.true_length!=(p[addr++]-0x30)) //minuse the 0x30 in order to get the record length
return(STC); //if the length is not equal, exit
for (i=0; i<kbf.true_length; i++){
if ((kbf.buffer[i]!=p[addr])
&& ((kbf.buffer[i]&0xdf)!=p[addr]))
return(STC);
addr++;
}
return(CLC); //find the code in the index
}
/**************************************************************
FUNCTION: OpenDlg(HWND,UNSIGNED,WORD,LONG)
PURPOSE: let the user add a new term in the liberty
***************************************************************/
INT_PTR WINAPI OpenDlg(hDlg, message, wParam, lParam)
HWND hDlg;
UINT message; //##!!unsigned message;
WPARAM wParam; //##!!WORD wParam;
LPARAM lParam;
{
WORD index;
BYTE *p;
//##!!PSTR pTptr;
int i,count;
//##!!HBRUSH OldBrush;
HDC hDC;
RECT Rect;
//##!!RECT Rect1;
int find_empty_flag; /*94.7.30*/
switch (message) {
case WM_COMMAND:
switch (LOWORD(wParam)) {
case ID_LISTBOX:
{
HIMC hIMC;
hIMC = ImmGetContext(hDlg);
ImmSetOpenStatus(hIMC,FALSE);
ImmReleaseContext(hDlg,hIMC);
}
switch (HIWORD(lParam)) {
case LBN_SELCHANGE:
index=(WORD)SendDlgItemMessage(hDlg,ID_LISTBOX,
LB_GETCURSEL,0,0l);
SendDlgItemMessage(hDlg,ID_LISTBOX,
LB_GETTEXT,index,
(LPARAM)(LPSTR *)str);
break;
case LBN_DBLCLK:
break;
}
return (TRUE);
case ID_ADD:
for (i=0; i<sizeof str; i++)
str[i]=0; //1993.4.20 clear the buffer
count = GetDlgItemText(hDlg, ID_NEWCHR, str, 31);
i=0;
while(str[i]==0x20) i++;
if ((i==count)||(!str[0])){
MessageBox(hDlg, "尚未输入新词",
NULL, MB_OK | MB_ICONHAND);
return (TRUE);
}
memmove(&str[2], &str[0], 30);
str[0]=count+0x30; //save the string count
str[1]=0x20;
count+=2;
while (count<user_word_max_length)
str[count++]=0x20;
GetDlgItemText(hDlg, ID_SHU, kbf.buffer, 10);
if (!kbf.buffer[0]){
MessageBox(hDlg, "尚未输入编码",
NULL, MB_OK | MB_ICONHAND);
return (TRUE);
}
{
int j=0;
while (kbf.buffer[j]>0x20) j++;
i=j;
if(j>0)
for(j=0;j<i; j++)
if (kbf.buffer[j]>0xa0) i=0;
if(!i) {
MessageBox(hDlg, "编码中有非法字符",
NULL, MB_OK | MB_ICONHAND);
return (TRUE);
}
for (j=0;j<i;j++)
str[count+j]=kbf.buffer[j];
}
kbf.true_length=(WORD)i;
read_mulu();
for (i=0x10; i<(mulu_true_length+0x10); i=i+mulu_record_length){
if (if_code_equ(i)){
MessageBox(hDlg, "编码重复",
NULL, MB_OK | MB_ICONHAND);
SendDlgItemMessage(hDlg,ID_SHU,
EM_SETSEL,
0,
MAKELONG(0,0x7fff));
return FALSE;
}
}
mulu_true_length+=mulu_record_length;
if (mulu_true_length>mulu_max_length)
{
find_empty_flag = find_empty_item();
if ( find_empty_flag == -1 )
{
MessageBox(hDlg,"用户定义区满",
NULL, MB_OK | MB_ICONHAND);
mulu_true_length-=mulu_record_length;
return FALSE;
}
p=(BYTE *)(&s_buf[8]) + find_empty_flag;
count=find_empty_flag/mulu_record_length;
}
else
{
p=(BYTE *)&s_buf[s_buf[3]/2];
count=(mulu_true_length-0x10)/mulu_record_length-1;
}
s_buf[3]=mulu_true_length;
p[0]=kbf.true_length+0x30; /* fill string index length */
for (i=0; i<kbf.true_length; i++)
p[i+1]=kbf.buffer[i]; /* fill string index code */
for (i=i; i<(mulu_record_length-1); i++) /* minuse the p[0] */
p[i+1]=0x20; /* clear the rest part of index */
for (i=0; i<user_word_max_length; i++) /* 32->user_word_max_length */
kbf.buffer[i]=str[i]; /* move the string into writting buffer */
if (write_mulu() == -1)
return FALSE;
if (write_data(count,kbf.buffer) == -1)
return FALSE;
{
char temp_bf[41];
WORD ndx;
for(ndx=0; ndx<41;ndx++)
temp_bf[ndx]=0x20;
strncpy(&temp_bf[0],&p[1],kbf.true_length);
strncpy(&temp_bf[10],&str[2],30);
temp_bf[40]=0;
ndx=(WORD)SendDlgItemMessage(hDlg,ID_LISTBOX, // add these new word
LB_ADDSTRING, // onto the listbox
0, //1993.4.16 &str[2]->str[1]
(LPARAM)((LPSTR *)&temp_bf[0])); //disp the space for deleting word
SendDlgItemMessage(hDlg,
ID_LISTBOX,
LB_SETCURSEL,
ndx,
0L);
}
break;
case ID_DEL:
index=(WORD)SendDlgItemMessage(hDlg,ID_LISTBOX,
LB_GETCURSEL,0,0L);
SendDlgItemMessage(hDlg,ID_LISTBOX,
LB_GETTEXT,index,
(LPARAM)(LPSTR *)str);
i=0; //pointer the begining of string code
while (str[i]&&(str[i]!=0x20)){
kbf.buffer[i]=str[i]; //get the string index code
i++;
}
kbf.true_length=(WORD)i; //get code length
read_mulu();
for (i=0x10; i<(mulu_true_length+0x10); i=i+mulu_record_length){
if (if_code_equ(i)){
p=(BYTE *)s_buf;
p[i]|=0x80;
write_mulu();
count=(i-0x10)/mulu_record_length;
if (!read_data(count))
break; //break from the cycle
out_svw[1]=0x2a;
write_data(count,out_svw);
SendDlgItemMessage(hDlg,ID_LISTBOX,
LB_DELETESTRING, // add these new word
index, // onto the listbox
(LPARAM)((LPSTR *)str));
return(TRUE);
}
}
MessageBox(hDlg, "删除操作失败",
NULL, MB_OK | MB_ICONHAND);
break;
case IDOK:
{
HIMC hIMC;
hIMC = ImmGetContext(hDlg);
ImmSetOpenStatus(hIMC,TRUE);
ImmDestroyContext(hIMC);
ImmReleaseContext(hDlg,hIMC);
}
Return=NULL;
EndDialog(hDlg, TRUE);
return (TRUE);
break;
case IDCANCEL:
Return=NULL;
{
HIMC hIMC;
hIMC = ImmGetContext(hDlg);
ImmSetOpenStatus(hIMC,TRUE);
ImmDestroyContext(hIMC);
ImmReleaseContext(hDlg,hIMC);
}
EndDialog(hDlg, TRUE);
return (TRUE);
case ID_NEWCHR: //1993.4.19
{
HIMC hIMC;
hIMC = ImmGetContext(hDlg);
ImmSetOpenStatus(hIMC,TRUE);
ImmReleaseContext(hDlg,hIMC);
}
break;
case ID_SHU: //1993.4.19
{
HIMC hIMC;
hIMC = ImmGetContext(hDlg);
ImmSetOpenStatus(hIMC,FALSE);
ImmReleaseContext(hDlg,hIMC);
}
break;
}
break;
case WM_INITDIALOG: // message: initialize
hCrtDlg = hDlg;
SendDlgItemMessage(hDlg, // dialog handle
ID_NEWCHR, // where to send message
EM_SETSEL, // select characters
0, // additional information
MAKELONG(0, 0x7fff)); // entire contents
SetFocus(GetDlgItem(hDlg, ID_NEWCHR));
listbox(hDlg);
CenterWindow(hDlg);
return (0); //##!!(NULL) Indicates the focus is set to a control
case WM_PAINT:
{
PAINTSTRUCT ps;
GetClientRect(hDlg, &Rect); //get the whole window area
InvalidateRect(hDlg, &Rect, 1);
hDC=BeginPaint(hDlg, &ps);
Rect.left+=10;//5;
Rect.top+=8;//5;
Rect.right-=10;//5;
Rect.bottom-=12;//5;
DrawEdge(hDC, &Rect, EDGE_RAISED,/*EDGE_SUNKEN,*/ BF_RECT);
EndPaint(hDlg, &ps);
}
break;
case WM_DESTROY:
{
HIMC hIMC;
hIMC = ImmGetContext(hDlg);
ImmSetOpenStatus(hIMC,TRUE);
ImmDestroyContext(hIMC);
ImmReleaseContext(hDlg,hIMC);
}
return (TRUE);
case WM_QUIT:
case WM_CLOSE:
Return=NULL;
EndDialog(hDlg, TRUE);
return (TRUE);
}
return FALSE;
}