Logo Search packages:      
Sourcecode: yaskkserv version File versions  Download package

bool SkkJisyo::open ( const char *  filename  )  [inline]

辞書をオープンします。正常にオープンできれば真を返します。失敗した場合は偽を返し、 DEBUG_ASSERT が有効ならばアサートします。

class SkkJisyo で使用できる辞書は 「createDictionaryForClassSkkJisyo()」または 「createDictionaryIndexAndDictionaryForClassSkkJisyo() アラインメン トなし」で生成されたものです。

通常の SKK-JISYO やアラインメントされた辞書は class SkkJisyo では使 用できないため、オープンに失敗します。

Definition at line 2771 of file skk_jisyo.hpp.

References seek().

        {
                DEBUG_ASSERT_POINTER(filename);

                int length = 0;
                const int limit = 4096;
                const int margin = 16;

                while (*(filename + length) != '\0')
                {
                        ++length;
                }

                if ((length == 0) ||
                    (length > limit - margin))
                {
                        DEBUG_ASSERT(0);
                        open_failure_flag_ = true;

                        return false;
                }
                else
                {
                        filename_buffer_ = new char[length + margin];

                        int i = 0;
                        for (i = 0; *(filename + i) != '\0'; ++i)
                        {
                                *(filename_buffer_ + i) = *(filename + i);
                        }
                        *(filename_buffer_ + i) = '\0';
                        mmap_ = new SkkMmap();
                        buffer_table_[STATE_NORMAL] = static_cast<char*>(mmap_->map(filename_buffer_));
                        if (buffer_table_[STATE_NORMAL] == 0)
                        {
                                DEBUG_ASSERT(0);
                                open_failure_flag_ = true;

                                return false;
                        }

                        if (*buffer_table_[STATE_NORMAL] == ';')
                        {
// 先頭 1 バイトが ';' なデータは通常の SKK-JISYO の可能性が高いため
// (少なくとも class SkkJisyo では不正な形式なので) 失敗します。
                                DEBUG_ASSERT(0);
                                open_failure_flag_ = true;

                                return false;
                        }

                        information_.initialize(buffer_table_[STATE_NORMAL] + mmap_->getFilesize() - Information::getSize());

                        if ((information_.get(Information::ID_IDENTIFIER) != IDENTIFIER) ||
                            (information_.get(Information::ID_BLOCK_ALIGNMENT_SIZE) != 0))
                        {
// IDENTIFIER が不正、またはアラインメントされた辞書ならば失敗します。
                                open_failure_flag_ = true;

                                return false;
                        }

                        size_table_[STATE_NORMAL] = information_.get(Information::ID_NORMAL_SIZE);
                        size_table_[STATE_SPECIAL] = information_.get(Information::ID_SPECIAL_SIZE);

                        buffer_table_[STATE_SPECIAL] = buffer_table_[STATE_NORMAL] + size_table_[STATE_NORMAL];

                        if (buffer_table_[STATE_NORMAL])
                        {
                                seek(SEEK_POSITION_TOP);
                        }
                }

                return true;
        }


Generated by  Doxygen 1.6.0   Back to index