見出し画像

Notes C API探訪: LMBCS文字列のクラス化

今回はNLS_translateの応用として、LMBCS文字列を扱うクラスを定義してみます。LMBCS文字列はマルチバイト文字セットなので、格納にはstd::stringを使用します。

// nxpp/include/nxpp/lmbcs/nxpp_lmbcs.hpp

#ifndef NXPP_LMBCS_HPP
#define NXPP_LMBCS_HPP

#include "./nxpp_translate.hpp"

#ifdef NT
#pragma pack(push, 1)
#endif

#include <global.h>
#include <osmisc.h>
#include <misc.h>

#ifdef NT
#pragma pack(pop)
#endif

namespace nxpp {

/**
* @brief LMBCS文字列クラス
*/
class Lmbcs : public std::string
{
public:
 /**
  * @brief デフォルトコンストラクタ
  */
 Lmbcs() : std::string() {}

 /**
  * @brief コンストラクタ
  * @param p ヌル終端文字列
  */
 Lmbcs(const char *p) : std::string(p) {}

 /**
  * @brief コンストラクタ
  * @param p 文字列
  * @param n サイズ
  */
 Lmbcs(const char *p, size_t n) : std::string(p, n) {}
};

/**
* @brief STATUS値からエラー内容のテキストに変換する
* @param status ステータス値
* @return エラーテキスト(LMBCS文字列)
*/
inline nxpp::Lmbcs fromStatus(STATUS status) {
 char buffer[MAXSPRINTF + 1];
 WORD len = OSLoadString(NULLHANDLE, ERR(status), buffer, MAXSPRINTF);
 return nxpp::Lmbcs(buffer, len);
}

} // namespace nxpp

/**
* @brief UTF-16文字列をLMBCS文字列に変換する
* @param wstr UTF-16文字列
* @return LMBCS文字列
*/
inline nxpp::Lmbcs toLmbcs(const std::wstring &wstr) {
 return nxpp::unicodeToLmbcs<nxpp::Lmbcs>(wstr);
}

/**
* @brief LMBCS文字列をUTF-16文字列に変換する
* @param lmbcs LMBCS文字列
* @return UTF-16文字列
*/
inline std::wstring fromLmbcs(const nxpp::Lmbcs &lmbcs) {
 return nxpp::lmbcsToUnicode<nxpp::Lmbcs>(lmbcs);
}

#endif // NXPP_LMBCS_HPP

nxpp::Lmbcsクラスは、現状std::stringクラスを継承しただけです。今後、LMBCS文字列として必要な機能を強化していきます。
nxpp::fromStatus関数は、OSLoadString関数を利用して、エラー文字列を取得し、それをLmbcsクラスとして返します。
toLmbcs関数は、Unicode文字列をLmbcsクラスに変換します。
fromLmbcs関数は、LmbcsクラスをUnicode文字列に変換します。

まとめ

今回のご紹介は非常にコンパクトにまとまってしまいましたが、それもこれも、これまでに「Notes C API探訪」シリーズの記事で紹介してきたAPI関数とそのラップ関数の集大成に他ならないからです。
Notes C APIは、C/C++の世界から入るとNotes/Dominoの独特の世界に戸惑い、Notes/Dominoの世界から入ると高度そうに見えるC/C++の言語の壁が侵入を阻む、非常に特殊な立ち位置の存在だと感じています。
一朝一夕に解を得られるわけではありませんが、これらの記事で少しでも気づきを得ていただけたら幸いです。

この記事が気に入ったらサポートをしてみませんか?