Changeset 14709 for lang/c

Show
Ignore:
Timestamp:
06/27/08 17:59:49 (5 months ago)
Author:
itkz
Message:

supported dead key

Location:
lang/c/SDL_textmanager
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • lang/c/SDL_textmanager/CHANGES

    r238 r14709  
    11 
    2 pre-alpha �� 
     2pre-alpha 履歴 
    33 
    442004/09/05 
    5         Kazunori Itoyanagi(531 ��pm4Rr1N8T6) 
    6 ������������ 
     5        Kazunori Itoyanagi(531 pm4Rr1N8T6) 
     6一日で無理矢理作る。 
    77 
    882004/09/05 
    9         Kazunori Itoyanagi(531 ��pm4Rr1N8T6) 
    10 �Х���餱��ä��Τǽ���� 
    11 �᥽�å������Ĵ������ 
    12 �ե�������L_InputMethod.* ����DL_inputmethod.* ��ѹ��� 
     9        Kazunori Itoyanagi(531 pm4Rr1N8T6) 
     10バグだらけだったので修正。 
     11メソッド名、引数の調整を行う。 
     12ファイル名を SDL_InputMethod.* から SDL_inputmethod.* に変更。 
    1313 
    14142004/09/06 
    15         Kazunori Itoyanagi(531 ��pm4Rr1N8T6) 
    16 ����������ƾä�������INPUT_METHOD_MESSAGE_CHANGE ������Ƥ��ʤ��ä��Τ���� 
     15        Kazunori Itoyanagi(531 ◆pm4Rr1N8T6) 
     16入力中の文字列が全て消えた時に 
     17INPUT_METHOD_MESSAGE_CHANGE が送られていなかったのを修正。 
    1718 
    18192004/09/08 
    1920        564 
    20 XIM��%���餤��� skkinput�Ǥ�����ʤ� canna + kinput2 �ǰ�ư������ 
     21XIMに5%くらい対応 skkinputでは動かない canna + kinput2 で一応動いた。 
    2122 
    22232004/09/09 
    23         Kazunori Itoyanagi(531 ��pm4Rr1N8T6) 
    24 ��ΥХ������ 
    25 Win32 ��ˤ����ơ������������ڤ����Ƥ��ʤ��ä��Τǽ���� 
    26 INPUT_METHOD_MESSAGE_CHANGE �������� 
     24        Kazunori Itoyanagi(531 pm4Rr1N8T6) 
     25諸々のバグを修正。 
     26Win32 版において、変換中の文節情報を適切に送信していなかったので修正。 
     27INPUT_METHOD_MESSAGE_CHANGE に説明を追記。 
    2728 
    28292004/09/13 
    2930        sgi_rocks 
    30 �ʤ󤫽�������� 
     31なんか修正した。 
    3132 
    32332004/09/13 
    33         Kazunori Itoyanagi(531 ��pm4Rr1N8T6) 
    34 �������Υ��꡼�󥢥å� 
     34        Kazunori Itoyanagi(531 ◆pm4Rr1N8T6) 
     35ソースのクリーンアップ 
     36 
    35372004/09/14 
    36         Kazunori Itoyanagi(531 ��pm4Rr1N8T6) 
    37 README.ja ��������� 
    38 InputMethod_Valid(), InputMethod_Invalid() ��Win32 ���� 
     38        Kazunori Itoyanagi(531 ◆pm4Rr1N8T6) 
     39README.ja の説明を大幅に変更。 
     40InputMethod_Valid(), InputMethod_Invalid() の Win32 版を実装。 
     41 
    39422004/09/15 
    4043        sgi_rocks 
    41 InputMethod_Valid(), InputMethod_Invalid() ��XIM ����InputMethod_Invalid()�ˤ����ݤ�M��ON��ä����� 
    42 InputMethod_Valid()�������᤻�ʤ���ʬ����������� 
     44InputMethod_Valid(), InputMethod_Invalid() の XIM 版を実装。 
     45InputMethod_Invalid()にした際にIMがONだった場合、 
     46InputMethod_Valid()を呼んでもIMをONに戻せない。分かる方修正求む。 
    4347 
    44482004/09/16 
    45         Kazunori Itoyanagi(531 ��pm4Rr1N8T6) 
    46 Valid, Invalid �Ϥʤ������Ȥ�����������sgi_rocks �� Validate, Invalidate �ΰƤ�����롣 
    47 xim.c, win32.c ���ˤ�����Reset �Τ���������٥������Ƥʤ��ä��Τǽ���� 
     49        Kazunori Itoyanagi(531 ◆pm4Rr1N8T6) 
     50Valid, Invalid はないだろう、という指摘を受けて 
     51sgi_rocks 氏の Validate, Invalidate の案を適応する。 
     52xim.c, win32.c 双方において Reset のあと 
     53正常にイベントを送信してなかったので修正。 
    4854 
    49552004/09/16 
    5056        564 
    51 uim-xim�������ư��ʤ��Ȥ�������64�᤬�����������ѥå�����Ŭ��� 
     57uim-ximで正しく動作しないという事を受けて564氏がそれを修正する 
     58パッチを公開。適用。 
    5259 
    53602004/09/19 
    5461        sgi_rocks 
    55 xim.c�ǡ�Ĺ��ʸ�Ϥ�Ϥ���iconv������¥롼�פ��Ƥ������� 
    56 Ĺ��ʸ�Ϥ�Ϥ������꡼�­�ˤʤäƤ���������� 
    57 ������ޤ����ʸ�Ϥ�����������������狼������ 
     62xim.cで、長い文章を入力するとiconvの部分で無限ループしていた問題、 
     63長い文章を入力するとメモリー不足になっていた問題を修正。 
     64ただ、まだ長い文章を入れると途中で切れるが原因はまだわからない。 
    5865 
    59662004/09/24 
    60         Kazunori Itoyanagi(531 ��pm4Rr1N8T6) 
    61 xim.c ����ľ������� 
     67        Kazunori Itoyanagi(531 ◆pm4Rr1N8T6) 
     68xim.c を大幅に書き直して清書。 
     69 
    62702007/09/19 
    6371        ITOYANAGI Kazunori 
    64 SDL_intputmethod ��L_textmanager ��ѹ��� 
    65 ���ʽ��������� 
     72SDL_intputmethod を SDL_textmanager に変更し 
     73大幅な修正を加えた。 
    6674 
     752008/06/27 
     76        ITOYANAGI Kazunori 
     77win32.c と SDL_textmanager 本体においてデッドキー入力に対応。 
  • lang/c/SDL_textmanager/SDL_textmanager.c

    r238 r14709  
    5151        int compositionLength; 
    5252        Uint16 character; 
    53         TextManager_DeadChar deadCharacter; 
    5453} TextManager_Event; 
    5554 
     
    5857SDL_EventFilter OriginalFilterSDL = NULL; 
    5958 
    60 static TextManager_Event *TextManager_EventQue = NULL; 
    61 static int TextManager_EventQueNumber = 0; 
     59static TextManager_Event *TextManager_EventQueue = NULL; 
     60static int TextManager_EventQueueNumber = 0; 
    6261static SDL_bool IsOriginalTextManager = SDL_FALSE; 
    6362static SDL_bool IsInited = SDL_FALSE; 
    6463static SDL_bool IsValid = SDL_TRUE; 
    6564static SDL_bool IsEnableUNICODEOld; 
     65static TextManager_DeadChar PreviousDeadChar; 
    6666static int BootStrapNum = -1; 
    6767 
     
    7070static void TextManager_SetEventFilter(void); 
    7171static void TextManager_RestoreEventFilter(void); 
    72 static void TextManager_AddEventToQue(TextManager_Event *event); 
    73  
    74  
    75 void TextManager_SetEventFilter(void) 
     72static void TextManager_AddEventToQueue(TextManager_Event *event); 
     73static Uint16 TextManager_GetDeadCharCode(TextManager_DeadChar deadChar); 
     74 
     75 
     76static void TextManager_SetEventFilter(void) 
    7677{ 
    7778        IsEnableUNICODEOld = SDL_EnableUNICODE(SDL_TRUE); 
     
    8182 
    8283 
    83 void TextManager_RestoreEventFilter(void) 
     84static void TextManager_RestoreEventFilter(void) 
    8485{ 
    8586        SDL_EnableUNICODE(IsEnableUNICODEOld); 
     
    9596         
    9697        if (IsInited == SDL_TRUE) { 
    97                 return INPUT_METHOD_ERROR_ALREADY_INIT; 
     98                return TEXT_MANAGER_ERROR_ALREADY_INIT; 
    9899        } 
    99100         
     
    108109        if (TextManager_Use != NULL) { 
    109110                result = TextManager_Use->init(); 
    110                 if (result != INPUT_METHOD_SUCCESS) { 
     111                if (result != TEXT_MANAGER_SUCCESS) { 
    111112                        TextManager_Use->quit(); 
    112113                        TextManager_Use = NULL; 
     
    115116                } 
    116117        } 
    117         TextManager_EventQue = NULL; 
    118         TextManager_EventQueNumber = 0; 
     118        TextManager_EventQueue = NULL; 
     119        TextManager_EventQueueNumber = 0; 
    119120        IsOriginalTextManager = SDL_FALSE; 
    120121        IsValid = SDL_TRUE; 
    121122        IsInited = SDL_TRUE; 
    122          
    123         return INPUT_METHOD_SUCCESS; 
     123        PreviousDeadChar = DEAD_CHAR_NON; 
     124         
     125        return TEXT_MANAGER_SUCCESS; 
    124126} 
    125127 
     
    140142        } 
    141143         
    142         event = TextManager_EventQue; 
     144        event = TextManager_EventQueue; 
    143145        while (event != NULL) { 
    144146                next = event->next; 
     
    149151                event = next; 
    150152        } 
    151         TextManager_EventQue = NULL; 
    152         TextManager_EventQueNumber = 0; 
     153        TextManager_EventQueue = NULL; 
     154        TextManager_EventQueueNumber = 0; 
    153155        IsOriginalTextManager = SDL_FALSE; 
    154156        IsInited = SDL_FALSE; 
     
    200202         
    201203        if (IsInited == SDL_TRUE) { 
    202                 return INPUT_METHOD_ERROR_ALREADY_INIT; 
     204                return TEXT_MANAGER_ERROR_ALREADY_INIT; 
    203205        } 
    204206         
     
    207209                        TextManager_Use = TextManager_BootStrap[num]; 
    208210                } else { 
    209                         return INPUT_METHOD_ERROR_NOT_AVAILABLE; 
     211                        return TEXT_MANAGER_ERROR_NOT_AVAILABLE; 
    210212                } 
    211213        } else { 
    212                 return INPUT_METHOD_ERROR_INVALID_BOOTSTRAP; 
     214                return TEXT_MANAGER_ERROR_INVALID_BOOTSTRAP; 
    213215        } 
    214216         
    215217        result = TextManager_Use->init(); 
    216         if (result != INPUT_METHOD_SUCCESS) { 
     218        if (result != TEXT_MANAGER_SUCCESS) { 
    217219                TextManager_Use->quit(); 
    218220                TextManager_Use = NULL; 
    219221                return result; 
    220222        } 
    221         TextManager_EventQue = NULL; 
    222         TextManager_EventQueNumber = 0; 
     223        TextManager_EventQueue = NULL; 
     224        TextManager_EventQueueNumber = 0; 
    223225        IsOriginalTextManager = SDL_FALSE; 
    224226        IsValid = SDL_TRUE; 
    225227        IsInited = SDL_TRUE; 
    226228         
    227         return INPUT_METHOD_SUCCESS; 
     229        return TEXT_MANAGER_SUCCESS; 
    228230} 
    229231 
     
    234236        TextManager_Event *next; 
    235237         
    236         event = TextManager_EventQue; 
     238        event = TextManager_EventQueue; 
    237239        while (event != NULL) { 
    238240                next = event->next; 
     
    243245                event = next; 
    244246        } 
    245         TextManager_EventQue = NULL; 
    246         TextManager_EventQueNumber = 0; 
     247        TextManager_EventQueue = NULL; 
     248        TextManager_EventQueueNumber = 0; 
    247249         
    248250        if (TextManager_Use != NULL) { 
     
    260262        if (TextManager_Use == NULL) { 
    261263                SDL_SetError("Input method is no init"); 
    262                 return INPUT_METHOD_ERROR_NO_INIT; 
     264                return TEXT_MANAGER_ERROR_NO_INIT; 
    263265        } 
    264266         
    265267        if (IsValid == SDL_TRUE) { 
    266                 return INPUT_METHOD_ERROR_ALREADY_VALIDATED; 
     268                return TEXT_MANAGER_ERROR_ALREADY_VALIDATED; 
    267269        } 
    268270         
     
    270272                if (TextManager_Use->validate != NULL) { 
    271273                        result = TextManager_Use->validate(); 
    272                         if (result == INPUT_METHOD_SUCCESS) { 
     274                        if (result == TEXT_MANAGER_SUCCESS) { 
    273275                                IsValid = SDL_TRUE; 
    274276                        } 
     
    278280         
    279281        SDL_SetError("Input method is no init"); 
    280         return INPUT_METHOD_ERROR_NO_INIT; 
     282        return TEXT_MANAGER_ERROR_NO_INIT; 
    281283} 
    282284 
     
    288290        if (TextManager_Use == NULL) { 
    289291                SDL_SetError("Input method is no init"); 
    290                 return INPUT_METHOD_ERROR_NO_INIT; 
     292                return TEXT_MANAGER_ERROR_NO_INIT; 
    291293        } 
    292294         
    293295        if (IsValid == SDL_FALSE) { 
    294                 return INPUT_METHOD_ERROR_ALREADY_INVALIDATED; 
     296                return TEXT_MANAGER_ERROR_ALREADY_INVALIDATED; 
    295297        } 
    296298         
     
    298300                if (TextManager_Use->invalidate !=NULL) { 
    299301                        result = TextManager_Use->invalidate(); 
    300                         if (result == INPUT_METHOD_SUCCESS) { 
     302                        if (result == TEXT_MANAGER_SUCCESS) { 
    301303                                IsValid = SDL_FALSE; 
    302304                        } 
     
    306308         
    307309        SDL_SetError("Input method is no init"); 
    308         return INPUT_METHOD_ERROR_NO_INIT; 
     310        return TEXT_MANAGER_ERROR_NO_INIT; 
    309311} 
    310312 
     
    312314int TextManager_GetEventNumber(void) 
    313315{ 
    314         return TextManager_EventQueNumber; 
     316        return TextManager_EventQueueNumber; 
    315317} 
    316318 
     
    320322        TextManager_Event *next; 
    321323         
    322         if (TextManager_EventQueNumber > 0) { 
    323                 if (TextManager_EventQue->editingString != NULL) { 
    324                         free(TextManager_EventQue->editingString); 
     324        if (TextManager_EventQueueNumber > 0) { 
     325                if (TextManager_EventQueue->editingString != NULL) { 
     326                        free(TextManager_EventQueue->editingString); 
    325327                } 
    326328                 
    327                 if (TextManager_EventQue != NULL) { 
    328                         next = TextManager_EventQue->next; 
    329                         free(TextManager_EventQue); 
    330                         TextManager_EventQue = next; 
     329                if (TextManager_EventQueue != NULL) { 
     330                        next = TextManager_EventQueue->next; 
     331                        free(TextManager_EventQueue); 
     332                        TextManager_EventQueue = next; 
    331333                } 
    332334                 
    333                 TextManager_EventQueNumber--; 
     335                TextManager_EventQueueNumber--; 
    334336        } 
    335337} 
     
    338340TextManager_Message TextManager_GetCurrentMessage(void) 
    339341{ 
    340         if (TextManager_EventQue == NULL) { 
     342        if (TextManager_EventQueue == NULL) { 
    341343                SDL_SetError("Message is not found"); 
    342                 return INPUT_METHOD_MESSAGE_NO_EXIST; 
     344                return TEXT_MANAGER_MESSAGE_NO_EXIST; 
    343345        } else { 
    344                 return TextManager_EventQue->message; 
     346                return TextManager_EventQueue->message; 
    345347        } 
    346348} 
     
    349351Uint16 *TextManager_GetCurrentEditingString(void) 
    350352{ 
    351         if (TextManager_EventQue == NULL) { 
     353        if (TextManager_EventQueue == NULL) { 
    352354                return NULL; 
    353355        } 
    354356         
    355         return TextManager_EventQue->editingString; 
     357        return TextManager_EventQueue->editingString; 
    356358} 
    357359 
     
    359361Uint16 TextManager_GetCurrentChar(void) 
    360362{ 
    361         if (TextManager_EventQue == NULL) { 
     363        if (TextManager_EventQueue == NULL) { 
    362364                return 0x0000; 
    363365        } 
    364366         
    365         return TextManager_EventQue->character; 
    366 } 
    367  
    368  
    369 TextManager_DeadChar TextManager_GetCurrentDeadChar(void) 
    370 { 
    371         if (TextManager_EventQue == NULL) { 
    372                 return 0x0000; 
    373         } 
    374          
    375         return TextManager_EventQue->deadCharacter; 
    376 } 
    377  
    378  
    379 struct DeadCharConbination 
    380 { 
    381  
    382 } 
     367        return TextManager_EventQueue->character; 
     368} 
     369 
     370 
     371typedef struct dead_char_combination 
     372{ 
     373        TextManager_DeadChar deadChar; 
     374        Uint16 character; 
     375        Uint16 combinedChar; 
     376} DEAD_CHAR_COMBINATION; 
     377 
     378 
     379static DEAD_CHAR_COMBINATION DeadCharCombinationList[] = 
     380{ 
     381        /* ^ */ 
     382        {DEAD_CHAR_CIRCUMFLEX, 0x0041/* A */, 0x00C2}, 
     383        {DEAD_CHAR_CIRCUMFLEX, 0x0045/* E */, 0x00CA}, 
     384        {DEAD_CHAR_CIRCUMFLEX, 0x0049/* I */, 0x00CE}, 
     385        {DEAD_CHAR_CIRCUMFLEX, 0x004F/* O */, 0x00D4}, 
     386        {DEAD_CHAR_CIRCUMFLEX, 0x0055/* U */, 0x00DB}, 
     387        {DEAD_CHAR_CIRCUMFLEX, 0x0061/* a */, 0x00E2}, 
     388        {DEAD_CHAR_CIRCUMFLEX, 0x0065/* e */, 0x00EA}, 
     389        {DEAD_CHAR_CIRCUMFLEX, 0x0069/* i */, 0x00EE}, 
     390        {DEAD_CHAR_CIRCUMFLEX, 0x006F/* o */, 0x00F4}, 
     391        {DEAD_CHAR_CIRCUMFLEX, 0x0075/* u */, 0x00FB}, 
     392        /* �N */ 
     393        {DEAD_CHAR_DIAERESIS,  0x0041/* A */, 0x00C4}, 
     394        {DEAD_CHAR_DIAERESIS,  0x004F/* O */, 0x00D6}, 
     395        {DEAD_CHAR_DIAERESIS,  0x0055/* U */, 0x00DC}, 
     396        {DEAD_CHAR_DIAERESIS,  0x0061/* a */, 0x00E4}, 
     397        {DEAD_CHAR_DIAERESIS,  0x006F/* o */, 0x00F6}, 
     398        {DEAD_CHAR_DIAERESIS,  0x0075/* u */, 0x00FC}, 
     399}; 
    383400 
    384401 
     
    386403        TextManager_DeadChar deadChar, Uint16 character) 
    387404{ 
    388         switch(deadChar) { 
    389         case DEAD_CHAR_CIRCUMFLEX: /* ^ */ 
    390                 switch (character) { 
    391                 case 0x0041: /* A */ 
    392                         return 0x00C2; 
    393                 case 0x0045: /* E */ 
    394                         return 0x00CA; 
    395                 case 0x0049: /* I */ 
    396                         return 0x00CE; 
    397                 case 0x004F: /* O */ 
    398                         return 0x00D4; 
    399                 case 0x0055: /* U */ 
    400                         return 0x00DB; 
    401                 case 0x0061: /* a */ 
    402                         return 0x00E2; 
    403                 case 0x0065: /* e */ 
    404                         return 0x00EA; 
    405                 case 0x0069: /* i */ 
    406                         return 0x00EE; 
    407                 case 0x006F: /* o */ 
    408                         return 0x00F4; 
    409                 case 0x0075: /* u */ 
    410                         return 0x00FB; 
    411                 default: 
    412                         return 0x0000; 
    413                 } 
    414         case DEAD_CHAR_DIAERESIS: /* �N */ 
    415                 switch (character) { 
    416                 case 0x0041: /* A */ 
    417                         return 0x00C4; 
    418                 case 0x004F: /* O */ 
    419                         return 0x00D6; 
    420                 case 0x0055: /* U */ 
    421                         return 0x00DC; 
    422                 case 0x0061: /* a */ 
    423                         return 0x00E4; 
    424                 case 0x006F: /* o */ 
    425                         return 0x00F6; 
    426                 case 0x0075: /* u */ 
    427                         return 0x00FC; 
    428                 default: 
    429                         return 0x0000; 
    430                 } 
    431         default: 
    432                 return 0x0000; 
    433         } 
     405        int i; 
     406        int combinationListNum; 
     407        DEAD_CHAR_COMBINATION *combination; 
     408         
     409        combinationListNum = 
     410                sizeof(DeadCharCombinationList) / sizeof(DEAD_CHAR_COMBINATION); 
     411        for (i = 0; i < combinationListNum; i++) { 
     412                combination = &DeadCharCombinationList[i]; 
     413                if ( 
     414                        combination->deadChar == deadChar && 
     415                        combination->character == character 
     416                ) { 
     417                        return combination->combinedChar; 
     418                } 
     419        } 
     420         
     421        return 0x0000; 
    434422} 
    435423 
     
    437425int TextManager_GetCurrentCursorPosition(void) 
    438426{ 
    439         if (TextManager_EventQue == NULL) { 
     427        if (TextManager_EventQueue == NULL) { 
    440428                return 0; 
    441429        } 
    442430         
    443         return TextManager_EventQue->cursorPosition; 
     431        return TextManager_EventQueue->cursorPosition; 
    444432} 
    445433 
     
    447435int TextManager_GetCurrentCompositionPosition(void) 
    448436{ 
    449         if (TextManager_EventQue == NULL) { 
     437        if (TextManager_EventQueue == NULL) { 
    450438                return 0; 
    451439        } 
    452440         
    453         return TextManager_EventQue->compositionPosition; 
     441        return TextManager_EventQueue->compositionPosition; 
    454442} 
    455443 
     
    457445int TextManager_GetCurrentCompositionLength(void) 
    458446{ 
    459         if (TextManager_EventQue == NULL) { 
     447        if (TextManager_EventQueue == NULL) { 
    460448                return 0; 
    461449        } 
    462450         
    463         return TextManager_EventQue->compositionLength; 
     451        return TextManager_EventQueue->compositionLength; 
    464452} 
    465453 
     
    476464 
    477465 
    478 int TextManager_GetUnicodeStringLength(Uint16 *unicodeString) 
     466static int TextManager_GetUnicodeStringLength(Uint16 *unicodeString) 
    479467{ 
    480468        int i; 
     
    493481 
    494482 
    495 void TextManager_AddEventToQue(TextManager_Event *event) 
     483static void TextManager_AddEventToQueue(TextManager_Event *event) 
    496484{ 
    497485        TextManager_Event *lastEvent; 
    498486         
    499         if (TextManager_EventQue == NULL) { 
    500                 TextManager_EventQue = event; 
     487        if (TextManager_EventQueue == NULL) { 
     488                TextManager_EventQueue = event; 
    501489        } else { 
    502                 lastEvent = TextManager_EventQue; 
     490                lastEvent = TextManager_EventQueue; 
    503491                while (lastEvent->next != NULL) { 
    504492                        lastEvent = lastEvent->next; 
     
    506494                lastEvent->next = event; 
    507495        } 
    508         TextManager_EventQueNumber++; 
     496        PreviousDeadChar = DEAD_CHAR_NON; 
     497        TextManager_EventQueueNumber++; 
    509498} 
    510499 
     
    522511        if (event == NULL) { 
    523512                SDL_SetError("Allocate memory failed"); 
    524                 return INPUT_METHOD_ERROR_ALLOCATED_MEMORY; 
     513                return TEXT_MANAGER_ERROR_ALLOCATED_MEMORY; 
    525514        } 
    526515        event->next = NULL; 
     
    529518                free(event); 
    530519                SDL_SetError( 
    531                         "post INPUT_METHOD_MESSAGE_CHANGE: " 
     520                        "post TEXT_MANAGER_MESSAGE_CHANGE: " 
    532521                        "Editing string is NULL"); 
    533                 return INPUT_METHOD_ERROR_NO_STRING; 
     522                return TEXT_MANAGER_ERROR_NO_STRING; 
    534523        } 
    535524        size = 
     
    539528        if (event->editingString == NULL) { 
    540529        &n