# You may need to install then.
#Option for development
-#CFLAGS = -g -Wall -DDEBUG ${DEFS} ${CDEF} -DNT_CLOUD
CFLAGS = -g -Wall -DDEBUG ${DEFS} ${CDEF} -DNT_CLOUD -DNT_NET_IPV6
#Option for release
#CFLAGS = -Wall ${DEFS} ${CDEF} -DNT_CLOUD -DNT_NET_IPV6
${OBJ_DIR}/_2ch/parse_string.o \
${OBJ_DIR}/_2ch/maru_2ch.o \
${OBJ_DIR}/usr/favorite_t.o \
+ ${OBJ_DIR}/usr/ng_word_t.o \
${OBJ_DIR}/usr/usr_db_t.o \
${OBJ_DIR}/ui/disp_board_menu.o \
${OBJ_DIR}/ui/disp_threadlist.o \
${INC_DIR}/_2ch/parse_2ch.h \
${INC_DIR}/_2ch/search_2ch.h \
${INC_DIR}/usr/favorite_t.h \
+ ${INC_DIR}/usr/ng_word_t.h \
+ ${INC_DIR}/usr/usr_db_t.h \
${INC_DIR}/ui/disp.h \
${INC_DIR}/ui/disp_win.h \
${INC_DIR}/ui/disp_string.h \
${INC_DIR}/utils/zip.h \
${INC_DIR}/utils/db.h \
${INC_DIR}/utils/text.h \
- ${INC_DIR}/usr/usr_db_t.h \
${INC_DIR}/utils/nt_conv_char.h \
${INC_DIR}/utils/nt_mutex.h \
${INC_DIR}/utils/nt_pthread.h \
@ ${SHELL} prepare_proj.sh
${CC} ${CFLAGS} ${INCLUDES} -c -o $@ $<
+$(OBJ_DIR)/usr/ng_word_t.o : ${SRC_DIR}/usr/ng_word_t.c ${INC_FILES}
+ @ ${SHELL} prepare_proj.sh
+ ${CC} ${CFLAGS} ${INCLUDES} -c -o $@ $<
+
$(OBJ_DIR)/utils/base64.o : ${SRC_DIR}/utils/base64.c ${INC_FILES}
@ ${SHELL} prepare_proj.sh
${CC} ${CFLAGS} ${INCLUDES} -c -o $@ $<
# You may need to install then.
#Option for development
-#CFLAGS = -g -Wall -DDEBUG ${DEFS} ${CDEF} -DNT_CLOUD
#CFLAGS = -g -Wall -DDEBUG ${DEFS} ${CDEF} -DNT_CLOUD -DNT_NET_IPV6
#Option for release
CFLAGS = -Wall ${DEFS} ${CDEF} -DNT_CLOUD -DNT_NET_IPV6
${OBJ_DIR}/_2ch/parse_string.o \
${OBJ_DIR}/_2ch/maru_2ch.o \
${OBJ_DIR}/usr/favorite_t.o \
+ ${OBJ_DIR}/usr/ng_word_t.o \
${OBJ_DIR}/usr/usr_db_t.o \
${OBJ_DIR}/ui/disp_board_menu.o \
${OBJ_DIR}/ui/disp_threadlist.o \
${INC_DIR}/_2ch/parse_2ch.h \
${INC_DIR}/_2ch/search_2ch.h \
${INC_DIR}/usr/favorite_t.h \
+ ${INC_DIR}/usr/ng_word_t.h \
+ ${INC_DIR}/usr/usr_db_t.h \
${INC_DIR}/ui/disp.h \
${INC_DIR}/ui/disp_win.h \
${INC_DIR}/ui/disp_string.h \
${INC_DIR}/utils/zip.h \
${INC_DIR}/utils/db.h \
${INC_DIR}/utils/text.h \
- ${INC_DIR}/usr/usr_db_t.h \
${INC_DIR}/utils/nt_conv_char.h \
${INC_DIR}/utils/nt_mutex.h \
${INC_DIR}/utils/nt_pthread.h \
@ ${SHELL} prepare_proj.sh
${CC} ${CFLAGS} ${INCLUDES} -c -o $@ $<
+$(OBJ_DIR)/usr/ng_word_t.o : ${SRC_DIR}/usr/ng_word_t.c ${INC_FILES}
+ @ ${SHELL} prepare_proj.sh
+ ${CC} ${CFLAGS} ${INCLUDES} -c -o $@ $<
+
$(OBJ_DIR)/utils/base64.o : ${SRC_DIR}/utils/base64.c ${INC_FILES}
@ ${SHELL} prepare_proj.sh
${CC} ${CFLAGS} ${INCLUDES} -c -o $@ $<
- ntch version 1.0.2.5
+ ntch version 1.0.2.6
This file is part of ntch.
ntch のインストール方法
-ダウンロードファイルを使用する場合、適当なディレクトリにntch-1.0.2.1.tgzファイルを解凍します
+ダウンロードファイルを使用する場合、適当なディレクトリにntch-1.0.2.6.tgzファイルを解凍します
-tar zxvf ntch-1.0.2.1.tgz
+tar zxvf ntch-1.0.2.6.tgz
作成されたディレクトリに移動します
-cd ntch-1.0.2.1
+cd ntch-1.0.2.6
以下のコマンドを実行して、実行ファイルを作成します
ntchは以下のライブラリィに依存しています。openssl, gdbm, ncurses, sqlite
これらのライブラリのデベロップ版がビルドには必要です。
-また、Fedora18で動作確認していますので、その他のディストリビューション等では、
+また、Fedora19で動作確認していますので、その他のディストリビューション等では、
作成されたMakefileやソースファイルを編集する必要があるかもしれません。
#define PACKAGE_NAME "ntch"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "ntch 1.0.2.5"
+#define PACKAGE_STRING "ntch 1.0.2.6"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "ntch"
#define PACKAGE_URL "https://sourceforge.jp/projects/ntch/"
/* Define to the version of this package. */
-#define PACKAGE_VERSION "1.0.2.5"
+#define PACKAGE_VERSION "1.0.2.6"
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for ntch 1.0.2.5.
+# Generated by GNU Autoconf 2.69 for ntch 1.0.2.6.
#
# Report bugs to <akohta001@gmail.com>.
#
# Identity of this package.
PACKAGE_NAME='ntch'
PACKAGE_TARNAME='ntch'
-PACKAGE_VERSION='1.0.2.5'
-PACKAGE_STRING='ntch 1.0.2.5'
+PACKAGE_VERSION='1.0.2.6'
+PACKAGE_STRING='ntch 1.0.2.6'
PACKAGE_BUGREPORT='akohta001@gmail.com'
PACKAGE_URL='https://sourceforge.jp/projects/ntch/'
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures ntch 1.0.2.5 to adapt to many kinds of systems.
+\`configure' configures ntch 1.0.2.6 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of ntch 1.0.2.5:";;
+ short | recursive ) echo "Configuration of ntch 1.0.2.6:";;
esac
cat <<\_ACEOF
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-ntch configure 1.0.2.5
+ntch configure 1.0.2.6
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by ntch $as_me 1.0.2.5, which was
+It was created by ntch $as_me 1.0.2.6, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by ntch $as_me 1.0.2.5, which was
+This file was extended by ntch $as_me 1.0.2.6, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-ntch config.status 1.0.2.5
+ntch config.status 1.0.2.6
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
-AC_INIT([ntch], [1.0.2.5], [akohta001@gmail.com],[ntch],[https://sourceforge.jp/projects/ntch/])
+AC_INIT([ntch], [1.0.2.6], [akohta001@gmail.com],[ntch],[https://sourceforge.jp/projects/ntch/])
AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_HEADERS([config.h])
- ntch version 1.0.2.5
+ ntch version 1.0.2.6
This file is part of ntch.
:a :autoscroll 自動スクロール
j,k,f,bキー以外の入力で自動スクロール解除
k,bキーで反転スクロール
+ :ngwd [NG指定文字列] , :ngnm [NG指定文字列] , :ngid [NG指定文字列]
+ ngwd レス本文に対するNG指定
+ 文字列には後述する方法で正規表現を指定出来ます。
+ 文字列を省略すると、現在設定されている全ての
+ NGWORDをエディターで表示しますので、これを直接
+ 編集できます。
+ ngnm, ngid それぞれレスの名前欄、IDに対するNGの指定です。
+ 指定方法はngwdと同様です
+ NG文字列に正規表現を指定する方法
+ 指定したい正規表現をスラッシュ'/'で囲んで指定します。
+ 例
+ :ngwd /(L|l)inux/ 左はLinuxとlinuxにマッチします。
+ :ngwd /ですか\\? $/ 行末が「ですか?」で終わる文字列に
+ にマッチします。
+ ?マークをエスケープすることと、
+ 2chのレスの行末には空白が1文字
+ 付加されるていることに注意して下さい
+ :ngwd /windows/i スラッシュの後ろに'i'を指定すると
+ 大文字小文字を無視します
+ 左の例ではWindows, windows, WiNdOwS
+ などにマッチします
+ 先頭が'/'で始まる文字列を正規表現を使わないでNG指定する方法
+ 先頭のスラッシュ'/'を円マーク'\\'でエスケープして下さい
+ 例
+ :ngwd \\/[a-z]/ 左は正規表現を使わずに文字列として
+ /[a-z]/ にマッチします。
お気に入り一覧
d 選択項目をお気に入りから削除
クラウド設定有効時には起動時にクラウドのデータを読み込みます。
現在のお気に入りの内容でクラウドのデータを明示的に更新したい場合は、
お気に入り一覧で、以下のコマンドを入力します
-:upload 現在のお気に入りを全てアップロード
+:upload ç\8f¾å\9c¨ã\81®ã\81\8aæ°\97ã\81«å\85¥ã\82\8aã\80\81NGã\83¯ã\83¼ã\83\89ã\81®è¨å®\9aã\82\92å\85¨ã\81¦ã\82¢ã\83\83ã\83\97ã\83ã\83¼ã\83\89
:upload board 現在の板のお気に入りをアップロード
:upload thread 現在のスレッドのお気に入りをアップロード
-
+:upload ng 現在のNGワードの設定をアップロード
#include "utils/nt_std_t.h"
#include "utils/text.h"
#include "utils/file.h"
+#include "utils/nt_pthread.h"
#include "utils/base64.h"
#include "utils/crypt.h"
#include "utils/nt_conv_char.h"
static BOOL nt_cloud_upload_file_local(nt_cloud_handle handle,
const char *file_name, nt_link_tp lines, int depth);
static nt_cloud_handle g_cloud_handle = NULL;
+static nt_pthread_result_t upload_file_pthread_func(void *param);
+static BOOL nt_cloud_edit_lines_file_async(nt_cloud_handle handle,
+ const char *file_name, nt_link_tp lines, const char *php_file);
+static nt_pthread_result_t edit_lines_file_pthread_func(void *param);
nt_cloud_handle nt_cloud_get_handle(){
if(!g_cloud_handle)
{
return nt_cloud_edit_lines_file(handle, file_name, lines, NT_CLOUD_DELETE_LINES_FILE_PHP, 0);
}
+BOOL nt_cloud_insert_lines_into_file_async(nt_cloud_handle handle,
+ const char *file_name, nt_link_tp lines)
+{
+ return nt_cloud_edit_lines_file_async(
+ handle, file_name, lines, NT_CLOUD_INSERT_LINES_FILE_PHP);
+}
+BOOL nt_cloud_delete_lines_from_file_async(nt_cloud_handle handle,
+ const char *file_name, nt_link_tp lines)
+{
+ return nt_cloud_edit_lines_file_async(
+ handle, file_name, lines, NT_CLOUD_DELETE_LINES_FILE_PHP);
+}
+
+
+static BOOL nt_cloud_edit_lines_file_async(nt_cloud_handle handle,
+ const char *file_name, nt_link_tp lines, const char *php_file)
+{
+ nt_link_tp param;
+ nt_pthread_handle h_pthread;
+ char *cptr;
+
+ cptr = nt_str_clone(file_name);
+ if(!cptr){
+ return FALSE;
+ }
+
+ param = nt_link_add_data(NULL, handle);
+ if(!param){
+ free(cptr);
+ return FALSE;
+ }
+ if(NULL == nt_link_add_data(param, cptr)){
+ nt_all_link_free(param, NULL);
+ free(cptr);
+ return FALSE;
+ }
+ if(NULL == nt_link_add_data(param, php_file)){
+ nt_all_link_free(param, NULL);
+ free(cptr);
+ return FALSE;
+ }
+ if(NULL == nt_link_add_data(param, lines)){
+ nt_all_link_free(param, NULL);
+ free(cptr);
+ return FALSE;
+ }
+ nt_cloud_add_ref(handle);
+
+ h_pthread = nt_pthread_alloc(
+ edit_lines_file_pthread_func, param, NULL);
+ if(!h_pthread){
+ nt_cloud_release_ref(handle);
+ nt_all_link_free(param, NULL);
+ free(cptr);
+ return FALSE;
+ }
+
+ if(!nt_pthread_put_que(h_pthread)){
+ nt_pthread_release_ref(h_pthread);
+ nt_cloud_release_ref(handle);
+ nt_all_link_free(param, NULL);
+ free(cptr);
+ return FALSE;
+ }
+ nt_pthread_release_ref(h_pthread);
+ return TRUE;
+}
+
+static nt_pthread_result_t edit_lines_file_pthread_func(void *param)
+{
+ nt_pthread_result_t result;
+ nt_link_tp linkp, lines;
+ char *file_name, *php_file_name;
+ nt_cloud_handle h_cloud;
+
+
+ result.code = 0;
+ result.data = NULL;
+
+ linkp = (nt_link_tp)param;
+ if(4 != nt_link_num(linkp)){
+ nt_all_link_free(linkp, NULL);
+ return result;
+ }
+ h_cloud = linkp->data;
+ file_name = linkp->next->data;
+ php_file_name = linkp->next->next->data;
+ lines = linkp->next->next->next->data;
+ (void)nt_cloud_edit_lines_file(h_cloud,
+ file_name, lines, php_file_name, 0);
+ nt_cloud_release_ref(h_cloud);
+ nt_all_link_free(lines, free);
+ nt_all_link_free(linkp, NULL);
+ free(file_name);
+ return result;
+}
static BOOL nt_cloud_edit_lines_file(nt_cloud_handle handle,
const char *file_name, nt_link_tp lines, const char *php_file, int depth)
file_name, lines, 0);
}
+BOOL nt_cloud_upload_file_async(nt_cloud_handle handle,
+ const char *file_name, nt_link_tp lines)
+{
+ nt_link_tp param;
+ nt_pthread_handle h_pthread;
+ char *cptr;
+
+ cptr = nt_str_clone(file_name);
+ if(!cptr){
+ return FALSE;
+ }
+
+ param = nt_link_add_data(NULL, handle);
+ if(param){
+ free(cptr);
+ return FALSE;
+ }
+ if(NULL == nt_link_add_data(param, cptr)){
+ nt_all_link_free(param, NULL);
+ free(cptr);
+ return FALSE;
+ }
+ if(NULL == nt_link_add_data(param, lines)){
+ nt_all_link_free(param, NULL);
+ free(cptr);
+ return FALSE;
+ }
+ nt_cloud_add_ref(handle);
+
+ h_pthread = nt_pthread_alloc(
+ upload_file_pthread_func, param, NULL);
+ if(!h_pthread){
+ nt_cloud_release_ref(handle);
+ nt_all_link_free(param, NULL);
+ free(cptr);
+ return FALSE;
+ }
+
+ if(!nt_pthread_put_que(h_pthread)){
+ nt_pthread_release_ref(h_pthread);
+ nt_cloud_release_ref(handle);
+ nt_all_link_free(param, NULL);
+ free(cptr);
+ return FALSE;
+ }
+ nt_pthread_release_ref(h_pthread);
+ return TRUE;
+}
+
+static nt_pthread_result_t upload_file_pthread_func(void *param)
+{
+ nt_pthread_result_t result;
+ nt_link_tp linkp, lines;
+ char *file_name;
+ nt_cloud_handle h_cloud;
+
+
+ result.code = 0;
+ result.data = NULL;
+
+ linkp = (nt_link_tp)param;
+ if(3 != nt_link_num(linkp)){
+ nt_all_link_free(linkp, NULL);
+ return result;
+ }
+ h_cloud = linkp->data;
+ file_name = linkp->next->data;
+ lines = linkp->next->next->data;
+ (void)nt_cloud_upload_file_local(h_cloud,
+ file_name, lines, 0);
+ nt_cloud_release_ref(h_cloud);
+ nt_all_link_free(lines, free);
+ nt_all_link_free(linkp, NULL);
+ free(file_name);
+ return result;
+}
+
+
static BOOL nt_cloud_upload_file_local(nt_cloud_handle handle,
const char *file_name, nt_link_tp lines, int depth)
{
char USR_FAVORITE_BOARD_FILE_PATH[1024];
char USR_FAVORITE_GRP_FILE_PATH[1024];
char USR_FAVORITE_THREAD_FILE_PATH[1024];
+char USR_NG_WORD_FILE_PATH[1024];
+char USR_NG_NAME_FILE_PATH[1024];
+char USR_NG_ID_FILE_PATH[1024];
char EDITOR_CMD[1024];
int FORCE_REFRESH = 0;
int THREAD_SORT_TYPE = NT_THREAD_SORT_BY_READ;
sprintf(USR_FAVORITE_BOARD_FILE_PATH, "%s/fb.txt", USR_PATH);
sprintf(USR_FAVORITE_GRP_FILE_PATH, "%s/ftab.txt", USR_PATH);
sprintf(USR_FAVORITE_THREAD_FILE_PATH, "%s/ft.txt", USR_PATH);
+ sprintf(USR_NG_WORD_FILE_PATH, "%s/ngwd.txt", USR_PATH);
+ sprintf(USR_NG_NAME_FILE_PATH, "%s/ngnm.txt", USR_PATH);
+ sprintf(USR_NG_ID_FILE_PATH, "%s/ngid.txt", USR_PATH);
sprintf(buf, "%s/.ntchrc", pw->pw_dir);
if(!read_resource(buf)){
const char *file_name, nt_link_tp lines);
extern BOOL nt_cloud_delete_lines_from_file(nt_cloud_handle handle,
const char *file_name, nt_link_tp lines);
+extern BOOL nt_cloud_insert_lines_into_file_async(nt_cloud_handle handle,
+ const char *file_name, nt_link_tp lines);
+extern BOOL nt_cloud_delete_lines_from_file_async(nt_cloud_handle handle,
+ const char *file_name, nt_link_tp lines);
extern void nt_cloud_update_read_count_async(nt_cloud_handle handle,
const wchar_t *board_name, const wchar_t *dat_name,
#define PACKAGE_NAME "ntch"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "ntch 1.0.2.5"
+#define PACKAGE_STRING "ntch 1.0.2.6"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "ntch"
#define PACKAGE_URL "https://sourceforge.jp/projects/ntch/"
/* Define to the version of this package. */
-#define PACKAGE_VERSION "1.0.2.5"
+#define PACKAGE_VERSION "1.0.2.6"
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
extern char USR_FAVORITE_BOARD_FILE_PATH[];
extern char USR_FAVORITE_GRP_FILE_PATH[];
extern char USR_FAVORITE_THREAD_FILE_PATH[];
+extern char USR_NG_WORD_FILE_PATH[];
+extern char USR_NG_NAME_FILE_PATH[];
+extern char USR_NG_ID_FILE_PATH[];
+
extern char *RFC2898_SALT;
extern int RFC2898_ITERATION;
extern char *AES256_PASS;
#define NT_KEY_COMMAND1 ':'
#define NT_KEY_COMMAND2 '/'
#define NT_KEY_COMMAND3 '?'
+#define NT_KEY_CMD_BASE (65536)
#define NT_KEY_CMD_BOARD_UPDATE (65536 + 1)
#define NT_KEY_CMD_AUTO_SCROLL (65536 + 2)
#define NT_KEY_CMD_FAVORITE_UPDATE (65536 + 3)
+#define NT_KEY_CMD_NGWORD_UPDATE (65536 + 4)
#define NT_COMMAND1_WRITE_MSG_1 "write"
#define NT_COMMAND1_WRITE_MSG_2 "w"
#define NT_COMMAND1_UPLOAD_BOARD2 "b"
#define NT_COMMAND1_UPLOAD_THREAD1 "thread"
#define NT_COMMAND1_UPLOAD_THREAD2 "t"
+#define NT_COMMAND1_UPLOAD_NG_FILE1 "ng"
+#define NT_COMMAND1_UPLOAD_NG_FILE2 "n"
#define NT_COMMAND1_LIMIT_1 "limit"
#define NT_COMMAND1_LIMIT_2 "l"
+#define NT_COMMAND1_NG_WORD_1 "ngword"
+#define NT_COMMAND1_NG_WORD_2 "ngwd"
+#define NT_COMMAND1_NG_NAME_1 "ngname"
+#define NT_COMMAND1_NG_NAME_2 "ngnm"
+#define NT_COMMAND1_NG_ID_1 "ngid"
extern int set_option(int argc, char* argv[]);
#define NT_INFO_DEL_FAVORITE_SUCCEEDED (L"お気に入りから削除しました")
#define NT_INFO_UPLOAD_FAVORITE_SUCCEEDED (L"クラウドのお気に入りを更新しました")
+#define NT_INFO_UPLOAD_NG_FILES_SUCCEEDED (L"クラウドのNGファイルを更新しました")
#define NT_TEXT_UNTRACKED_LOG_NAME (L"[DAT落] ")
#include "_2ch/search_2ch.h"
#include "usr/favorite_t.h"
#include "usr/usr_db_t.h"
+#include "usr/ng_word_t.h"
#define DISP_STATE_MASK 0xff
#define DISP_CMD_MASK 0xff00
#define DISP_CMD_UPLOAD_THREADS (11*256)
#define DISP_CMD_REFRESH (12*256)
#define DISP_CMD_REENTER (13*256)
+#define DISP_CMD_EDIT_NGWORD (14*256)
+#define DISP_CMD_EDIT_NGNAME (15*256)
+#define DISP_CMD_EDIT_NGID (16*256)
+#define DISP_CMD_UPLOAD_NG_FILES (17*256)
+
extern int disp_board_menu(nt_window_tp wp,
nt_2ch_model_handle h_model, nt_2ch_selected_item_handle h_select);
extern int disp_threadlist(nt_window_tp wp, int state,
nt_2ch_selected_item_handle h_select, nt_usr_db_handle usr_db_handle);
extern int disp_reslist(nt_window_tp wp, int state,
- nt_2ch_selected_item_handle h_select, nt_usr_db_handle usr_db_handle);
+ nt_2ch_selected_item_handle h_select, nt_usr_db_handle usr_db_handle,
+ nt_ng_word_handle h_ng_word, nt_cloud_handle h_cloud);
extern int disp_thread_search(nt_window_tp wp,
int prev_state, nt_link_tp thread_list,
nt_searched_thread_handle *h_sel_threadp);
extern void free_favorite_ctx(void *ptr);
extern void free_history_ctx(void *ptr);
extern BOOL disp_editor(nt_write_data_handle h_write_data);
+extern BOOL disp_editor2(const char *file_name);
+extern nt_link_tp disp_editor3(nt_link_tp text_list);
extern int disp_html_result(nt_write_data_handle h_write_data);
#endif /* _DISP_H_ */
--- /dev/null
+/* Copyright 2014 Akira Ohta (akohta001@gmail.com)
+ This file is part of ntch.
+
+ The ntch is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ The ntch is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with ntch. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+#ifndef _NG_WORD_T_H_
+#define _NG_WORD_T_H_
+
+#include "utils/nt_std_t.h"
+#include "utils/nt_mutex.h"
+#ifdef NT_CLOUD
+#include "cloud/nt_cloud.h"
+#endif
+
+#define NG_ITEM_NONE 0
+#define NG_ITEM_MSG 1
+#define NG_ITEM_NAME 2
+#define NG_ITEM_ID 4
+#define NG_ITEM_ALL 7
+
+
+typedef struct tag_nt_ng_word_handle{
+ int chk_sum;
+} nt_ng_word_handle_t, *nt_ng_word_handle;
+
+extern int nt_ng_word_add_ref(nt_ng_word_handle handle);
+extern int nt_ng_word_release_ref(nt_ng_word_handle handle);
+
+extern nt_mutex_handle nt_ng_get_mutex(nt_ng_word_handle handle);
+extern nt_mutex_handle nt_ng_word_get_mutex(nt_ng_word_handle handle);
+extern nt_mutex_handle nt_ng_name_get_mutex(nt_ng_word_handle handle);
+extern nt_mutex_handle nt_ng_id_get_mutex(nt_ng_word_handle handle);
+
+extern nt_ng_word_handle nt_ng_word_load(
+#ifdef NT_CLOUD
+ nt_cloud_handle h_cloud,
+#endif
+ const char *ng_word_file_name,
+ const char *ng_name_file_name,
+ const char *ng_id_file_name
+ );
+extern BOOL nt_ng_word_save(nt_ng_word_handle handle,
+ const char *ng_word_file_name,
+ const char *ng_name_file_name,
+ const char *ng_id_file_name
+ );
+
+#ifdef NT_CLOUD
+extern BOOL nt_ng_word_upload_cloud(
+ nt_cloud_handle h_cloud, nt_ng_word_handle h_ng_word);
+extern BOOL nt_ng_word_add_ng_word(nt_cloud_handle h_cloud,
+ nt_ng_word_handle handle, const char *ng_word);
+extern BOOL nt_ng_word_add_ng_name(nt_cloud_handle h_cloud,
+ nt_ng_word_handle handle, const char *ng_name);
+extern BOOL nt_ng_word_add_ng_id(nt_cloud_handle h_cloud,
+ nt_ng_word_handle handle, const char *ng_id);
+extern BOOL nt_ng_word_set_words(
+ nt_ng_word_handle handle, nt_link_tp text_list,
+ nt_cloud_handle h_cloud);
+extern BOOL nt_ng_word_set_names(
+ nt_ng_word_handle handle, nt_link_tp text_list,
+ nt_cloud_handle h_cloud);
+extern BOOL nt_ng_word_set_ids(
+ nt_ng_word_handle handle, nt_link_tp text_list,
+ nt_cloud_handle h_cloud);
+
+#else
+extern BOOL nt_ng_word_add_ng_word(
+ nt_ng_word_handle handle, const char *ng_word);
+extern BOOL nt_ng_word_add_ng_name(
+ nt_ng_word_handle handle, const char *ng_name);
+extern BOOL nt_ng_word_add_ng_id(
+ nt_ng_word_handle handle, const char *ng_id);
+extern BOOL nt_ng_word_set_words(nt_ng_word_handle handle, nt_link_tp text_list);
+extern BOOL nt_ng_word_set_names(nt_ng_word_handle handle, nt_link_tp text_list);
+extern BOOL nt_ng_word_set_ids(nt_ng_word_handle handle, nt_link_tp text_list);
+
+#endif
+extern int ng_word_match(nt_ng_word_handle handle,
+ int item_type, const wchar_t *source,
+ wchar_t *match, size_t match_buf_len);
+extern nt_link_tp nt_ng_word_get_words(nt_ng_word_handle handle);
+extern nt_link_tp nt_ng_word_get_names(nt_ng_word_handle handle);
+extern nt_link_tp nt_ng_word_get_ids(nt_ng_word_handle handle);
+
+
+#endif /* _NG_WORD_T_H_ */
+
typedef void (*nt_memfree_fn)(void* ptr);
typedef int (*nt_compare_fn)(void *lhs, void *rhs);
typedef int (*nt_compare_n_fn)(int a, int b);
+typedef void* (*nt_memcopy_fn)(void* ptr);
typedef struct tag_nt_link_t *nt_link_tp;
typedef struct tag_nt_link_t{
extern int nt_link_num(nt_link_tp linkp);
extern void* nt_link_get_by_index(nt_link_tp linkp, int index);
extern void nt_all_link_free(nt_link_tp ptr, nt_memfree_fn free_func);
-extern nt_link_tp nt_link_copy(nt_link_tp src_linkp);
+extern nt_link_tp nt_link_copy(nt_link_tp src_linkp, nt_memcopy_fn copy_func);
+
+extern void* nt_link_strcpy_fnc(void *ptr);
+extern void* nt_link_wcscpy_fnc(void *ptr);
extern int nt_link_wcscmp_fnc(void *lhs, void *rhs);
typedef struct tag_nt_key_value_t *nt_key_value_tp;
#include "ui/disp.h"
#include "ui/disp_win.h"
#include "ui/disp_string.h"
-#ifdef NT_CLOUD
#include "cloud/nt_cloud.h"
-#endif
+#include "usr/ng_word_t.h"
+
#define S_SIZE (1024)
extern int server_main();
static int draw_title(WINDOW *wp, const wchar_t *title, attr_t attr);
-#ifdef NT_CLOUD
static BOOL DoLoop(WINDOW *scrp, nt_usr_db_handle db_handle,
nt_cloud_handle h_cloud,
nt_favorite_handle h_favorite,
- nt_favorite_grp_handle h_favorite_grp);
-#else
-static BOOL DoLoop(WINDOW *scrp, nt_usr_db_handle db_handle,
- nt_favorite_handle h_favorite,
- nt_favorite_grp_handle h_favorite_grp);
-#endif
+ nt_favorite_grp_handle h_favorite_grp,
+ nt_ng_word_handle h_ng_word);
static void print_error(WINDOW *wp, const wchar_t *msg);
static void _2ch_selected_item_free(void *ptr)
nt_favorite_grp_handle h_favorite_grp;
nt_link_tp text_linkp, text2_linkp;
const char *err_msg;
-#ifdef NT_CLOUD
+ nt_ng_word_handle h_ng_word;
nt_cloud_handle h_cloud;
h_cloud = NULL;
-#endif
err_msg = NULL;
setlocale(LC_ALL, "ja_JP.UTF-8");
goto ERROR_TRAP;
}
-#ifdef NT_CLOUD
if(nt_crypt_lib_init(RFC2898_SALT, RFC2898_ITERATION,
AES256_PASS, &err_msg)){
if(NCE_AUTH_URL && NCE_ID && NCE_PASS){
sleep(1);
}
}
-#endif
if(!nt_2ch_model_init()){
fputs("Failed to read board menu data.\n", stderr);
}
text_linkp = NULL;
-#ifdef NT_CLOUD
if(h_cloud){
text_linkp = nt_cloud_download_file(h_cloud, "fb.txt");
}
-#endif
if(!text_linkp)
text_linkp = nt_read_text_file(USR_FAVORITE_BOARD_FILE_PATH);
if(text_linkp){
nt_all_link_free(text_linkp, free);
}
text_linkp = NULL;
-#ifdef NT_CLOUD
if(h_cloud){
text_linkp = nt_cloud_download_file(h_cloud, "ft.txt");
nt_cloud_query_favorite_attributes_async(h_cloud, usr_db_handle);
//nt_cloud_query_attributes(h_cloud, usr_db_handle, 0);
}
-#endif
if(!text_linkp)
text_linkp = nt_read_text_file(USR_FAVORITE_THREAD_FILE_PATH);
if(text_linkp){
nt_all_link_free(text_linkp, free);
}
+ h_ng_word = nt_ng_word_load(h_cloud,
+ USR_NG_WORD_FILE_PATH,
+ USR_NG_NAME_FILE_PATH,
+ USR_NG_ID_FILE_PATH);
+
cbreak();
noecho();
-#ifdef NT_CLOUD
- if(DoLoop(scrp, usr_db_handle, h_cloud, h_favorite, h_favorite_grp))
-#else
- if(DoLoop(scrp, usr_db_handle, h_favorite, h_favorite_grp))
-#endif
+ if(DoLoop(scrp, usr_db_handle, h_cloud, h_favorite, h_favorite_grp, h_ng_word))
result = 0;
echo();
nocbreak();
+ if(h_ng_word){
+ nt_ng_word_save(h_ng_word,
+ USR_NG_WORD_FILE_PATH,
+ USR_NG_NAME_FILE_PATH,
+ USR_NG_ID_FILE_PATH);
+ nt_ng_word_release_ref(h_ng_word);
+ }
+
text_linkp = nt_favorite_retrieve_boards(h_favorite);
if(text_linkp){
nt_write_text_file(USR_FAVORITE_BOARD_FILE_PATH, text_linkp);
nt_timer_lib_finish();
-#ifdef NT_CLOUD
nt_crypt_lib_finish();
if(h_cloud)
nt_cloud_release_ref(h_cloud);
-#endif
nt_env_free();
return (result);
}
return TIMER_ID_AUTO_UPDATE_NONE;
}
-#ifdef NT_CLOUD
static BOOL DoLoop(WINDOW *scrp, nt_usr_db_handle db_handle,
nt_cloud_handle h_cloud,
nt_favorite_handle h_favorite,
- nt_favorite_grp_handle h_favorite_grp)
-#else
-static BOOL DoLoop(WINDOW *scrp, nt_usr_db_handle db_handle,
- nt_favorite_handle h_favorite,
- nt_favorite_grp_handle h_favorite_grp)
-#endif
+ nt_favorite_grp_handle h_favorite_grp,
+ nt_ng_word_handle h_ng_word)
{
int ch, state, num;
int disp_state, nresult;
h_favorite_board = nt_favorite_board_alloc(
h_favorite, board_name);
if(h_favorite_board){
-#ifdef NT_CLOUD
linkp = nt_link_add_data(NULL, (void*)board_name);
if(linkp){
if(h_cloud)
nt_cloud_insert_lines_into_file(h_cloud, "fb.txt", linkp);
free(linkp);
}
-#endif
nt_favorite_board_release_ref(h_favorite_board);
//favorite_dump(h_favorite);
}
nt_2ch_selected_item_get_board_name(h_sel_items),
nt_2ch_selected_item_get_thread_title(h_sel_items));
if(h_favorite_thread){
-#ifdef NT_CLOUD
linkp = NULL;
if(nt_favorite_retrieve_thread(h_favorite_thread, &linkp)){
if(h_cloud)
nt_cloud_insert_lines_into_file(h_cloud, "ft.txt", linkp);
nt_all_link_free(linkp, free);
}
-#endif
nt_favorite_thread_release_ref(h_favorite_thread);
//favorite_dump(h_favorite);
status_msg = NT_INFO_ADD_FAVORITE_SUCCEEDED;
LINES - num, COLS, num, 0))
goto END_WHILE;
rwinp->key = ch;
- state = disp_reslist(rwinp, state, h_sel_items, db_handle);
+ state = disp_reslist(rwinp, state, h_sel_items, db_handle, h_ng_word, h_cloud);
auto_scrolling = FALSE;
if(DISP_CMD(state)){
if(DISP_CMD(state) == DISP_CMD_AUTO_SCROLL){
h_timer_auto_scroll, NT_AUTO_SCROLL_INTERVAL);
}
auto_scrolling = TRUE;
+ state = DISP_STATE_RESLIST;
}else if(DISP_CMD(state) == DISP_CMD_REFRESH){
state = DISP_STATE_RESLIST;
ch = NT_KEY_NONE;
status_msg = NT_INFO_REFRESH_THREAD_SUCCESS;
wclear(scrp);
continue;
+ }else if(DISP_CMD(state) == DISP_CMD_REENTER){
+ DISP_CLR_CMD(state);
+ ch = NT_KEY_NONE;
+ continue;
+ }else if(DISP_CMD(state) == DISP_CMD_EDIT_NGWORD){
+ ch = NT_KEY_NONE;
+ if(!h_ng_word)
+ break;
+ linkp = nt_ng_word_get_words(h_ng_word);
+ linkp = disp_editor3(linkp);
+ if(linkp && nt_ng_word_set_words(h_ng_word, linkp, h_cloud)){
+ ch = NT_KEY_CMD_NGWORD_UPDATE;
+ }
+ DISP_CLR_CMD(state);
+ keypad(stdscr, true);
+ wclear(scrp);
+ continue;
+ }else if(DISP_CMD(state) == DISP_CMD_EDIT_NGNAME){
+ ch = NT_KEY_NONE;
+ if(!h_ng_word)
+ break;
+ linkp = nt_ng_word_get_names(h_ng_word);
+ linkp = disp_editor3(linkp);
+ if(linkp && nt_ng_word_set_names(h_ng_word, linkp, h_cloud)){
+ ch = NT_KEY_CMD_NGWORD_UPDATE;
+ }
+ DISP_CLR_CMD(state);
+ keypad(stdscr, true);
+ wclear(scrp);
+ continue;
+ }else if(DISP_CMD(state) == DISP_CMD_EDIT_NGID){
+ ch = NT_KEY_NONE;
+ if(!h_ng_word)
+ break;
+ linkp = nt_ng_word_get_ids(h_ng_word);
+ linkp = disp_editor3(linkp);
+ if(linkp && nt_ng_word_set_ids(h_ng_word, linkp, h_cloud)){
+ ch = NT_KEY_CMD_NGWORD_UPDATE;
+ }
+ DISP_CLR_CMD(state);
+ keypad(stdscr, true);
+ wclear(scrp);
+ continue;
}
- DISP_CLR_CMD(state);
}
if(!auto_scrolling){
nt_timer_set_interval(h_timer_auto_scroll, -1);
if(DISP_CMD(state) == DISP_CMD_DEL_FAVORITE_BOARD){
if(nt_favorite_board_remove(handle)){
h_favorite_board = (nt_favorite_board_handle)handle;
-#ifdef NT_CLOUD
if(h_cloud){
linkp = nt_link_add_data(NULL,
(void*)nt_favorite_board_get_name(h_favorite_board));
free(linkp);
}
}
-#endif
nt_favorite_board_release_ref(h_favorite_board);
status_msg = NT_INFO_DEL_FAVORITE_SUCCEEDED;
}else{
}else if(DISP_CMD(state) == DISP_CMD_DEL_FAVORITE_THREAD){
if(nt_favorite_thread_remove(handle)){
h_favorite_thread = (nt_favorite_thread_handle)handle;
-#ifdef NT_CLOUD
if(h_cloud){
linkp = NULL;
if(nt_favorite_retrieve_thread(h_favorite_thread, &linkp)){
nt_all_link_free(linkp, free);
}
}
-#endif
nt_favorite_thread_release_ref(h_favorite_thread);
status_msg = NT_INFO_DEL_FAVORITE_SUCCEEDED;
}else{
status_msg = NT_INFO_REFRESH_FAVORITE_SUCCESS;
wclear(scrp);
continue;
-#ifdef NT_CLOUD
}else if(h_cloud){
if(DISP_CMD(state) == DISP_CMD_UPLOAD_ALL ||
DISP_CMD(state) == DISP_CMD_UPLOAD_BOARDS){
}
}
}
+ if(DISP_CMD(state) == DISP_CMD_UPLOAD_ALL ||
+ DISP_CMD(state) == DISP_CMD_UPLOAD_NG_FILES){
+ if(nt_ng_word_upload_cloud(h_cloud, h_ng_word)){
+ status_msg = NT_INFO_UPLOAD_FAVORITE_SUCCEEDED;
+ }
+ }
disp_state = state = DISP_STATE_FAVORITE;
-#endif
}else{
disp_state = state = DISP_STATE_FAVORITE;
}
#include "_2ch/_2ch.h"
#include "utils/nt_std_t.h"
#include "utils/text.h"
+#include "utils/file.h"
#include "ui/disp.h"
static BOOL read_editor(FILE *fp, nt_write_data_handle h_write_data,
char *buf_reuse, size_t buf_len);
+BOOL disp_editor2(const char *file_name)
+{
+ char buf[1024*2];
+ int ret;
+
+ sprintf(buf, "%s %s", EDITOR_CMD, file_name);
+ ret = system(buf);
+ if (WIFSIGNALED(ret) &&
+ (WTERMSIG(ret) == SIGINT ||
+ WTERMSIG(ret) == SIGQUIT))
+ return FALSE;
+ return TRUE;
+}
+
+BOOL nt_link_cmp(nt_link_tp l, nt_link_tp r, nt_compare_fn cmp_func)
+{
+ nt_link_tp lp, rp;
+ lp = l;
+ rp = r;
+ do{
+ if(0 != cmp_func(lp->data, rp->data))
+ return FALSE;
+ lp = lp->next;
+ rp = rp->next;
+ }while(l != lp || r != rp);
+ return (l == lp && r == rp);
+}
+
+nt_link_tp disp_editor3(nt_link_tp text_list)
+{
+ FILE *tmp_fp;
+ pid_t pid;
+ char fname[512];
+ char buf[128];
+ int ret;
+ nt_link_tp out_linkp;
+ pid = getpid();
+
+ sprintf(fname, "%s/txt%d.tmp", LOG_PATH, pid);
+ if(!text_list){
+ tmp_fp = fopen(fname, "w");
+ if(!tmp_fp)
+ return FALSE;
+ fclose(tmp_fp);
+ }else{
+ if(!nt_write_text_file(fname, text_list))
+ return NULL;
+ }
+
+ sprintf(buf, "%s %s", EDITOR_CMD, fname);
+ ret = system(buf);
+ if (WIFSIGNALED(ret) &&
+ (WTERMSIG(ret) == SIGINT ||
+ WTERMSIG(ret) == SIGQUIT))
+ return NULL;
+
+ out_linkp = nt_read_text_file(fname);
+ if(!out_linkp)
+ return NULL;
+
+ if(nt_link_cmp(out_linkp, text_list, nt_link_wcscmp_fnc)){
+ nt_all_link_free(out_linkp, free);
+ return NULL;
+ }
+ return out_linkp;
+}
+
+
BOOL disp_editor(nt_write_data_handle h_write_data)
{
FILE *tmp_fp;
#define NT_CMD_UPLOAD_BOARDS 2
#define NT_CMD_UPLOAD_THREADS 3
#define NT_CMD_DISP_HISTORY 4
+#define NT_CMD_UPLOAD_NG_FILES 5
typedef struct tag_favorite_ctx_t *favorite_ctx_tp;
typedef struct tag_favorite_ctx_t {
return DISP_CMD_UPLOAD_BOARDS;
case NT_CMD_UPLOAD_THREADS:
return DISP_CMD_UPLOAD_THREADS;
+ case NT_CMD_UPLOAD_NG_FILES:
+ return DISP_CMD_UPLOAD_NG_FILES;
case NT_CMD_DISP_HISTORY:
return DISP_STATE_HISTORY;
}
}else if(0 == strncmp(start, NT_COMMAND1_UPLOAD_THREAD1,len) ||
0 == strncmp(start, NT_COMMAND1_UPLOAD_THREAD2,len)){
return NT_CMD_UPLOAD_THREADS;
+ }else if(0 == strncmp(start, NT_COMMAND1_UPLOAD_NG_FILE1,len) ||
+ 0 == strncmp(start, NT_COMMAND1_UPLOAD_NG_FILE2,len)){
+ return NT_CMD_UPLOAD_NG_FILES;
}
return NT_CMD_ERR;
if(!nt_mutex_unlock(h_mutex)){
assert(0);
}
- if(h_map)
+ if(h_map){
*update_board_list = nt_map_get_values(h_map);
+ nt_map_free(h_map, NULL);
+ }
return TRUE;
}
#define NT_CMD_FAVORITE 6
#define NT_CMD_HISTORY 7
#define NT_CMD_AUTO_SCROLL 8
+#define NT_CMD_ADD_NGWORD 9
+#define NT_CMD_ADD_NGNAME 10
+#define NT_CMD_ADD_NGID 11
+#define NT_CMD_EDT_NGWORD 12
+#define NT_CMD_EDT_NGNAME 13
+#define NT_CMD_EDT_NGID 14
#define AUTO_SCROLL_NONE 0
#define AUTO_SCROLL_UP -1
static void int_ptr_free(void *ptr);
static int parse_cmd1(const char *param, const char **end);
static BOOL search_line_asc(regex_t *regexp, nt_link_tp reslistp,
- int *sel_res_no, int *sel_res_line, int column);
+ int *sel_res_no, int *sel_res_line, int column,
+ nt_ng_word_handle h_ngword);
static BOOL search_line_desc(regex_t *regexp, ctx_reslist_tp ctxp,
nt_link_tp reslistp,
- int *sel_res_no, int *sel_res_line, int column);
+ int *sel_res_no, int *sel_res_line, int column,
+ nt_ng_word_handle h_ngword);
static int parse_res_msg(nt_link_tp disp_res_list,
- res_data_tp res_datap, size_t colmns);
+ res_data_tp res_datap, size_t colmns, nt_ng_word_handle h_ngword);
static void res_msg_free(void *ptr);
static nt_link_tp get_cited_num_list(nt_link_tp res_listp, int seq_no);
static BOOL reslist_copy(ctx_reslist_tp ctxp, ctx_reslist_tp copy_ctxp,
nt_link_tp num_listp);
static ctx_reslist_tp init_sub_context(ctx_reslist_tp ctxp, nt_link_tp num_listp);
static void free_reslist_sub_ctx(void *ptr);
+static void free_disp_lines_ctx(void *ptr);
static nt_link_tp parse_tree_list(ctx_reslist_tp ctxp, const char *param);
static nt_link_tp parse_id_list(ctx_reslist_tp ctxp, const char *param);
static void search_up_tree(int seq_no, nt_link_tp disp_list, nt_link_tp *num_linkp);
wchar_t *buf, size_t buf_len);
int disp_reslist(nt_window_tp wp, int prev_state, nt_2ch_selected_item_handle h_select,
- nt_usr_db_handle usr_db_handle)
+ nt_usr_db_handle usr_db_handle, nt_ng_word_handle h_ng_word, nt_cloud_handle h_cloud)
{
ctx_reslist_tp ctxp, child_ctxp;
res_data_tp res_datap;
}
}
- if(prev_state != DISP_STATE_RESLIST)
+ if(prev_state != DISP_STATE_RESLIST &&
+ prev_state < NT_KEY_CMD_BASE)
ctxp->prev_state = prev_state;
ch = wp->key;
while(clistp != ctxp->res_disp_list){
res_datap = (res_data_tp)clistp->data;
if(!res_datap->msg_line_linkp){
- parse_res_msg(ctxp->res_disp_list, res_datap, wp->cols-5);
+ parse_res_msg(ctxp->res_disp_list, res_datap, wp->cols-5, h_ng_word);
}
if(res_datap->msg_header_line_num <= 0){
if(search_asc){
if(search_line_asc(&(ctxp->regex),ctxp->res_disp_list,
&ctxp->sel_res_no, &ctxp->sel_res_line,
- wp->cols - 5)){
+ wp->cols - 5, h_ng_word)){
adjust = TRUE;
}
}else{
if(search_line_desc(&(ctxp->regex),ctxp,
ctxp->res_disp_list,
&ctxp->sel_res_no, &ctxp->sel_res_line,
- wp->cols - 5)){
+ wp->cols - 5, h_ng_word)){
adjust = TRUE;
}
}
res_datap = (res_data_tp)clistp->data;
//resp = (nt_res_tp)clistp->data;
if(!res_datap->msg_line_linkp){
- parse_res_msg(ctxp->res_disp_list, res_datap, wp->cols-5);
+ parse_res_msg(ctxp->res_disp_list, res_datap, wp->cols-5, h_ng_word);
}
if(res_datap->msg_header_line_num <= 0){
if(!set_res_header((ctx_reslist_tp)wp->data,
}
ctxp->cur_res_offset = 0;
break;
+ case NT_CMD_ADD_NGWORD:
+ nt_ng_word_add_ng_word(h_cloud, h_ng_word, endp);
+ free_disp_lines_ctx(wp->data);
+ return DISP_CMD_REENTER | DISP_STATE_RESLIST;
+ case NT_CMD_ADD_NGNAME:
+ nt_ng_word_add_ng_name(h_cloud, h_ng_word, endp);
+ free_disp_lines_ctx(wp->data);
+ return DISP_CMD_REENTER | DISP_STATE_RESLIST;
+ case NT_CMD_ADD_NGID:
+ nt_ng_word_add_ng_id(h_cloud, h_ng_word, endp);
+ free_disp_lines_ctx(wp->data);
+ return DISP_CMD_REENTER | DISP_STATE_RESLIST;
+ case NT_CMD_EDT_NGWORD:
+ free_disp_lines_ctx(wp->data);
+ return DISP_CMD_EDIT_NGWORD | DISP_STATE_RESLIST;
+ case NT_CMD_EDT_NGNAME:
+ free_disp_lines_ctx(wp->data);
+ return DISP_CMD_EDIT_NGNAME | DISP_STATE_RESLIST;
+ case NT_CMD_EDT_NGID:
+ free_disp_lines_ctx(wp->data);
+ return DISP_CMD_EDIT_NGID | DISP_STATE_RESLIST;
default:
if(cmd == NT_CMD_TREE){
linkp = parse_tree_list((ctx_reslist_tp)wp->data, endp);
break;
res_datap = (res_data_tp)clistp->data;
if(!res_datap->msg_line_linkp){
- parse_res_msg(ctxp->res_disp_list, res_datap, wp->cols-5);
+ parse_res_msg(ctxp->res_disp_list, res_datap, wp->cols-5, h_ng_word);
}
if(res_datap->msg_header_line_num <= 0){
if(!set_res_header((ctx_reslist_tp)wp->data,
break;
res_datap = (res_data_tp)clistp->data;
if(!res_datap->msg_line_linkp){
- parse_res_msg(ctxp->res_disp_list, res_datap, wp->cols-5);
+ parse_res_msg(ctxp->res_disp_list, res_datap, wp->cols-5, h_ng_word);
}
if(res_datap->msg_header_line_num <= 0){
if(!set_res_header((ctx_reslist_tp)wp->data,
for( ; i > 0; i--){
res_datap = (res_data_tp)clistp->data;
if(!res_datap->msg_line_linkp){
- parse_res_msg(ctxp->res_disp_list, res_datap, wp->cols-5);
+ parse_res_msg(ctxp->res_disp_list, res_datap, wp->cols-5, h_ng_word);
}
if(res_datap->msg_header_line_num <= 0){
if(!set_res_header((ctx_reslist_tp)wp->data,
for( ; i < ctxp->res_num; i++){
res_datap = (res_data_tp)clistp->data;
if(!res_datap->msg_line_linkp){
- parse_res_msg(ctxp->res_disp_list, res_datap, wp->cols-5);
+ parse_res_msg(ctxp->res_disp_list, res_datap, wp->cols-5, h_ng_word);
}
if(res_datap->msg_header_line_num <= 0){
if(!set_res_header((ctx_reslist_tp)wp->data,
if(rows == wp->lines)
break;
if(!res_datap->msg_line_linkp){
- parse_res_msg(ctxp->res_disp_list, res_datap, wp->cols-5);
+ parse_res_msg(ctxp->res_disp_list, res_datap, wp->cols-5, h_ng_word);
}
if(0 == res_datap->msg_line_num)
continue;
0 == strncmp(NT_COMMAND1_AUTOSCROLL_2,param,
strlen(NT_COMMAND1_AUTOSCROLL_2))){
return NT_CMD_AUTO_SCROLL;
+ }else if(0 == strncmp(NT_COMMAND1_NG_WORD_1,param,len) ||
+ 0 == strncmp(NT_COMMAND1_NG_WORD_2,param, len)){
+ if(!nt_strtok(*end, ' ', &start, end))
+ return NT_CMD_EDT_NGWORD;
+
+ len = *end - start;
+ if(len <= 0)
+ return NT_CMD_EDT_NGWORD;
+ *end = start;
+ return NT_CMD_ADD_NGWORD;
+ }else if(0 == strncmp(NT_COMMAND1_NG_NAME_1,param,len) ||
+ 0 == strncmp(NT_COMMAND1_NG_NAME_2,param, len)){
+ if(!nt_strtok(*end, ' ', &start, end))
+ return NT_CMD_EDT_NGNAME;
+
+ len = *end - start;
+ if(len <= 0)
+ return NT_CMD_EDT_NGNAME;
+ *end = start;
+ return NT_CMD_ADD_NGNAME;
+ }else if(0 == strncmp(NT_COMMAND1_NG_ID_1,param,len)){
+ if(!nt_strtok(*end, ' ', &start, end))
+ return NT_CMD_EDT_NGID;
+
+ len = *end - start;
+ if(len <= 0)
+ return NT_CMD_EDT_NGID;
+ *end = start;
+ return NT_CMD_ADD_NGID;
}
return NT_CMD_NONE;
}
return child_ctxp;
}
+static const wchar_t *get_id(const wchar_t *source)
+{
+ const wchar_t *cptr;
+ if(!source)
+ return NULL;
+ cptr = wcsstr(source, L"ID:");
+ if(!cptr)
+ return NULL;
+ cptr += 3;
+ if(cptr[0] == L'\0' || cptr[0] == L'?')
+ return NULL;
+ return cptr;
+}
+
static BOOL reslist_clone(nt_thread_handle h_thread, ctx_reslist_tp ctxp)
{
nt_enum_handle h_enum_res;
}
free(ptr);
}
+
+static void free_disp_lines_ctx(void *ptr)
+{
+ ctx_reslist_tp ctxp;
+ nt_stack_tp stackp;
+ nt_link_tp linkp;
+ res_data_tp res_datap;
+ if(!ptr)
+ return;
+ ctxp = (ctx_reslist_tp)ptr;
+ if(ctxp->res_disp_list){
+ linkp = ctxp->res_disp_list;
+ do{
+ res_datap = (res_data_tp)linkp->data;
+ if(res_datap->msg_line_linkp){
+ free(res_datap->msg_line_linkp->data);
+ nt_all_link_free(res_datap->msg_line_linkp, NULL);
+ res_datap->msg_line_linkp = NULL;
+ }
+ res_datap->msg_line_num = 0;
+ linkp = linkp->next;
+ }while(linkp != ctxp->res_disp_list);
+ }
+ stackp = ctxp->child_ctx_stackp;
+ if(stackp){
+ nt_stack_free(stackp, free_reslist_sub_ctx);
+ ctxp->child_ctx_stackp = NULL;
+ }
+}
+
static void free_reslist_sub_ctx(void *ptr)
{
ctx_reslist_tp ctxp;
}
static int parse_res_msg(nt_link_tp disp_res_list,
- res_data_tp res_datap, size_t colmns)
+ res_data_tp res_datap, size_t colmns,
+ nt_ng_word_handle h_ngword)
{
- int i, len, start, lines;
+ int i, len, start, lines, nwrite;
wchar_t ch;
wchar_t *buf, *cptr, *srcp, *wrk_buf;
+ const wchar_t *name, *id, *misc;
+ wchar_t match[256];
int offset;
nt_link_tp linkp;
int consume_colmns;
//res_msg_free(res_datap);
res_datap->msg_line_num = 0;
-
- len = wcslen(res_datap->res_msg);
+
+ name = nt_res_get_name(res_datap->h_res);
+ misc = nt_res_get_misc(res_datap->h_res);
+ if(misc)
+ id = get_id(misc);
+ else
+ id = NULL;
+ cptr = NULL;
+ if(name && NG_ITEM_NAME ==
+ ng_word_match(h_ngword, NG_ITEM_NAME, name,
+ match, sizeof(match)/sizeof(wchar_t))){
+ cptr = L"NGNAME:";
+ }else if(id && NG_ITEM_ID ==
+ ng_word_match(h_ngword, NG_ITEM_ID, id,
+ match, sizeof(match)/sizeof(wchar_t))){
+ cptr = L"NGID:";
+ }else if(NG_ITEM_MSG == ng_word_match(h_ngword, NG_ITEM_MSG,
+ res_datap->res_msg,
+ match, sizeof(match)/sizeof(wchar_t))){
+ cptr = L"NGWORD:";
+ }
+ if(cptr){
+ len = wcslen(cptr) + wcslen(match) + 1;
+ buf = malloc(len*sizeof(wchar_t));
+ if(!buf)
+ return 0;
+ swprintf(buf, len, L"%ls%ls", cptr, match);
+ nwrite = nt_get_wc_count_within_colmns(buf, colmns);
+ if(nwrite <= 0){
+ free(buf);
+ return 0;
+ }
+ buf[nwrite] = L'\0';
+ res_datap->msg_line_num = 1;
+ res_datap->msg_line_linkp = nt_link_add_data(NULL, buf);
+ return 1;
+ }
+
+ srcp = res_datap->res_msg;
+
+ len = wcslen(srcp);
if(len == 0)
return 0;
buf_size = len + delta;
return 0;
buf_idx = 0;
- srcp = res_datap->res_msg;
lines = 0;
start = 0;
}
static BOOL search_line_asc(regex_t *regexp, nt_link_tp reslistp,
- int *sel_res_no, int *sel_res_line, int column)
+ int *sel_res_no, int *sel_res_line, int column, nt_ng_word_handle h_ngword)
{
nt_link_tp clistp, listp;
//nt_res_tp resp;
res_datap = (res_data_tp)clistp->data;
//resp = res_datap->resp;
if(!res_datap->msg_line_linkp)
- parse_res_msg(reslistp, res_datap, column);
+ parse_res_msg(reslistp, res_datap, column, h_ngword);
listp = res_datap->msg_line_linkp;
line = 0;
do{
res_datap = (res_data_tp)clistp->data;
if(!res_datap->msg_line_linkp)
- parse_res_msg(reslistp, res_datap, column);
+ parse_res_msg(reslistp, res_datap, column, h_ngword);
listp = res_datap->msg_line_linkp;
line = 0;
do{
static BOOL search_line_desc(regex_t *regexp, ctx_reslist_tp ctxp,
nt_link_tp reslistp,
- int *sel_res_no, int *sel_res_line, int column)
+ int *sel_res_no, int *sel_res_line, int column,
+ nt_ng_word_handle h_ngword)
{
nt_link_tp clistp, listp;
//nt_res_tp resp;
res_datap = (res_data_tp)clistp->data;
//resp = res_datap->resp;
if(!res_datap->msg_line_linkp)
- parse_res_msg(reslistp, res_datap, column);
+ parse_res_msg(reslistp, res_datap, column, h_ngword);
listp = res_datap->msg_line_linkp->prev;
line = res_datap->msg_line_num - 1;
do{
res_datap = (res_data_tp)clistp->data;
//resp = (nt_res_tp)clistp->data;
if(!res_datap->msg_line_linkp)
- parse_res_msg(reslistp, res_datap, column);
+ parse_res_msg(reslistp, res_datap, column, h_ngword);
listp = res_datap->msg_line_linkp->prev;
line = res_datap->msg_line_num - 1;
do{
nt_board_handle h_board;
nt_mutex_handle h_mutex;
nt_link_tp res_linkp, tmp_linkp, board_name_linkp;
- const wchar_t *board_name, *cptr;
+ const wchar_t *board_name;
h_mutex = nt_favorite_get_mutex(h_favorite);
if(!h_mutex){
if(!board_name)
continue;
if(board_name_linkp){
- cptr = (const wchar_t*)nt_link_find(
- board_name_linkp, (void*)board_name, nt_link_wcscmp_fnc);
- if(cptr)
+ if(nt_link_find(board_name_linkp,
+ (void*)board_name, nt_link_wcscmp_fnc)){
continue;
+ }
}
//fwprintf(stderr, L"%ls\n", board_name);
h_board = nt_get_board_by_name(h_model, board_name, &h_category);
--- /dev/null
+/* Copyright 2014 Akira Ohta (akohta001@gmail.com)
+ This file is part of ntch.
+
+ The ntch is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ The ntch is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with ntch. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <wchar.h>
+#include <assert.h>
+#include <iconv.h>
+#include <sys/types.h>
+#include <regex.h>
+
+
+#include "usr/ng_word_t.h"
+#include "usr/usr_db_t.h"
+#include "utils/text.h"
+#include "utils/file.h"
+#include "utils/nt_conv_char.h"
+
+#define NT_NG_WORD_CHK_SUM (1678428)
+
+#define NT_NG_ROOT_MUTEX_KEY (L"ng")
+#define NT_NG_WORD_MUTEX_KEY (L"ng_word")
+#define NT_NG_NAME_MUTEX_KEY (L"ng_name")
+#define NT_NG_ID_MUTEX_KEY (L"ng_id")
+
+
+typedef struct tag_nt_ng_word_t *nt_ng_word_tp;
+typedef struct tag_nt_ng_word_t {
+ nt_ng_word_handle_t handle;
+ int ref_count;
+ wchar_t *key;
+ nt_link_tp ng_words;
+ nt_link_tp ng_names;
+ nt_link_tp ng_ids;
+ nt_link_tp ng_word_patterns;
+ nt_link_tp ng_name_patterns;
+ nt_link_tp ng_id_patterns;
+ nt_link_tp ng_word_reg_patterns;
+ nt_link_tp ng_name_reg_patterns;
+ nt_link_tp ng_id_reg_patterns;
+} nt_ng_word_t;
+
+static nt_mutex_handle local_ng_word_get_mutex(
+ const wchar_t *key, nt_ng_word_handle handle);
+static nt_ng_word_handle nt_ng_word_alloc();
+static BOOL ng_word_add(
+ nt_cloud_handle h_cloud, const char *cloud_file_name,
+ nt_ng_word_handle handle,
+ const char *ng_word,
+ nt_link_tp *org_linkpp,
+ nt_link_tp *text_linkpp,
+ nt_link_tp *regx_linkpp);
+static wchar_t *parse_plain_text(const wchar_t *source);
+static regex_t *get_regx_pattern(const char *source);
+static BOOL word_match_local(nt_ng_word_tp ng_wordp,
+ const wchar_t *source,
+ nt_link_tp patterns,
+ nt_link_tp reg_patterns,
+ wchar_t *match_buf, size_t match_buf_len);
+
+
+static wchar_t *parse_plain_text(const wchar_t *source){
+ if(!source || source[0] == L'\0')
+ return NULL;
+
+ if(source[0] == L'\\' &&
+ source[0] == L'/'){
+ return nt_w_str_clone(source+1);
+ }else{
+ return nt_w_str_clone(source);
+ }
+}
+
+static regex_t *get_regx_pattern(const char *source)
+{
+ int len, cflags;
+ char *cptr;
+ char buf[256];
+ regex_t *regp;
+
+ if(!source || '\0' == source[0])
+ return NULL;
+
+ if('/' != source[0])
+ return NULL;
+
+ cptr = strrchr (source, '/');
+ if(!cptr || cptr == source)
+ return NULL;
+ cflags = REG_NEWLINE | REG_EXTENDED;
+ if(cptr[1] == 'i')
+ cflags |= REG_ICASE;
+
+ len = cptr - source - 1;
+ if(len >= sizeof(buf)-1)
+ return NULL;
+ strncpy(buf, source+1, len);
+ buf[len] = '\0';
+
+ regp = malloc(sizeof(regex_t));
+ if(!regp){
+ return NULL;
+ }
+ if(0 != regcomp(regp, buf, cflags)){
+ free(regp);
+ return NULL;
+ }
+ return regp;
+}
+
+nt_link_tp nt_ng_word_get_words(nt_ng_word_handle handle)
+{
+ nt_ng_word_tp ng_wordp;
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+ return ng_wordp->ng_words;
+}
+
+nt_link_tp nt_ng_word_get_names(nt_ng_word_handle handle)
+{
+ nt_ng_word_tp ng_wordp;
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+ return ng_wordp->ng_names;
+}
+
+nt_link_tp nt_ng_word_get_ids(nt_ng_word_handle handle)
+{
+ nt_ng_word_tp ng_wordp;
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+ return ng_wordp->ng_ids;
+}
+
+static void reg_free(void *ptr){
+ regex_t *regp;
+ regp = (regex_t*)ptr;
+ regfree(regp);
+ free(regp);
+}
+
+BOOL nt_ng_word_set_words(nt_ng_word_handle handle,
+ nt_link_tp text_list, nt_cloud_handle h_cloud)
+{
+ nt_ng_word_tp ng_wordp;
+ nt_link_tp linkp;
+ wchar_t *cptr;
+ char buf[256];
+
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+ if(ng_wordp->ng_words)
+ nt_all_link_free(ng_wordp->ng_words, free);
+ if(ng_wordp->ng_word_patterns)
+ nt_all_link_free(ng_wordp->ng_word_patterns, free);
+ if(ng_wordp->ng_word_reg_patterns)
+ nt_all_link_free(ng_wordp->ng_word_reg_patterns, reg_free);
+ ng_wordp->ng_words = NULL;
+ ng_wordp->ng_word_patterns = NULL;
+ ng_wordp->ng_word_reg_patterns = NULL;
+ if(text_list){
+ linkp = text_list;
+ do{
+ cptr = (wchar_t*)linkp->data;
+ if((size_t)-1 != wcstombs(buf, cptr, sizeof(buf))){
+ nt_ng_word_add_ng_word(NULL, &ng_wordp->handle, buf);
+ }
+ linkp = linkp->next;
+ }while(linkp != text_list);
+ nt_all_link_free(text_list, free);
+ if(h_cloud)
+ nt_cloud_upload_file(h_cloud,
+ "ngwd.txt", ng_wordp->ng_words);
+ }
+ return TRUE;
+}
+
+BOOL nt_ng_word_set_names(nt_ng_word_handle handle,
+ nt_link_tp text_list, nt_cloud_handle h_cloud)
+{
+ nt_ng_word_tp ng_wordp;
+ nt_link_tp linkp;
+ wchar_t *cptr;
+ char buf[256];
+
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+ if(ng_wordp->ng_names)
+ nt_all_link_free(ng_wordp->ng_names, free);
+ if(ng_wordp->ng_name_patterns)
+ nt_all_link_free(ng_wordp->ng_name_patterns, free);
+ if(ng_wordp->ng_name_reg_patterns)
+ nt_all_link_free(ng_wordp->ng_name_reg_patterns, reg_free);
+ ng_wordp->ng_names = NULL;
+ ng_wordp->ng_name_patterns = NULL;
+ ng_wordp->ng_name_reg_patterns = NULL;
+ if(text_list){
+ linkp = text_list;
+ do{
+ cptr = (wchar_t*)linkp->data;
+ if((size_t)-1 != wcstombs(buf, cptr, sizeof(buf))){
+ nt_ng_word_add_ng_name(NULL, &ng_wordp->handle, buf);
+ }
+ linkp = linkp->next;
+ }while(linkp != text_list);
+ nt_all_link_free(text_list, free);
+ if(h_cloud)
+ nt_cloud_upload_file(h_cloud,
+ "ngnm.txt", ng_wordp->ng_names);
+ }
+ return TRUE;
+}
+
+BOOL nt_ng_word_set_ids(nt_ng_word_handle handle,
+ nt_link_tp text_list, nt_cloud_handle h_cloud)
+{
+ nt_ng_word_tp ng_wordp;
+ nt_link_tp linkp;
+ wchar_t *cptr;
+ char buf[256];
+
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+ if(ng_wordp->ng_ids)
+ nt_all_link_free(ng_wordp->ng_ids, free);
+ if(ng_wordp->ng_id_patterns)
+ nt_all_link_free(ng_wordp->ng_id_patterns, free);
+ if(ng_wordp->ng_id_reg_patterns)
+ nt_all_link_free(ng_wordp->ng_id_reg_patterns, reg_free);
+ ng_wordp->ng_ids = NULL;
+ ng_wordp->ng_id_patterns = NULL;
+ ng_wordp->ng_id_reg_patterns = NULL;
+ if(text_list){
+ linkp = text_list;
+ do{
+ cptr = (wchar_t*)linkp->data;
+ if((size_t)-1 != wcstombs(buf, cptr, sizeof(buf))){
+ nt_ng_word_add_ng_id(NULL, &ng_wordp->handle, buf);
+ }
+ linkp = linkp->next;
+ }while(linkp != text_list);
+ nt_all_link_free(text_list, free);
+ if(h_cloud)
+ nt_cloud_upload_file(h_cloud,
+ "ngid.txt", ng_wordp->ng_ids);
+ }
+ return TRUE;
+}
+
+nt_ng_word_handle nt_ng_word_load(
+ nt_cloud_handle h_cloud,
+ const char *ng_word_file_name,
+ const char *ng_name_file_name,
+ const char *ng_id_file_name
+ )
+{
+ nt_ng_word_tp ng_wordp;
+ nt_link_tp text_linkp, linkp;
+ wchar_t *cptr;
+ char buf[256];
+
+ ng_wordp = (nt_ng_word_tp)nt_ng_word_alloc();
+ if(!ng_wordp)
+ return NULL;
+ text_linkp = NULL;
+ if(h_cloud)
+ text_linkp = nt_cloud_download_file(h_cloud, "ngwd.txt");
+ if(!text_linkp)
+ text_linkp = nt_read_text_file(ng_word_file_name);
+ if(text_linkp){
+ linkp = text_linkp;
+ do{
+ cptr = (wchar_t*)linkp->data;
+ if((size_t)-1 != wcstombs(buf, cptr, sizeof(buf))){
+ nt_ng_word_add_ng_word(NULL, &ng_wordp->handle, buf);
+ }
+ linkp = linkp->next;
+ }while(linkp != text_linkp);
+ nt_all_link_free(text_linkp, free);
+ }
+ text_linkp = NULL;
+ if(h_cloud)
+ text_linkp = nt_cloud_download_file(h_cloud, "ngnm.txt");
+ if(!text_linkp)
+ text_linkp = nt_read_text_file(ng_name_file_name);
+ if(text_linkp){
+ linkp = text_linkp;
+ do{
+ cptr = (wchar_t*)linkp->data;
+ if((size_t)-1 != wcstombs(buf, cptr, sizeof(buf))){
+ nt_ng_word_add_ng_name(NULL, &ng_wordp->handle, buf);
+ }
+ linkp = linkp->next;
+ }while(linkp != text_linkp);
+ nt_all_link_free(text_linkp, free);
+ }
+ text_linkp = NULL;
+ if(h_cloud)
+ text_linkp = nt_cloud_download_file(h_cloud, "ngid.txt");
+ if(!text_linkp)
+ text_linkp = nt_read_text_file(ng_id_file_name);
+ if(text_linkp){
+ linkp = text_linkp;
+ do{
+ cptr = (wchar_t*)linkp->data;
+ if((size_t)-1 != wcstombs(buf, cptr, sizeof(buf))){
+ nt_ng_word_add_ng_id(NULL, &ng_wordp->handle, buf);
+ }
+ linkp = linkp->next;
+ }while(linkp != text_linkp);
+ nt_all_link_free(text_linkp, free);
+ }
+
+ return &ng_wordp->handle;
+}
+
+BOOL nt_ng_word_save(nt_ng_word_handle handle,
+ const char *ng_word_file_name,
+ const char *ng_name_file_name,
+ const char *ng_id_file_name
+ )
+{
+ nt_ng_word_tp ng_wordp;
+ nt_mutex_handle h_mutex;
+
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+
+ h_mutex = nt_ng_get_mutex(handle);
+ if(h_mutex)
+ nt_mutex_lock(h_mutex);
+
+ if(ng_wordp->ng_words)
+ nt_write_text_file(ng_word_file_name, ng_wordp->ng_words);
+ if(ng_wordp->ng_names)
+ nt_write_text_file(ng_name_file_name, ng_wordp->ng_names);
+ if(ng_wordp->ng_ids)
+ nt_write_text_file(ng_id_file_name, ng_wordp->ng_ids);
+
+ if(h_mutex)
+ nt_mutex_unlock(h_mutex);
+ return TRUE;
+}
+
+BOOL nt_ng_word_add_ng_word(
+ nt_cloud_handle h_cloud,
+ nt_ng_word_handle handle, const char *ng_word)
+{
+ nt_ng_word_tp ng_wordp;
+ nt_mutex_handle h_mutex;
+ BOOL bret;
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+ h_mutex = nt_ng_word_get_mutex(handle);
+ if(h_mutex)
+ nt_mutex_lock(h_mutex);
+ bret = ng_word_add(
+ h_cloud, "ngwd.txt",
+ handle, ng_word,
+ &ng_wordp->ng_words,
+ &ng_wordp->ng_word_patterns,
+ &ng_wordp->ng_word_reg_patterns);
+ if(h_mutex)
+ nt_mutex_unlock(h_mutex);
+ return bret;
+}
+
+BOOL nt_ng_word_add_ng_name(
+ nt_cloud_handle h_cloud,
+ nt_ng_word_handle handle, const char *ng_name)
+{
+ nt_ng_word_tp ng_wordp;
+ nt_mutex_handle h_mutex;
+ BOOL bret;
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+ h_mutex = nt_ng_name_get_mutex(handle);
+ if(h_mutex)
+ nt_mutex_lock(h_mutex);
+ bret = ng_word_add(
+ h_cloud, "ngnm.txt",
+ handle, ng_name,
+ &ng_wordp->ng_names,
+ &ng_wordp->ng_name_patterns,
+ &ng_wordp->ng_name_reg_patterns);
+ if(h_mutex)
+ nt_mutex_unlock(h_mutex);
+ return bret;
+}
+
+BOOL nt_ng_word_add_ng_id(
+ nt_cloud_handle h_cloud,
+ nt_ng_word_handle handle, const char *ng_id)
+{
+ nt_ng_word_tp ng_wordp;
+ nt_mutex_handle h_mutex;
+ BOOL bret;
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+ h_mutex = nt_ng_id_get_mutex(handle);
+ if(h_mutex)
+ nt_mutex_lock(h_mutex);
+ bret = ng_word_add(
+ h_cloud, "ngid.txt",
+ handle, ng_id,
+ &ng_wordp->ng_ids,
+ &ng_wordp->ng_id_patterns,
+ &ng_wordp->ng_id_reg_patterns);
+ if(h_mutex)
+ nt_mutex_unlock(h_mutex);
+ return bret;
+}
+
+static BOOL ng_word_add(
+ nt_cloud_handle h_cloud, const char *cloud_file_name,
+ nt_ng_word_handle handle,
+ const char *ng_word,
+ nt_link_tp *org_linkpp,
+ nt_link_tp *text_linkpp,
+ nt_link_tp *regx_linkpp)
+{
+ int len;
+ wchar_t wbuf[1024];
+ wchar_t *cptr;
+ nt_link_tp linkp;
+ regex_t *regp;
+
+ if(!ng_word || (0 == (len = strlen(ng_word))))
+ return FALSE;
+
+ if(-1 == mbstowcs(wbuf, ng_word, sizeof(wbuf)))
+ return FALSE;
+
+ if(*org_linkpp){
+ cptr = (wchar_t*)nt_link_find(
+ *org_linkpp, (void*)wbuf, nt_link_wcscmp_fnc);
+ if(cptr)
+ return TRUE;
+ }
+
+ if(NULL == (cptr = nt_w_str_clone(wbuf)))
+ return FALSE;
+ linkp = nt_link_add_data(*org_linkpp, cptr);
+ if(!linkp){
+ free(cptr);
+ return FALSE;
+ }
+ if(!(*org_linkpp))
+ *org_linkpp = linkp;
+
+ if(h_cloud){
+ cptr = nt_w_str_clone(wbuf);
+ if(cptr){
+ linkp = nt_link_add_data(NULL, (void*)cptr);
+ if(linkp){
+ nt_cloud_insert_lines_into_file_async(h_cloud, cloud_file_name, linkp);
+ }
+ }
+ }
+
+ if(NULL != (regp = get_regx_pattern(ng_word))){
+ linkp = nt_link_add_data(*regx_linkpp, regp);
+ if(!linkp){
+ regfree(regp);
+ free(regp);
+ return FALSE;
+ }
+ if(!(*regx_linkpp))
+ *regx_linkpp = linkp;
+ return TRUE;
+ }
+ if(NULL != (cptr = parse_plain_text(wbuf))){
+ linkp = nt_link_add_data(*text_linkpp, cptr);
+ if(!linkp){
+ free(cptr);
+ return FALSE;
+ }
+ if(!(*text_linkpp))
+ *text_linkpp = linkp;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+int ng_word_match(nt_ng_word_handle handle,
+ int item_type, const wchar_t *source,
+ wchar_t *match_buf, size_t match_buf_len)
+{
+ nt_ng_word_tp ng_wordp;
+
+ //assert(match);
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+ if(item_type & NG_ITEM_MSG){
+ if(word_match_local(ng_wordp, source,
+ ng_wordp->ng_word_patterns,
+ ng_wordp->ng_word_reg_patterns,
+ match_buf, match_buf_len)){
+ return NG_ITEM_MSG;
+ }
+ }else if(item_type & NG_ITEM_NAME){
+ if(word_match_local(ng_wordp, source,
+ ng_wordp->ng_name_patterns,
+ ng_wordp->ng_name_reg_patterns,
+ match_buf, match_buf_len)){
+ return NG_ITEM_NAME;
+ }
+ }else if(item_type & NG_ITEM_ID){
+ if(word_match_local(ng_wordp, source,
+ ng_wordp->ng_id_patterns,
+ ng_wordp->ng_id_reg_patterns,
+ match_buf, match_buf_len)){
+ return NG_ITEM_ID;
+ }
+ }
+ return NG_ITEM_NONE;
+}
+
+static BOOL word_match_local(nt_ng_word_tp ng_wordp,
+ const wchar_t *source,
+ nt_link_tp patterns,
+ nt_link_tp reg_patterns,
+ wchar_t *match_buf, size_t match_buf_len)
+{
+ nt_link_tp linkp;
+ wchar_t *cptr1, *cptr2;
+ regex_t *regp;
+ regmatch_t match[2];
+ char *ptr;
+ int len;
+
+ if(patterns){
+ linkp = patterns;
+ do{
+ cptr1 = (wchar_t*)linkp->data;
+ if(NULL != (cptr2 = wcsstr(source, cptr1))){
+ if(match_buf_len > wcslen(cptr1))
+ wcscpy(match_buf, cptr1);
+ else
+ match_buf[0] = L'\0';
+ return TRUE;
+ }
+ linkp = linkp->next;
+ }while(linkp != patterns);
+ }
+ if(reg_patterns){
+ len = wcslen(source);
+ if(len == 0)
+ goto EXIT_NG_ITEM_MSG;
+ ptr = malloc((len+1)*3);/*max utf-8 char size*/
+ if(!ptr)
+ goto EXIT_NG_ITEM_MSG;
+ if((size_t)-1 == wcstombs(ptr, source, (len+1)*3)){
+ free(ptr);
+ goto EXIT_NG_ITEM_MSG;
+ }
+ linkp = reg_patterns;
+ do{
+ regp = (regex_t*)linkp->data;
+ if(0 == regexec(regp, ptr,
+ sizeof(match)/sizeof(regmatch_t),
+ match, 0)){
+ if(match[0].rm_so > -1){
+ len = match[0].rm_eo - match[0].rm_so;
+ if(match_buf_len > len){
+ ptr[match[0].rm_eo] = '\0';
+ if((size_t)-1 == mbstowcs(
+ match_buf,
+ ptr + match[0].rm_so,
+ match_buf_len)){
+ match_buf[0] = L'\0';
+ }
+ }else{
+ match_buf[0] = L'\0';
+ }
+ }else{
+ match_buf[0] = L'\0';
+ }
+ free(ptr);
+ return TRUE;
+ }
+ linkp = linkp->next;
+ }while(linkp != reg_patterns);
+ free(ptr);
+ }
+EXIT_NG_ITEM_MSG:
+ return FALSE;
+}
+
+
+static nt_ng_word_handle nt_ng_word_alloc()
+{
+ nt_ng_word_tp ng_wordp =
+ malloc(sizeof(nt_ng_word_t));
+ if(!ng_wordp)
+ return NULL;
+
+ ng_wordp->handle.chk_sum = NT_NG_WORD_CHK_SUM;
+ ng_wordp->ng_words = NULL;
+ ng_wordp->ng_names = NULL;
+ ng_wordp->ng_word_patterns = NULL;
+ ng_wordp->ng_name_patterns = NULL;
+ ng_wordp->ng_id_patterns = NULL;
+ ng_wordp->ng_word_reg_patterns = NULL;
+ ng_wordp->ng_name_reg_patterns = NULL;
+ ng_wordp->ng_id_reg_patterns = NULL;
+
+ ng_wordp->ng_ids = NULL;
+ ng_wordp->ref_count = 1;
+ ng_wordp->key = NT_NG_ROOT_MUTEX_KEY;
+ return (nt_ng_word_handle)&ng_wordp->handle;
+}
+
+
+nt_mutex_handle nt_ng_get_mutex(nt_ng_word_handle handle)
+{
+ nt_mutex_handle h_mutex;
+ nt_ng_word_tp ng_wordp;
+
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+
+ nt_ng_word_add_ref(handle);
+
+ h_mutex = nt_mutex_get_one_time_handle(ng_wordp->key);
+
+ nt_ng_word_release_ref(handle);
+ if(!h_mutex){
+ return NULL;
+ }
+ return h_mutex;
+}
+
+static nt_mutex_handle local_ng_word_get_mutex(
+ const wchar_t *key, nt_ng_word_handle handle)
+{
+ nt_mutex_handle h_mutex;
+ nt_ng_word_tp ng_wordp;
+
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+
+ nt_ng_word_add_ref(handle);
+
+ h_mutex = nt_mutex_get_one_time_handle(ng_wordp->key);
+
+ nt_ng_word_release_ref(handle);
+ if(!h_mutex){
+ return NULL;
+ }
+ if(!nt_mutex_add_moniker(h_mutex, key)){
+ return NULL;
+ }
+ return h_mutex;
+}
+
+nt_mutex_handle nt_ng_word_get_mutex(nt_ng_word_handle handle)
+{
+ return local_ng_word_get_mutex(NT_NG_WORD_MUTEX_KEY, handle);
+}
+nt_mutex_handle nt_ng_name_get_mutex(nt_ng_word_handle handle)
+{
+ return local_ng_word_get_mutex(NT_NG_NAME_MUTEX_KEY, handle);
+}
+nt_mutex_handle nt_ng_id_get_mutex(nt_ng_word_handle handle)
+{
+ return local_ng_word_get_mutex(NT_NG_ID_MUTEX_KEY, handle);
+}
+
+
+int nt_ng_word_add_ref(nt_ng_word_handle handle)
+{
+ nt_ng_word_tp ng_wordp;
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+ return ++ng_wordp->ref_count;
+}
+
+
+int nt_ng_word_release_ref(nt_ng_word_handle handle)
+{
+ nt_ng_word_tp ng_wordp;
+ assert(handle);
+ assert(handle->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)handle;
+ assert(ng_wordp->ref_count > 0);
+ ng_wordp->ref_count--;
+ if(0 != ng_wordp->ref_count)
+ return ng_wordp->ref_count;
+
+
+ if(ng_wordp->ng_words)
+ nt_all_link_free(ng_wordp->ng_words, free);
+ if(ng_wordp->ng_word_patterns)
+ nt_all_link_free(ng_wordp->ng_word_patterns, free);
+ if(ng_wordp->ng_word_reg_patterns)
+ nt_all_link_free(ng_wordp->ng_word_reg_patterns, reg_free);
+ if(ng_wordp->ng_names)
+ nt_all_link_free(ng_wordp->ng_names, free);
+ if(ng_wordp->ng_name_patterns)
+ nt_all_link_free(ng_wordp->ng_name_patterns, free);
+ if(ng_wordp->ng_name_reg_patterns)
+ nt_all_link_free(ng_wordp->ng_name_reg_patterns, reg_free);
+ if(ng_wordp->ng_ids)
+ nt_all_link_free(ng_wordp->ng_ids, free);
+ if(ng_wordp->ng_id_patterns)
+ nt_all_link_free(ng_wordp->ng_id_patterns, free);
+ if(ng_wordp->ng_id_reg_patterns)
+ nt_all_link_free(ng_wordp->ng_id_reg_patterns, reg_free);
+ free(ng_wordp);
+ return 0;
+}
+
+BOOL nt_ng_word_upload_cloud(nt_cloud_handle h_cloud, nt_ng_word_handle h_ng_word)
+{
+ nt_ng_word_tp ng_wordp;
+ nt_link_tp empty_linkp;
+ assert(h_ng_word);
+ assert(h_ng_word->chk_sum == NT_NG_WORD_CHK_SUM);
+ ng_wordp = (nt_ng_word_tp)h_ng_word;
+ assert(ng_wordp->ref_count > 0);
+
+ empty_linkp = nt_link_add_data(NULL, L"");
+
+ if(ng_wordp->ng_words){
+ nt_cloud_upload_file(h_cloud, "ngwd.txt", ng_wordp->ng_words);
+ }else if(empty_linkp){
+ nt_cloud_upload_file(h_cloud, "ngwd.txt", empty_linkp);
+ }
+
+ if(ng_wordp->ng_names){
+ nt_cloud_upload_file(h_cloud, "ngnm.txt", ng_wordp->ng_names);
+ }else if(empty_linkp){
+ nt_cloud_upload_file(h_cloud, "ngnm.txt", empty_linkp);
+ }
+ if(ng_wordp->ng_ids){
+ nt_cloud_upload_file(h_cloud, "ngid.txt", ng_wordp->ng_ids);
+ }else if(empty_linkp){
+ nt_cloud_upload_file(h_cloud, "ngid.txt", empty_linkp);
+ }
+
+ if(empty_linkp)
+ nt_all_link_free(empty_linkp, NULL);
+ return TRUE;
+}
+
return link->next;
}
-nt_link_tp nt_link_copy(nt_link_tp src_linkp)
+nt_link_tp nt_link_copy(nt_link_tp src_linkp, nt_memcopy_fn copy_func)
{
nt_link_tp srcp, resultp, workp;
+ void *ptr;
+
assert(src_linkp);
srcp = src_linkp;
resultp = NULL;
do{
- workp = nt_link_add_data(resultp, srcp->data);
+ if(!copy_func){
+ workp = nt_link_add_data(resultp, srcp->data);
+ }else{
+ ptr = (copy_func)(srcp->data);
+ if(ptr)
+ workp = nt_link_add_data(resultp, ptr);
+ else
+ workp = NULL;
+ }
if(!workp){
if(resultp)
nt_all_link_free(resultp, NULL);
return resultp;
}
+void* nt_link_strcpy_fnc(void *ptr)
+{
+ char *cptr, *p;
+ int len;
+ cptr = (char*)ptr;
+ len = strlen(cptr);
+ p = malloc(len+1);
+ if(!p)
+ return NULL;
+ strcpy(p, cptr);
+ return p;
+}
+void* nt_link_wcscpy_fnc(void *ptr)
+{
+ wchar_t *cptr, *p;
+ int len;
+ cptr = (wchar_t*)ptr;
+ len = wcslen(cptr);
+ p = malloc((len+1)*sizeof(wchar_t));
+ if(!p)
+ return NULL;
+ wcscpy(p, cptr);
+ return p;
+}
+
int nt_link_wcscmp_fnc(void *lhs, void *rhs)
{
return wcscmp((const wchar_t *)lhs, (const wchar_t *)rhs);