From bcbf8f3753455cca09c00d4d971518e1da897cbc Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E8=A5=BF=E7=94=B0=E3=80=80=E8=80=80?= Date: Sun, 24 Feb 2013 22:27:57 +0900 Subject: [PATCH] =?utf8?q?=E7=8F=BE=E5=9C=A8=E3=81=BE=E3=81=A7=E3=81=AE?= =?utf8?q?=E3=82=BD=E3=83=BC=E3=82=B9=E3=82=92=E3=82=B3=E3=83=9F=E3=83=83?= =?utf8?q?=E3=83=88=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- CHNOSProject/AI002/AI002/array.c | 167 +++++++++++++++++ CHNOSProject/AI002/AI002/command.c | 25 +++ CHNOSProject/AI002/AI002/constant.c | 25 +++ CHNOSProject/AI002/AI002/core.h | 163 +++++++++++++++++ CHNOSProject/AI002/AI002/dpndenv.c | 41 +++++ CHNOSProject/AI002/AI002/interpre.c | 9 + CHNOSProject/AI002/AI002/main.c | 63 +++++++ CHNOSProject/AI002/AI002/mem_e.c | 145 +++++++++++++++ CHNOSProject/AI002/AI002/mem_m.c | 65 +++++++ CHNOSProject/AI002/AI002/mem_w.c | 121 +++++++++++++ CHNOSProject/AI002/AI002/memory.c | 142 +++++++++++++++ CHNOSProject/AI002/AI002/memory.txt | 211 ++++++++++++++++++++++ CHNOSProject/AI002/AI002/separate.c | 73 ++++++++ CHNOSProject/AI002/AI002/string.c | 153 ++++++++++++++++ CHNOSProject/AI002/AI002/sysdata.h | 31 ++++ CHNOSProject/AI002/AI002/think.c | 88 +++++++++ CHNOSProject/AI003/AI003/core.h | 31 ++++ CHNOSProject/AI003/AI003/main.c | 204 +++++++++++++++++++++ CHNOSProject/c2wiki/c2wiki/main.c | 59 ++++++ CHNOSProject/chn/chnlib.c | 210 ++++++++++++++++++++++ CHNOSProject/chn/chnlib.h | 124 +++++++++++++ CHNOSProject/chn/chnlib00.c | 251 ++++++++++++++++++++++++++ CHNOSProject/chn/chnlib01.c | 349 ++++++++++++++++++++++++++++++++++++ CHNOSProject/chn/chnlib02.c | 109 +++++++++++ CHNOSProject/chn/chnlib03.c | 58 ++++++ CHNOSProject/chn/chnlib04.c | 40 +++++ 26 files changed, 2957 insertions(+) create mode 100644 CHNOSProject/AI002/AI002/array.c create mode 100644 CHNOSProject/AI002/AI002/command.c create mode 100644 CHNOSProject/AI002/AI002/constant.c create mode 100644 CHNOSProject/AI002/AI002/core.h create mode 100644 CHNOSProject/AI002/AI002/dpndenv.c create mode 100644 CHNOSProject/AI002/AI002/interpre.c create mode 100644 CHNOSProject/AI002/AI002/main.c create mode 100644 CHNOSProject/AI002/AI002/mem_e.c create mode 100644 CHNOSProject/AI002/AI002/mem_m.c create mode 100644 CHNOSProject/AI002/AI002/mem_w.c create mode 100644 CHNOSProject/AI002/AI002/memory.c create mode 100644 CHNOSProject/AI002/AI002/memory.txt create mode 100644 CHNOSProject/AI002/AI002/separate.c create mode 100644 CHNOSProject/AI002/AI002/string.c create mode 100644 CHNOSProject/AI002/AI002/sysdata.h create mode 100644 CHNOSProject/AI002/AI002/think.c create mode 100755 CHNOSProject/AI003/AI003/core.h create mode 100755 CHNOSProject/AI003/AI003/main.c create mode 100644 CHNOSProject/c2wiki/c2wiki/main.c create mode 100755 CHNOSProject/chn/chnlib.c create mode 100755 CHNOSProject/chn/chnlib.h create mode 100755 CHNOSProject/chn/chnlib00.c create mode 100644 CHNOSProject/chn/chnlib01.c create mode 100644 CHNOSProject/chn/chnlib02.c create mode 100644 CHNOSProject/chn/chnlib03.c create mode 100644 CHNOSProject/chn/chnlib04.c diff --git a/CHNOSProject/AI002/AI002/array.c b/CHNOSProject/AI002/AI002/array.c new file mode 100644 index 0000000..73a18ae --- /dev/null +++ b/CHNOSProject/AI002/AI002/array.c @@ -0,0 +1,167 @@ +// +// array.c +// Arrays which contain data number and pointer of object. +// AI002 +// +// Created by 西田 耀 on 13/01/01. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#include "core.h" + +AI_Array *AI_Array_Initialize(void) +{ + return NULL; +} + +AI_Array *AI_Array_Allocate(void) +{ + AI_Array *tag; + + tag = (AI_Array *)malloc(sizeof(AI_Array)); + + if(tag == NULL){ + AI_SpeakError("Allocation error.\n", NULL); + exit(EXIT_FAILURE); + } + + memset(tag, 0, sizeof(AI_Array)); + + return tag; +} + +void AI_Array_Free(AI_Array **start) +{ + //Array全体をFreeする。 + //内部ポインタの参照先については関知しない。 + AI_Array *now, *next; + + now = *start; + *start = NULL; + + for(; now != NULL; ){ + next = now->next; + free(now); + now = next; + } + return; +} + +void AI_Array_FreePointer(AI_Array *start) +{ + //Pointerの参照先をすべてFree. + //Array自体はFreeしない。 + int i; + + for(; start != NULL; start = start->next){ + for(i = 0; i < start->using_tags; i++){ + if(start->tag[i].pointer != NULL){ + free(start->tag[i].pointer); + start->tag[i].pointer = NULL; + } + } + //free(now); + } + return; +} + +uint AI_Array_GetDataIDByIndex(const AI_Array *start, int index) +{ + for(; (index / AI_ARRAY_PACKDATAS) > 0; index -= AI_ARRAY_PACKDATAS){ + if(start == NULL){ + return AI_DATAID_NULL; + } + start = start->next; + } + if(start == NULL){ + return AI_DATAID_NULL; + } + return start->tag[index].dataID; +} + +void *AI_Array_GetPointerByIndex(const AI_Array *start, int index) +{ + for(; (index / AI_ARRAY_PACKDATAS) > 0; index -= AI_ARRAY_PACKDATAS){ + if(start == NULL){ + return NULL; + } + start = start->next; + } + if(start == NULL){ + return NULL; + } + return start->tag[index].pointer; +} + +int AI_Array_GetIndexByDataID(const AI_Array *start, int dataID) +{ + int i, tags; + + tags = AI_Array_GetNumberOfTags(start); + + for(i = 0; i < tags; i++){ + if(AI_Array_GetDataIDByIndex(start, i) == dataID){ + return i; + } + } + return AI_ARRAY_INDEX_NOTFOUND; +} + +void *AI_Array_GetPointerByDataID(const AI_Array *start, int dataID) +{ + int i, tags; + + tags = AI_Array_GetNumberOfTags(start); + + for(i = 0; i < tags; i++){ + if(AI_Array_GetDataIDByIndex(start, i) == dataID){ + return AI_Array_GetPointerByIndex(start, i); + } + } + return NULL; +} + +int AI_Array_GetNumberOfTags(const AI_Array *start) +{ + int tags; + + tags = 0; + + for(; start != NULL; start = start->next){ + tags += start->using_tags; + } + return tags; +} + +int AI_Array_AppendLast(AI_Array **start, uint dataID, void *pointer) +{ + int index; + + index = 0; + for(; *start != NULL && (*start)->using_tags == AI_ARRAY_PACKDATAS; start = &((*start)->next)){ + index += AI_ARRAY_PACKDATAS; + } + + if(*start == NULL){ + *start = AI_Array_Allocate(); + } + (*start)->tag[(*start)->using_tags].dataID = dataID; + (*start)->tag[(*start)->using_tags].pointer = pointer; + (*start)->using_tags++; + + return index + (*start)->using_tags - 1; +} + +AI_ArrayTag *AI_Array_GetTagPointerByIndex(AI_Array *start, int index) +{ + for(; (index / AI_ARRAY_PACKDATAS) > 0; index -= AI_ARRAY_PACKDATAS){ + if(start == NULL){ + return NULL; + } + start = start->next; + } + if(start == NULL){ + return NULL; + } + return &start->tag[index]; +} diff --git a/CHNOSProject/AI002/AI002/command.c b/CHNOSProject/AI002/AI002/command.c new file mode 100644 index 0000000..09d4646 --- /dev/null +++ b/CHNOSProject/AI002/AI002/command.c @@ -0,0 +1,25 @@ +// +// command.c +// AI002 +// +// Created by 西田 耀 on 13/01/02. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#include "core.h" + +void AI_Command_System_info(AI_Array *separated) +{ + AI_SpeakSystem("%d datas exist.\n", AI_Array_GetNumberOfTags(AI_MainMemory.rootdata)); + + return; +} + +void AI_Command_System_setmode(AI_Array *separated) +{ + AI_MainMemory.mode = AI_strtol((char *)AI_Array_GetPointerByIndex(separated, 2), NULL, 0); + + AI_SpeakSystem("setmode:Change mode to %d.\n", AI_MainMemory.mode); + + return; +} diff --git a/CHNOSProject/AI002/AI002/constant.c b/CHNOSProject/AI002/AI002/constant.c new file mode 100644 index 0000000..746ed16 --- /dev/null +++ b/CHNOSProject/AI002/AI002/constant.c @@ -0,0 +1,25 @@ +// +// constant.c +// AI002 +// +// Created by 西田 耀 on 13/01/02. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#include "core.h" + +AI_Array AI_SystemStringList = { + 1, + { + {AI_DATAID_NULL, ":"}, + }, + NULL +}; + +AI_Array AI_SystemStringList_ReadExpressionData = { + 1, + { + {AI_DATAID_NULL, ","}, + }, + NULL +}; \ No newline at end of file diff --git a/CHNOSProject/AI002/AI002/core.h b/CHNOSProject/AI002/AI002/core.h new file mode 100644 index 0000000..78bec2f --- /dev/null +++ b/CHNOSProject/AI002/AI002/core.h @@ -0,0 +1,163 @@ +// +// core.h +// AI002 +// +// Created by 西田 耀 on 13/01/01. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#ifndef AI002_core_h +#define AI002_core_h + +//includes +//+---C99 standard headers +#include +//+-------FILENAME_MAX +#include +#include +#include +#include +#include + +//+---Project headers +#include "sysdata.h" + +typedef unsigned char uchar; +typedef unsigned short ushort; +typedef unsigned int uint; + +#define True 1 +#define False 0 + +//preprocessor functions +#ifdef DEBUG +#define debug(s, ...) printf("AI:Debug:%s:%s:%d:" s "\n", __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__); +#else +#define debug(s, ...) +#endif + +#define AI_SpeakSystem(s, ...) printf("AI:System:%s:" s, __FUNCTION__, __VA_ARGS__); +#define AI_SpeakError(s, ...) printf("AI:Error:%s:%d:" s, __FUNCTION__, __LINE__, __VA_ARGS__); + +//define values +#define AI_ARRAY_PACKDATAS 7 +#define AI_DATAID_NULL 0 +#define AI_MAX_STRINGLENGTH 1024 +#define AI_ARRAY_INDEX_NOTFOUND -1 +#define AI_MEMORY_FILENAME "memory.txt" + +//typedef +typedef struct AI_ARRAY_TAG { + uint dataID; + void *pointer; +} AI_ArrayTag; + +typedef struct AI_ARRAY { + int using_tags; //Number of using tags in this pack. + AI_ArrayTag tag[AI_ARRAY_PACKDATAS]; + struct AI_ARRAY *next; +} AI_Array; + +typedef struct AI_MEMORY_WORKING_SET { + char *filename; + AI_Array *rootdata; //pointer = AI_Memory_DataTag_X(instace) + int mode; + struct AI_MEMORY_WORKING_SET_FLAGS { + unsigned no_asking_user : 1; + } flags; + + AI_Array *list_word; //pointer = char[](ref) + AI_Array *list_mean; //pointer = char[](ref) + AI_Array *list_expresson; //pointer = *AI_Memory_DataTag_E(ref) +} AI_Memory_WorkingSet; + +typedef struct AI_MEMORY_DATA_TAG_W { + char type; + uint dataID; + char *string; + int length; + AI_Array *part_of_speech; +} AI_Memory_DataTag_W; + +typedef struct AI_MEMORY_DATA_TAG_M { + char type; + uint dataID; + char *description; +} AI_Memory_DataTag_M; + +typedef struct AI_MEMORY_DATA_TAG_E { + char type; + uint dataID; + AI_Array *pattern; + uint meanID; +} AI_Memory_DataTag_E; + +//functions +//@array.c +AI_Array *AI_Array_Initialize(void); +AI_Array *AI_Array_Allocate(void); +void AI_Array_Free(AI_Array **start); +void AI_Array_FreePointer(AI_Array *start); +uint AI_Array_GetDataIDByIndex(const AI_Array *start, int index); +void *AI_Array_GetPointerByIndex(const AI_Array *start, int index); +int AI_Array_GetIndexByDataID(const AI_Array *start, int dataID); +void *AI_Array_GetPointerByDataID(const AI_Array *start, int dataID); +int AI_Array_GetNumberOfTags(const AI_Array *start); +int AI_Array_AppendLast(AI_Array **start, uint dataID, void *pointer); +AI_ArrayTag *AI_Array_GetTagPointerByIndex(AI_Array *start, int index); +//@command.c +void AI_Command_System_info(AI_Array *separated); +void AI_Command_System_setmode(AI_Array *separated); +//@constant.c +extern AI_Array AI_SystemStringList; +extern AI_Array AI_SystemStringList_ReadExpressionData; +//@dpndenv.c +void AI_Environment_SetCurrentWorkingDirectory(const char apppath[]); +//@main.c +int AI_Speak(char *format, ...); +char *AI_ReadInput(char line[], int linesize, FILE *fp); +int AI_strtol(const char s[], char **invalidchar, int base); +//@mem_e.c +AI_Memory_DataTag_E *AI_Memory_DataTag_E_Allocate(void); +void AI_Memory_DataTag_E_Free(AI_Memory_DataTag_E *tag); +void AI_Memory_DataTag_E_ReadSaveData(const char line[]); +void AI_Memory_DataTag_E_WriteSaveData(FILE *fp, AI_Memory_DataTag_E *tag); +AI_Array *AI_Memory_Expression_GetMeanFromSeparatedString(const AI_Array *separated); +int AI_Memory_Expression_CheckString(const AI_Array *pattern, const AI_Array *separated, int patternstart, int separatedstart); +//@mem_m.c +AI_Memory_DataTag_M *AI_Memory_DataTag_M_Allocate(void); +void AI_Memory_DataTag_M_Free(AI_Memory_DataTag_M *tag); +void AI_Memory_DataTag_M_ReadSaveData(const char line[]); +void AI_Memory_DataTag_M_WriteSaveData(FILE *fp, AI_Memory_DataTag_M *tag); +//@mem_w.c +AI_Memory_DataTag_W *AI_Memory_DataTag_W_Allocate(void); +void AI_Memory_DataTag_W_Free(AI_Memory_DataTag_W *tag); +void AI_Memory_DataTag_W_ReadSaveData(const char line[]); +void AI_Memory_DataTag_W_WriteSaveData(FILE *fp, AI_Memory_DataTag_W *tag); +int AI_Memory_Word_SortListByLength(AI_Array *start); +uint AI_Memory_Word_GetDataIDByString(const char s[]); +//@memory.c +extern AI_Memory_WorkingSet AI_MainMemory; +void AI_Memory_InitializeWorkingSet(void); +char AI_Memory_DataTag_GetType(void *pointer); +int AI_Memory_ReadMemory(const char filename[]); +int AI_Memory_SaveMemory(const char filename[]); +int AI_Memory_AddRootData(uint dataID, void *tag); +//@separate.c +int AI_Array_GetSeparatedStringByArray(AI_Array **separated, AI_Array *list, const char s[]); +int AI_Array_GetSeparatedStringByArrayWithoutListWord(AI_Array **separated, AI_Array *list, const char s[]); +//@string.c +void AI_String_DeleteCRLF(char s[]); +char *AI_String_ExtractByLength(const char s[], int start, int len); +int AI_String_GetLength(const char s[]); +int AI_String_CompareString(const char s[], const char search[]); +int AI_String_CompareString_Strict(const char s[], const char search[]); +int AI_String_SearchLocationFromArray(const char s[], AI_Array *start, int *location); +//@think.c +void AI_ThinkMain(void); +int AI_Think_GetSeparatedStringByMemory(AI_Array **separated, const char s[]); + + + + +#endif diff --git a/CHNOSProject/AI002/AI002/dpndenv.c b/CHNOSProject/AI002/AI002/dpndenv.c new file mode 100644 index 0000000..5ab7749 --- /dev/null +++ b/CHNOSProject/AI002/AI002/dpndenv.c @@ -0,0 +1,41 @@ +// +// dpndenv.c +// Functions which depend on the environment. +// AI002 +// +// Created by 西田 耀 on 13/01/01. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +//includes +//+---depend on the environment +#include +//+-------int chdir(const char *path); カレントディレクトリの変更 +//+-------char *getcwd(char *buf, size_t size); 現在のカレントディレクトリを取得 + +#include "core.h" + +void AI_Environment_SetCurrentWorkingDirectory(const char apppath[]) +{ + char path[FILENAME_MAX]; + int i, last; + + //カレントディレクトリを実行ファイルのディレクトリに変更 + snprintf(path, sizeof(path), "%s", apppath); + last = 0; + for(i = 0; i < FILENAME_MAX; i++){ + if(path[i] == '\0'){ + break; + } + if(path[i] == '/'){ + last = i; + } + } + path[last + 1] = '\0'; + printf("%s\n", path); + chdir(path); + getcwd(path, sizeof(path)); + printf("%s\n", path); + + return; +} diff --git a/CHNOSProject/AI002/AI002/interpre.c b/CHNOSProject/AI002/AI002/interpre.c new file mode 100644 index 0000000..833734a --- /dev/null +++ b/CHNOSProject/AI002/AI002/interpre.c @@ -0,0 +1,9 @@ +// +// interpre.c +// AI002 +// +// Created by 西田 耀 on 13/01/07. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#include diff --git a/CHNOSProject/AI002/AI002/main.c b/CHNOSProject/AI002/AI002/main.c new file mode 100644 index 0000000..efe94d4 --- /dev/null +++ b/CHNOSProject/AI002/AI002/main.c @@ -0,0 +1,63 @@ +// +// main.c +// AI002 +// +// Created by 西田 耀 on 13/01/01. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#include "core.h" + +int main(int argc, const char * argv[]) +{ + srand((unsigned int)time(NULL)); + AI_Environment_SetCurrentWorkingDirectory(argv[0]); + AI_Memory_InitializeWorkingSet(); + + if(argc >= 2){ + AI_MainMemory.filename = AI_String_ExtractByLength(argv[1], 0, PATH_MAX); + } else{ + AI_MainMemory.filename = AI_String_ExtractByLength(AI_MEMORY_FILENAME, 0, PATH_MAX); + } + AI_Memory_ReadMemory(NULL); + + AI_ThinkMain(); + + return 0; +} + +int AI_Speak(char *format, ...) +{ + char s[AI_MAX_STRINGLENGTH]; + va_list varg; + + fputs("AI:", stdout); + + va_start(varg, format); + vsnprintf(s, sizeof(s), format, varg); + va_end(varg); + + fputs(s, stdout); + + return 0; +} + + +char *AI_ReadInput(char line[], int linesize, FILE *fp) +{ + char *retv; + + retv = fgets(line, linesize, fp); + AI_String_DeleteCRLF(line); + + return retv; +} + +int AI_strtol(const char s[], char **invalidchar, int base) +{ + if(s == NULL){ + return 0; + } + + return (int)strtol(s, invalidchar, base); +} diff --git a/CHNOSProject/AI002/AI002/mem_e.c b/CHNOSProject/AI002/AI002/mem_e.c new file mode 100644 index 0000000..ce94799 --- /dev/null +++ b/CHNOSProject/AI002/AI002/mem_e.c @@ -0,0 +1,145 @@ +// +// mem_e.c +// AI002 +// +// Created by 西田 耀 on 13/01/03. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#include "core.h" + +AI_Memory_DataTag_E *AI_Memory_DataTag_E_Allocate(void) +{ + AI_Memory_DataTag_E *tag; + + tag = (AI_Memory_DataTag_E *)malloc(sizeof(AI_Memory_DataTag_E)); + + if(tag == NULL){ + AI_SpeakError("Allocation error.\n", NULL); + exit(EXIT_FAILURE); + } + + memset(tag, 0, sizeof(AI_Memory_DataTag_E)); + tag->type = 'E'; + + return tag; +} + +void AI_Memory_DataTag_E_Free(AI_Memory_DataTag_E *tag) +{ + if(tag->pattern != NULL){ + AI_Array_FreePointer(tag->pattern); + AI_Array_Free(&tag->pattern); + } + free(tag); + return; +} + +void AI_Memory_DataTag_E_ReadSaveData(const char line[]) +{ + AI_Array *separated; + AI_Memory_DataTag_E *tagE; + + separated = AI_Array_Initialize(); + AI_Array_GetSeparatedStringByArray(&separated, &AI_SystemStringList, line); + + tagE = AI_Memory_DataTag_E_Allocate(); + tagE->dataID = AI_Memory_AddRootData(AI_strtol(line, NULL, 0), tagE); + if(tagE->dataID == AI_DATAID_NULL){ + //add failed. + AI_Memory_DataTag_E_Free(tagE); + } else{ + tagE->meanID = AI_strtol((const char *)AI_Array_GetPointerByIndex(separated, 4), NULL, 0); + AI_Array_GetSeparatedStringByArrayWithoutListWord(&tagE->pattern, &AI_SystemStringList_ReadExpressionData, (const char *)AI_Array_GetPointerByIndex(separated, 2)); + AI_Array_AppendLast(&AI_MainMemory.list_expresson, tagE->dataID, tagE); + } + + AI_Array_FreePointer(separated); + AI_Array_Free(&separated); + + return; +} + +void AI_Memory_DataTag_E_WriteSaveData(FILE *fp, AI_Memory_DataTag_E *tag) +{ + int i, i_max; + + fprintf(fp, "E0x%08X:", tag->dataID); + i_max = AI_Array_GetNumberOfTags(tag->pattern); + for(i = 0; i < i_max; i++){ + fprintf(fp, "%s,", AI_Array_GetPointerByIndex(tag->pattern, i)); + } + fprintf(fp, ":0x%08X\n", tag->meanID); + return; +} + +AI_Array *AI_Memory_Expression_GetMeanFromSeparatedString(const AI_Array *separated) +{ + AI_Array *retlist; //MeanDataID:*AI_Memory_DataTag_E(ref) + AI_Array *pattern; + AI_Memory_DataTag_E *tagE; + int i, i_max; + + retlist = AI_Array_Initialize(); + + i_max = AI_Array_GetNumberOfTags(AI_MainMemory.list_expresson); + for(i = 0; i < i_max; i++){ + tagE = (AI_Memory_DataTag_E *)AI_Array_GetPointerByIndex(AI_MainMemory.list_expresson, i); + pattern = tagE->pattern; + if(AI_Memory_Expression_CheckString(pattern, separated, 0, 0)){ + AI_Array_AppendLast(&retlist, tagE->meanID, tagE); + } + } + + return retlist; +} + +int AI_Memory_Expression_CheckString(const AI_Array *pattern, const AI_Array *separated, int patternstart, int separatedstart) +{ + //True:Equal False:Not equal + + int pattern_max, separated_max; + int i, separated_i; + const char *patternstr; + const char *separatedstr; + + pattern_max = AI_Array_GetNumberOfTags(pattern); + separated_max = AI_Array_GetNumberOfTags(separated); + separated_i = separatedstart; + for(i = patternstart; i < pattern_max; i++){ + patternstr = (const char *)AI_Array_GetPointerByIndex(pattern, i); + separatedstr = (const char *)AI_Array_GetPointerByIndex(separated, separated_i); + if(patternstr[0] == '?'){ + separated_i++; + } else if(patternstr[0] == '*'){ + for(i++; i < pattern_max; i++){ + patternstr = (const char *)AI_Array_GetPointerByIndex(pattern, i); + if(patternstr[0] == '?'){ + separated_i++; + } else if(patternstr[0] == '*'){ + + } else{ + break; + } + } + for(; separated_i < separated_max; separated_i++){ + if(AI_Memory_Expression_CheckString(pattern, separated, i, separated_i)){ + i = pattern_max; + separated_i = separated_max; + break; + } + } + break; + } else{ + if(AI_strtol(patternstr, NULL, 0) == AI_Array_GetDataIDByIndex(separated, separated_i)){ + separated_i++; + } else{ + break; + } + } + } + if(i == pattern_max && (separated_i == separated_max || ((const char *)AI_Array_GetPointerByIndex(pattern, pattern_max - 1))[0] == '*')){ + return True; + } + return False; +} diff --git a/CHNOSProject/AI002/AI002/mem_m.c b/CHNOSProject/AI002/AI002/mem_m.c new file mode 100644 index 0000000..d590e90 --- /dev/null +++ b/CHNOSProject/AI002/AI002/mem_m.c @@ -0,0 +1,65 @@ +// +// mem_m.c +// AI002 +// +// Created by 西田 耀 on 13/01/03. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#include "core.h" + +AI_Memory_DataTag_M *AI_Memory_DataTag_M_Allocate(void) +{ + AI_Memory_DataTag_M *tag; + + tag = (AI_Memory_DataTag_M *)malloc(sizeof(AI_Memory_DataTag_M)); + + if(tag == NULL){ + AI_SpeakError("Allocation error.\n", NULL); + exit(EXIT_FAILURE); + } + + memset(tag, 0, sizeof(AI_Memory_DataTag_M)); + tag->type = 'M'; + + return tag; +} + +void AI_Memory_DataTag_M_Free(AI_Memory_DataTag_M *tag) +{ + if(tag->description != NULL){ + free(tag->description); + } + free(tag); + return; +} + +void AI_Memory_DataTag_M_ReadSaveData(const char line[]) +{ + AI_Array *separated; + AI_Memory_DataTag_M *tagM; + + separated = AI_Array_Initialize(); + AI_Array_GetSeparatedStringByArray(&separated, &AI_SystemStringList, line); + + tagM = AI_Memory_DataTag_M_Allocate(); + tagM->dataID = AI_Memory_AddRootData(AI_strtol(line, NULL, 0), tagM); + if(tagM->dataID == AI_DATAID_NULL){ + //add failed. + AI_Memory_DataTag_M_Free(tagM); + } else{ + tagM->description = AI_String_ExtractByLength(AI_Array_GetPointerByIndex(separated, 2), 0, AI_MAX_STRINGLENGTH); + AI_Array_AppendLast(&AI_MainMemory.list_mean, tagM->dataID, tagM->description); + } + + AI_Array_FreePointer(separated); + AI_Array_Free(&separated); + + return; +} + +void AI_Memory_DataTag_M_WriteSaveData(FILE *fp, AI_Memory_DataTag_M *tag) +{ + fprintf(fp, "M0x%08X:%s\n", tag->dataID, tag->description); + return; +} diff --git a/CHNOSProject/AI002/AI002/mem_w.c b/CHNOSProject/AI002/AI002/mem_w.c new file mode 100644 index 0000000..8a25a7d --- /dev/null +++ b/CHNOSProject/AI002/AI002/mem_w.c @@ -0,0 +1,121 @@ +// +// mem_w.c +// AI002 +// +// Created by 西田 耀 on 13/01/03. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#include "core.h" + +AI_Memory_DataTag_W *AI_Memory_DataTag_W_Allocate(void) +{ + AI_Memory_DataTag_W *tag; + + tag = (AI_Memory_DataTag_W *)malloc(sizeof(AI_Memory_DataTag_W)); + + if(tag == NULL){ + AI_SpeakError("Allocation error.\n", NULL); + exit(EXIT_FAILURE); + } + + memset(tag, 0, sizeof(AI_Memory_DataTag_W)); + tag->type = 'W'; + + return tag; +} + +void AI_Memory_DataTag_W_Free(AI_Memory_DataTag_W *tag) +{ + if(tag->string != NULL){ + free(tag->string); + } + free(tag); + return; +} + +void AI_Memory_DataTag_W_ReadSaveData(const char line[]) +{ + AI_Array *separated; + AI_Memory_DataTag_W *tagW; + + separated = AI_Array_Initialize(); + AI_Array_GetSeparatedStringByArray(&separated, &AI_SystemStringList, line); + + tagW = AI_Memory_DataTag_W_Allocate(); + tagW->dataID = AI_Memory_AddRootData(AI_strtol(line, NULL, 0), tagW); + if(tagW->dataID == AI_DATAID_NULL){ + //add failed. + AI_Memory_DataTag_W_Free(tagW); + } else{ + tagW->string = AI_String_ExtractByLength(AI_Array_GetPointerByIndex(separated, 2), 0, AI_MAX_STRINGLENGTH); + tagW->length = AI_String_GetLength(tagW->string); + if(AI_Memory_Word_GetDataIDByString(tagW->string) != AI_DATAID_NULL){ + AI_SpeakError("word[%s] has already existed.\n", tagW->string); + } else{ + AI_Array_AppendLast(&AI_MainMemory.list_word, tagW->dataID, tagW->string); + } + } + + AI_Array_FreePointer(separated); + AI_Array_Free(&separated); + + return; +} + +void AI_Memory_DataTag_W_WriteSaveData(FILE *fp, AI_Memory_DataTag_W *tag) +{ + fprintf(fp, "W0x%08X:%s\n", tag->dataID, tag->string); + return; +} + +int AI_Memory_Word_SortListByLength(AI_Array *start) +{ + //AI_Array(uint dataID, string[])をAI_の大きい順に並べる。 + //バブルソートなので遅いけれどとりあえず実装 + //Nullポインタを考慮していない。 + int i, i_max, exchanged; + AI_ArrayTag *tag0, *tag1; + AI_ArrayTag temptag; + + i_max = AI_Array_GetNumberOfTags(start) - 1; + for(exchanged = 1; exchanged != 0; ){ + exchanged = 0; + tag1 = AI_Array_GetTagPointerByIndex(start, 0); + for(i = 0; i < i_max; i++){ + tag0 = tag1; + tag1 = AI_Array_GetTagPointerByIndex(start, i + 1); + if(((AI_Memory_DataTag_W *)AI_Array_GetPointerByDataID(AI_MainMemory.rootdata, tag0->dataID))->length < ((AI_Memory_DataTag_W *)AI_Array_GetPointerByDataID(AI_MainMemory.rootdata, tag1->dataID))->length){ + //temp <- tag0 + temptag.dataID = tag0->dataID; + temptag.pointer = tag0->pointer; + //tag0 <- tag1 + tag0->dataID = tag1->dataID; + tag0->pointer = tag1->pointer; + //tag1 <- temp + tag1->dataID = temptag.dataID; + tag1->pointer = temptag.pointer; + + tag1 = tag0; + exchanged++; + } + } + } + return 0; +}; + +uint AI_Memory_Word_GetDataIDByString(const char s[]) +{ + int s_len; + int i, i_max; + + s_len = AI_String_GetLength(s); + + i_max = AI_Array_GetNumberOfTags(AI_MainMemory.list_word); + for(i = 0; i < i_max; i++){ + if(AI_String_CompareString_Strict((const char *)AI_Array_GetPointerByIndex(AI_MainMemory.list_word, i), s)){ + return AI_Array_GetDataIDByIndex(AI_MainMemory.list_word, i); + } + } + return AI_DATAID_NULL; +} diff --git a/CHNOSProject/AI002/AI002/memory.c b/CHNOSProject/AI002/AI002/memory.c new file mode 100644 index 0000000..21cf923 --- /dev/null +++ b/CHNOSProject/AI002/AI002/memory.c @@ -0,0 +1,142 @@ +// +// memory.c +// AI002 +// +// Created by 西田 耀 on 13/01/01. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#include "core.h" + +AI_Memory_WorkingSet AI_MainMemory; + +void AI_Memory_InitializeWorkingSet(void) +{ + memset(&AI_MainMemory, 0, sizeof(AI_Memory_WorkingSet)); + + return; +} + +char AI_Memory_DataTag_GetType(void *pointer) +{ + return *((char *)pointer); +} + +int AI_Memory_ReadMemory(const char filename[]) +{ + FILE *fp; + char line[AI_MAX_STRINGLENGTH]; + + if(filename == NULL){ + filename = AI_MainMemory.filename; + } + + fp = fopen(filename, "r"); + if(fp == NULL){ + AI_SpeakError("Can't open [%s]\n", AI_MainMemory.filename); + return 1; + } + + if(filename != AI_MainMemory.filename){ + free(AI_MainMemory.filename); + AI_MainMemory.filename = AI_String_ExtractByLength(filename, 0, PATH_MAX); + } + + for(;;){ + if(AI_ReadInput(line, sizeof(line), fp) == NULL){ + break; + } + + if(line[0] != '\0'){ + if(line[0] == 'W'){ + AI_Memory_DataTag_W_ReadSaveData(&line[1]); + } else if(line[0] == 'M'){ + AI_Memory_DataTag_M_ReadSaveData(&line[1]); + } else if(line[0] == 'E'){ + AI_Memory_DataTag_E_ReadSaveData(&line[1]); + } else{ + AI_SpeakError("Unknown datatype [%c].\n", line[0]); + } + } + } + + fclose(fp); + AI_SpeakSystem("Read %d datas.\n", AI_Array_GetNumberOfTags(AI_MainMemory.rootdata)); + + AI_Memory_Word_SortListByLength(AI_MainMemory.list_word); + AI_SpeakSystem("Sorted %d word datas.\n", AI_Array_GetNumberOfTags(AI_MainMemory.list_word)); + + return 0; +} + +int AI_Memory_SaveMemory(const char filename[]) +{ + + FILE *fp; + int i, i_max; + void *tag; + + if(filename == NULL){ + filename = AI_MainMemory.filename; + } + + fp = fopen(filename, "w"); + if(fp == NULL){ + AI_SpeakError("Can't open [%s]\n", AI_MainMemory.filename); + return 1; + } + + if(filename != AI_MainMemory.filename){ + free(AI_MainMemory.filename); + AI_MainMemory.filename = AI_String_ExtractByLength(filename, 0, PATH_MAX); + } + + i_max = AI_Array_GetNumberOfTags(AI_MainMemory.rootdata); + for(i = 0; i < i_max; i++){ + tag = AI_Array_GetPointerByIndex(AI_MainMemory.rootdata, i); + switch(AI_Memory_DataTag_GetType(tag)){ + case 'W': + AI_Memory_DataTag_W_WriteSaveData(fp, (AI_Memory_DataTag_W *)tag); + break; + case 'M': + AI_Memory_DataTag_M_WriteSaveData(fp, (AI_Memory_DataTag_M *)tag); + break; + case 'E': + AI_Memory_DataTag_E_WriteSaveData(fp, (AI_Memory_DataTag_E *)tag); + break; + } + } + + fclose(fp); + + AI_SpeakSystem("Saved %d datas to [%s].\n", AI_Array_GetNumberOfTags(AI_MainMemory.rootdata), AI_MainMemory.filename); + + return 0; + +} + +int AI_Memory_AddRootData(uint dataID, void *tag) +{ + //retv == datanumber(AI_DATANUMBER_NULL:error) + int i, i_max, j; + + //重複チェック + if(AI_Array_GetIndexByDataID(AI_MainMemory.rootdata, dataID) != AI_ARRAY_INDEX_NOTFOUND){ + AI_SpeakError("datanumber %d is conflicted. Not added.\n", dataID); + return AI_DATAID_NULL; + } + if(dataID == 0){ + //自動割当 + i_max = AI_Array_GetNumberOfTags(AI_MainMemory.rootdata); + dataID = 1; + for(i = 0; i < i_max; i++){ + j = AI_Array_GetDataIDByIndex(AI_MainMemory.rootdata, i); + if(j > dataID){ + dataID = j + 1; + } + } + AI_SpeakSystem("datanumber 0 is reserved. This data added as datanumber %d.\n", dataID); + } + AI_Array_AppendLast(&AI_MainMemory.rootdata, dataID, tag); + return dataID; +} diff --git a/CHNOSProject/AI002/AI002/memory.txt b/CHNOSProject/AI002/AI002/memory.txt new file mode 100644 index 0000000..c42bfab --- /dev/null +++ b/CHNOSProject/AI002/AI002/memory.txt @@ -0,0 +1,211 @@ +W0x00000016:ミステリアス +W0x00000063:けたたましい +W0x000000C4:こんにちは +W0x00000002:いろいろな +W0x00000015:あからさま +W0x0000001A:ちょうだい +W0x0000001B:せんだって +W0x00000039:オクターブ +W0x0000003A:パーセント +W0x00000059:いがみ合う +W0x00000095:お疲れさま +W0x000000BB:一般名詞 +W0x000000B8:固有名詞 +W0x00000003:おおきな +W0x00000004:堂々たる +W0x00000010:アピール +W0x00000011:くしゃみ +W0x00000013:とんでも +W0x00000014:おとなげ +W0x0000001E:シエスタ +W0x00000020:ありさま +W0x00000044:いっぱい +W0x0000004A:わたしゃ +W0x0000004B:そりゃあ +W0x0000005A:たてつく +W0x0000005B:垢抜ける +W0x00000064:めでたい +W0x00000068:たいそう +W0x0000006C:ぱさぱさ +W0x0000006D:けれども +W0x0000006F:たとえば +W0x00000075:について +W0x00000076:とかいう +W0x0000008A:ばっかり +W0x0000005D:られる +W0x0000005E:させる +W0x00000090:らしい +W0x000000AE:たがる +W0x000000C2:感動詞 +W0x000000C1:助動詞 +W0x000000BF:接続詞 +W0x000000BD:形容詞 +W0x000000BA:接頭詞 +W0x000000B9:連体詞 +W0x000000AA:Microsoft +W0x0000000A:アンチ +W0x0000000D:いわく +W0x00000012:申し訳 +W0x00000017:決定的 +W0x00000019:ごらん +W0x0000001F:加速度 +W0x00000026:富士山 +W0x00000027:紫式部 +W0x0000002E:東京都 +W0x00000033:ゆかり +W0x0000004D:きらい +W0x00000051:みたい +W0x00000055:さなか +W0x0000005F:がかる +W0x00000060:しまう +W0x00000061:ちゃう +W0x00000065:っぽい +W0x00000066:づらい +W0x00000067:がたい +W0x00000069:人一倍 +W0x0000006A:あまり +W0x0000006B:いつも +W0x0000006E:しかし +W0x0000007B:かしら +W0x00000081:および +W0x00000088:くらい +W0x00000089:なんか +W0x00000091:ござる +W0x00000093:じゃん +W0x00000096:トホホ +W0x000000B4:です +W0x00000053:よう +W0x000000AB:れる +W0x0000003D:そう +W0x000000B5:ます +W0x0000002F:日本 +W0x000000B3:まい +W0x000000B0:ない +W0x000000AD:たい +W0x000000AC:せる +W0x000000C3:記号 +W0x000000C0:助詞 +W0x000000BE:副詞 +W0x000000BC:動詞 +W0x00000001:この +W0x00000005:まっ +W0x00000006:毎分 +W0x00000007:ぶっ +W0x00000008:引き +W0x00000009:もと +W0x0000000E:苦労 +W0x0000000F:終了 +W0x00000018:無人 +W0x0000001C:当分 +W0x0000001D:大根 +W0x00000021:ゼロ +W0x00000028:山田 +W0x00000029:佐藤 +W0x0000002A:鈴木 +W0x0000002B:太郎 +W0x0000002C:花子 +W0x00000031:入り +W0x00000032:気味 +W0x00000035:不可 +W0x00000036:がち +W0x00000038:同然 +W0x0000003F:さん +W0x00000041:国内 +W0x00000042:都内 +W0x00000043:ぶり +W0x00000045:前後 +W0x00000046:次第 +W0x00000047:そこ +W0x0000004C:こと +W0x0000004E:くせ +W0x0000004F:もの +W0x00000050:ふう +W0x00000054:限り +W0x00000056:うち +W0x00000058:そう +W0x0000005C:する +W0x00000062:願う +W0x00000070:反面 +W0x00000072:から +W0x00000078:こそ +W0x0000007D:っけ +W0x0000007E:わい +W0x00000080:つつ +W0x00000082:ので +W0x00000083:かな +W0x00000084:けむ +W0x00000085:にゃ +W0x0000008C:とか +W0x0000008D:だの +W0x0000008E:やら +W0x00000092:っす +W0x00000094:うむ +W0x0000002D:Apple +W0x000000AF:だ +W0x0000000B:最 +W0x000000B2:う +W0x00000071:の +W0x00000074:と +W0x00000087:に +W0x000000B1:ぬ +W0x0000008B:か +W0x00000052:よ +W0x00000073:を +W0x0000007F:て +W0x000000A1:「 +W0x000000A4:」 +W0x000000B7:・ +W0x000000B6:た +W0x0000000C:総 +W0x00000022:億 +W0x00000024:対 +W0x00000025:兼 +W0x00000030:化 +W0x00000034:枚 +W0x00000037:的 +W0x0000003C:そ +W0x0000003E:君 +W0x00000040:州 +W0x00000048:僕 +W0x00000057:そ +W0x00000079:も +W0x0000007A:や +W0x0000007C:ぞ +W0x00000086:と +W0x0000008F:の +W0x0000009B:  +W0x0000009D:? +W0x0000009E:! +W0x0000009F:¥ +W0x000000A0:( +W0x000000A5:) +W0x000000A8:ぁ +W0x000000A9:ァ +W0x00000023:VS +W0x0000003B:% +W0x00000098:. +W0x0000009A:, +W0x0000009C: +W0x000000A2:( +W0x000000A3:< +W0x000000A6:) +W0x000000A7:> + +M0xFFFF0000:未定義 +M0xFFFF0001:肯定 +M0xFFFF0002:否定 +M0xFFFF0003:定義 + +W0xFFFF1000:: +W0xFFFF1001:。 +W0xFFFF1002:、 +W0xFFFF1003:私 +W0xFFFF1004:これ +W0xFFFF1005:それ +W0xFFFF1006:あれ +W0xFFFF1007:どれ +W0xFFFF1008:です +W0xFFFF1009:は + +E0xFFFF2000:*,0xFFFF1009,*,0xFFFF1008,0xFFFF1001:0xFFFF0003 + diff --git a/CHNOSProject/AI002/AI002/separate.c b/CHNOSProject/AI002/AI002/separate.c new file mode 100644 index 0000000..169305f --- /dev/null +++ b/CHNOSProject/AI002/AI002/separate.c @@ -0,0 +1,73 @@ +// +// separate.c +// AI002 +// +// Created by 西田 耀 on 13/01/01. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#include "core.h" + +int AI_Array_GetSeparatedStringByArray(AI_Array **separated, AI_Array *list, const char s[]) +{ + int index, end, location; + + if(s == NULL){ + debug("s null\n", NULL); + return 1; + } + + end = 0; + for(;;){ + index = AI_String_SearchLocationFromArray(&s[end], list, &location); + if(index == AI_ARRAY_INDEX_NOTFOUND){ + //もうリストの文字列はない + if(s[end] != '\0'){ + //でもまだ文字列は残っている + AI_Array_AppendLast(separated, AI_DATAID_NULL, AI_String_ExtractByLength(&s[end], 0, AI_MAX_STRINGLENGTH)); + } + break; + } + //リストの文字列が見つかった + if(location != 0){ + //リストの文字列の前に、リストにない文字列がある + AI_Array_AppendLast(separated, AI_DATAID_NULL, AI_String_ExtractByLength(&s[end], 0, location)); + end += location; + } + AI_Array_AppendLast(separated, AI_Array_GetDataIDByIndex(list, index), AI_String_ExtractByLength((char *)AI_Array_GetPointerByIndex(list, index), 0, AI_MAX_STRINGLENGTH)); + end += AI_String_GetLength(AI_Array_GetPointerByIndex(list, index)); + } + return 0; +} + +int AI_Array_GetSeparatedStringByArrayWithoutListWord(AI_Array **separated, AI_Array *list, const char s[]) +{ + int index, end, location; + + if(s == NULL){ + debug("s null\n", NULL); + return 1; + } + + end = 0; + for(;;){ + index = AI_String_SearchLocationFromArray(&s[end], list, &location); + if(index == AI_ARRAY_INDEX_NOTFOUND){ + //もうリストの文字列はない + if(s[end] != '\0'){ + //でもまだ文字列は残っている + AI_Array_AppendLast(separated, AI_DATAID_NULL, AI_String_ExtractByLength(&s[end], 0, AI_MAX_STRINGLENGTH)); + } + break; + } + //リストの文字列が見つかった + if(location != 0){ + //リストの文字列の前に、リストにない文字列がある + AI_Array_AppendLast(separated, AI_DATAID_NULL, AI_String_ExtractByLength(&s[end], 0, location)); + end += location; + } + //AI_Array_AppendLast(separated, AI_Array_GetDataNumberByIndex(list, index), AI_String_ExtractByLength((char *)AI_Array_GetPointerByIndex(list, index), 0, AI_MAX_STRINGLENGTH)); + end += AI_String_GetLength(AI_Array_GetPointerByIndex(list, index)); + } + return 0; +} diff --git a/CHNOSProject/AI002/AI002/string.c b/CHNOSProject/AI002/AI002/string.c new file mode 100644 index 0000000..0309220 --- /dev/null +++ b/CHNOSProject/AI002/AI002/string.c @@ -0,0 +1,153 @@ +// +// string.c +// AI002 +// +// Created by 西田 耀 on 13/01/01. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#include "core.h" + +void AI_String_DeleteCRLF(char s[]) +{ + //末尾のLF, CR/LFを\0に置換する + int i, crlf; + + crlf = -1; + for(i = 0; s[i] != '\0'; i++){ + if(s[i] == '\n'){ + if(crlf == -1 || crlf + 1 != i){ + crlf = i; + } + } + if(s[i] == '\r'){ + if(crlf == -1 || crlf + 1 != i){ + crlf = i; + } + } + } + if(crlf != -1){ + for(i = crlf; s[i] != '\0'; i++){ + s[i] = '\0'; + } + } + return; +} + +char *AI_String_ExtractByLength(const char s[], int start, int len) +{ + //s[start]からs[start + len - 1]の文字を含む文字列を、新たにメモリを確保して書き込み、その先頭アドレスを返す。 + //lenに満たずにsが終端文字を迎えた場合は、sの終端文字直前までの文字列がコピーされる。 + char *str; + int i; + + if(s == NULL){ + AI_SpeakError("Null s[]\n", NULL); + return NULL; + } + + i = AI_String_GetLength(s) + 1; + + if(i > (len + 1)){ + i = len + 1; + } + + str = malloc(i); + + if(str == NULL){ + AI_SpeakError("Allocation error.", NULL); + exit(EXIT_FAILURE); + } + + for(i = 0; s[i + start] != '\0'; i++){ + if(len <= 0){ + break; + } + len--; + str[i] = s[i + start]; + } + str[i] = '\0'; + + return str; +} + +int AI_String_GetLength(const char s[]) +{ + //終端文字を含めない時の、文字列のバイト数を返す。 + int i; + + for(i = 0; s[i] != 0x00; i++){ + + } + + return i; +} + +int AI_String_CompareString(const char s[], const char search[]) +{ + //s[]の先頭からsearch[]と比較し、searchの終端まで一致したらTrue, 一致しなかったらFalseを返す。 + //終端文字'\0'はカウントしない。 + //search[]に含まれる文字(終端文字除く)がすべて入っていれば一致とみなす。 + int i; + + if(s == NULL || search == NULL){ + debug("Null str.\n", NULL); + return False; + } + + for(i = 0; search[i] != '\0'; i++){ + if(s[i] != search[i]){ + return False; + } + } + return True; +} + +int AI_String_CompareString_Strict(const char s[], const char search[]) +{ + //二つの文字列が終端文字までを含めて完全に一致するかどうか調べる。一致していればTrueを返す。 + int i; + + if(s == NULL || search == NULL){ + debug("Null str.\n", NULL); + return False; + } + + for(i = 0; search[i] != '\0'; i++){ + if(s[i] != search[i]){ + return False; + } + } + if(s[i] != '\0'){ + return False; + } + return True; +} + +int AI_String_SearchLocationFromArray(const char s[], AI_Array *start, int *location) +{ + //s[]に含まれている中で最も左側にあるArrayの文字列((char *)pointer)のArrayにおける添字と、その文字列が開始する場所を返す。 + //locaton!=NULLの時、*locationに、発見された文字列の最初のバイトのsにおける添字が代入される。 + //Arrayの文字列がすべて見つからなかった場合、AI_ARRAY_INDEX_NOTFOUNDを返す。そのときの*locatonには0が代入される。 + int i, j, j_max; + + j_max = AI_Array_GetNumberOfTags(start); + for(i = 0; s[i] != '\0'; i++){ + for(j = 0; j < j_max; j++){ + if(AI_String_CompareString(&s[i], (char *)AI_Array_GetPointerByIndex(start, j))){ + if(location != NULL){ + *location = i; + } + return j; + } + + } + } + if(location != NULL){ + *location = 0; + } + return AI_ARRAY_INDEX_NOTFOUND; +} + + + diff --git a/CHNOSProject/AI002/AI002/sysdata.h b/CHNOSProject/AI002/AI002/sysdata.h new file mode 100644 index 0000000..5b53879 --- /dev/null +++ b/CHNOSProject/AI002/AI002/sysdata.h @@ -0,0 +1,31 @@ +// +// sysdata.h +// AI002 +// +// Created by 西田 耀 on 13/01/02. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#ifndef AI002_sysdata_h +#define AI002_sysdata_h + +#define AI_SYSDATAID_M_NULL 0xFFFF0000 +#define AI_SYSDATAID_M_AFFIRM 0xFFFF0001 +#define AI_SYSDATAID_M_DENY 0xFFFF0002 +#define AI_SYSDATAID_M_DEFINE 0xFFFF0003 + +#define AI_SYSDATAID_W_COLON 0xFFFF1000 +#define AI_SYSDATAID_W_KUTEN 0xFFFF1001 +#define AI_SYSDATAID_W_TOUTEN 0xFFFF1002 +#define AI_SYSDATAID_W_WATASI 0xFFFF1003 +#define AI_SYSDATAID_W_KORE 0xFFFF1004 +#define AI_SYSDATAID_W_SORE 0xFFFF1005 +#define AI_SYSDATAID_W_ARE 0xFFFF1006 +#define AI_SYSDATAID_W_DORE 0xFFFF1007 +#define AI_SYSDATAID_W_DESU 0xFFFF1008 +#define AI_SYSDATAID_W_HA 0xFFFF1009 + + + + +#endif diff --git a/CHNOSProject/AI002/AI002/think.c b/CHNOSProject/AI002/AI002/think.c new file mode 100644 index 0000000..b4b2ff4 --- /dev/null +++ b/CHNOSProject/AI002/AI002/think.c @@ -0,0 +1,88 @@ +// +// think.c +// AI002 +// +// Created by 西田 耀 on 13/01/01. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#include "core.h" + +void AI_ThinkMain(void) +{ + char line[AI_MAX_STRINGLENGTH]; + int i, j, k; + AI_Array *separated, *meanlist; + int passthink; + + line[0] = '\0'; + separated = AI_Array_Initialize(); + + + for(;;){ + passthink = False; + AI_ReadInput(line, sizeof(line), stdin); + + if(line[0] == ':' && line[1] == ':'){ + //システムコマンド解釈 + passthink = True; + AI_Array_GetSeparatedStringByArray(&separated, &AI_SystemStringList, &line[2]); + if(AI_String_CompareString_Strict((const char *)AI_Array_GetPointerByIndex(separated, 0), "info")){ + AI_Command_System_info(separated); + } else if(AI_String_CompareString_Strict((const char *)AI_Array_GetPointerByIndex(separated, 0), "setmode")){ + AI_Command_System_setmode(separated); + } else if(AI_String_CompareString_Strict((const char *)AI_Array_GetPointerByIndex(separated, 0), "exit")){ + return; + } else if(AI_String_CompareString_Strict((const char *)AI_Array_GetPointerByIndex(separated, 0), "save")){ + AI_Memory_SaveMemory((const char *)AI_Array_GetPointerByIndex(separated, 2)); + } else{ + passthink = False; + } + AI_Array_FreePointer(separated); + AI_Array_Free(&separated); + } + if(!passthink){ + AI_Think_GetSeparatedStringByMemory(&separated, line); + switch(AI_MainMemory.mode){ + case 0: + AI_Speak("mode 0\nInput:"); + j = AI_Array_GetNumberOfTags(separated); + for(i = 0; i < j; i++){ + printf("%s(0x%08X) ", AI_Array_GetPointerByIndex(separated, i), AI_Array_GetDataIDByIndex(separated, i)); + } + printf("\n"); + meanlist = AI_Memory_Expression_GetMeanFromSeparatedString(separated); + if(AI_Array_GetIndexByDataID(meanlist, AI_SYSDATAID_M_DEFINE) != AI_ARRAY_INDEX_NOTFOUND){ + AI_Speak("OK.\n"); + } else{ + AI_Speak("BAD.\n"); + } + AI_Array_Free(&meanlist); + break; + case 1: + k = (AI_String_GetLength(line) % 10) + 1; + AI_Speak(""); + for(j = 0; j < k; j++){ + i = rand() % AI_Array_GetNumberOfTags(AI_MainMemory.list_word); + printf("%s ", AI_Array_GetPointerByIndex(AI_MainMemory.list_word, i)); + } + printf("\n"); + break; + default: + AI_Speak("default\n"); + break; + } + AI_Array_FreePointer(separated); + AI_Array_Free(&separated); + } + } + + return; +} + +int AI_Think_GetSeparatedStringByMemory(AI_Array **separated, const char s[]) +{ + return AI_Array_GetSeparatedStringByArray(separated, AI_MainMemory.list_word, s); +} + + diff --git a/CHNOSProject/AI003/AI003/core.h b/CHNOSProject/AI003/AI003/core.h new file mode 100755 index 0000000..ce4b954 --- /dev/null +++ b/CHNOSProject/AI003/AI003/core.h @@ -0,0 +1,31 @@ +// +// core.h +// AI003 +// +// Created by 西田 耀 on 13/01/28. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#ifndef AI003_core_h +#define AI003_core_h + +#include "chnlib.h" + +#define AI_CONFIG_FILE_NAME "config.txt" + +typedef struct AI_WORKING_SET AI_WorkingSet; +struct AI_WORKING_SET { + CHNLIB_UIPArray *SystemWordList0; + CHNLIB_UIPArray *RootWordList; + CHNLIB_UIPArray *InputHistory; +}; + +//@main.c +extern AI_WorkingSet WorkingSet; +CHNLIB_UIPArray *AI_Think_SlideLookUpWordByHistory(CHNLIB_String *input); +void AI_Memory_AddRootWordData(CHNLIB_String *tag); +int AI_Memory_AddRootWordData_IsDuplicated(const void *listtag, const void *newtag); +void AI_System_InitializeSystemWorkingSet(void); +void AI_System_LoadMemory(const char configfilename[]); + +#endif diff --git a/CHNOSProject/AI003/AI003/main.c b/CHNOSProject/AI003/AI003/main.c new file mode 100755 index 0000000..e75a4e6 --- /dev/null +++ b/CHNOSProject/AI003/AI003/main.c @@ -0,0 +1,204 @@ +// +// main.c +// AI003 +// +// Created by 西田 耀 on 13/01/28. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +// +//Include headers +// + +#include +#include "core.h" + +// +//Define static values +// + +AI_WorkingSet WorkingSet; + +int main(int argc, const char * argv[]) +{ + int i, i_max; + CHNLIB_String *input, *temp; + CHNLIB_UIPArray *separated; + int passthink; + + CHNLIB_Environment_SetCurrentWorkingDirectory(argv[0]); + + CHNLIB_Debug("Hello, World.", __FILE__, __LINE__, __FUNCTION__); + + AI_System_InitializeSystemWorkingSet(); + + AI_System_LoadMemory(AI_CONFIG_FILE_NAME); + + for(;;){ + passthink = False; + input = CHNLIB_ReadLine(stdin); + + if(CHNLIB_String_CompareStringWithCString(input, "::")){ + //システムコマンド解釈 + passthink = True; + separated = CHNLIB_UIPArray_Initialize(); + CHNLIB_UIPArray_GetSeparatedStringByUIPArray(&separated, WorkingSet.SystemWordList0, input); + + temp = CHNLIB_UIPArray_GetPointerByIndex(separated, 2); + if(temp != NULL){ + if(CHNLIB_String_CompareStringWithCString(temp, "info")){ + printf("AI internal information:\n"); + } else if(CHNLIB_String_CompareStringWithCString(temp, "exit")){ + break; + } else if(CHNLIB_String_CompareStringWithCString(temp, "wordlist")){ + i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList); + for(i = 0; i < i_max; i++){ + printf("word%3d:%s\n", i, CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.RootWordList, i))); + } + } else{ + passthink = False; + } + } + + CHNLIB_UIPArray_FreeSelectedAll(&separated); + } + + if(!passthink){ + //AIへの入力 + separated = CHNLIB_UIPArray_Initialize(); + separated = AI_Think_SlideLookUpWordByHistory(input); + i_max = CHNLIB_UIPArray_GetNumberOfDatas(separated); + printf("Index(Decimal),CountOfContain(Decimal), String\n"); + for(i = 0; i < i_max; i++){ + printf("%d,%d,%s\n", i, CHNLIB_UIPArray_GetData32ByIndex(separated, i), CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, i))); + } + CHNLIB_UIPArray_FreeAll(&separated); + CHNLIB_UIPArray_AppendLast(&WorkingSet.InputHistory, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory), input); + } + } + + return 0; +} + +CHNLIB_UIPArray *AI_Think_SlideLookUpWordByHistory(CHNLIB_String *input) +{ + CHNLIB_UIPArray *candidatewordlist; + int i, i_max; + int j, j_max; + int k, k_max; + int candidatelength, templength; + const char *cstr_input, *cstr_history; + + candidatewordlist = CHNLIB_UIPArray_Initialize(); + + i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory); + + cstr_input = CHNLIB_String_GetReferencePointerOfCString(input); + k_max = CHNLIB_CString_GetLength(cstr_input); + + for(k = 0; k < k_max; k++){ + //**UTF-8 only + //UTF-8のマルチバイト部分でないことを確認 + if(CHNLIB_UTF8_GetCharacterType(cstr_input[k]) != 0){ + //**** + candidatelength = 0; + for(i = 0; i < i_max; i++){ + cstr_history = CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.InputHistory, i)); + j_max = CHNLIB_CString_GetLength(cstr_history); + for(j = 0; j < j_max; j++){ + templength = CHNLIB_CString_CompareString_LeftHand(&cstr_history[j], &cstr_input[k]); + if(templength > candidatelength && templength != (k_max - k)){ + //前方一致の長さが、 + //これまで見つかった単語よりも長く、かつ + //入力文字列の検索部分の全長ではない場合、 + //単語の候補とする。 + candidatelength = templength; + } + } + } + if(candidatelength > 0){ + //AI_Memory_AddRootWordData(CHNLIB_String_ExtractByLength(input, k, candidatelength)); + CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&candidatewordlist, 0, CHNLIB_String_ExtractByLength(input, k, candidatelength), &AI_Memory_AddRootWordData_IsDuplicated); + } + } + } + + //各候補単語が入力文字列にいくつ含まれているかをdata32に保存する。 + i_max = CHNLIB_UIPArray_GetNumberOfDatas(candidatewordlist); + for(i = 0; i < i_max; i++){ + CHNLIB_UIPArray_SetData32ByIndex(candidatewordlist, i, CHNLIB_String_GetCountOfContain(input, CHNLIB_UIPArray_GetPointerByIndex(candidatewordlist, i))); + } + + return candidatewordlist; +} + +void AI_Memory_AddRootWordData(CHNLIB_String *tag) +{ + int i, i_max; + + i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList); + for(i = 0; i < i_max; i++){ + if(CHNLIB_String_CompareString_Strict(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.RootWordList, i), tag)){ + CHNLIB_ReportError("Word[%s] has already existed.", __FILE__, __LINE__, __FUNCTION__, CHNLIB_String_GetReferencePointerOfCString(tag)); + return; + } + } + + CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i_max, tag); + + CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&WorkingSet.RootWordList, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList), tag, &AI_Memory_AddRootWordData_IsDuplicated); + + return; +} + +int AI_Memory_AddRootWordData_IsDuplicated(const void *listtag, const void *newtag) +{ + if(CHNLIB_StructureHeader_GetTypeID(listtag) != CHNLIB_STRUCT_ID_String){ + return False; + } + if(CHNLIB_String_CompareString_Strict(listtag, newtag)){ + CHNLIB_ReportError("Word[%s] has already existed.", __FILE__, __LINE__, __FUNCTION__, CHNLIB_String_GetReferencePointerOfCString(newtag)); + return True; + } + return False; +} + +void AI_System_InitializeSystemWorkingSet(void) +{ + WorkingSet.SystemWordList0 = CHNLIB_UIPArray_Initialize(); + CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, 0, CHNLIB_String_Initialize(":")); + CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, 0, CHNLIB_String_Initialize(",")); + + WorkingSet.InputHistory = CHNLIB_UIPArray_Initialize(); + + return; +} + +void AI_System_LoadMemory(const char configfilename[]) +{ + FILE *fp; + CHNLIB_String *line, *currentfilename; + int i; + + fp = fopen(configfilename, "rb"); + currentfilename = CHNLIB_ReadLine(fp); + fclose(fp); + + fp = fopen(CHNLIB_String_GetReferencePointerOfCString(currentfilename), "rb"); + + WorkingSet.RootWordList = CHNLIB_UIPArray_Initialize(); + for(i = 1; ;i++){ + line = CHNLIB_ReadLine(fp); + if(line == NULL){ + break; + } + CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i, line); + //CHNLIB_String_Free(line);リストに登録している実体なので解放の必要なし! + } + fclose(fp); + CHNLIB_String_Free(currentfilename); + + //CHNLIB_Debug_PrintStructureData(WorkingSet.RootWordList, 0); + + return; +} diff --git a/CHNOSProject/c2wiki/c2wiki/main.c b/CHNOSProject/c2wiki/c2wiki/main.c new file mode 100644 index 0000000..5a97057 --- /dev/null +++ b/CHNOSProject/c2wiki/c2wiki/main.c @@ -0,0 +1,59 @@ +// +// main.c +// c2wiki +// +// Created by 西田 耀 on 13/02/24. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#include +#include "chnlib.h" + +int main(int argc, const char * argv[]) +{ + FILE *fp; + CHNLIB_String *line; + CHNLIB_UIPArray *root, *wordlist; + int i, i_max; + + CHNLIB_Environment_SetCurrentWorkingDirectory(argv[0]); + + if(argc < 2){ + printf("Usage: c2wiki csourcefile\n"); + return 0; + } + + fp = fopen(argv[1], "rb"); + if(fp == NULL){ + printf("fopen error. Abort.\n"); + return 1; + } + + wordlist = CHNLIB_UIPArray_Initialize(); + CHNLIB_UIPArray_AppendLast(&wordlist, 1, CHNLIB_String_Initialize("{")); + CHNLIB_UIPArray_AppendLast(&wordlist, 2, CHNLIB_String_Initialize("}")); + //CHNLIB_UIPArray_AppendLast(&wordlist, 1, CHNLIB_String_Initialize("")); + + root = CHNLIB_UIPArray_Initialize(); + for(;;){ + line = CHNLIB_ReadLine(fp); + if(line == NULL){ + break; + } + CHNLIB_UIPArray_GetSeparatedStringByUIPArray(&root, wordlist, line); + } + + fclose(fp); + + i_max = CHNLIB_UIPArray_GetNumberOfDatas(root); + fp = fopen("out.txt", "wb"); + + for(i = 0; i < i_max; i++){ + + } + + fclose(fp); + + return 0; +} + diff --git a/CHNOSProject/chn/chnlib.c b/CHNOSProject/chn/chnlib.c new file mode 100755 index 0000000..1b96da3 --- /dev/null +++ b/CHNOSProject/chn/chnlib.c @@ -0,0 +1,210 @@ +// +// chnlib.c +// AI003 +// +// Created by 西田 耀 on 13/01/28. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +// +//Include headers +// + +#include +#include +#include +#include + +#include "chnlib.h" + +// +//Define static values +// +int CHNLIB_Debug_PrintStructureData_RecursiveCounter; + +// +//Declare internal functions +// +const char *CHNLIB_Debug_Internal_GetStructTypeNameByID(uint typeid); +void CHNLIB_Debug_Internal_PrintStructureDataSub(void *structure, uint level); +void CHNLIB_Debug_Internal_PrintIndent(int level); + +// +//Define types +// + +// +//Functions +// + +void CHNLIB_Debug(const char format[], const char filename[], int line, const char funcname[], ...) +{ + char s[CHNLIB_MAX_STRING_LENGTH]; + va_list varg; + + fprintf(stdout, "CHNLIB:Debug:%s@%s:%d:", funcname, filename, line); + + va_start(varg, funcname); + vsnprintf(s, sizeof(s), format, varg); + va_end(varg); + + fputs(s, stdout); + fputs("\n", stdout); + + fflush(stdout); + + return; +} + +void CHNLIB_Debug_PrintStructureData(void *structure, uint level) +{ + //level == 0:全階層 + //level >= 1:level階層まで + + CHNLIB_Debug_PrintStructureData_RecursiveCounter = level - 1; + + CHNLIB_Debug_Internal_PrintStructureDataSub(structure, 0); + + return; +} + +void CHNLIB_ReportError(const char format[], const char filename[], int line, const char funcname[], ...) +{ + char s[CHNLIB_MAX_STRING_LENGTH]; + va_list varg; + + fprintf(stderr, "CHNLIB:Error:%s@%s:%d:", funcname, filename, line); + + va_start(varg, funcname); + vsnprintf(s, sizeof(s), format, varg); + va_end(varg); + + fputs(s, stderr); + fputs("\n", stderr); + + return; +} + +void CHNLIB_StructureHeader_Initialize(CHNLIB_StructureHeader *header, uint typeid) +{ + if(header == NULL){ + CHNLIB_ReportError("Null structure.", __FILE__, __LINE__, __FUNCTION__); + return; + } + + header->signature = CHNLIB_STRUCTURE_SIGNATURE; + header->typeid = typeid; + return; +} + +uint CHNLIB_StructureHeader_GetTypeID(const void *structure) +{ + CHNLIB_StructureHeader *strhead; + + if(structure == NULL){ + return CHNLIB_STRUCT_ID_Null; + } + + strhead = (CHNLIB_StructureHeader *)structure; + if(strhead->signature == CHNLIB_STRUCTURE_SIGNATURE){ + return strhead->typeid; + } + return CHNLIB_STRUCT_ID_Null; +} + +void *CHNLIB_System_AllocateMemory_Strict(int size, const char filename[], int line, const char funcname[]) +{ + void *p; + + p = malloc(size); + if(p == NULL){ + CHNLIB_ReportError("An attempt to allocate memory %d bytes in %s@%s:%d: is failed. Abort.", __FILE__, __LINE__, __FUNCTION__, size, filename, line, funcname); + exit(EXIT_FAILURE); + } + +#ifdef DEBUG_MEMORY_ALLOCATION + CHNLIB_Debug("Request allocation %d bytes ->[%p].", __FILE__, __LINE__, __FUNCTION__, size, p); +#endif + + memset(p, 0, size); + + return p; +} + +void CHNLIB_System_FreeMemory(void *p, const char filename[], int line, const char funcname[]) +{ + if(p == NULL){ + CHNLIB_ReportError("An attempt to free NULL memory in %s@%s:%d:. Ignore.", __FILE__, __LINE__, __FUNCTION__, filename, line, funcname); + return; + } + +#ifdef DEBUG_MEMORY_ALLOCATION + CHNLIB_Debug("Request ƒree memory [%p].", __FILE__, __LINE__, __FUNCTION__, p); +#endif + + free(p); + + return; + +} + +// +//Internal functions +// + +const char *CHNLIB_Debug_Internal_GetStructTypeNameByID(uint typeid) +{ + switch(typeid){ + case CHNLIB_STRUCT_ID_Null: + return "Null"; + case CHNLIB_STRUCT_ID_UIPArray: + return "UIPArray"; + case CHNLIB_STRUCT_ID_String: + return "String"; + } + return "Unknown"; +} + +void CHNLIB_Debug_Internal_PrintStructureDataSub(void *structure, uint level) +{ + int typeid, i, j; + void *p; + + typeid = CHNLIB_StructureHeader_GetTypeID(structure); + + switch(typeid){ + case CHNLIB_STRUCT_ID_UIPArray: + i = CHNLIB_UIPArray_GetNumberOfDatas(structure); + CHNLIB_Debug_Internal_PrintIndent(level); + CHNLIB_Debug("%s[%p]:Number of datas=%d", "", 0, "", CHNLIB_Debug_Internal_GetStructTypeNameByID(typeid), structure, i); + for(j = 0; j < i; j++){ + p = CHNLIB_UIPArray_GetPointerByIndex(structure, j); + CHNLIB_Debug_Internal_PrintIndent(level); + CHNLIB_Debug("%s[%p]:[%d]=(%d,[%p])", "", 0, "", CHNLIB_Debug_Internal_GetStructTypeNameByID(typeid), structure, j, CHNLIB_UIPArray_GetData32ByIndex(structure, j), p); + if(CHNLIB_Debug_PrintStructureData_RecursiveCounter != 0){ + CHNLIB_Debug_Internal_PrintStructureDataSub(p, level + 1); + } + } + break; + case CHNLIB_STRUCT_ID_String: + CHNLIB_Debug_Internal_PrintIndent(level); + CHNLIB_Debug("%s[%p]:[%s]", "", 0, "", CHNLIB_Debug_Internal_GetStructTypeNameByID(typeid), structure, CHNLIB_String_GetReferencePointerOfCString(structure)); + break; + default: + CHNLIB_Debug_Internal_PrintIndent(level); + CHNLIB_Debug("%s[%p]:NULL structure or not implemented.", "", 0, "", CHNLIB_Debug_Internal_GetStructTypeNameByID(typeid), structure); + break; + } + return; +} + +void CHNLIB_Debug_Internal_PrintIndent(int level) +{ + int i; + + for(i = 0; i < level; i++){ + fputs(" ", stdout); + } + + return; +} diff --git a/CHNOSProject/chn/chnlib.h b/CHNOSProject/chn/chnlib.h new file mode 100755 index 0000000..27fdf28 --- /dev/null +++ b/CHNOSProject/chn/chnlib.h @@ -0,0 +1,124 @@ +// +// chnlib.h +// AI003 +// +// Created by 西田 耀 on 13/01/28. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +#ifndef AI003_chnlib_h +#define AI003_chnlib_h + +// +//Set compile environment +// + +#define CHNLIB_MAKE_GCC_MAC +//#define CHNLIB_MAKE_BCC_WIN + +#ifdef CHNLIB_MAKE_BCC_WIN +#define DEBUG +#ifndef __FUNCTION__ +#define __FUNCTION__ "Unknown" +#endif +#endif + +#ifdef DEBUG +//#define DEBUG_MEMORY_ALLOCATION +#endif + +// +//Define types +// + +typedef unsigned char uchar; +typedef unsigned short ushort; +typedef unsigned int uint; + +typedef struct CHNLIB_STRUCTURE_HEADER CHNLIB_StructureHeader; +struct CHNLIB_STRUCTURE_HEADER { + uint signature; + uint typeid; +}; + +// +//Define library values +// + +#define CHNLIB_STRUCTURE_SIGNATURE ((uint)0x43484E4C) //"CHNL" + +#define False 0 +#define True 1 + +#define CHNLIB_STRUCT_ID_Null 0 +#define CHNLIB_STRUCT_ID_UIPArray 1 +#define CHNLIB_STRUCT_ID_String 2 + +#define CHNLIB_MAX_STRING_LENGTH 4096 + +#define CHNLIB_UIPArray_INDEX_NOTFOUND -1 + +// +//Declare library functions +// +//@chnlib.c +void CHNLIB_Debug(const char format[], const char filename[], int line, const char funcname[], ...); +void CHNLIB_Debug_PrintStructureData(void *structure, uint level); +void CHNLIB_ReportError(const char format[], const char filename[], int line, const char funcname[], ...); //("", __FILE__, __LINE__, __FUNCTION__); +void CHNLIB_StructureHeader_Initialize(CHNLIB_StructureHeader *header, uint typeid); +uint CHNLIB_StructureHeader_GetTypeID(const void *structure); +void *CHNLIB_System_AllocateMemory_Strict(int size, const char filename[], int line, const char funcname[]); +void CHNLIB_System_FreeMemory(void *p, const char filename[], int line, const char funcname[]); + +//@chnlib00.c +typedef struct CHNLIB_UIPARRAY CHNLIB_UIPArray; +struct CHNLIB_UIP_ARRAY; +CHNLIB_UIPArray *CHNLIB_UIPArray_Initialize(void); +int CHNLIB_UIPArray_AppendLast(CHNLIB_UIPArray **array, uint data32, void *pointer); +int CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(CHNLIB_UIPArray **array, uint data32, void *pointer, int (*IsDuplicated)(const void *listtag, const void *newtag)); +void CHNLIB_UIPArray_FreeOnlyArray(CHNLIB_UIPArray **array); +void CHNLIB_UIPArray_FreeOnlyAllPointer(CHNLIB_UIPArray *array); +void CHNLIB_UIPArray_FreeOnlySelectedPointer(CHNLIB_UIPArray *array); +void CHNLIB_UIPArray_FreeAll(CHNLIB_UIPArray **array); +void CHNLIB_UIPArray_FreeSelectedAll(CHNLIB_UIPArray **array); +int CHNLIB_UIPArray_GetNumberOfDatas(const CHNLIB_UIPArray *array); +uint CHNLIB_UIPArray_GetData32ByIndex(const CHNLIB_UIPArray *array, int index); +uint CHNLIB_UIPArray_SetData32ByIndex(CHNLIB_UIPArray *array, int index, uint data32); +void *CHNLIB_UIPArray_GetPointerByIndex(const CHNLIB_UIPArray *array, int index); +int CHNLIB_UIPArray_GetIndexByData32(const CHNLIB_UIPArray *array, uint data32); +void *CHNLIB_UIPArray_GetPointerByData32(const CHNLIB_UIPArray *array, uint data32); + +//@chnlib01.c +typedef struct CHNLIB_STRING CHNLIB_String; +struct CHNLIB_STRING; +CHNLIB_String *CHNLIB_String_Initialize(const char str[]); +void CHNLIB_String_Free(CHNLIB_String *strtag); +int CHNLIB_String_SetStringFromCString(CHNLIB_String *strtag, const char s[]); +int CHNLIB_String_Print(CHNLIB_String *strtag); +const char *CHNLIB_String_GetReferencePointerOfCString(const CHNLIB_String *strtag); +CHNLIB_String *CHNLIB_String_ExtractByLength(const CHNLIB_String *strtag, int start, int len); +int CHNLIB_String_GetLength(const CHNLIB_String *strtag); +void CHNLIB_String_DeleteLastCRLF(CHNLIB_String *strtag); +int CHNLIB_String_CompareStringWithCString(const CHNLIB_String *s, const char search[]); +int CHNLIB_String_CompareString_Strict(const CHNLIB_String *s, const CHNLIB_String *search); +uint CHNLIB_String_GetCountOfContain(const CHNLIB_String *s, const CHNLIB_String *search); +//-- +int CHNLIB_CString_GetLength(const char s[]); +void CHNLIB_CString_DeleteLastCRLF(char s[]); +char *CHNLIB_CString_ExtractByLength(const char s[], int start, int len); +int CHNLIB_CString_CompareString(const char s[], const char search[]); +int CHNLIB_CString_CompareString_Strict(const char s[], const char search[]); +int CHNLIB_CString_CompareString_LeftHand(const char s[], const char search[]); +uint CHNLIB_CString_GetCountOfContain(const char s[], const char search[]); +//@chnlib02.c +int CHNLIB_String_Search_UIPArrayStringLocation(const CHNLIB_String *s, int s_start, const CHNLIB_UIPArray *list, int *location); +int CHNLIB_UIPArray_GetSeparatedStringByUIPArray(CHNLIB_UIPArray **separated, const CHNLIB_UIPArray *list, const CHNLIB_String *s); +CHNLIB_String *CHNLIB_ReadLine(FILE *fp); + +//@chnlib03.c +void CHNLIB_Environment_SetCurrentWorkingDirectory(const char apppath[]); + +//@chnlib05.c +int CHNLIB_UTF8_GetCharacterType(char c); + +#endif diff --git a/CHNOSProject/chn/chnlib00.c b/CHNOSProject/chn/chnlib00.c new file mode 100755 index 0000000..ee35e00 --- /dev/null +++ b/CHNOSProject/chn/chnlib00.c @@ -0,0 +1,251 @@ +// +// chnlib00.c +// AI003 +// +// Created by 西田 耀 on 13/01/28. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +// +//Include headers +// + +#include +#include +#include +#include "chnlib.h" + +// +//Define values +// +#define CHNLIB_UIPArray_INTERNAL_PACKDATAS 7 + +// +//Declare internal functions +// +CHNLIB_UIPArray *CHNLIB_UIPArray_Internal_Allocate(void); + +// +//Define types +// +typedef struct CHNLIB_UIPARRAY_INTERNAL_TAG CHNLIB_UIPArray_Internal_Tag; +struct CHNLIB_UIPARRAY_INTERNAL_TAG { + uint data32; + void *pointer; +}; + +struct CHNLIB_UIPARRAY { + CHNLIB_StructureHeader header; + + int using_tags; //Number of using tags in this pack. + CHNLIB_UIPArray_Internal_Tag tag[CHNLIB_UIPArray_INTERNAL_PACKDATAS]; + CHNLIB_UIPArray *next; +}; + +// +//Functions +// +CHNLIB_UIPArray *CHNLIB_UIPArray_Initialize(void) +{ + return NULL; +} + +int CHNLIB_UIPArray_AppendLast(CHNLIB_UIPArray **array, uint data32, void *pointer) +{ + int index; + + index = 0; + for(; *array != NULL && (*array)->using_tags == CHNLIB_UIPArray_INTERNAL_PACKDATAS; array = &((*array)->next)){ + index += CHNLIB_UIPArray_INTERNAL_PACKDATAS; + } + + if(*array == NULL){ + *array = CHNLIB_UIPArray_Internal_Allocate(); + } + (*array)->tag[(*array)->using_tags].data32 = data32; + (*array)->tag[(*array)->using_tags].pointer = pointer; + (*array)->using_tags++; + + return index + (*array)->using_tags - 1; +} + +int CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(CHNLIB_UIPArray **array, uint data32, void *pointer, int (*IsDuplicated)(const void *listtag, const void *newtag)) +{ + //戻り値:IsAdded(True/False) + //int (*IsDuplicated)(void *listtag, void *newtag)は、重複を確認する関数へのポインタ。 + //listtagにarrayのすべてのpointerを与え、すべてがFalseだった場合追加してFalseを返す。 + //Trueが返った時点で、追加をせずTrueを返す。 + int i, i_max; + + i_max = CHNLIB_UIPArray_GetNumberOfDatas(*array); + for(i = 0; i < i_max; i++){ + if(IsDuplicated(CHNLIB_UIPArray_GetPointerByIndex(*array, i), pointer)){ + return False; + } + } + + CHNLIB_UIPArray_AppendLast(array, data32, pointer); + + return True; +} + +void CHNLIB_UIPArray_FreeOnlyArray(CHNLIB_UIPArray **array) +{ + //ArrayそのものをFreeする。 + //Pointerの参照先については関知しない。 + CHNLIB_UIPArray *now, *next; + + now = *array; + *array = NULL; + + for(; now != NULL; ){ + next = now->next; + free(now); + now = next; + } + return; +} + +void CHNLIB_UIPArray_FreeOnlyAllPointer(CHNLIB_UIPArray *array) +{ + //Pointerの参照先をすべてFree. + //Array自体はFreeしない。 + int i; + + for(; array != NULL; array = array->next){ + for(i = 0; i < array->using_tags; i++){ + if(array->tag[i].pointer != NULL){ + free(array->tag[i].pointer); + array->tag[i].pointer = NULL; + } + } + } + return; +} + +void CHNLIB_UIPArray_FreeOnlySelectedPointer(CHNLIB_UIPArray *array) +{ + //Pointerの参照先で、data32==FalseのものをFree. + //Array自体はFreeしない。 + int i; + + for(; array != NULL; array = array->next){ + for(i = 0; i < array->using_tags; i++){ + if(array->tag[i].pointer != NULL && !array->tag[i].data32){ + free(array->tag[i].pointer); + array->tag[i].pointer = NULL; + } + } + } + return; +} + +void CHNLIB_UIPArray_FreeAll(CHNLIB_UIPArray **array) +{ + //Array及びすべてのPointerをFree. + CHNLIB_UIPArray_FreeOnlyAllPointer(*array); + CHNLIB_UIPArray_FreeOnlyArray(array); + return; +} + +void CHNLIB_UIPArray_FreeSelectedAll(CHNLIB_UIPArray **array) +{ + //Array及びdata32==TrueのPointerをFree. + CHNLIB_UIPArray_FreeOnlySelectedPointer(*array); + CHNLIB_UIPArray_FreeOnlyArray(array); + return; +} + +int CHNLIB_UIPArray_GetNumberOfDatas(const CHNLIB_UIPArray *array) +{ + int tags; + + tags = 0; + + for(; array != NULL; array = array->next){ + tags += array->using_tags; + } + return tags; +} + +uint CHNLIB_UIPArray_GetData32ByIndex(const CHNLIB_UIPArray *array, int index) +{ + for(; (index / CHNLIB_UIPArray_INTERNAL_PACKDATAS) > 0; index -= CHNLIB_UIPArray_INTERNAL_PACKDATAS){ + if(array == NULL){ + return 0; + } + array = array->next; + } + if(array == NULL){ + return 0; + } + return array->tag[index].data32; +} + +uint CHNLIB_UIPArray_SetData32ByIndex(CHNLIB_UIPArray *array, int index, uint data32) +{ + //retv = old data32 + + uint olddata; + + for(; (index / CHNLIB_UIPArray_INTERNAL_PACKDATAS) > 0; index -= CHNLIB_UIPArray_INTERNAL_PACKDATAS){ + if(array == NULL){ + return 0; + } + array = array->next; + } + if(array == NULL){ + return 0; + } + olddata = array->tag[index].data32; + array->tag[index].data32 = data32; + return olddata; +} + +void *CHNLIB_UIPArray_GetPointerByIndex(const CHNLIB_UIPArray *array, int index) +{ + for(; (index / CHNLIB_UIPArray_INTERNAL_PACKDATAS) > 0; index -= CHNLIB_UIPArray_INTERNAL_PACKDATAS){ + if(array == NULL){ + return NULL; + } + array = array->next; + } + if(array == NULL){ + return NULL; + } + return array->tag[index].pointer; +} + +int CHNLIB_UIPArray_GetIndexByData32(const CHNLIB_UIPArray *array, uint data32) +{ + int i, i_max; + + i_max = CHNLIB_UIPArray_GetNumberOfDatas(array); + for(i = 0; i < i_max; i++){ + if(CHNLIB_UIPArray_GetData32ByIndex(array, i) == data32){ + return i; + } + } + return CHNLIB_UIPArray_INDEX_NOTFOUND; +} + +void *CHNLIB_UIPArray_GetPointerByData32(const CHNLIB_UIPArray *array, uint data32) +{ + return CHNLIB_UIPArray_GetPointerByIndex(array, CHNLIB_UIPArray_GetIndexByData32(array, data32)); +} + +// +//Internal functions +// +CHNLIB_UIPArray *CHNLIB_UIPArray_Internal_Allocate(void) +{ + CHNLIB_UIPArray *tag; + + tag = (CHNLIB_UIPArray *)CHNLIB_System_AllocateMemory_Strict(sizeof(CHNLIB_UIPArray), __FILE__, __LINE__, __FUNCTION__); + + CHNLIB_StructureHeader_Initialize(&tag->header, CHNLIB_STRUCT_ID_UIPArray); + + return tag; + +} + diff --git a/CHNOSProject/chn/chnlib01.c b/CHNOSProject/chn/chnlib01.c new file mode 100644 index 0000000..db26f9e --- /dev/null +++ b/CHNOSProject/chn/chnlib01.c @@ -0,0 +1,349 @@ +// +// chnlib01.c +// AI003 +// +// Created by 西田 耀 on 13/02/03. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +// +//Include headers +// + +#include +#include +#include +#include "chnlib.h" + +// +//Define values +// + +// +//Declare internal functions +// + +CHNLIB_String *CHNLIB_String_Internal_Allocate(void); + +// +//Define types +// + +struct CHNLIB_STRING { + CHNLIB_StructureHeader header; + char *str; +}; + +// +//Functions(CHNLIB_String) +// + +CHNLIB_String *CHNLIB_String_Initialize(const char str[]) +{ + CHNLIB_String *strtag; + + strtag = CHNLIB_String_Internal_Allocate(); + + if(str != NULL){ + CHNLIB_String_SetStringFromCString(strtag, str); + } + return strtag; +} + +void CHNLIB_String_Free(CHNLIB_String *strtag) +{ + if(strtag == NULL){ + return; + } + + if(strtag->str != NULL){ + CHNLIB_System_FreeMemory(strtag->str, __FILE__, __LINE__, __FUNCTION__); + } + strtag->header.typeid = CHNLIB_STRUCT_ID_Null; + strtag->header.signature = 0; + CHNLIB_System_FreeMemory(strtag, __FILE__, __LINE__, __FUNCTION__); +} + +int CHNLIB_String_SetStringFromCString(CHNLIB_String *strtag, const char s[]) +{ + int i, size; + + if(strtag == NULL){ + return 0; + } + + size = CHNLIB_CString_GetLength(s) + 1; + if(strtag->str != NULL){ + CHNLIB_System_FreeMemory(strtag->str, __FILE__, __LINE__, __FUNCTION__); + } + strtag->str = CHNLIB_System_AllocateMemory_Strict(size, __FILE__, __LINE__, __FUNCTION__); + for(i = 0; i < size - 1; i++){ + strtag->str[i] = s[i]; + } + strtag->str[i] = '\0'; + return size; +} + +int CHNLIB_String_Print(CHNLIB_String *strtag) +{ + if(strtag == NULL){ + return 0; + } + if(strtag->str == NULL){ + return 0; + } + + return fputs(strtag->str, stdout); +} + +const char *CHNLIB_String_GetReferencePointerOfCString(const CHNLIB_String *strtag) +{ + if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){ + return NULL; + } + + return (const char *)strtag->str; +} + +CHNLIB_String *CHNLIB_String_ExtractByLength(const CHNLIB_String *strtag, int start, int len) +{ + char *retstr; + CHNLIB_String *retstrtag; + + retstr = CHNLIB_CString_ExtractByLength(strtag->str, start, len); + + if(retstr == NULL){ + return NULL; + } + + retstrtag = CHNLIB_String_Initialize(NULL); + retstrtag->str = retstr; + + return retstrtag; +} + +int CHNLIB_String_GetLength(const CHNLIB_String *strtag) +{ + if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){ + return 0; + } + + return CHNLIB_CString_GetLength(strtag->str); +} + +void CHNLIB_String_DeleteLastCRLF(CHNLIB_String *strtag) +{ + if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){ + return; + } + + CHNLIB_CString_DeleteLastCRLF(strtag->str); + + return; +} + +int CHNLIB_String_CompareStringWithCString(const CHNLIB_String *s, const char search[]) +{ + return CHNLIB_CString_CompareString(CHNLIB_String_GetReferencePointerOfCString(s), search); +} + +int CHNLIB_String_CompareString_Strict(const CHNLIB_String *s, const CHNLIB_String *search) +{ + return CHNLIB_CString_CompareString_Strict(CHNLIB_String_GetReferencePointerOfCString(s), CHNLIB_String_GetReferencePointerOfCString(search)); +} + +uint CHNLIB_String_GetCountOfContain(const CHNLIB_String *s, const CHNLIB_String *search) +{ + return CHNLIB_CString_GetCountOfContain(CHNLIB_String_GetReferencePointerOfCString(s), CHNLIB_String_GetReferencePointerOfCString(search)); +} + +// +//Functions(CString(char[])) +// + +int CHNLIB_CString_GetLength(const char s[]) +{ + //終端文字を含めない時の、文字列のバイト数を返す。 + int i; + + if(s == NULL){ + return 0; + } + + for(i = 0; s[i] != 0x00; i++){ + + } + + return i; +} + +void CHNLIB_CString_DeleteLastCRLF(char s[]) +{ + //末尾のLF, CR/LFを\0に置換する + int i, crlf; + + if(s == NULL){ + return; + } + + crlf = -1; + for(i = 0; s[i] != '\0'; i++){ + if(s[i] == '\n'){ + if(crlf == -1 || crlf + 1 != i){ + crlf = i; + } + } + if(s[i] == '\r'){ + if(crlf == -1 || crlf + 1 != i){ + crlf = i; + } + } + } + if(crlf != -1){ + for(i = crlf; s[i] != '\0'; i++){ + s[i] = '\0'; + } + } + return; +} + +char *CHNLIB_CString_ExtractByLength(const char s[], int start, int len) +{ + //s[start]からs[start + len - 1]の文字を含む文字列を、新たにメモリを確保して書き込み、その先頭アドレスを返す。 + //lenに満たずにsが終端文字を迎えた場合は、sの終端文字直前までの文字列がコピーされる。 + //(len < 0)のときは、NULLを返す。また、結果として(len < 0)となった時も同様にNULLを返す。 + char *str; + int i; + int utf8type; + + if(s == NULL){ + CHNLIB_ReportError("Null s[]\n", __FILE__, __LINE__, __FUNCTION__); + return NULL; + } + + i = CHNLIB_CString_GetLength(s) + 1; + + if(i > (len + 1)){ + i = len + 1; + } + + if(len == 0){ + return NULL; + } + + str = CHNLIB_System_AllocateMemory_Strict(i, __FILE__, __LINE__, __FUNCTION__); + + for(i = 0; s[i + start] != '\0'; i++){ + if(len <= 0){ + break; + } + //**UTF-8 + utf8type = CHNLIB_UTF8_GetCharacterType(s[i + start]); + if(len < utf8type){ + break; + } + //**** + len--; + str[i] = s[i + start]; + } + str[i] = '\0'; + + return str; +} + +int CHNLIB_CString_CompareString(const char s[], const char search[]) +{ + //s[]の先頭からsearch[]と比較し、searchの終端まで一致したらTrue, 一致しなかったらFalseを返す。 + //終端文字'\0'はカウントしない。 + //search[]に含まれる文字(終端文字除く)がすべて入っていれば一致とみなす。 + int i; + + if(s == NULL || search == NULL){ + CHNLIB_ReportError("Null str.\n", __FILE__, __LINE__, __FUNCTION__); + return False; + } + + for(i = 0; search[i] != '\0'; i++){ + if(s[i] != search[i]){ + return False; + } + } + return True; +} + +int CHNLIB_CString_CompareString_Strict(const char s[], const char search[]) +{ + //二つの文字列が終端文字までを含めて完全に一致するかどうか調べる。一致していればTrueを返す。 + //StrictよりExactの方が適する?<関数名 + int i; + + if(s == NULL || search == NULL){ + CHNLIB_ReportError("Null str.\n", __FILE__, __LINE__, __FUNCTION__); + return False; + } + + for(i = 0; search[i] != '\0'; i++){ + if(s[i] != search[i]){ + return False; + } + } + if(s[i] != '\0'){ + return False; + } + return True; +} + +int CHNLIB_CString_CompareString_LeftHand(const char s[], const char search[]) +{ + //二つの文字列がどの程度一致するか調べる。前方一致。 + //戻り値は、終端文字を除く、同一だったバイト数。 + int i; + + if(s == NULL || search == NULL){ + CHNLIB_ReportError("Null str.\n", __FILE__, __LINE__, __FUNCTION__); + return 0; + } + + for(i = 0; search[i] != '\0'; i++){ + if(s[i] != search[i]){ + break; + } + } + + return i; +} + +uint CHNLIB_CString_GetCountOfContain(const char s[], const char search[]) +{ + //[Not implemented] + uint count; + int i; + + if(s == NULL || search == NULL){ + CHNLIB_ReportError("Null str.\n", __FILE__, __LINE__, __FUNCTION__); + return 0; + } + + count = 0; + for(i = 0; s[i] != '\0'; i++){ + if(CHNLIB_CString_CompareString(&s[i], search)){ + count++; + } + } + return count; +} + +// +//Internal functions +// + +CHNLIB_String *CHNLIB_String_Internal_Allocate(void) +{ + CHNLIB_String *tag; + + tag = (CHNLIB_String *)CHNLIB_System_AllocateMemory_Strict(sizeof(CHNLIB_String), __FILE__, __LINE__, __FUNCTION__); + + CHNLIB_StructureHeader_Initialize(&tag->header, CHNLIB_STRUCT_ID_String); + + return tag; +} \ No newline at end of file diff --git a/CHNOSProject/chn/chnlib02.c b/CHNOSProject/chn/chnlib02.c new file mode 100644 index 0000000..f5b13b8 --- /dev/null +++ b/CHNOSProject/chn/chnlib02.c @@ -0,0 +1,109 @@ +// +// chnlib02.c +// AI003 +// +// Created by 西田 耀 on 13/02/09. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +// +//Include headers +// + +#include +#include "chnlib.h" + +// +//Functions +// + +int CHNLIB_String_Search_UIPArrayStringLocation(const CHNLIB_String *s, int s_start, const CHNLIB_UIPArray *list, int *location) +{ + //文字列&s[s_start]に含まれている中で最も左側にある、Array内のStringタグの文字列のArrayにおける添字と、その文字列が開始する、文字列&s[s_start]中の添字を返す。 + //locaton!=NULLの時、*locationに、発見された文字列の最初のバイトの&s[s_start]における添字が代入される。 + //Arrayの文字列がすべて見つからなかった場合、AI_ARRAY_INDEX_NOTFOUNDを返す。そのときの*locatonには0が代入される。 + int i, i_max, j, j_max; + CHNLIB_String *tag; + const char *cstr_s; + + if(s == NULL || list == NULL){ + if(location != NULL){ + *location = 0; + } + return CHNLIB_UIPArray_INDEX_NOTFOUND; + } + cstr_s = CHNLIB_String_GetReferencePointerOfCString(s); + i_max = CHNLIB_CString_GetLength(cstr_s); + + j_max = CHNLIB_UIPArray_GetNumberOfDatas(list); + for(i = s_start; i < i_max; i++){ + for(j = 0; j < j_max; j++){ + tag = (CHNLIB_String *)CHNLIB_UIPArray_GetPointerByIndex(list, j); + if(CHNLIB_StructureHeader_GetTypeID(tag) == CHNLIB_STRUCT_ID_String){ + if(CHNLIB_CString_CompareString(&cstr_s[i], CHNLIB_String_GetReferencePointerOfCString(tag))){ + if(location != NULL){ + *location = i - s_start; + } + return j; + } + } + } + } + + if(location != NULL){ + *location = 0; + } + return CHNLIB_UIPArray_INDEX_NOTFOUND; +} + +int CHNLIB_UIPArray_GetSeparatedStringByUIPArray(CHNLIB_UIPArray **separated, const CHNLIB_UIPArray *list, const CHNLIB_String *s) +{ + //listにある文字列でsを分割し、その結果をseparatedに追加する。 + //listに存在する文字列は新しくメモリを確保せず、リスト中のStringタグへのポインタをseparatedに記録する。 + //従ってseparatedを解放する際は、CHNLIB_UIPArray_FreeSelectedAllを利用するべきである。 + //listにない文字列はdata32==False + //listにある文字列はdata32==True + int index, end, end_end, location; + + if(s == NULL){ + return 1; + } + + end = 0; + end_end = CHNLIB_String_GetLength(s); + for(;;){ + index = CHNLIB_String_Search_UIPArrayStringLocation(s, end, list, &location); + if(index == CHNLIB_UIPArray_INDEX_NOTFOUND){ + //もうリストの文字列はない + if(end != end_end){ + //でもまだ文字列は残っている + CHNLIB_UIPArray_AppendLast(separated, False, CHNLIB_String_ExtractByLength(s, end, CHNLIB_MAX_STRING_LENGTH)); + } + break; + } + //リストの文字列が見つかった + if(location != 0){ + //リストの文字列の前に、リストにない文字列がある + CHNLIB_UIPArray_AppendLast(separated, False, CHNLIB_String_ExtractByLength(s, end, location)); + end += location; + } + CHNLIB_UIPArray_AppendLast(separated, True, CHNLIB_UIPArray_GetPointerByIndex(list, index)); + end += CHNLIB_String_GetLength(CHNLIB_UIPArray_GetPointerByIndex(list, index)); + } + return 0; +} + +CHNLIB_String *CHNLIB_ReadLine(FILE *fp) +{ + char s[CHNLIB_MAX_STRING_LENGTH]; + + if(fgets(s, sizeof(s), fp) == NULL){ + return NULL; + } + + CHNLIB_CString_DeleteLastCRLF(s); + + return CHNLIB_String_Initialize(s); +} + + diff --git a/CHNOSProject/chn/chnlib03.c b/CHNOSProject/chn/chnlib03.c new file mode 100644 index 0000000..3eb6b5c --- /dev/null +++ b/CHNOSProject/chn/chnlib03.c @@ -0,0 +1,58 @@ +// +// chnlib03.c +// AI003 +// +// Created by 西田 耀 on 13/02/09. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +// +//Include headers +// + +#include +#include "chnlib.h" + +#ifdef CHNLIB_MAKE_GCC_MAC +#include +//+---int chdir(const char *path); カレントディレクトリの変更 +//+---char *getcwd(char *buf, size_t size); 現在のカレントディレクトリを取得 +#endif + + +#ifdef CHNLIB_MAKE_BCC_WIN +#include +#define getcwd(a,b) _getcwd(a,b) +//+---int _chdir(const char *dirname); +//+---char *_getcwd(char *buffer, int maxlen); +#endif + + +// +//Functions +// + +void CHNLIB_Environment_SetCurrentWorkingDirectory(const char apppath[]) +{ + char path[FILENAME_MAX]; + int i, last; + + //カレントディレクトリを実行ファイルのディレクトリに変更 + snprintf(path, sizeof(path), "%s", apppath); + last = 0; + for(i = 0; i < FILENAME_MAX; i++){ + if(path[i] == '\0'){ + break; + } + if(path[i] == '/'){ + last = i; + } + } + path[last + 1] = '\0'; + printf("%s\n", path); + chdir(path); + getcwd(path, sizeof(path)); + printf("%s\n", path); + + return; +} diff --git a/CHNOSProject/chn/chnlib04.c b/CHNOSProject/chn/chnlib04.c new file mode 100644 index 0000000..b4a4576 --- /dev/null +++ b/CHNOSProject/chn/chnlib04.c @@ -0,0 +1,40 @@ +// +// chnlib04.c +// AI003 +// +// Created by 西田 耀 on 13/02/10. +// Copyright (c) 2013年 Hikaru Nishida. All rights reserved. +// + +// +//Include headers +// + +#include +#include "chnlib.h" + +// +//Functions(UTF-8) +// + +int CHNLIB_UTF8_GetCharacterType(char c) +{ + if(((c >> 6) & 3) == 2){ + //マルチバイト後続バイト + return 0; + } else if(((c >> 7) & 1) == 0){ + //1Byte + return 1; + } else if(((c >> 5) & 7) == 6){ + //2Byte + return 2; + } else if(((c >> 4) & 15) == 14){ + //3Byte + return 3; + } else if(((c >> 3) & 31) == 30){ + //4Byte + return 4; + } + + return 0; +} \ No newline at end of file -- 2.11.0