nlib
nlib Platform APIs

Cリンケージを持つnlibの最も基本的なAPIです。 [詳解]

ファイル

ファイル  Platform.h
 基本的なAPIがCリンケージで宣言されています。
 

クラス

struct  nlib_timerspec
 タイマーの初回起動までの時間と以降の起動間隔を指定します。両方0を指定した場合タイマーは停止します。 [詳解]
 
struct  nlib_mq_attr
 メッセージキューの設定や現在の状態を格納する構造体です。 [詳解]
 
struct  nlib_utf8_convert_info
 UTF-8文字列の変換に関する情報が格納される構造体です。 [詳解]
 

マクロ定義

#define RSIZE_MAX   0x7FFFFFFFFFFFFFFFLL
 size_tの最大値よりいくらか小さい値が定義されています。 [詳解]
 

型定義

typedef unsigned char nlib_byte_t
 C++17以降でstd::byteにtypedefされる型です。
 
typedef int32_t nlib_long_compatible_t
 longと互換性のある整数型がtypedefされています。
 
typedef uint32_t nlib_ulong_compatible_t
 unsigned longと互換性のある整数型がtypedefされています。
 

バージョン

nlibのバージョンを取得するためのマクロと関数です。

#define NLIB_VERSION   20180605
 バージョン番号が定義されています。リリースの年月日に相当する数値が定義されています。
 
#define NLIB_VERSION_YEAR   2018
 バージョン番号の年に相当する部分が整数として定義されています。
 
#define NLIB_VERSION_YEAR_SHORT   18
 バージョン番号の年部分の下二桁に相当する部分が整数として定義されています。
 
#define NLIB_VERSION_DATE   0605
 バージョン番号の月日に相当する部分が整数として定義されています。
 
#define nlib_getversion   NLIB_CAPI(nlib_getversion)
 nlibのバージョンを動的に取得します。 [詳解]
 
#define nlib_compiler_version   NLIB_CAPI(nlib_compiler_version)
 nlibのコンパイルに利用されたコンパイラのバージョンを動的に取得します。 [詳解]
 

CRC-32, CRC-32C

SSE又はNEONが利用できる場合は、専用命令を利用して高速に計算を行います。

uint32_t nlib_crc32 (uint32_t crc32, const void *p, size_t n)
 データのCRC-32チェックサムを計算する関数です。 [詳解]
 
uint32_t nlib_crc32c (uint32_t crc32c, const void *p, size_t n)
 データのCRC-32Cチェックサムを計算する関数です。 [詳解]
 

メモリフェンス

マルチコアプロセッサでのプログラミングにおいて、メモリアクセスの同期を行うための低レベルのプリミティブです。

#define NLIB_MEMORY_ORDER_RELEASE   __atomic_thread_fence(__ATOMIC_RELEASE)
 メモリフェンスです。C++11ではatomic_thread_fence(memory_order_release)に一致します。
 
#define NLIB_MEMORY_ORDER_ACQUIRE   __atomic_thread_fence(__ATOMIC_ACQUIRE)
 メモリフェンスです。C++11ではatomic_thread_fence(memory_order_acquire)に一致します。
 
#define NLIB_MEMORY_ORDER_ACQ_REL   __atomic_thread_fence(__ATOMIC_ACQ_REL)
 メモリフェンスです。C++11ではatomic_thread_fence(memory_order_acq_rel)に一致します。
 
#define NLIB_MEMORY_ORDER_SEQ_CST   __atomic_thread_fence(__ATOMIC_SEQ_CST)
 メモリフェンスです。C++11ではatomic_thread_fence(memory_order_seq_cst)に一致します。
 

アトリビュート

コンパイラ毎のアトリビュートの違いを吸収するためのマクロです。

#define NLIB_WARN(exp)   ("WARNING: " exp)
 ワーニングを出力します。 [詳解]
 
#define NLIB_ALWAYS_INLINE   inline __attribute__((always_inline))
 コンパイラに関数をインライン展開するように強く示します。 [詳解]
 
#define NLIB_NEVER_INLINE   __attribute__((__noinline__))
 コンパイラに関数をインライン展開しないように示します。 [詳解]
 
#define NLIB_LIKELY(x)   __builtin_expect(!!(x), 1)
 条件xが真になる傾向が高いことをコンパイラに示します。 [詳解]
 
#define NLIB_UNLIKELY(x)   __builtin_expect(!!(x), 0)
 条件xが偽になる傾向が高いことをコンパイラに示します。 [詳解]
 
#define NLIB_CHECK_RESULT   __attribute__((warn_unused_result))
 関数の呼び出し元が戻り値をチェックする必要があることを示します。 [詳解]
 
#define NLIB_NORETURN   __attribute__((noreturn))
 関数がリターンしないことを示します。 [詳解]
 
#define NLIB_NONNULL   __attribute__((nonnull))
 全ての引数にNULLを指定することができないことを示します。 [詳解]
 
#define NLIB_NONNULL_1   __attribute__((nonnull(1)))
 1番目の引数にNULLを指定することができないことを示します。 [詳解]
 
#define NLIB_NONNULL_2   __attribute__((nonnull(2)))
 2番目の引数にNULLを指定することができないことを示します。 [詳解]
 
#define NLIB_NONNULL_3   __attribute__((nonnull(3)))
 3番目の引数にNULLを指定することができないことを示します。 [詳解]
 
#define NLIB_NONNULL_4   __attribute__((nonnull(4)))
 4番目の引数にNULLを指定することができないことを示します。 [詳解]
 
#define NLIB_NONNULL_5   __attribute__((nonnull(5)))
 5番目の引数にNULLを指定することができないことを示します。 [詳解]
 
#define NLIB_ATTRIBUTE_MALLOC   __attribute__((malloc))
 利用可能であれば__attribute__((malloc))が定義されます。 [詳解]
 
#define NLIB_ATTRIBUTE_PURE   __attribute__((pure))
 利用可能であれば__attribute__((pure))が定義されます。 [詳解]
 
#define NLIB_ATTRIBUTE_CONST   __attribute__((const))
 利用可能であれば__attribute__((const))が定義されます。 [詳解]
 
#define NLIB_DEPRECATED   [[deprecated]]
 関数等がdeprecatedになったことを示します。 [詳解]
 
#define NLIB_WEAKSYMBOL   __attribute__((weak))
 ウィークシンボルを定義するために利用します。 [詳解]
 
#define NLIB_VIS_HIDDEN   __attribute__((visibility("hidden")))
 関数やクラス等のシンボルをライブラリの外部に公開しません。 [詳解]
 
#define NLIB_VIS_PUBLIC   __attribute__((visibility("default")))
 関数やクラス等のシンボルをライブラリの外部に公開します。 [詳解]
 
#define NLIB_ASSUME(cond)   switch (0) case 0: default: if (cond) ; else __builtin_unreachable()
 cond が真であることを示してコンパイラに最適化のヒントを与えます。 [詳解]
 

環境判定用マクロ

#define NLIB_LITTLE_ENDIAN
 環境がリトルエンディアンの場合定義されています。
 
#define NLIB_64BIT
 環境が64bitアーキテクチャの場合定義されています。
 

エラー

エラー値に関するユーティリティです。

#define nlib_get_native_last_error   NLIB_CAPI(nlib_get_native_last_error)
 最後に発生したネイティブのエラーコードを返します。 [詳解]
 
const char * nlib_error_string (errno_t e)
 nlibのエラー値に対応する文字列リテラルを返します。 [詳解]
 
template<class T >
bool nlib_is_error (const T &obj) noexcept
 処理の結果やオブジェクトの状態がエラーである場合にtrueを返します。 [詳解]
 
typedef int errno_t
 inttypedefで、戻り値としてPOSIXのエラー値を返すことを示します。
 

時刻と時間

時刻や経過時間を取得したりスリープを行う関数です。

errno_t nlib_epochtime (nlib_time *t)
 現在時刻を取得します。 [詳解]
 
errno_t nlib_ticktime (nlib_duration *t)
 ブートからの経過時間を取得します。 [詳解]
 
errno_t nlib_sleep (nlib_duration t)
 t の間スリープする。 [詳解]
 
static errno_t nlib_epochtime_timespec (struct timespec *tm)
 nlib_epochtime()の引数にtimespec構造体を取るバージョンです。
 
static errno_t nlib_ticktime_timespec (struct timespec *tm)
 nlib_ticktime()の引数にtimespec構造体を取るバージョンです。
 
static errno_t nlib_sleep_timespec (const struct timespec *tm)
 nlib_sleep()の引数にtimespec構造体を取るバージョンです。
 
typedef int64_t nlib_time
 1970/01/01を起点(0)としてから100ns刻みで時刻を表現する型です。64bit符号付き整数です。
 
typedef int64_t nlib_duration
 100ns刻みで時間を表現する型です。64bit符号付き整数です。
 

タイマー

定期的にタスクを実行します。

説明
以下のコードは、タイマーを作成し200ミリ秒後から100ミリ秒毎にコールバック関数を5回読んで最後のコールバック関数呼び出しでタイマーを削除するサンプルです。
nlib_timer timer;
int counter = 0;
e = nlib_timer_create(&timer, [](nlib_timer t, void* p) {
// NOTE:
// callback function can be called in parallel
int32_t* pcounter = reinterpret_cast<int*>(p);
int32_t cnt = nlib_atomic_add_fetch32(pcounter, 1, NLIB_ATOMIC_SEQ_CST);
nlib_printf("counter = %d\n", cnt);
if (cnt == 5) {
nlib_timer_delete(t, 1, NULL);
}
}, &counter, 0);
SUCCEED_IF(e == 0);
nlib_timerspec spec = {
_100msec * 2, // due_time
_100msec // interval
};
e = nlib_timer_settime(timer, &spec, NULL);
if (e != 0) {
nlib_timer_delete(timer, 1, NULL);
SUCCEED_IF(0);
}
while (counter < 5) {
nlib_sleep(_100msec);
}
/*
Output:
counter = 1
counter = 2
counter = 3
counter = 4
counter = 5
*/
errno_t nlib_timer_create (nlib_timer *timer, nlib_timer_callback callback, void *param, uint32_t flags)
 タイマーを作成します。 [詳解]
 
errno_t nlib_timer_settime (nlib_timer timer, const nlib_timerspec *new_value, nlib_timerspec *old_value)
 タイマーを開始したり一時停止したりします。 [詳解]
 
errno_t nlib_timer_gettime (nlib_timer timer, nlib_timerspec *curr_value)
 タイマーの現在の設定を取得します。 [詳解]
 
errno_t nlib_timer_delete (nlib_timer timer, int wait_completion, nlib_timer_callback completion_callback)
 タイマーを削除します。 [詳解]
 
typedef uint32_t nlib_timer
 nlib_timer_create()nlib_timer_delete()で利用するタイマーのIDです。
 
typedef void(* nlib_timer_callback) (nlib_timer timer, void *param)
 nlib_timer_create()で設定するコールバック関数の型です。
 
nlib_duration nlib_timerspec::due_time
 タイマーが最初に起動するまでの時間を指定します。
 
nlib_duration nlib_timerspec::interval
 タイマーの初回起動以降の起動間隔を指定します。0を指定した場合ワンショットタイマーになります。
 

ランダム値の生成

errno_t nlib_gen_random (void *buf, size_t size)
 ランダムな値をsize バイト生成してbuf に格納します。 [詳解]
 

OSからのメモリ割り当て

OSからの仮想メモリ空間の割当及び解放と、物理メモリの割当及び解放を行います。

errno_t nlib_mempagesize (size_t *size)
 ページサイズを取得します。 [詳解]
 
errno_t nlib_virtual_alloc (void **ptr, size_t size)
 仮想メモリアドレス空間を割り当てます。 [詳解]
 
errno_t nlib_virtual_free (void *ptr, size_t size)
 仮想メモリアドレス空間の割り当てを解除します [詳解]
 
errno_t nlib_physical_alloc (void *ptr, size_t size, int prot)
 物理メモリを割り当てます。 [詳解]
 
errno_t nlib_physical_free (void *ptr, size_t size)
 物理メモリの割り当てを解除します。 [詳解]
 
errno_t nlib_mprotect (void *ptr, size_t size, int prot)
 割り当てられた物理メモリに対してアクセス保護を設定します。 [詳解]
 
errno_t nlib_mlock (void *addr, size_t len)
 指定したメモリ領域がスワップアウトされないようにします。 [詳解]
 
errno_t nlib_munlock (void *addr, size_t len)
 指定したメモリ領域がスワップアウトできるようにします。 [詳解]
 

TLS

Thread local storage(TLS)はスレッド毎に異なるメモリにアクセスするための仕組みです。

#define NLIB_TLS_INVALID   (nlib_tls)(-1)
 無効なTLSスロットのIDを指し示す値
 
errno_t nlib_tls_alloc (nlib_tls *tls, nlib_tls_destructor destr)
 TLSスロットに対する新しいIDを確保します。 [詳解]
 
errno_t nlib_tls_free (nlib_tls tls)
 TLSスロットに対応するIDを解放します。 [詳解]
 
errno_t nlib_tls_setvalue (nlib_tls tls, const void *value)
 TLSスロットに値を格納します。 [詳解]
 
errno_t nlib_tls_getvalue (nlib_tls tls, void **value)
 TLSスロットから値を取り出します。 [詳解]
 
typedef pthread_key_t nlib_tls
 TLSスロットのIDを示す型です。
 
typedef void(* nlib_tls_destructor) (void *tls_value)
 スレッド終了時に呼び出されるTLSのデストラクタ関数の型です。 [詳解]
 

スピンロック

スピンロックを行います。スピンロックの初期化を静的に行うことができます。

#define NLIB_SPINLOCK_INITIALIZER   (0)
 nlib_spinlockを静的に初期化するためのマクロです。
 
static void nlib_spinlock_init (nlib_spinlock *lock)
 スピンロックを初期化します。 [詳解]
 
static void nlib_spinlock_lock (nlib_spinlock *lock)
 スピンロックをロックします。再帰ロックを行った場合の動作は不定です。 [詳解]
 
static errno_t nlib_spinlock_trylock (nlib_spinlock *lock)
 スピンロックをロックします。成功した場合は0を返し、失敗した場合はEBUSYを返します。 [詳解]
 
static void nlib_spinlock_unlock (nlib_spinlock *lock)
 スピンロックをアンロックします。 [詳解]
 
typedef int32_t nlib_spinlock
 スピンロック変数の型です。NLIB_SPINLOCK_INITIALIZERにより静的に初期化して利用します。 [詳解]
 

ミューテックス

pthreadのミューテックスに準じたI/Fを提供しています。

#define NLIB_MUTEX_INITIALIZER   PTHREAD_MUTEX_INITIALIZER
 nlib_mutexを静的に初期化するためのマクロ。
 
#define NLIB_RECURSIVE_MUTEX_INITIALIZER   PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
 nlib_mutexを静的に初期化するためのマクロ。再帰mutexになる。
 
#define NLIB_RECURSIVE_TIMED_MUTEX_INITIALIZER   PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
 nlib_mutexを静的に初期化するためのマクロ。再帰でタイムアウト可能なmutexになる。
 
errno_t nlib_mutex_init (nlib_mutex *mutex) NLIB_EXCLUDES(*mutex)
 ミューテックスを初期化します。 [詳解]
 
errno_t nlib_mutex_recursive_init (nlib_mutex *mutex) NLIB_EXCLUDES(*mutex)
 再帰ミューテックスを初期化します。 [詳解]
 
errno_t nlib_mutex_recursive_timed_init (nlib_mutex *mutex) NLIB_EXCLUDES(*mutex)
 再帰かつタイムアウト可能なミューテックスを初期化します。 [詳解]
 
errno_t nlib_mutex_lock (nlib_mutex *mutex) NLIB_ACQUIRE(*mutex)
 与えられたmutexをロックします。 [詳解]
 
errno_t nlib_mutex_trylock (nlib_mutex *mutex) NLIB_TRY_ACQUIRE(0
 mutexがロックされていない場合のみロックします。 [詳解]
 
errno_t nlib_mutex_trylock_for (nlib_mutex *mutex, nlib_duration delta) NLIB_TRY_ACQUIRE(0
 与えられたmutexをロックします。タイムアウトします。 [詳解]
 
static errno_t nlib_mutex_trylock_for_timespec (nlib_mutex *mutex, const struct timespec *tm) NLIB_TRY_ACQUIRE(0
 nlib_mutex_trylock_for()の引数にtimespec構造体を取るバージョンです。
 
errno_t nlib_mutex_unlock (nlib_mutex *mutex) NLIB_RELEASE(*mutex)
 与えられたmutex をアンロックします。 [詳解]
 
errno_t nlib_mutex_destroy (nlib_mutex *mutex) NLIB_EXCLUDES(*mutex)
 mutexオブジェクトを破壊し、関連付けられているリソース(あれば)を解放します。 [詳解]
 
typedef pthread_mutex_t nlib_mutex
 ミューテックス変数の型です。 [詳解]
 

セマフォ

errno_t nlib_semaphore_init (nlib_semaphore *sem, int initial_count)
 sem で指定されるセマフォオブジェクトを初期化する。 [詳解]
 
errno_t nlib_semaphore_wait (nlib_semaphore *sem)
 セマフォカウントが0でなくなるまで待って、セマフォカウントを1減少させる。 [詳解]
 
errno_t nlib_semaphore_trywait (nlib_semaphore *sem)
 セマフォカウントが0でなければ、セマフォカウントを1減少させる。 [詳解]
 
errno_t nlib_semaphore_trywait_for (nlib_semaphore *sem, nlib_duration duration)
 セマフォカウントが0でなければ、セマフォカウントを1減少させる。0の場合はduration の期間だけ待つ。 [詳解]
 
static errno_t nlib_semaphore_trywait_for_timespec (nlib_semaphore *sem, const struct timespec *tm)
 nlib_semaphore_trywait_for()の引数にtimespec構造体を取るバージョンです。
 
errno_t nlib_semaphore_post (nlib_semaphore *sem, int *previous_count)
 セマフォカウントを1つ増加させる。 [詳解]
 
errno_t nlib_semaphore_post_ex (nlib_semaphore *sem, int release_count, int *previous_count)
 セマフォカウントをreleaseCount 増加させる。 [詳解]
 
errno_t nlib_semaphore_destroy (nlib_semaphore *sem)
 セマフォオブジェクトを破壊する。 [詳解]
 
typedef sem_t nlib_semaphore
 セマフォオブジェクトの型です。 [詳解]
 

条件変数

pthreadの条件変数に準じたI/Fを提供しています。

#define NLIB_COND_INITIALIZER   PTHREAD_COND_INITIALIZER
 nlib_cond を静的に初期化するための定数です。
 
errno_t nlib_cond_init (nlib_cond *cond)
 条件変数を初期化します。 [詳解]
 
errno_t nlib_cond_signal (nlib_cond *cond)
 条件変数cond を待っているスレッドの1つの実行を再開させます。 [詳解]
 
errno_t nlib_cond_broadcast (nlib_cond *cond)
 条件変数cond を待っているスレッド全ての実行を再開させます。 [詳解]
 
errno_t nlib_cond_wait (nlib_cond *cond, nlib_mutex *mutex) NLIB_REQUIRES(*mutex)
 mutexをアンロックし、条件変数を待機します。実行が再開したらmutexを再ロックします。 [詳解]
 
errno_t nlib_cond_wait_for (nlib_cond *cond, nlib_mutex *mutex, nlib_duration duration) NLIB_REQUIRES(*mutex)
 mutexをアンロックし、条件変数をduration の間だけ待機します。実行が再開したらmutexを再ロックします。 [詳解]
 
static errno_t nlib_cond_wait_for_timespec (nlib_cond *cond, nlib_mutex *mutex, const struct timespec *tm) NLIB_REQUIRES(*mutex)
 nlib_cond_wait_for()の引数にtimespec構造体を取るバージョンです。
 
errno_t nlib_cond_wait_until (nlib_cond *cond, nlib_mutex *mutex, nlib_time abstime) NLIB_REQUIRES(*mutex)
 mutexをアンロックし、条件変数をabstimeまで待機します。実行が再開したらmutexを再ロックします。 [詳解]
 
static errno_t nlib_cond_wait_until_timespec (nlib_cond *cond, nlib_mutex *mutex, const struct timespec *tm) NLIB_REQUIRES(*mutex)
 nlib_cond_wait_until()の引数にtimespec構造体を取るバージョンです。
 
errno_t nlib_cond_destroy (nlib_cond *cond)
 条件変数オブジェクトを破壊します。 [詳解]
 
typedef pthread_cond_t nlib_cond
 条件変数オブジェクトの型です。 [詳解]
 

リードライトロック

リードライトロックは複数のリーダーによる同時アクセスを許可しつつ、更新時にはライターによる排他アクセスのみを許可する仕組みです。

#define NLIB_RWLOCK_INITIALIZER
 nlib_rwlockを静的に初期化するための定数です。
 
errno_t nlib_rwlock_init (nlib_rwlock *rwlock) NLIB_EXCLUDES(*rwlock)
 リードライトロックを初期化します。 [詳解]
 
errno_t nlib_rwlock_destroy (nlib_rwlock *rwlock) NLIB_EXCLUDES(*rwlock)
 リードライトロックオブジェクトを破壊します。 [詳解]
 
errno_t nlib_rwlock_rdlock (nlib_rwlock *rwlock) NLIB_ACQUIRE_SHARED(*rwlock)
 読み込みロックを取得しクリティカルセクションに入ります。取得できるまでブロックします。 [詳解]
 
errno_t nlib_rwlock_tryrdlock (nlib_rwlock *rwlock) NLIB_TRY_ACQUIRE_SHARED(0
 読み込みロックを取得しクリティカルセクションに入ることを試みます。 [詳解]
 
errno_t nlib_rwlock_tryrdlock_for (nlib_rwlock *rwlock, nlib_duration duration) NLIB_TRY_ACQUIRE_SHARED(0
 読み込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。 [詳解]
 
static errno_t nlib_rwlock_tryrdlock_for_timespec (nlib_rwlock *rwlock, const struct timespec *tm) NLIB_TRY_ACQUIRE_SHARED(0
 nlib_rwlock_tryrdlock_for()の引数にtimespec構造体を取るバージョンです。
 
errno_t nlib_rwlock_tryrdlock_until (nlib_rwlock *rwlock, nlib_time abstime) NLIB_TRY_ACQUIRE_SHARED(0
 読み込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。 [詳解]
 
static errno_t nlib_rwlock_tryrdlock_until_timespec (nlib_rwlock *rwlock, const struct timespec *tm) NLIB_TRY_ACQUIRE_SHARED(0
 nlib_rwlock_tryrdlock_until()の引数にtimespec構造体を取るバージョンです。
 
errno_t nlib_rwlock_rdunlock (nlib_rwlock *rwlock) NLIB_RELEASE_SHARED(*rwlock)
 読み込みロックを解放します。 [詳解]
 
errno_t nlib_rwlock_wrlock (nlib_rwlock *rwlock) NLIB_ACQUIRE(*rwlock)
 書き込みロックを取得しクリティカルセクションに入ります。取得できるまでブロックします。 [詳解]
 
errno_t nlib_rwlock_trywrlock (nlib_rwlock *rwlock) NLIB_TRY_ACQUIRE(0
 書き込みロックを取得しクリティカルセクションに入ることを試みます。 [詳解]
 
errno_t nlib_rwlock_trywrlock_for (nlib_rwlock *rwlock, nlib_duration duration) NLIB_TRY_ACQUIRE(0
 書き込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。 [詳解]
 
static errno_t nlib_rwlock_trywrlock_for_timespec (nlib_rwlock *rwlock, const struct timespec *tm) NLIB_TRY_ACQUIRE(0
 nlib_rwlock_trywrlock_for()の引数にtimespec構造体を取るバージョンです。
 
errno_t nlib_rwlock_trywrlock_until (nlib_rwlock *rwlock, nlib_time abstime) NLIB_TRY_ACQUIRE(0
 書き込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。 [詳解]
 
static errno_t nlib_rwlock_trywrlock_until_timespec (nlib_rwlock *rwlock, const struct timespec *tm) NLIB_TRY_ACQUIRE(0
 nlib_rwlock_trywrlock_until()の引数にtimespec構造体を取るバージョンです。
 
errno_t nlib_rwlock_wrunlock (nlib_rwlock *rwlock) NLIB_RELEASE(*rwlock)
 書き込みロックを解放します。 [詳解]
 
typedef struct nlib_rwlock_ nlib_rwlock
 リードライトロックオブジェクトの型です。 [詳解]
 

リードライトロック用条件変数

nlib_rwlockに対して利用することのできる条件変数です。

#define NLIB_CONDRWLOCK_INITIALIZER   { NLIB_COND_INITIALIZER, NLIB_MUTEX_INITIALIZER }
 nlib_condrwlockを静的に初期化するための定数です。
 
errno_t nlib_condrwlock_init (nlib_condrwlock *cond)
 リードライトロック用条件変数を初期化します。 [詳解]
 
errno_t nlib_condrwlock_destroy (nlib_condrwlock *cond)
 リードライトロック用条件変数を破壊します。 [詳解]
 
errno_t nlib_condrwlock_signal (nlib_condrwlock *cond)
 リードライトロック用条件変数cond を待っているスレッドの1つの実行を再開させます。 [詳解]
 
errno_t nlib_condrwlock_broadcast (nlib_condrwlock *cond)
 リードライトロック用条件変数cond を待っているスレッド全ての実行を再開させます。 [詳解]
 
errno_t nlib_condrwlock_wait (nlib_condrwlock *cond, nlib_rwlock *rwlock, int rdlock)
 rwlockをアンロックし、条件変数を待機します。実行が再開したらrwlockを再ロックします。 [詳解]
 
errno_t nlib_condrwlock_wait_for (nlib_condrwlock *cond, nlib_rwlock *rwlock, nlib_duration duration, int rdlock)
 rwlockをアンロックし、条件変数を待機します。実行が再開したらrwlockを再ロックします。 [詳解]
 
static errno_t nlib_condrwlock_wait_for_timespec (nlib_condrwlock *cond, nlib_rwlock *rwlock, const struct timespec *tm, int rdlock)
 nlib_condrwlock_wait_for_timespec()の引数にtimespec構造体を取るバージョンです。
 
errno_t nlib_condrwlock_wait_until (nlib_condrwlock *cond, nlib_rwlock *rwlock, nlib_time abstime, int rdlock)
 rwlockをアンロックし、条件変数を待機します。実行が再開したらrwlockを再ロックします。 [詳解]
 
static errno_t nlib_condrwlock_wait_until_timespec (nlib_condrwlock *cond, nlib_rwlock *rwlock, const struct timespec *tm, int rdlock)
 nlib_condrwlock_wait_until_timespec()の引数にtimespec構造体を取るバージョンです。
 
typedef struct nlib_condrwlock_ nlib_condrwlock
 リードライトロック用の条件変数の型です。 [詳解]
 

バリア

複数のスレッドを特定のタスクの完了に同期させます。繰り返し利用可能です。

説明
以下のコードでは、ThreadFunc関数内で4つのスレッドが2回待ち合わせを行っています。
bool Barrier() {
const int kNumThread = 4;
nlib_thread th[kNumThread];
nlib_barrier barrier;
errno_t e = nlib_barrier_init(&barrier, kNumThread);
SUCCEED_IF(e == 0);
for (int i = 0; i < kNumThread; ++i) { th[i] = NLIB_THREAD_INVALID; }
for (int i = 0; i < kNumThread; ++i) {
e = nlib_thread_create(&th[i], nullptr, [](void* p) {
nlib_barrier* pbarrier = reinterpret_cast<nlib_barrier*>(p);
nlib_printf("Thread %d Step1\n", GetMyThreadId());
nlib_barrier_wait(pbarrier); // blocks until kNumThread threads comes here
nlib_printf("Thread %d Step2\n", GetMyThreadId());
nlib_barrier_wait(pbarrier); // blocks until kNumThread threads comes here
}, &barrier);
SUCCEED_IF(e == 0);
}
for (int i = 0; i < kNumThread; ++i) { (void)nlib_thread_join(th[i]); }
(void)nlib_barrier_destroy(&barrier);
return true;
}
/*
Output:
Thread 9008 Step1
Thread 19996 Step1
Thread 9892 Step1
Thread 14120 Step1
Thread 14120 Step2
Thread 9008 Step2
Thread 19996 Step2
Thread 9892 Step2
*/
errno_t nlib_barrier_init (nlib_barrier *barrier, unsigned int count)
 バリアオブジェクトを初期化します。 [詳解]
 
errno_t nlib_barrier_destroy (nlib_barrier *barrier)
 バリアオブジェクトを破壊します。 [詳解]
 
errno_t nlib_barrier_wait (nlib_barrier *barrier)
 スレッドの待ち合わせを行います。 [詳解]
 
typedef struct nlib_barrier_ nlib_barrier
 バリアオブジェクトの型です。 [詳解]
 

アトミック関数用マクロ

#define NLIB_ATOMIC_RELAXED   __ATOMIC_RELAXED
 gccの__ATOMIC_RELAXEDやC++11のstd::memory_order_relaxedに準じます。
 
#define NLIB_ATOMIC_ACQUIRE   __ATOMIC_ACQUIRE
 gccの__ATOMIC_ACQUIREやC++11のstd::memory_order_acquireに準じます。
 
#define NLIB_ATOMIC_RELEASE   __ATOMIC_RELEASE
 gccの__ATOMIC_RELEASEやC++11のstd::memory_order_releaseに準じます。
 
#define NLIB_ATOMIC_ACQ_REL   __ATOMIC_ACQ_REL
 gccの__ATOMIC_ACQ_RELやC++11のstd::memory_order_acq_relに準じます。
 
#define NLIB_ATOMIC_SEQ_CST   __ATOMIC_SEQ_CST
 gccの__ATOMIC_SEQ_CSTやC++11のstd::memory_order_seq_cstに準じます。
 

アトミック関数(32 bit)

各関数のmemorder引数には、NLIB_ATOMIC_RELAXED, NLIB_ATOMIC_ACQUIRE, NLIB_ATOMIC_RELEASE, NLIB_ATOMIC_ACQ_REL, NLIB_ATOMIC_CST_SEQのいずれかを指定します。

説明
詳細については下記ドキュメントを参照してください。
参照
https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
int32_t nlib_atomic_load32 (const int32_t *ptr, int memorder)
 アトミックに値をロードします。動作はgccの__atomic_load_n()に準じます。
 
void nlib_atomic_store32 (int32_t *ptr, int32_t val, int memorder)
 アトミックに値をストアします。動作はgccの__atomic_store_n()に準じます。
 
int32_t nlib_atomic_exchange32 (int32_t *ptr, int32_t val, int memorder)
 アトミックに値を入れ替えます。動作はgccの__atomic_exchange_n()に準じます。
 
int nlib_atomic_compare_exchange32 (int32_t *ptr, int32_t *expected, int32_t desired, int weak, int success_memorder, int failure_memorder)
 アトミックな値の比較と入れ替えを行います。動作はgccの__atomic_compare_exchange_n()に準じます。
 
int32_t nlib_atomic_add_fetch32 (int32_t *ptr, int32_t val, int memorder)
 アトミックな値の加算を行います。動作はgccの__atomic_add_fetch()に準じます。
 
int32_t nlib_atomic_sub_fetch32 (int32_t *ptr, int32_t val, int memorder)
 アトミックな値の減算を行います。動作はgccの__atomic_sub_fetch()に準じます。
 
int32_t nlib_atomic_and_fetch32 (int32_t *ptr, int32_t val, int memorder)
 アトミックな値の論理積の計算を行います。動作はgccの__atomic_and_fetch()に準じます。
 
int32_t nlib_atomic_xor_fetch32 (int32_t *ptr, int32_t val, int memorder)
 アトミックな値の排他的論理和の計算を行います。動作はgccの__atomic_xor_fetch()に準じます。
 
int32_t nlib_atomic_or_fetch32 (int32_t *ptr, int32_t val, int memorder)
 アトミックな値の論理和の計算を行います。動作はgccの__atomic_or_fetch()に準じます。
 
int32_t nlib_atomic_fetch_add32 (int32_t *ptr, int32_t val, int memorder)
 アトミックな値の加算を行います。動作はgccの__atomic_fetch_add()に準じます。
 
int32_t nlib_atomic_fetch_sub32 (int32_t *ptr, int32_t val, int memorder)
 アトミックな値の減算を行います。動作はgccの__atomic_fetch_sub()に準じます。
 
int32_t nlib_atomic_fetch_and32 (int32_t *ptr, int32_t val, int memorder)
 アトミックな値の論理積の計算を行います。動作はgccの__atomic_fetch_and()に準じます。
 
int32_t nlib_atomic_fetch_xor32 (int32_t *ptr, int32_t val, int memorder)
 アトミックな値の排他的論理和の計算を行います。動作はgccの__atomic_fetch_xor()に準じます。
 
int32_t nlib_atomic_fetch_or32 (int32_t *ptr, int32_t val, int memorder)
 アトミックな値の論理和の計算を行います。動作はgccの__atomic_fetch_or()に準じます。
 

アトミック関数(64 bit)

各関数のmemorder引数には、NLIB_ATOMIC_RELAXED, NLIB_ATOMIC_ACQUIRE, NLIB_ATOMIC_RELEASE, NLIB_ATOMIC_ACQ_REL, NLIB_ATOMIC_CST_SEQのいずれかを指定します。

説明
詳細については下記ドキュメントを参照してください。
参照
https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
int64_t nlib_atomic_load64 (const int64_t *ptr, int memorder)
 アトミックに値をロードします。動作はgccの__atomic_load_n()に準じます。
 
void nlib_atomic_store64 (int64_t *ptr, int64_t val, int memorder)
 アトミックに値をストアします。動作はgccの__atomic_store_n()に準じます。
 
int64_t nlib_atomic_exchange64 (int64_t *ptr, int64_t val, int memorder)
 アトミックに値を入れ替えます。動作はgccの__atomic_exchange_n()に準じます。
 
int nlib_atomic_compare_exchange64 (int64_t *ptr, int64_t *expected, int64_t desired, int weak, int success_memorder, int failure_memorder)
 アトミックな値の比較と入れ替えを行います。動作はgccの__atomic_compare_exchange_n()に準じます。
 
int64_t nlib_atomic_add_fetch64 (int64_t *ptr, int64_t val, int memorder)
 アトミックな値の加算を行います。動作はgccの__atomic_add_fetch()に準じます。
 
int64_t nlib_atomic_sub_fetch64 (int64_t *ptr, int64_t val, int memorder)
 アトミックな値の減算を行います。動作はgccの__atomic_sub_fetch()に準じます。
 
int64_t nlib_atomic_and_fetch64 (int64_t *ptr, int64_t val, int memorder)
 アトミックな値の論理積の計算を行います。動作はgccの__atomic_and_fetch()に準じます。
 
int64_t nlib_atomic_xor_fetch64 (int64_t *ptr, int64_t val, int memorder)
 アトミックな値の排他的論理和の計算を行います。動作はgccの__atomic_xor_fetch()に準じます。
 
int64_t nlib_atomic_or_fetch64 (int64_t *ptr, int64_t val, int memorder)
 アトミックな値の論理和の計算を行います。動作はgccの__atomic_or_fetch()に準じます。
 
int64_t nlib_atomic_fetch_add64 (int64_t *ptr, int64_t val, int memorder)
 アトミックな値の加算を行います。動作はgccの__atomic_fetch_add()に準じます。
 
int64_t nlib_atomic_fetch_sub64 (int64_t *ptr, int64_t val, int memorder)
 アトミックな値の減算を行います。動作はgccの__atomic_fetch_sub()に準じます。
 
int64_t nlib_atomic_fetch_and64 (int64_t *ptr, int64_t val, int memorder)
 アトミックな値の論理積の計算を行います。動作はgccの__atomic_fetch_and()に準じます。
 
int64_t nlib_atomic_fetch_xor64 (int64_t *ptr, int64_t val, int memorder)
 アトミックな値の排他的論理和の計算を行います。動作はgccの__atomic_fetch_xor()に準じます。
 
int64_t nlib_atomic_fetch_or64 (int64_t *ptr, int64_t val, int memorder)
 アトミックな値の論理和の計算を行います。動作はgccの__atomic_fetch_or()に準じます。
 

アトミック関数(ポインタ型)

各関数のmemorder引数には、NLIB_ATOMIC_RELAXED, NLIB_ATOMIC_ACQUIRE, NLIB_ATOMIC_RELEASE, NLIB_ATOMIC_ACQ_REL, NLIB_ATOMIC_CST_SEQのいずれかを指定します。

説明
詳細については下記ドキュメントを参照してください。
参照
https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
void * nlib_atomic_loadptr (void *const *ptr, int memorder)
 アトミックに値をロードします。動作はgccの__atomic_load_n()に準じます。
 
void nlib_atomic_storeptr (void **ptr, void *val, int memorder)
 アトミックに値をストアします。動作はgccの__atomic_store_n()に準じます。
 
void * nlib_atomic_exchangeptr (void **ptr, void *val, int memorder)
 アトミックに値を入れ替えます。動作はgccの__atomic_exchange_n()に準じます。
 
int nlib_atomic_compare_exchangeptr (void **ptr, void **expected, void *desired, int weak, int success_memorder, int failure_memorder)
 アトミックな値の比較と入れ替えを行います。動作はgccの__atomic_compare_exchange_n()に準じます。
 

メモリバリア

各関数のmemorder引数には、NLIB_ATOMIC_RELAXED, NLIB_ATOMIC_ACQUIRE, NLIB_ATOMIC_RELEASE, NLIB_ATOMIC_ACQ_REL, NLIB_ATOMIC_CST_SEQのいずれかを指定します。

説明
詳細については下記ドキュメントを参照してください。
参照
https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
void nlib_atomic_thread_fence (int memorder)
 指定されたメモリバリアを配置します。
 

1回のみの実行

特定の処理が1回だけ実行されることを保証するための仕組みです。

説明
以下のコードでは、ThreadFunc関数を4つのスレッドが実行しますが、OnceFunc関数を実行するのは1つのスレッドだけです。 更に他のスレッドはOnceFunc関数の実行が完了するまで先の処理を実行することはありません。
void ThreadFunc(void*) {
static nlib_onceflag onceflag = NLIB_ONCE_INIT; // static initialization required
nlib_printf("Thread #%d: start\n", GetMyThreadId());
nlib_once(&onceflag, []() { // nlib_oncefunc
nlib_printf("OnceFunc start\n");
nlib_sleep(nlib_ns::TimeSpan(0, 2).ToTimeValue().tick); // 2000 msec
nlib_printf("OnceFunc end\n");
});
nlib_printf("Thread #%d: end\n", GetMyThreadId());
}
bool Once() {
const int kNumThread = 4;
nlib_thread th[kNumThread];
for (int i = 0; i < kNumThread; ++i) { th[i] = NLIB_THREAD_INVALID; }
for (int i = 0; i < kNumThread; ++i) {
errno_t e = nlib_thread_create(&th[i], nullptr, ThreadFunc, nullptr);
SUCCEED_IF(e == 0);
}
for (int i = 0; i < kNumThread; ++i) { (void)nlib_thread_join(th[i]); }
ThreadFunc(nullptr);
return true;
}
/*
Output:
Thread #19972: start
Thread #892: start
OnceFunc start
Thread #13624: start
Thread #10668: start
OnceFunc end
Thread #19972: end
Thread #10668: end
Thread #13624: end
Thread #892: end
Thread #19176: start
Thread #19176: end
*/
#define NLIB_ONCE_INIT   { 0 }
 nlib_onceflagを静的に初期化するための値
 
errno_t nlib_once (nlib_onceflag *flag, nlib_oncefunc func)
 func を高々1回しか実行されないようします。 [詳解]
 
typedef struct nlib_onceflag_ nlib_onceflag
 nlib_onceで利用される構造体
 
typedef void(* nlib_oncefunc) (void)
 nlib_onceで実行される関数の型
 

メッセージキュー

nlibのメッセージキューの特徴についてはnlib_mq_open()をご覧ください。

errno_t nlib_mq_open (nlib_mq *mq, const nlib_mq_attr *attr)
 スレッド間でメッセージをやりとりするためのメッセージキューを作成します。 [詳解]
 
errno_t nlib_mq_getattr (nlib_mq mq, nlib_mq_attr *attr)
 ハンドルで示されるメッセージキューに設定されている属性を取得します。 [詳解]
 
errno_t nlib_mq_close (nlib_mq mq)
 ハンドルで示されるメッセージキューをクローズします。 [詳解]
 
errno_t nlib_mq_readonly (nlib_mq mq)
 ハンドルで示されるメッセージキューを受信専用にします。 [詳解]
 
errno_t nlib_mq_send (nlib_mq mq, nlib_mq_msg msg, int prio)
 メッセージをキューに送信します。 [詳解]
 
errno_t nlib_mq_send_until (nlib_mq mq, nlib_mq_msg msg, int prio, nlib_time abstime)
 メッセージをキューにタイムアウトつきで送信します。 [詳解]
 
errno_t nlib_mq_receive (nlib_mq mq, nlib_mq_msg *msg, int *prio)
 メッセージをキューから受信します。受信したメッセージはユーザーがデストラクタ関数で削除する必要があります。 [詳解]
 
errno_t nlib_mq_receive_until (nlib_mq mq, nlib_mq_msg *msg, int *prio, nlib_time abstime)
 メッセージをキューからタイムアウトつきで受信します。受信したメッセージはユーザーがデストラクタ関数で削除する必要があります。 [詳解]
 
errno_t nlib_mq_drop (nlib_mq mq, nlib_mq_msg *msg, int *prio)
 キューに存在する最低の優先度のメッセージをキューから受信します。受信したメッセージはユーザーがデストラクタ関数で削除する必要があります。 [詳解]
 
typedef int32_t nlib_mq
 メッセージキューに関連付けられるハンドルです。ハンドルがゼロクリア(memset()を利用してください)された場合、必ず無効ハンドルとなります。
 
typedef void * nlib_mq_msg
 メッセージキューに格納されるメッセージの型です。
 
typedef void(* nlib_mq_msg_destructor) (nlib_mq_msg)
 メッセージキューから取り出したメッセージのデストラクタ関数です。
 
int32_t nlib_mq_attr::flag
 メッセージキューを作成する際の設定です。 [詳解]
 
int32_t nlib_mq_attr::max_msg
 メッセージキューの作成の際に最大メッセージ数を設定することができます。
 
int32_t nlib_mq_attr::cur_msg
 ロックフリーなキュー以外の場合、現在メッセージキューに存在するメッセージ数を取得できます。
 
nlib_mq_msg_destructor nlib_mq_attr::destructor
 メッセージキューから取り出したメッセージのデストラクタ関数を設定、取得できます。
 

スレッド

#define NLIB_THREAD_INVALID   (nlib_thread)(0)
 無効なスレッドを指し示す値
 
#define nlib_yield   NLIB_CAPI(nlib_yield)
 スレッドの実行権を手放す。 [詳解]
 
#define nlib_thread_exit   NLIB_CAPI(nlib_thread_exit)
 呼び出しスレッドを終了します。 [詳解]
 
#define nlib_thread_exit_cpp   NLIB_CAPI(nlib_thread_exit_cpp)
 呼び出しスレッドを終了します。 [詳解]
 
static void nlib_pause (void)
 ごく短期間の間ウェイトします。 [詳解]
 
errno_t nlib_thread_create (nlib_thread *thread, const nlib_thread_attr *attr, nlib_thread_func func, void *arg)
 新しいスレッド作成して実行します。 [詳解]
 
errno_t nlib_thread_join (nlib_thread thread)
 スレッドの終了を待ちます。 [詳解]
 
errno_t nlib_thread_detach (nlib_thread thread)
 実行中のスレッドをデタッチ状態にします。 [詳解]
 
errno_t nlib_thread_self (nlib_thread *thread)
 実行中のスレッドに対応するnlib_threadの値を格納する。 [詳解]
 
errno_t nlib_thread_getconcurrency (unsigned int *num_cpu)
 ハードウェアスレッドの数を取得します。 [詳解]
 
errno_t nlib_thread_getid (nlib_thread_id *id)
 実行中のスレッドに対応する一意の整数値を格納する。 [詳解]
 
int nlib_thread_equal (nlib_thread th1, nlib_thread th2)
 2つのスレッドが同一スレッドを指すかどうかチェックします。 [詳解]
 
errno_t nlib_thread_getcpu (int *result)
 呼び出したスレッドが実行されているCPUを取得します。 [詳解]
 
errno_t nlib_thread_setaffinity (nlib_thread thread, uint32_t affinity)
 指定されたスレッドのプロセッサアフィニティマスクを設定します。 [詳解]
 
errno_t nlib_thread_setname (nlib_thread thread, const char *name)
 スレッドに名前をつけます。 [詳解]
 
errno_t nlib_thread_getname (nlib_thread thread, char *name, size_t len)
 スレッド名を取得します。 [詳解]
 
errno_t nlib_thread_attr_init (nlib_thread_attr *attr)
 スレッド属性オブジェクトを初期化して、デフォルトに設定する。 [詳解]
 
errno_t nlib_thread_attr_setint (nlib_thread_attr *attr, int key, int value)
 スレッドの属性オブジェクトのキーに対応する整数を設定する。 [詳解]
 
errno_t nlib_thread_attr_getint (const nlib_thread_attr *attr, int key, int *value)
 スレッドの属性オブジェクトのキーに対応する整数を取得する。 [詳解]
 
errno_t nlib_thread_attr_setptr (nlib_thread_attr *attr, int key, void *value)
 スレッドの属性オブジェクトのキーに対応するポインタを設定する。現在のところEINVALのみを返します。 [詳解]
 
errno_t nlib_thread_attr_getptr (const nlib_thread_attr *attr, int key, void **value)
 スレッドの属性オブジェクトのキーに対応するポインタを取得する。現在のところEINVALのみを返します。 [詳解]
 
errno_t nlib_thread_attr_setstack (nlib_thread_attr *attr, void *stack_addr, size_t stack_size)
 スレッドの属性オブジェクトのスタック設定を設定します。 [詳解]
 
errno_t nlib_thread_attr_getstack (const nlib_thread_attr *attr, void **stack_addr, size_t *stack_size)
 スレッドの属性オブジェクトのスタック設定を取得する。 [詳解]
 
errno_t nlib_thread_attr_destroy (nlib_thread_attr *attr)
 スレッド初期化オブジェクトを破壊します。 [詳解]
 
errno_t nlib_thread_getpriority (nlib_thread thread, int *priority)
 スレッドの現在の実行優先度を取得します。数値の意味は実装依存です。 [詳解]
 
errno_t nlib_thread_setpriority (nlib_thread thread, int priority)
 スレッドの実行優先度を設定します。数値の意味は実装依存です。 [詳解]
 
errno_t nlib_thread_priority_min (int *priority)
 実行優先度に指定できる数値の最小値を取得します。 [詳解]
 
errno_t nlib_thread_priority_max (int *priority)
 実行優先度に指定できる数値の最大値を取得します。 [詳解]
 
errno_t nlib_thread_priority_default (int *priority)
 実行優先度に指定できる数値のデフォルト値を取得します。 [詳解]
 
void nlib_thread_cleanup_push (void(*fn)(void *), void *arg)
 fnを専用のスタックにプッシュします。 [詳解]
 
void nlib_thread_cleanup_pop (int exec)
 クリーンアップハンドラが格納されているスタックの一番上のハンドラを削除します。 [詳解]
 
typedef pthread_t nlib_thread
 スレッドを指し示す識別子 [詳解]
 
typedef struct nlib_thread_attr_ nlib_thread_attr
 新しく作られるスレッドに適用されるスレッド属性
 
typedef void(* nlib_thread_func) (void *arg)
 別スレッドで実行される関数 [詳解]
 
typedef int nlib_thread_id
 スレッド毎にユニークな整数値
 

デバック, デバック出力

#define nlib_debug_break   NLIB_CAPI(nlib_debug_break)
 ブレークポイントになります。 [詳解]
 
errno_t nlib_write_stdout (size_t *result, const void *buf, size_t count)
 標準出力に文字列を書き出します。 [詳解]
 
errno_t nlib_write_stderr (size_t *result, const void *buf, size_t count)
 標準エラー出力に文字列を書き出します。 [詳解]
 
errno_t nlib_debug_backtrace (size_t *result, void **buffer, size_t count)
 バックトレースをbuffer が指す配列に格納します。 [詳解]
 
errno_t nlib_debug_backtrace_gettext (char *str, size_t strbufsize, void *const *buf, size_t count)
 nlib_debug_backtrace()で得られた情報から文字列情報を作成します。 [詳解]
 
errno_t nlib_getenv (size_t *result, char *buf, size_t bufsize, const char *varname)
 環境変数の値を文字列で取得します。 [詳解]
 

ロギング

ログを標準出力やsyslog, 及びファイルに出力します。

説明
nlib_log_attr_setint()によってどの優先度のログをどの出力先に出力するかを決めて、nlib_log_print()によって優先度と識別用のタグを指定したテキスト出力が可能です。
以下がコード例です。
kNlibLogWarn | kNlibLogLevelEqualOrAbove, // priority: output if warn, error, fatal level
kNlibLogAttrStderr, // channel: stdout,stderr,fd, ...
1 // 0: OFF, otherwise: ON
);
const char* tag = "tag_to_grep";
nlib_log_print(kNlibLogVerbose, tag, "Verbose level not displayed");
nlib_log_print(kNlibLogDebug, tag, "Debug level not displayed");
nlib_log_print(kNlibLogWarn, tag, "Warn level displayed");
nlib_log_print(kNlibLogError, tag, "Error level displayed");
nlib_log_print(kNlibLogError, tag, "Fatal level displayed");
/*
Output:
tag_to_grep: Warn level displayed
tag_to_grep: Error level displayed
tag_to_grep: Fatal level displayed
*/
enum  nlib_log_priority
 出力の優先度(種類)を定義しています。 [詳解]
 
int nlib_log_print (int prio, const char *tag, const char *fmt,...)
 ログメッセージを出力します。 [詳解]
 
int nlib_log_vprint (int prio, const char *tag, const char *fmt, va_list ap)
 ログメッセージを出力します。 [詳解]
 
errno_t nlib_log_attr_setint (int prio, int key, int value)
 優先度ごとの出力先の指定を行います。 [詳解]
 

ファイル

#define NLIB_FD_O_RDONLY   O_RDONLY
 nlib_fd_open()flags 引数で使われます。
 
#define NLIB_FD_O_WRONLY   O_WRONLY
 nlib_fd_open()flags 引数で使われます。
 
#define NLIB_FD_O_RDWR   O_RDWR
 nlib_fd_open()flags 引数で使われます。
 
#define NLIB_FD_O_APPEND   O_APPEND
 nlib_fd_open()flags 引数で使われます。
 
#define NLIB_FD_O_CREAT   O_CREAT
 nlib_fd_open()flags 引数で使われます。
 
#define NLIB_FD_O_TRUNC   O_TRUNC
 nlib_fd_open()flags 引数で使われます。
 
#define NLIB_FD_O_EXCL   O_EXCL
 nlib_fd_open()flags 引数で使われます。
 
#define NLIB_SEEK_SET   SEEK_SET
 nlib_fd_seek()whence 引数で使われます。
 
#define NLIB_SEEK_CUR   SEEK_CUR
 nlib_fd_seek()whence 引数で使われます。
 
#define NLIB_FD_INVALID   (-1)
 無効なファイルディスクリプタを定義したマクロです。
 
errno_t nlib_fd_open (nlib_fd *fd, const char *native_path, unsigned int flags, int mode)
 ファイルをオープンします。 [詳解]
 
static errno_t nlib_fd_creat (nlib_fd *fd, const char *native_path, int mode)
 nlib_fd_open(fd, native_path, NLIB_FD_O_CREAT | NLIB_FD_O_WRONLY | NLIB_FD_O_EXCL, mode)と等価です。 ファイルが既に存在する場合は失敗することに注意してください。
 
errno_t nlib_fd_close (nlib_fd fd)
 ファイルをクローズします。エラーを返した場合でもファイルディスクリプタは解放されます。 [詳解]
 
errno_t nlib_fd_read (size_t *result, nlib_fd fd, void *buf, size_t count)
 ファイルディスクリプタから、(最大)count バイトをbuf に読むこみます。 [詳解]
 
errno_t nlib_fd_write (size_t *result, nlib_fd fd, const void *buf, size_t count)
 ファイルディスクリプタへ、(最大)count バイトをbuf から書きこみます。 [詳解]
 
errno_t nlib_fd_seek (nlib_offset *result, nlib_fd fd, nlib_offset offset, int whence)
 ファイルのオフセットを変更する。 [詳解]
 
errno_t nlib_fd_pread (size_t *result, nlib_fd fd, void *buf, size_t count, nlib_offset offset)
 指定したオフセットでファイルディスクリプタから読みこみます。ファイルディスクリプタのオフセットは変更されません。 [詳解]
 
errno_t nlib_fd_pwrite (size_t *result, nlib_fd fd, const void *buf, size_t count, nlib_offset offset)
 指定したオフセットでファイルディスクリプタに書きこみます。ファイルディスクリプタのオフセットは変更されません。 [詳解]
 
errno_t nlib_fd_truncate (nlib_fd fd, nlib_offset length)
 指定した長さにファイルを延長、もしくは切り詰める。 [詳解]
 
errno_t nlib_fd_getsize (nlib_offset *size, nlib_fd fd)
 ファイルサイズを取得します。 [詳解]
 
errno_t nlib_fd_flush (nlib_fd fd)
 ファイルディスクリプタへの書き込みをフラッシュします。 [詳解]
 
errno_t nlib_fd_sync (nlib_fd fd)
 メモリにあるファイルの内容をデバイス上のものと同期させます。 [詳解]
 
errno_t nlib_fd_native_handle (void **native_handle, nlib_fd fd)
 ネイティブのファイルハンドル(に相当するもの)を取得する。 [詳解]
 
errno_t nlib_fd_readv (size_t *result, nlib_fd fd, const nlib_fd_iovec *iov, int iovcnt)
 fdに関連付けられたファイルから複数の非連続なバッファへの読み込みを行います。 [詳解]
 
errno_t nlib_fd_writev (size_t *result, nlib_fd fd, const nlib_fd_iovec *iov, int iovcnt)
 複数の非連続なバッファからfdに関連付けられたファイルへの書き込みを行います。 [詳解]
 
errno_t nlib_fd_preadv (size_t *result, nlib_fd fd, const nlib_fd_iovec *iov, int iovcnt, nlib_offset offset)
 内部でpread()又はnlib_fd_pread()を使うこと以外は、nlib_fd_readv()と同様です。
 
errno_t nlib_fd_pwritev (size_t *result, nlib_fd fd, const nlib_fd_iovec *iov, int iovcnt, nlib_offset offset)
 内部でpwrite()又はnlib_fd_pwrite()を使うこと以外は、nlib_fd_writev()と同様です。
 
errno_t nlib_unlink (const char *native_path)
 ファイルを削除する [詳解]
 
errno_t nlib_mkdir (const char *native_path, unsigned int flags)
 ディレクトリを作成する [詳解]
 
errno_t nlib_rmdir (const char *native_path)
 ディレクトリを削除する [詳解]
 
errno_t nlib_remove (const char *native_path)
 ファイルまたはディレクトリを削除します。ファイルに対してはnlib_unlink()を、ディレクトリに対してはnlib_rmdir()を呼び出します。
 
errno_t nlib_rename (const char *old_path, const char *new_path)
 ファイル名の変更する [詳解]
 
errno_t nlib_dir_open (nlib_dir *dir, const char *native_path)
 ディレクトリをオープンする [詳解]
 
errno_t nlib_dir_close (nlib_dir dir)
 ディレクトリをクローズする [詳解]
 
errno_t nlib_dir_read (nlib_dirent *ent, nlib_dir dir)
 ディレクトリエントリがあればそれをを1つ読み込む。 [詳解]
 
errno_t nlib_is_dir (int *result, const char *native_path)
 パスがディレクトリかどうかを検査します。パスが存在しない場合は*resultに0を設定し、0を返します。 [詳解]
 
errno_t nlib_exist_path (int *result, const char *native_path)
 パスが存在するかどうかを検査します。 [詳解]
 
errno_t nlib_disk_freespace (const char *native_path, uint64_t *free_bytes_available, uint64_t *total_bytes, uint64_t *total_free_bytes)
 指定されたパスが属するストレージの容量に関する情報を取得します。 [詳解]
 
const char * nlib_basename (const char *path)
 
const char * nlib_dirname (size_t *len, const char *path)
 
errno_t nlib_mkostemps (nlib_fd *fd, char *templ, int suffixlen, int flags)
 ユニークで推測されにくい名前を持つ一時ファイルを作成します。 [詳解]
 
errno_t nlib_fd_fileid (nlib_fileid *result, nlib_fd fd)
 
errno_t nlib_readlink (size_t *len, const char *native_path, char *buf, size_t bufsize)
 シンボリックリンクを解決します。 [詳解]
 
typedef int64_t nlib_offset
 ファイルへのオフセットです。64bit整数です。
 
typedef int nlib_fd
 (nlib独自の)ファイルディスクリプタで、32bit整数です。 [詳解]
 

printf

各種標準ライブラリのprintfの違いを吸収するための関数です。

説明
printfのフォーマット文字列の記述には移植性のために気をつける必要がある場合があります。以下の記述を参考にしてください。
参照
https://google.github.io/styleguide/cppguide.html#64-bit_Portability
http://www.textdrop.net/google-styleguide-ja/cppguide.xml#64%E3%83%93%E3%83%83%E3%83%88%E3%81%AE%E7%A7%BB%E6%A4%8D%E6%80%A7
#define PRIdS   __PRIS_PREFIX "d"
 size_tの型をprintfで表示する場合に利用します。%zdに相当します。
 
#define PRIxS   __PRIS_PREFIX "x"
 size_tの型をprintfで表示する場合に利用します。%zxに相当します。
 
#define PRIuS   __PRIS_PREFIX "u"
 size_tの型をprintfで表示する場合に利用します。%zuに相当します。
 
#define PRIXS   __PRIS_PREFIX "X"
 size_tの型をprintfで表示する場合に利用します。%zXに相当します。
 
#define PRIoS   __PRIS_PREFIX "o"
 size_tの型をprintfで表示する場合に利用します。%zoに相当します。
 
errno_t nlib_vsnprintf (size_t *count, char *buf, size_t size, const char *fmt, va_list args)
 より安全な形式のvsnprintfで、標準のvsnprintfの動作の違いも吸収します。 [詳解]
 
template<size_t N>
errno_t nlib_vsnprintf (size_t *count, char(&buf)[N], const char *fmt, va_list args) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_snprintf (size_t *count, char *buf, size_t size, const char *fmt,...)
 より安全な形式のsnprintfです。
 
template<size_t N>
errno_t nlib_snprintf (size_t *count, char(&buf)[N], const char *fmt,...) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_vdprintf (nlib_fd fd, size_t *count, const char *fmt, va_list args)
 ファイルディスクリプタに出力するvsnprintf()です。
 
errno_t nlib_dprintf (nlib_fd fd, size_t *count, const char *fmt,...)
 ファイルディスクリプタに出力するsnprintf()です。
 
int nlib_printf (const char *fmt,...)
 printf()の代替です。
 
errno_t nlib_vsnwprintf (size_t *count, wchar_t *buf, size_t size, const wchar_t *fmt, va_list args)
 より安全な形式のvswprintfで、各種vswprintfの動作の違いも吸収します。 [詳解]
 
template<size_t N>
errno_t nlib_vsnwprintf (size_t *count, wchar_t(&buf)[N], const wchar_t *fmt, va_list args) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_snwprintf (size_t *count, wchar_t *buf, size_t size, const wchar_t *fmt,...)
 より安全な形式のsnwprintfです。
 
template<size_t N>
errno_t nlib_snwprintf (size_t *count, wchar_t(&buf)[N], const wchar_t *fmt,...) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_vdwprintf (nlib_fd fd, size_t *count, const wchar_t *fmt, va_list args)
 ファイルディスクリプタに出力するvsnwprintfです。
 
errno_t nlib_dwprintf (nlib_fd fd, size_t *count, const wchar_t *fmt,...)
 ファイルディスクリプタに出力するsnwprintf()です。
 
int nlib_wprintf (const wchar_t *fmt,...)
 wprintf()の代替です。
 

メモリ領域のコピー、比較、探索

static errno_t nlib_memmove (void *s1, size_t s1max, const void *s2, size_t n)
 N1078のmemmove_sに相当する実装です。 [詳解]
 
static errno_t nlib_memset (void *buf, int ch, size_t n)
 内部でmemset(buf, ch, n)相当の関数を呼び出します。 [詳解]
 
void * nlib_memccpy (void *dest, size_t dest_size, const void *src, size_t src_size, int c)
 cが見つかるまでコピーを行います。見つかった場合そこでコピーを中止します。 [詳解]
 
int nlib_memcmp (const void *buf1, const void *buf2, size_t n)
 buf1buf2 を先頭からn バイト分unsigned charとして比較します。 [詳解]
 
const void * nlib_memchr (const void *s, int c, size_t n)
 メモリ領域[s, s + n)の先頭からn バイトを検索して、バイトc があるポインタを返します。 [詳解]
 
const void * nlib_memrchr (const void *s, int c, size_t n)
 メモリ領域[s, s + n)の後方からn バイトを検索して、バイトc があるポインタを返します。 [詳解]
 
const void * nlib_memchr_not (const void *s, int c, size_t n)
 メモリ領域[s, s + n)の先頭からn バイトを検索して、バイトc でないポインタを返します。 [詳解]
 
const void * nlib_memchr_range_not (const void *s, const char *range, size_t n)
 メモリ領域[s, s + n)の先頭からn バイトを検索して、最初のrange に含まない文字へのポインタを返します。 [詳解]
 
const void * nlib_memchr_lt (const void *s, int c, size_t n)
 メモリ領域[s, s + n)の先頭からn バイトを検索して、バイトc 未満の文字があるデータへのポインタを返します。 [詳解]
 
const void * nlib_memchr_gt (const void *s, int c, size_t n)
 メモリ領域[s, s + n)の先頭からn バイトを検索して、バイトc より大きいの文字があるデータへのポインタを返します。 [詳解]
 
const void * nlib_memchr_mb (const void *s, size_t n)
 メモリ領域[s, s + n)の先頭からn バイトを検索して、0x80以上のバイトが格納されている場所へのポインタを返します。 [詳解]
 
size_t nlib_memspn (const void *buf, size_t len, const char *set, size_t n)
 bufの先頭から続く部分バイト列の長さを返します。 部分バイト列は、setに含まれるバイトのみで構成されます。 [詳解]
 
size_t nlib_memcspn (const void *buf, size_t len, const char *set, size_t n)
 bufの先頭から続く部分バイト列の長さを返します。 部分バイト列は、setに含まれるバイト以外のみで構成されます。 [詳解]
 

ヌル終端文字列のための関数

const char * nlib_skipws (size_t *cnt_lf, const char **last_lf, const char *s, size_t n)
 n 個の文字から成る文字列を探索して最初の空白でない文字へのポインタを返します。 [詳解]
 
size_t nlib_strlen (const char *s)
 内部でstrlen()を呼び出します。独自の実装が動作する場合もあります。 [詳解]
 
size_t nlib_strnlen (const char *s, size_t maxsize)
 N1078のstrnlen_sに相当する実装です。 [詳解]
 
errno_t nlib_strcpy (char *s1, size_t s1max, const char *s2)
 N1078のstrcpy_sに相当する実装です。 [詳解]
 
template<size_t N>
errno_t nlib_strcpy (char(&s1)[N], const char *s2) noexcept
 上記関数のテンプレートオーバーロードです。
 
template<size_t N>
size_t nlib_strlcpy (char(&s1)[N], const char *s2) noexcept
 nlib_strlcpy(s1, s2, N)を呼び出します。
 
errno_t nlib_strncpy (char *s1, size_t s1max, const char *s2, size_t n)
 N1078のstrncpy_sに相当する実装です。 [詳解]
 
template<size_t N>
errno_t nlib_strncpy (char(&s1)[N], const char *s2, size_t n) noexcept
 上記関数のテンプレートオーバーロードです。
 
const char * nlib_strchr (const char *s, int c)
 文字列の先頭から文字を検索します。 [詳解]
 
const char * nlib_strrchr (const char *s, int c)
 文字列の末尾から文字を検索します。 [詳解]
 
size_t nlib_wcslen (const wchar_t *s)
 内部でwcslen()を呼び出します。独自の実装が動作する場合もあります。 [詳解]
 
size_t nlib_wcsnlen (const wchar_t *s, size_t maxsize)
 N1078のwcsnlen_sに相当する実装です。 [詳解]
 
errno_t nlib_wcscpy (wchar_t *s1, size_t s1max, const wchar_t *s2)
 N1078のwcscpy_sに相当する実装です。 [詳解]
 
template<size_t N>
errno_t nlib_wcscpy (wchar_t(&s1)[N], const wchar_t *s2) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_wcsncpy (wchar_t *s1, size_t s1max, const wchar_t *s2, size_t n)
 N1078のwcsncpy_sに相当する実装です。 [詳解]
 
template<size_t N>
errno_t nlib_wcsncpy (wchar_t(&s1)[N], const wchar_t *s2, size_t n) noexcept
 上記関数のテンプレートオーバーロードです。
 

strtol()代替

strtol()を代替します。詳しくはnlib_strto_int32()の項目を御覧ください。

errno_t nlib_strto_int32 (int32_t *result, const char *nptr, char **endptr, int base)
 文字列をint32_t型に変換します。 [詳解]
 
errno_t nlib_strto_int64 (int64_t *result, const char *nptr, char **endptr, int base)
 文字列をint64_t型に変換します。詳しくはnlib_strto_int32()を参照してください。
 
errno_t nlib_strto_uint32 (uint32_t *result, const char *nptr, char **endptr, int base)
 文字列をuint32_t型に変換します。詳しくはnlib_strto_int32()を参照してください。
 
errno_t nlib_strto_uint64 (uint64_t *result, const char *nptr, char **endptr, int base)
 文字列をuint64_t型に変換します。詳しくはnlib_strto_int32()を参照してください。
 
errno_t nlib_strto_double (double *result, const char *nptr, char **endptr)
 文字列をdouble型に変換します。詳しくはnlib_strto_int32()を参照してください。
 
errno_t nlib_strto_float (float *result, const char *nptr, char **endptr)
 文字列をfloat型に変換します。詳しくはnlib_strto_int32()を参照してください。
 
errno_t nlib_strto_int32_fallback (int32_t *result, const char *nptr, char **endptr, int base)
 C標準関数を使わずに文字列をint32_t型に変換します。詳しくはnlib_strto_int32()を参照してください。
 
errno_t nlib_strto_int64_fallback (int64_t *result, const char *nptr, char **endptr, int base)
 C標準関数を使わずに文字列をint64_t型に変換します。詳しくはnlib_strto_int32()を参照してください。
 
errno_t nlib_strto_uint32_fallback (uint32_t *result, const char *nptr, char **endptr, int base)
 C標準関数を使わずに文字列をuint32_t型に変換します。詳しくはnlib_strto_int32()を参照してください。
 
errno_t nlib_strto_uint64_fallback (uint64_t *result, const char *nptr, char **endptr, int base)
 C標準関数を使わずに文字列をuint64_t型に変換します。詳しくはnlib_strto_int32()を参照してください。
 
errno_t nlib_strto_double_fallback (double *result, const char *nptr, char **endptr)
 C標準関数を使わずに文字列をdouble型に変換します。詳しくはnlib_strto_int32()を参照してください。
 
errno_t nlib_strto_float_fallback (float *result, const char *nptr, char **endptr)
 C標準関数を使わずに文字列をfloat型に変換します。詳しくはnlib_strto_int32()を参照してください。
 

strtol()代替その2

C++17で導入されているfrom_chars()を用いた実装です。標準C++ライブラリに存在しない場合は代替実装が用いられます。詳しくはnlib_int32_from_chars()の項目を御覧ください。

説明
strtol()と異なり先頭の空白はスキップされず、'0x'や'0X'は16進数のプレフィックスとは解釈されません。また、符号の'+'は数値の一部として認識されません。 以下がコーディング例です。
int32_t result;
const char* text;
const char* endptr;
// returns 0 and set 'result' 12345. endptr also moves forward.
text = "12345;";
e = nlib_int32_from_chars(&result, &endptr, text, text + nlib_strlen(text), 10);
nlib_printf("result=%d, ERROR=%s, *endptr='%c'\n", result, nlib_error_string(e), *endptr);
// returns ERANGE if overflow, and result_i8 unchanged, but endptr moves forward.
int8_t result_i8;
e = nlib_int8_from_chars(&result_i8, &endptr, text, text + nlib_strlen(text), 10);
nlib_printf("ERROR=%s, *endptr='%c'\n", nlib_error_string(e), *endptr);
// returns EINVAL and spaces are not skipped. endptr does not move forwad.
text = ";12345";
e = nlib_int32_from_chars(&result, &endptr, text, text + nlib_strlen(text), 10);
nlib_printf("ERROR=%s, *endptr='%c'\n", nlib_error_string(e), *endptr);
/*
Output:
result=12345, ERROR=OK, *endptr=';'
ERROR=ERANGE, *endptr=';'
ERROR=EINVAL, *endptr=';'
*/
errno_t nlib_int32_from_chars (int32_t *result, const char **endptr, const char *first, const char *last, int base)
 文字列をint32_t型に変換します。 [詳解]
 
errno_t nlib_int64_from_chars (int64_t *result, const char **endptr, const char *first, const char *last, int base)
 文字列をint64_t型に変換します。詳しくはnlib_int32_from_chars()の項目を御覧ください。
 
errno_t nlib_int8_from_chars (int8_t *result, const char **endptr, const char *first, const char *last, int base)
 文字列をint8_t型に変換します。詳しくはnlib_int32_from_chars()の項目を御覧ください。
 
errno_t nlib_int16_from_chars (int16_t *result, const char **endptr, const char *first, const char *last, int base)
 文字列をint16_t型に変換します。詳しくはnlib_int32_from_chars()の項目を御覧ください。
 
errno_t nlib_uint8_from_chars (uint8_t *result, const char **endptr, const char *first, const char *last, int base)
 文字列をuint8_t型に変換します。詳しくはnlib_int32_from_chars()の項目を御覧ください。
 
errno_t nlib_uint16_from_chars (uint16_t *result, const char **endptr, const char *first, const char *last, int base)
 文字列をuint16_t型に変換します。詳しくはnlib_int32_from_chars()の項目を御覧ください。
 
errno_t nlib_uint32_from_chars (uint32_t *result, const char **endptr, const char *first, const char *last, int base)
 文字列をuint32_t型に変換します。詳しくはnlib_int32_from_chars()の項目を御覧ください。
 
errno_t nlib_uint64_from_chars (uint64_t *result, const char **endptr, const char *first, const char *last, int base)
 文字列をuint64_t型に変換します。詳しくはnlib_int32_from_chars()の項目を御覧ください。
 
errno_t nlib_double_from_chars (double *result, const char **endptr, const char *first, const char *last)
 文字列をdouble型に変換します。 [詳解]
 
errno_t nlib_float_from_chars (float *result, const char **endptr, const char *first, const char *last)
 文字列をfloat型に変換します。詳しくはnlib_double_from_chars()の項目を御覧ください。
 

ctype.h代替

C標準ヘッダctype.hで宣言されている関数の代替です。ロケールの影響を受けません。

static int nlib_isalnum (int ch)
 chがASCII文字の'0'-'9', 'A'-'Z', または'a'-'z'である場合に非0、そうでない場合に0を返します。
 
static int nlib_isalpha (int ch)
 chがASCII文字の'A'-'Z', または'a'-'z'である場合に非0、そうでない場合に0を返します。
 
static int nlib_isblank (int ch)
 chがASCII文字の' 'または'\t'である場合に非0、そうでない場合に0を返します。
 
static int nlib_iscntrl (int ch)
 chがASCIIコードの0から31、または127である場合に非0、そうでない場合に0を返します。
 
static int nlib_isdigit (int ch)
 chがASCII文字の'0'-'9'である場合に非0、そうでない場合に0を返します。
 
static int nlib_isgraph (int ch)
 chがASCII文字の33から126である場合に非0、そうでない場合に0を返します。
 
static int nlib_islower (int ch)
 chがASCII文字の'a'-'z'である場合に非0、そうでない場合に0を返します。
 
static int nlib_isprint (int ch)
 chがASCII文字の32から126である場合に非0、そうでない場合に0を返します。
 
static int nlib_ispunct (int ch)
 chがASCII文字の0から32、または127である場合に非0、そうでない場合に0を返します。
 
static int nlib_isspace (int ch)
 chがASCII文字の' ', '\t', または'\n'である場合に非0、そうでない場合に0を返します。
 
static int nlib_isupper (int ch)
 chがASCII文字の'A'-'Z'である場合に非0、そうでない場合に0を返します。
 
static int nlib_isxdigit (int ch)
 chがASCII文字の'0'-'9', 'A'-'F', または'a'-'f'である場合に非0、そうでない場合に0を返します。
 
static int nlib_tolower (int ch)
 chがASCII文字の'A'-'Z'である場合に小文字にしたものを、そうでない場合にchを返します。
 
static int nlib_toupper (int ch)
 chがASCII文字の'a'-'z'である場合に大文字にしたものを、そうでない場合にchを返します。
 

ユニコード

nn::nlib::unicode名前空間にもユニコード関連の機能が実装されています。

#define nlib_memutf8_to_utf32char   NLIB_CAPI(nlib_memutf8_to_utf32char)
 UTF-8を1コードポイント分変換します。 [詳解]
 
enum  nlib_unicode_char_category
 ユニコードの各コードポイントにはいずれかの一般カテゴリが割り当てられます。 [詳解]
 
enum  nlib_case_mapping_option
 nlib_case_mapping()で指定するオプションです。 [詳解]
 
enum  nlib_unicode_char_property
 nlib_get_unicode_char_property()で取得するプロパティを指定します。 [詳解]
 
enum  nlib_case_folding_option
 nlib_case_folding()で指定するオプションです。 [詳解]
 
enum  nlib_nfkc_option
 nlib_nfkc(), nlib_nfkc_case_folding()で指定するオプションです。 [詳解]
 
enum  nlib_unicode_break_property
 文字列を区切る境界の種類です。Unicodeの仕様に基づきます。 [詳解]
 
enum  nlib_unicode_break_option
 nlib_find_break()で指定するオプションです。 [詳解]
 
int nlib_utf16_to_utf32char (nlib_utf32_t *utf32, nlib_utf16_t upper, nlib_utf16_t lower)
 1つのコードポイントをUTF-16からUTF-32に変換します。 [詳解]
 
int nlib_utf32char_to_utf16 (nlib_utf16_t *upper, nlib_utf16_t *lower, nlib_utf32_t utf32)
 1つのUTF-32文字をUTF-16に変換します。 [詳解]
 
int nlib_utf8_to_utf32char (nlib_utf32_t *utf32, const nlib_utf8_t *utf8)
 UTF-8を1文字分のUTF-32に変換します。 [詳解]
 
int nlib_utf32char_to_utf8 (nlib_utf8_t(&utf8)[4], nlib_utf32_t utf32)
 1文字のUTF-32をUTF-8に変換します。 [詳解]
 
errno_t nlib_wide_to_utf8 (size_t *utf8count, nlib_utf8_t *utf8, size_t buflen, const wchar_t *wcstr)
 UTF-16/UTF-32文字列からUTF-8文字列に変換します。 [詳解]
 
template<size_t N>
errno_t nlib_wide_to_utf8 (size_t *result, nlib_utf8_t(&utf8)[N], const wchar_t *wcstr) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_utf8_to_wide (size_t *wccount, wchar_t *wcstr, size_t buflen, const nlib_utf8_t *utf8)
 UTF-8文字列からUTF-16/UTF-32文字列に変換します。 [詳解]
 
template<size_t N>
errno_t nlib_utf8_to_wide (size_t *result, wchar_t(&wcstr)[N], const nlib_utf8_t *utf8) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_utf16_to_utf8 (size_t *utf8count, nlib_utf8_t *utf8, size_t buflen, const nlib_utf16_t *utf16)
 UTF-16文字列からUTF-8文字列に変換します。 [詳解]
 
template<size_t N>
errno_t nlib_utf16_to_utf8 (size_t *utf8count, nlib_utf8_t(&utf8)[N], const nlib_utf16_t *utf16) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_utf8_to_utf16 (size_t *utf16count, nlib_utf16_t *utf16, size_t buflen, const nlib_utf8_t *utf8)
 UTF-8文字列からUTF-16文字列に変換します。UTF-16文字列はヌル終端されます。 [詳解]
 
template<size_t N>
errno_t nlib_utf8_to_utf16 (size_t *utf16count, nlib_utf16_t(&utf16)[N], const nlib_utf8_t *utf8) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_utf32_to_utf8 (size_t *utf8count, nlib_utf8_t *utf8, size_t buflen, const nlib_utf32_t *utf32)
 UTF-32文字列からUTF-8文字列に変換します。 [詳解]
 
template<size_t N>
errno_t nlib_utf32_to_utf8 (size_t *utf8count, nlib_utf8_t(&utf8)[N], const nlib_utf32_t *utf32) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_utf8_to_utf32 (size_t *utf32count, nlib_utf32_t *utf32, size_t buflen, const nlib_utf8_t *utf8)
 UTF-8文字列からUTF-32文字列に変換します。 [詳解]
 
template<size_t N>
errno_t nlib_utf8_to_utf32 (size_t *utf32count, nlib_utf32_t(&utf32)[N], const nlib_utf8_t *utf8) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_memutf16_to_utf8 (size_t *to_count, size_t *from_count, nlib_utf8_t *to, size_t to_size, const nlib_utf16_t *from, size_t from_size) NLIB_NONNULL_5
 ヌル終端しないUTF-16文字列をUTF-8文字列に変換します。 [詳解]
 
template<size_t N>
errno_t nlib_memutf16_to_utf8 (size_t *to_count, size_t *from_count, nlib_utf8_t(&to)[N], const nlib_utf16_t *from, size_t from_size) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_memutf8_to_utf16 (size_t *to_count, size_t *from_count, nlib_utf16_t *to, size_t to_size, const nlib_utf8_t *from, size_t from_size) NLIB_NONNULL_5
 ヌル終端しないUTF-8文字列をUTF-16文字列に変換します。 [詳解]
 
template<size_t N>
errno_t nlib_memutf8_to_utf16 (size_t *to_count, size_t *from_count, nlib_utf16_t(&to)[N], const nlib_utf8_t *from, size_t from_size) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_memutf32_to_utf8 (size_t *to_count, size_t *from_count, nlib_utf8_t *to, size_t to_size, const nlib_utf32_t *from, size_t from_size) NLIB_NONNULL_5
 ヌル終端しないUTF-32文字列をUTF-8文字列に変換します。 [詳解]
 
template<size_t N>
errno_t nlib_memutf32_to_utf8 (size_t *to_count, size_t *from_count, nlib_utf8_t(&to)[N], const nlib_utf32_t *from, size_t from_size) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_memutf8_to_utf32 (size_t *to_count, size_t *from_count, nlib_utf32_t *to, size_t to_size, const nlib_utf8_t *from, size_t from_size) NLIB_NONNULL_5
 ヌル終端しないUTF-8文字列をUTF-32文字列に変換します。 [詳解]
 
template<size_t N>
errno_t nlib_memutf8_to_utf32 (size_t *to_count, size_t *from_count, nlib_utf32_t(&to)[N], const nlib_utf8_t *from, size_t from_size) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_memwide_to_utf8 (size_t *to_count, size_t *from_count, nlib_utf8_t *to, size_t to_size, const wchar_t *from, size_t from_size) NLIB_NONNULL_5
 wchar_tのサイズによってnlib_memutf16_to_utf8()またはnlib_memutf32_to_utf8()が呼ばれます。
 
template<size_t N>
errno_t nlib_memwide_to_utf8 (size_t *to_count, size_t *from_count, nlib_utf8_t(&to)[N], const wchar_t *from, size_t from_size) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t nlib_memutf8_to_wide (size_t *to_count, size_t *from_count, wchar_t *to, size_t to_size, const nlib_utf8_t *from, size_t from_size) NLIB_NONNULL_5
 wchar_tのサイズによってnlib_memutf8_to_utf16またはnlib_memutf8_to_utf32が呼ばれます。
 
template<size_t N>
errno_t nlib_memutf8_to_wide (size_t *to_count, size_t *from_count, wchar_t(&to)[N], const nlib_utf8_t *from, size_t from_size) noexcept
 上記関数のテンプレートオーバーロードです。
 
static size_t nlib_utf16len (const nlib_utf16_t *str)
 ヌル文字を含まないnlib_utf16_tの数を数えます。 [詳解]
 
static size_t nlib_utf16nlen (const nlib_utf16_t *str, size_t maxsize)
 nlib_strnlen()のUTF-16版です。 [詳解]
 
static errno_t nlib_utf16cpy (nlib_utf16_t *s1, size_t s1max, const nlib_utf16_t *s2)
 nlib_strcpy()のUTF-16版です。 [詳解]
 
static errno_t nlib_utf16ncpy (nlib_utf16_t *s1, size_t s1max, const nlib_utf16_t *s2, size_t n)
 nlib_strcpy()のUTF-16版です。 [詳解]
 
static size_t nlib_utf32len (const nlib_utf32_t *str)
 ヌル文字を含まないnlib_utf32_tの数を数えます。 [詳解]
 
static size_t nlib_utf32nlen (const nlib_utf32_t *str, size_t maxsize)
 nlib_strnlen()のUTF-32版です。 [詳解]
 
static errno_t nlib_utf32cpy (nlib_utf32_t *s1, size_t s1max, const nlib_utf32_t *s2)
 nlib_strcpy()のUTF-32版です。 [詳解]
 
static errno_t nlib_utf32ncpy (nlib_utf32_t *s1, size_t s1max, const nlib_utf32_t *s2, size_t n)
 nlib_strcpy()のUTF-32版です。 [詳解]
 
errno_t nlib_strcplen (size_t *codepoint_count, size_t *supplementary_codepoint_count, size_t *len, const nlib_utf8_t *str)
 文字列中のコードポイントの数と補助文字の数と文字列長を取得します。 EILSEQを返す場合は、その場所までのコードポイント数等が格納されています。 [詳解]
 
errno_t nlib_wcscplen (size_t *count, const wchar_t *str)
 文字列中のコードポイントの数を取得します。 [詳解]
 
static errno_t nlib_utf16cplen (size_t *count, const nlib_utf16_t *str)
 文字列中のコードポイントの数を取得します。 [詳解]
 
static errno_t nlib_utf16cplen_ex (size_t *count, size_t *len, const nlib_utf16_t *str)
 文字列中のコードポイントの数を取得します。 [詳解]
 
errno_t nlib_utf32cplen (size_t *count, const nlib_utf32_t *str)
 文字列中のコードポイントの数を取得します。 [詳解]
 
errno_t nlib_memcplen (size_t *codepoint_count, size_t *supplementary_codepoint_count, size_t *from_read, const nlib_utf8_t *from, size_t from_size)
 文字列中のコードポイントの数と補助文字の数を取得します。 [詳解]
 
errno_t nlib_get_unicode_char_property (void *value, const nlib_utf8_t *first, const nlib_utf8_t *last, nlib_unicode_char_property property)
 指定されたユニコードのコードポイント1つに割り当てられたプロパティを取得します。 [詳解]
 
errno_t nlib_case_mapping (nlib_utf8_convert_info *result, nlib_utf8_t *buf, size_t n, const nlib_utf8_t *first, const nlib_utf8_t *last, nlib_case_mapping_option option) NLIB_NONNULL_5
 UTF-8文字列のケースマッピングを行います。 [詳解]
 
errno_t nlib_case_folding (nlib_utf8_convert_info *result, nlib_utf8_t *buf, size_t n, const nlib_utf8_t *first, const nlib_utf8_t *last, nlib_case_folding_option option) NLIB_NONNULL_5
 UTF-8文字列のケースフォールディングを行います。 [詳解]
 
errno_t nlib_nfkc (nlib_utf8_convert_info *result, nlib_utf8_t *buf, size_t n, const nlib_utf8_t *first, const nlib_utf8_t *last, nlib_nfkc_option option) NLIB_NONNULL_5
 UTF-8文字列のNFKC正規化を行います。 [詳解]
 
errno_t nlib_nfkc_case_folding (nlib_utf8_convert_info *result, nlib_utf8_t *buf, size_t n, const nlib_utf8_t *first, const nlib_utf8_t *last, nlib_nfkc_option nfkc_option, nlib_case_folding_option case_folding_option) NLIB_NONNULL_5
 UTF-8文字列のNFKC正規化に加え、ケースフォールディングを行います。
 
errno_t nlib_find_break (const nlib_utf8_t **pos, const nlib_utf8_t *first, const nlib_utf8_t *last, nlib_unicode_break_property property, nlib_unicode_break_option option)
 UTF-8文字列内の次の区切の位置を計算します。 [詳解]
 
typedef char nlib_utf8_t
 chartypedefです。文字列がUTF-8であることを示します。
 
typedef uint16_t nlib_utf16_t
 char16_tが利用できる場合はchar16_tに、そうでない場合はuint16_ttypedefされます。
 
typedef uint32_t nlib_utf32_t
 char32_tが利用できる場合はchar32_tに、そうでない場合はuint32_ttypedefされます。
 
size_t nlib_utf8_convert_info::written
 バッファに書き込まれたバイト数です
 
const nlib_utf8_tnlib_utf8_convert_info::cur
 入力データの未変換部分の先頭です
 

エンディアン変換、ビット操作

エンディアンの変換関数です。

説明
16bit, 32bit, 64bitの1つ又は複数のデータのエンディアンを変更します。
static uint16_t nlib_bswap16 (uint16_t x)
 __builtin_bswap16(x)や_byteswap_ushort(x)を返します。
 
static uint32_t nlib_bswap32 (uint32_t x)
 __builtin_bswap32(x)や_byteswap_ulong(x)を返します。
 
static uint64_t nlib_bswap64 (uint64_t x)
 __builtin_bswap64(x)や_byteswap_uint64(x)を返します。
 
errno_t nlib_swapendian_16 (uint16_t *p, size_t count)
 エンディアンを変換します。 [詳解]
 
errno_t nlib_swapendian_32 (uint32_t *p, size_t count)
 エンディアンを変換します。 [詳解]
 
errno_t nlib_swapendian_64 (uint64_t *p, size_t count)
 エンディアンを変換します。 [詳解]
 
static int nlib_clz32 (uint32_t x)
 MSB(most significant bit)から見て連続する0ビットの数を返します。 [詳解]
 
static int nlib_clz64 (uint64_t x)
 MSB(most significant bit)から見て連続する0ビットの数を返します。 [詳解]
 
static int nlib_ctz32 (uint32_t x)
 LSB(least significant bit)から見て連続する0ビットの数を返します。 [詳解]
 
static int nlib_ctz64 (uint64_t x)
 LSB(least significant bit)から見て連続する0ビットの数を返します。 [詳解]
 
static int nlib_popcnt32 (uint32_t x)
 1となっているビットの数を返します。 [詳解]
 
static int nlib_popcnt64 (uint64_t x)
 1となっているビットの数を返します。 [詳解]
 
static int nlib_popcnt16 (uint16_t x)
 1となっているビットの数を返します。 [詳解]
 
static uint32_t nlib_bitreverse32 (uint32_t x)
 32ビット整数のビットの並び順を反転させます。 [詳解]
 
static uint64_t nlib_bitreverse64 (uint64_t x)
 64ビット整数のビットの並び順を反転させます。 [詳解]
 

malloc

void * nlib_malloc (size_t size)
 C標準関数のmalloc()を呼び出すweak関数です。nlibはこの関数を経由してmalloc()を呼び出します。 [詳解]
 
void nlib_free (void *ptr)
 C標準関数のfree()を呼び出すweak関数です。nlibはこの関数を経由してfree()を呼び出します。 [詳解]
 
size_t nlib_malloc_size (const void *ptr)
 アロケートされたメモリのサイズを返します。 [詳解]
 
void nlib_free_size (void *ptr, size_t size)
 サイズを指定してメモリを解放します。デフォルトではnlib_free()を呼び出します。 [詳解]
 
void * nlib_calloc (size_t nmemb, size_t size)
 C標準関数のcalloc()を呼び出すweak関数です。nlibはこの関数を経由してcalloc()を呼び出します。 [詳解]
 
void * nlib_realloc (void *ptr, size_t size)
 C標準関数のrealloc()を呼び出すweak関数です。nlibはこの関数を経由してrealloc()を呼び出します。 [詳解]
 
void * nlib_memalign (size_t alignment, size_t size)
 memalign()を呼び出すweak関数です。nlibはこの関数を経由してmemalign()を呼び出します。 [詳解]
 

詳解

Cリンケージを持つnlibの最も基本的なAPIです。

説明
プラットフォーム毎の違いを吸収し、同じI/Fを利用したプログラミングを可能にすることを目的としてます。

マクロ定義詳解

◆ NLIB_ALWAYS_INLINE

NLIB_ALWAYS_INLINE   inline __attribute__((always_inline))

コンパイラに関数をインライン展開するように強く示します。

説明
Platform Definition
Win32 __forceinline
Linux inline __attribute__((always_inline))
FreeBSD inline __attribute__((always_inline))
OS X inline __attribute__((always_inline))
CAFE inline __attribute__((always_inline))
CTR __forceinline

Platform_unix.h95 行目に定義があります。

◆ NLIB_ASSUME

NLIB_ASSUME (   cond)    switch (0) case 0: default: if (cond) ; else __builtin_unreachable()

cond が真であることを示してコンパイラに最適化のヒントを与えます。

引数
[in]cond真であると仮定される式
説明
以下のようなコードでswitch文を最適化出来る場合があります。
switch (x) {
case 0:
....
break;
case 1:
....
break;
case 2:
....
break;
default:
}

Platform.h259 行目に定義があります。

◆ NLIB_ATTRIBUTE_CONST

NLIB_ATTRIBUTE_CONST   __attribute__((const))

利用可能であれば__attribute__((const))が定義されます。

説明
Platform Definition
Win32 空文字列
Linux __attribute__((const))
FreeBSD __attribute__((const))
OS X __attribute__((const))
CAFE __attribute__((const))
CTR __attribute__((const))

Platform_unix.h124 行目に定義があります。

◆ NLIB_ATTRIBUTE_MALLOC

NLIB_ATTRIBUTE_MALLOC   __attribute__((malloc))

利用可能であれば__attribute__((malloc))が定義されます。

説明
Platform Definition
Win32 空文字列
Linux __attribute__((malloc))
FreeBSD __attribute__((malloc))
OS X __attribute__((malloc))
CAFE __attribute__((malloc))
CTR __attribute__((malloc))

Platform_unix.h122 行目に定義があります。

◆ NLIB_ATTRIBUTE_PURE

NLIB_ATTRIBUTE_PURE   __attribute__((pure))

利用可能であれば__attribute__((pure))が定義されます。

説明
Platform Definition
Win32 空文字列
Linux __attribute__((pure))
FreeBSD __attribute__((pure))
OS X __attribute__((pure))
CAFE __attribute__((pure))
CTR __attribute__((pure))

Platform_unix.h123 行目に定義があります。

◆ NLIB_CHECK_RESULT

NLIB_CHECK_RESULT   __attribute__((warn_unused_result))

関数の呼び出し元が戻り値をチェックする必要があることを示します。

説明
Platform Definition
Win32 Check_return
Linux __attribute__((warn_unused_result))
FreeBSD __attribute__((warn_unused_result))
OS X __attribute__((warn_unused_result))
CAFE __attribute__((warn_unused_result))
CTR 空文字列

Platform_unix.h103 行目に定義があります。

◆ nlib_compiler_version

nlib_compiler_version   NLIB_CAPI(nlib_compiler_version)

nlibのコンパイルに利用されたコンパイラのバージョンを動的に取得します。

戻り値
コンパイラのバージョンを示す整数値
説明
Compiler Implementation
MSVC _MSC_FULL_VER
clang __clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__
gcc __GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__
armcc __ARMCC_VERSION
ghs __GHS_VERSION_NUMBER

Platform_rename.h35 行目に定義があります。

◆ nlib_debug_break

nlib_debug_break   NLIB_CAPI(nlib_debug_break)

ブレークポイントになります。

説明
Platform Implementation
Win32 DebugBreak()
Linux __builtin_trap()
FreeBSD __builtin_trap()
OS X __builtin_trap()
CAFE OSDebug()
CTR nn::dbg::Break()

Platform_rename.h143 行目に定義があります。

◆ NLIB_DEPRECATED

NLIB_DEPRECATED   [[deprecated]]

関数等がdeprecatedになったことを示します。

説明
Platform Definition
Win32 __declspec(deprecated)
Linux __attribute__((deprecated))
FreeBSD __attribute__((deprecated))
OS X __attribute__((deprecated))
CAFE __attribute__((deprecated))
CTR 空文字列(前置形式が不可能なため)

Config.h113 行目に定義があります。

◆ nlib_get_native_last_error

nlib_get_native_last_error   NLIB_CAPI(nlib_get_native_last_error)

最後に発生したネイティブのエラーコードを返します。

戻り値
最後に発生したエラーのネイティブのエラーコード
説明
Platform Implementation
Win32 GetLastError()
Linux 常に0を返す
FreeBSD 常に0を返す
OS X 常に0を返す
CAFE nlib_xxxx関数内のSDK関数呼び出しで発生したエラー値
CTR nlib_xxxx関数内のSDK関数呼び出しで発生したエラーのGetPrintableBits()メソッドの戻り値

Platform_rename.h33 行目に定義があります。

◆ nlib_getversion

nlib_getversion   NLIB_CAPI(nlib_getversion)

nlibのバージョンを動的に取得します。

戻り値
NLIB_VERSIONを返します。
説明
利用しているnlibのバージョンによってユーザーコードの挙動を実行時に変化させる必要がある場合に利用します。

Platform_rename.h34 行目に定義があります。

◆ NLIB_LIKELY

NLIB_LIKELY (   x)    __builtin_expect(!!(x), 1)

条件xが真になる傾向が高いことをコンパイラに示します。

引数
[in]x条件式
説明
Platform Definition
Win32 (x)
Linux __builtin_expect(!!(x), 1)
FreeBSD __builtin_expect(!!(x), 1)
OS X __builtin_expect(!!(x), 1)
CAFE __builtin_expect(!!(x), 1)
CTR __builtin_expect(!!(x), 1)

Platform_unix.h97 行目に定義があります。

◆ nlib_memutf8_to_utf32char

nlib_memutf8_to_utf32char   NLIB_CAPI(nlib_memutf8_to_utf32char)

UTF-8を1コードポイント分変換します。

引数
[out]count変換されたバイト数
[out]cpコードポイントが1つ格納される
[in]firstUTF-8文字列の先頭
[in]lastUTF-8文字列の末尾
戻り値
0成功した場合
ERANGEコードポイントの途中でUTF-8文字列が終了した場合
EILSEQ不正なUTF-8だった場合
説明
nlib_utf8_to_utf32char()の非ヌル終端文字列対応版です。

Platform_rename.h289 行目に定義があります。

◆ NLIB_NEVER_INLINE

NLIB_NEVER_INLINE   __attribute__((__noinline__))

コンパイラに関数をインライン展開しないように示します。

説明
Platform Definition
Win32 __declspec(noinline)
Linux __attribute__((__noinline__))
FreeBSD __attribute__((__noinline__))
OS X __attribute__((__noinline__))
CAFE __attribute__((__noinline__))
CTR __declspec(noinline)

Platform_unix.h96 行目に定義があります。

◆ NLIB_NONNULL

NLIB_NONNULL   __attribute__((nonnull))

全ての引数にNULLを指定することができないことを示します。

説明
NULLを渡した場合にはコンパイル時に警告が出ます。
Platform Definition
Win32 空文字列
Linux __attribute__((nonnull))
FreeBSD __attribute__((nonnull))
OS X __attribute__((nonnull))
CAFE __attribute__((nonnull))
CTR __attribute__((nonnull))

Platform_unix.h115 行目に定義があります。

◆ NLIB_NONNULL_1

NLIB_NONNULL_1   __attribute__((nonnull(1)))

1番目の引数にNULLを指定することができないことを示します。

説明
NULLを渡した場合にはコンパイル時に警告が出ます。
Platform Definition
Win32 空文字列
Linux __attribute__((nonnull (1)))
FreeBSD __attribute__((nonnull (1)))
OS X __attribute__((nonnull (1)))
CAFE __attribute__((nonnull (1)))
CTR __attribute__((nonnull (1)))

Platform_unix.h116 行目に定義があります。

◆ NLIB_NONNULL_2

NLIB_NONNULL_2   __attribute__((nonnull(2)))

2番目の引数にNULLを指定することができないことを示します。

説明
NULLを渡した場合にはコンパイル時に警告が出ます。
Platform Definition
Win32 空文字列
Linux __attribute__((nonnull (2)))
FreeBSD __attribute__((nonnull (2)))
OS X __attribute__((nonnull (2)))
CAFE __attribute__((nonnull (2)))
CTR __attribute__((nonnull (2)))

Platform_unix.h117 行目に定義があります。

◆ NLIB_NONNULL_3

NLIB_NONNULL_3   __attribute__((nonnull(3)))

3番目の引数にNULLを指定することができないことを示します。

説明
NULLを渡した場合にはコンパイル時に警告が出ます。
Platform Definition
Win32 空文字列
Linux __attribute__((nonnull (3)))
FreeBSD __attribute__((nonnull (3)))
OS X __attribute__((nonnull (3)))
CAFE __attribute__((nonnull (3)))
CTR __attribute__((nonnull (3)))

Platform_unix.h118 行目に定義があります。

◆ NLIB_NONNULL_4

NLIB_NONNULL_4   __attribute__((nonnull(4)))

4番目の引数にNULLを指定することができないことを示します。

説明
NULLを渡した場合にはコンパイル時に警告が出ます。
Platform Definition
Win32 空文字列
Linux __attribute__((nonnull (4)))
FreeBSD __attribute__((nonnull (4)))
OS X __attribute__((nonnull (4)))
CAFE __attribute__((nonnull (4)))
CTR __attribute__((nonnull (4)))

Platform_unix.h119 行目に定義があります。

◆ NLIB_NONNULL_5

NLIB_NONNULL_5   __attribute__((nonnull(5)))

5番目の引数にNULLを指定することができないことを示します。

説明
NULLを渡した場合にはコンパイル時に警告が出ます。
Platform Definition
Win32 空文字列
Linux __attribute__((nonnull (5)))
FreeBSD __attribute__((nonnull (5)))
OS X __attribute__((nonnull (5)))
CAFE __attribute__((nonnull (5)))
CTR __attribute__((nonnull (5)))

Platform_unix.h120 行目に定義があります。

◆ NLIB_NORETURN

NLIB_NORETURN   __attribute__((noreturn))

関数がリターンしないことを示します。

説明
Platform Definition
Win32 空文字列_
Linux __attribute__((noreturn))
FreeBSD __attribute__((noreturn))
OS X __attribute__((noreturn))
CAFE __attribute__((noreturn))
CTR __attribute__((noreturn))

Platform_unix.h108 行目に定義があります。

◆ nlib_thread_exit

nlib_thread_exit   NLIB_CAPI(nlib_thread_exit)

呼び出しスレッドを終了します。

説明
C++オブジェクトの自動オブジェクトのデストラクタに関しては呼び出される保証はありません(プラットフォームによる)。 従って、nlib_thread_cleanup_push(), nlib_thread_cleanup_pop()を用いてヒープ上に構築されたオブジェクトを明示的に解体する必要があります。
Platform Implementation
Win32 _endthreadex(0)
Linux pthread_exit(0)
FreeBSD pthread_exit(0)
OS X pthread_exit(0)
CAFE OSExitThread(0)
CTR 実装が存在しません(コンパイルエラー)
バグ:
LinuxとFreeBSDの場合、C++の自動変数のデストラクタが実行されます。それ以外の場合は実行されません。

Platform_rename.h137 行目に定義があります。

◆ nlib_thread_exit_cpp

nlib_thread_exit_cpp   NLIB_CAPI(nlib_thread_exit_cpp)

呼び出しスレッドを終了します。

説明
内部で実装依存のC++例外がスローされ、その結果としてC++オブジェクトのデストラクタが実行されます。 従って、catch (...)で例外がキャッチされてしまうと正しく動作しません。 また、この関数の呼び出し元の全ての関数で無例外指定(noexcept他)が指定されていてはいけません。 なお、nlib_thread_cleanup_push(), nlib_thread_cleanup_pop()が用いられている場合の動作は不定(プラットフォームによる)です。
Platform Implementation
Win32 nlib_unwind_exceptionをスロー
Linux pthread_exit(0)の内部でabi::__forced_unwindをスロー
FreeBSD pthread_exit(0)の内部で_Unwind_Exceptionをスロー
OS X nlib_unwind_exceptionをスロー
CAFE 実装が存在しません(コンパイルエラー)
CTR 実装が存在しません(コンパイルエラー)
バグ:
nlib_thread_cleanup_push()で登録されたデストラクタはLinuxとFreeBSDの場合は実行されます。また、FreeBSDの場合はスローされた(特殊な)C++例外をキャッチすることができません。

Platform_rename.h138 行目に定義があります。

◆ NLIB_UNLIKELY

NLIB_UNLIKELY (   x)    __builtin_expect(!!(x), 0)

条件xが偽になる傾向が高いことをコンパイラに示します。

引数
[in]x条件式
説明
Platform Definition
Win32 (x)
Linux __builtin_expect(!!(x), 0)
FreeBSD __builtin_expect(!!(x), 0)
OS X __builtin_expect(!!(x), 0)
CAFE __builtin_expect(!!(x), 0)
CTR __builtin_expect(!!(x), 0)

Platform_unix.h98 行目に定義があります。

◆ NLIB_VIS_HIDDEN

NLIB_VIS_HIDDEN   __attribute__((visibility("hidden")))

関数やクラス等のシンボルをライブラリの外部に公開しません。

説明
シェアードライブラリを利用する場合、公開されているシンボルが多いと、ロード時間が長くなります。 また、シンボルテーブルの分だけライブラリのサイズも増大します。 この現象は、テンプレートライブラリの場合において極めて顕著です。
なお、一般に公開されているシンボルは以下のようにして確認することができます。
nm -C -D lib***.so
NLIB_VIS_HIDDEN を利用するとシンボルを外部に公開しないように設定することができます。 また、-fvisibility=hidden オプションを渡してコンパイルすると、シンボルの非公開がデフォルトになります。
Platform Definition
Win32 空文字列
Linux __attribute__((visibility("hidden"))), cygwin環境では空文字列
FreeBSD __attribute__((visibility("hidden")))
OS X __attribute__((visibility("hidden")))
CAFE 空文字列
CTR 空文字列
参照
https://gcc.gnu.org/wiki/Visibility

Platform_unix.h86 行目に定義があります。

◆ NLIB_VIS_PUBLIC

NLIB_VIS_PUBLIC   __attribute__((visibility("default")))

関数やクラス等のシンボルをライブラリの外部に公開します。

説明
-fvisibility=hidden オプションを渡してコンパイルした場合、明示的にシンボルを公開する必要があります。 そのような場合にこのマクロを使う必要があります。
Platform Definition
Win32 DLL版を利用する場合は__declspec(dllimport)、そうでない場合は空文字列
Linux __attribute__((visibility("default"))), cygwin環境では空文字列
FreeBSD __attribute__((visibility("default")))
OS X __attribute__((visibility("default")))
CAFE 空文字列
CTR 空文字列
参照
NLIB_VIS_HIDDEN

Platform_unix.h87 行目に定義があります。

◆ NLIB_WARN

NLIB_WARN (   exp)    ("WARNING: " exp)

ワーニングを出力します。

引数
[in]exp警告メッセージ
説明
#pragma message NLIB_WARN("message")のよう記述して利用します。

Platform.h224 行目に定義があります。

◆ NLIB_WEAKSYMBOL

NLIB_WEAKSYMBOL   __attribute__((weak))

ウィークシンボルを定義するために利用します。

説明
Platform Definition
Win32 空文字列
Linux __attribute__((weak)), cygwin環境では空文字列
FreeBSD __attribute__((weak))
OS X __attribute__((weak))
CAFE __attribute__((weak))
CTR __attribute__((weak))

Platform_unix.h88 行目に定義があります。

◆ nlib_yield

nlib_yield   NLIB_CAPI(nlib_yield)

スレッドの実行権を手放す。

戻り値
0ならば成功
説明
Platform Implementation
Win32 Sleep(0)
Linux sched_yield()
FreeBSD sched_yield()
OS X sched_yield()
CAFE OSYieldThread()
CTR nn::os::Thread::Yield()
各種例:
misc/threading/simpleringbuffer/simpleringbuffer.cpp, msgpack/jsonrpc/jsonrpc.cpp, msgpack/jsonrpc/server.cpp.

Platform_rename.h112 行目に定義があります。

◆ RSIZE_MAX

RSIZE_MAX   0x7FFFFFFFFFFFFFFFLL

size_tの最大値よりいくらか小さい値が定義されています。

説明
size_tの引数の値をチェックして不慮の際のオーバーフローを避けるために用いられるマクロです。
参照
https://www.securecoding.cert.org/confluence/display/c/INT01-C.+Use+rsize_t+or+size_t+for+all+integer+values+representing+the+size+of+an+object
https://www.jpcert.or.jp/sc-rules/c-int01-c.html (in Japanese)

Platform.h219 行目に定義があります。

型定義詳解

◆ nlib_barrier

バリアオブジェクトの型です。

説明
Platform Implementation
Win32 nlibによる実装, SYNCHRONIZATION_BARRIER
Linux pthread_barrier_t
FreeBSD pthread_barrier_t
OS X nlibによる実装
CAFE nlibによる実装
CTR nlibによる実装

Platform.h1087 行目に定義があります。

◆ nlib_cond

条件変数オブジェクトの型です。

説明
Platform Implementation
Win32 CONDITION_VARIABLE
Linux pthread_cond_t
FreeBSD pthread_cond_t
OS X pthread_cond_t
CAFE OSFastCond
CTR nn::os::Event

Platform_unix.h257 行目に定義があります。

◆ nlib_condrwlock

リードライトロック用の条件変数の型です。

説明
nlib_condnlib_mutexを持つ構造体として定義されます。 ただし、Windowsの条件変数(CONDITION_VARIABLE)はリードライトロックを直接待てることから条件変数のみを持っています。

◆ nlib_fd

(nlib独自の)ファイルディスクリプタで、32bit整数です。

説明
Platform Implementation
Win32 nlibによる実装
Linux ネイティブのファイルディスクリプタに一致
FreeBSD ネイティブのファイルディスクリプタに一致
OS X ネイティブのファイルディスクリプタに一致
CAFE nlibによる実装
CTR nlibによる実装

Platform.h1513 行目に定義があります。

◆ nlib_mutex

ミューテックス変数の型です。

説明
Platform Implementation
Win32 HANDLE又はCRITICAL_SECTION
Linux pthread_mutex_t
FreeBSD pthread_mutex_t
OS X pthread_mutex_t
CAFE OSFastMutex
CTR nn::os::CriticalSection

Platform_unix.h195 行目に定義があります。

◆ nlib_rwlock

リードライトロックオブジェクトの型です。

説明
Platform Implementation
Win32 SRWLOCK
Linux pthread_rwlock_t
FreeBSD pthread_rwlock_t
OS X pthread_rwlock_t
CAFE nlibによる実装
CTR nlibによる実装
コード例
nlib_rwlock rwlock;
MyVector vec;
.....
// Init nlib_rwlock
e = nlib_rwlock_init(&rwlock);
if (nlib_is_error(e)) {
// ERROR
}
.....
{
// Reads vector: nlib_rwlock_rdlock() does not block the other ones.
....
// retrieve vec[i] for example
....
}
....
{
// Writes vector: nlib_rwlock_wrlock() blocks both nlib_rwlock_wrlock() and nlib_rwlock_rdlock()
....
// vec.push_back() for example
....
}

Platform.h871 行目に定義があります。

◆ nlib_semaphore

セマフォオブジェクトの型です。

説明
Platform Implementation
Win32 HANDLE
Linux sem_t
FreeBSD sem_t
OS X int(sem_tでないことに注意)
CAFE OSSemaphore
CTR nn::os::Semaphore

Platform_unix.h254 行目に定義があります。

◆ nlib_spinlock

スピンロック変数の型です。NLIB_SPINLOCK_INITIALIZERにより静的に初期化して利用します。

説明
Platform Implementation
Win32 int32_t
Linux int32_t
FreeBSD int32_t
OS X OSSpinLock
CAFE OSSpinLock
CTR int32_t

Platform.h1220 行目に定義があります。

◆ nlib_thread

スレッドを指し示す識別子

説明
Platform Implementation
Win32 HANDLE
Linux pthread_t
FreeBSD pthread_t
OS X pthread_t
CAFE OSThread*
CTR nn::os::Thread

Platform_unix.h266 行目に定義があります。

◆ nlib_thread_func

void(* nlib_thread_func)(void *arg)

別スレッドで実行される関数

引数
[in]argスレッドに渡された引数

Platform.h1241 行目に定義があります。

◆ nlib_tls_destructor

void(* nlib_tls_destructor)(void *tls_value)

スレッド終了時に呼び出されるTLSのデストラクタ関数の型です。

引数
[in]tls_valueTLSスロットに格納されている値
説明
覚え書き
デストラクタ関数内でnlib_tls_setvalue()を使って値を設定した場合、メモリリーク等を抑止するために再度そのTLSに対応するデストラクタが実行される実装が一般的です。 ただし、現在のところCTR, cygwinでは再度のデストラクタの実行は行われません。

Platform.h558 行目に定義があります。

列挙型詳解

◆ nlib_case_folding_option

nlib_case_folding()で指定するオプションです。

説明
説明
kCaseFoldingDefault CaseFolding.txtのcommon case folding及びfull case foldingを行います。
kCaseFoldingExcludeSpecialI CaseFolding.txtのcommon case folding及びfull case foldingに対して、大文字と大文字ドット付きのIに対する変換を置き換えたcase foldingを行います。

Platform.h2359 行目に定義があります。

◆ nlib_case_mapping_option

nlib_case_mapping()で指定するオプションです。

説明
説明
kCaseMappingUpperCase 大文字への変換を指定します。
kCaseMappingLowerCase 小文字への変換を指定します。

Platform.h2350 行目に定義があります。

◆ nlib_log_priority

出力の優先度(種類)を定義しています。

説明
nlib_log_print(), nlib_log_vprint(), nlib_log_attr_setint()prio 引数に対して利用することができます。
説明
kNlibLogVerbose 詳細レベルのメッセージを出力するときに指定します。
kNlibLogDebug デバッグレベルのメッセージを出力するときに指定します。
kNlibLogInfo 情報レベルのメッセージを出力するときに指定します。
kNlibLogWarn 警告レベルのメッセージを出力するときに指定します。
kNlibLogError エラーレベルのメッセージを出力するときに指定します。
kNlibLogFatal 致命的なレベルのメッセージを出力するときに指定します。
kNlibLogLevelEqualOrAbove 指定した優先度との論理和をとると、指定した優先度かそれ以上の優先度を指定したことになります。nlib_log_attr_setint()で利用することができます。
kNlibLogLevelEqualOrBelow 指定した優先度との論理和をとると、指定した優先度かそれ以下の優先度を指定したことになります。nlib_log_attr_setint()で利用することができます。
kNlibLogLevelAll 全ての優先度を指定します。nlib_log_attr_setint()で利用することができます。

Platform.h1407 行目に定義があります。

◆ nlib_nfkc_option

nlib_nfkc(), nlib_nfkc_case_folding()で指定するオプションです。

説明
入力データが文字列の末尾までを含まない場合、後続のコードポイントによっては正規化の結果が異なることがあります。 従って、そのような入力データの場合はkNfkcContinueを指定して出力を遅延させる必要があります。
説明
kNfkcStop 入力データが文字列の末尾までを含む場合
kNfkcContinue 入力データが文字列の末尾までを含まない場合
kNfkcDefault kNfkcStopと同じ

Platform.h2363 行目に定義があります。

◆ nlib_unicode_break_option

nlib_find_break()で指定するオプションです。

説明
入力データが文字列の末尾までを含まない場合、後続のコードポイントによっては文字列を区切る位置が異なる場合があります。 従って、そのような入力データの場合はkUnicodeBreakContinueを指定する必要があります。
説明
kUnicodeBreakStop 入力データが文字列の末尾までを含む場合
kUnicodeBreakContinue 入力データが文字列の末尾までを含まない場合
kUnicodeBreakDefault kUnicodeBreakStopと同じ

Platform.h2378 行目に定義があります。

◆ nlib_unicode_break_property

文字列を区切る境界の種類です。Unicodeの仕様に基づきます。

説明
説明
kUnicodeBreakPropertyGrapheme 書記素の単位で区切ります(GraphemeBreakProperty.txt)
kUnicodeBreakPropertyWord 単語の単位で区切ります(WordBreakProperty.txt)
kUnicodeBreakPropertySentence 文単位で区切ります(SentenceBreakProperty.txt)
kUnicodeBreakPropertyLine 行単位で区切ります(LineBreak.txt)
参照
http://unicode.org/reports/tr14/
http://www.unicode.org/reports/tr29/tr29-31.html

Platform.h2372 行目に定義があります。

◆ nlib_unicode_char_category

ユニコードの各コードポイントにはいずれかの一般カテゴリが割り当てられます。

説明
nlib_get_unicode_char_property()kUnicodeCharPropertyCategoryをプロパティに指定した場合に取得できます。
説明
kUnicodeCharCategoryLu Letter, uppercase
kUnicodeCharCategoryLl Letter, lowercase
kUnicodeCharCategoryLt Letter, titlecase
kUnicodeCharCategoryLm Letter, modifier
kUnicodeCharCategoryLo Letter, other
kUnicodeCharCategoryMn Mark, nonspacing
kUnicodeCharCategoryMc Mark, spacing combining
kUnicodeCharCategoryMe Mark, enclosing
kUnicodeCharCategoryNd Number, decimal digit
kUnicodeCharCategoryNl Number, letter
kUnicodeCharCategoryNo Number, other
kUnicodeCharCategoryPc Punctuation, connector
kUnicodeCharCategoryPd Punctuation, dash
kUnicodeCharCategoryPs Punctuation, open
kUnicodeCharCategoryPe Punctuation, close
kUnicodeCharCategoryPi Punctuation, initial quote
kUnicodeCharCategoryPf Punctunation, final quote
kUnicodeCharCategoryPo Punctunation, other
kUnicodeCharCategorySm Symbol, math
kUnicodeCharCategorySc Symbol, currency
kUnicodeCharCategorySk Symbol, modifier
kUnicodeCharCategorySo Symbol, other
kUnicodeCharCategoryZs Separator, space
kUnicodeCharCategoryZl Separator, line
kUnicodeCharCategoryZp Separator, paragraph
kUnicodeCharCategoryCc Other, control
kUnicodeCharCategoryCf Other, format
kUnicodeCharCategoryCs Other, surrogate
kUnicodeCharCategoryCo Other, private
kUnicodeCharCategoryCn Other, not assigned

Platform.h2318 行目に定義があります。

◆ nlib_unicode_char_property

nlib_get_unicode_char_property()で取得するプロパティを指定します。

説明
得られる値の型
kUnicodeCharPropertyCategory nlib_unicode_char_category コードポイントに割り当てられた一般カテゴリを取得します。
kUnicodeCharPropertyCombiningClass int コードポイントに割り当てられた結合クラスを取得します。

Platform.h2355 行目に定義があります。

関数詳解

◆ nlib_barrier_destroy()

nlib_barrier_destroy ( nlib_barrier barrier)

バリアオブジェクトを破壊します。

引数
[in]barrierバリアオブジェクト
戻り値
0成功した場合
EINVALbarrierNULLである場合
その他実装依存のエラー
説明
Platform Implementation
Win32 nlibによる実装, DeleteSynchronizationBarrier()
Linux pthread_barrier_destroy()
FreeBSD pthread_barrier_destroy()
OS X nlibによる実装
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_barrier_init()

nlib_barrier_init ( nlib_barrier barrier,
unsigned int  count 
)

バリアオブジェクトを初期化します。

引数
[in,out]barrierバリアオブジェクト
[in]count待ち合わせするスレッドの数
戻り値
0成功した場合
EINVALbarrierNULLである場合
その他実装依存のエラー
説明
Platform Implementation
Win32 nlibによる実装, InitializeSynchronizationBarrier()
Linux pthread_barrier_init()
FreeBSD pthread_barrier_init()
OS X nlibによる実装
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_barrier_wait()

nlib_barrier_wait ( nlib_barrier barrier)

スレッドの待ち合わせを行います。

引数
[in]barrierバリアオブジェクト
戻り値
0成功した場合(PTHREAD_BARRIER_SERIAL_THREADを返すことはありません)
EINVALbarrierNULLである場合
その他実装依存のエラー
説明
Platform Implementation
Win32 nlibによる実装, EnterSynchronizationBarrier()
Linux pthread_barrier_wait()
FreeBSD pthread_barrier_wait()
OS X nlibによる実装
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_basename()

nlib_basename ( const char *  path)
引数
[in]pathパス文字列
戻り値
ファイル名部分の文字列を返します。
説明
例で示すと下記のような動作となります(basename()のGNUバージョンと同じ)。
path return value
"" ""
"/" ""
"." "."
".." ".."
"../" ""
"./" ""
"/usr/lib" "lib"
"/usr/" ""
"usr" "usr"
"sdmc:/test.txt" "test.txt"
"C:\\test.txt" "test.txt"(Windows only)

◆ nlib_bitreverse32()

static uint32_t nlib_bitreverse32 ( uint32_t  x)
inlinestatic

32ビット整数のビットの並び順を反転させます。

引数
[in]x32ビット整数
戻り値
xのビットの並び順を反転させた値

Platform.h2717 行目に定義があります。

◆ nlib_bitreverse64()

static uint64_t nlib_bitreverse64 ( uint64_t  x)
inlinestatic

64ビット整数のビットの並び順を反転させます。

引数
[in]x64ビット整数
戻り値
xのビットの並び順を反転させた値

Platform.h2740 行目に定義があります。

◆ nlib_calloc()

nlib_calloc ( size_t  nmemb,
size_t  size 
)

C標準関数のcalloc()を呼び出すweak関数です。nlibはこの関数を経由してcalloc()を呼び出します。

引数
[in]nmemb要素の数
[in]size各要素のバイト単位の長さ
戻り値
確保された領域へのポインタ
説明
cygwin版以外ではこの関数はユーザープログラムによって上書きすることが可能です。 上書きすることでnlibのメモリ確保をカスタマイズすることが可能です。
上書きする場合は以下のようにCリンケージにすることを忘れないでください。
extern "C" void* nlib_calloc(size_t nmemb, size_t size) {
.....
}
バグ:
cygwin版ではユーザープログラムによる上書きはできません。
各種例:
heap/replace_malloc/replace_malloc.cpp.

◆ nlib_case_folding()

nlib_case_folding ( nlib_utf8_convert_info result,
nlib_utf8_t buf,
size_t  n,
const nlib_utf8_t first,
const nlib_utf8_t last,
nlib_case_folding_option  option 
)

UTF-8文字列のケースフォールディングを行います。

引数
[out]result変換結果に関する情報が格納されます
[out]buf変換結果が格納されるバッファ
[in]nバッファサイズ
[in]first変換対象のUTF-8文字列の先頭
[in]last変換対象のUTF-8文字列の末尾
[in]option変換オプション
戻り値
0変換が行われた場合
EINVALbufNULLで且つnが0より大きい場合
ERANGEbufNULLで且つnが0と等しい場合
説明
この関数では、CaseFolding.txtに記述されているケースフォールディング内のsimple case folding以外の変換を行います。
関数が0を返した場合、bufnlib_utf8_convert_info::writtenバイトが書き込まれています。 nlib_utf8_convert_info::curは変換されなかったUTF-8文字列の先頭を指します。
ERANGEを返した場合、変換結果がnlib_utf8_convert_info::writtenは十分なサイズのバッファが存在した場合に書き込まれたであろうバイト数が書き込まれています。
また、以下の場合はnlib_utf8_convert_info::curlastと一致しない場合があることに注意してください。
  • bufのバッファサイズが足りないため途中で変換が終了した。
  • 入力のUTF-8がコードポイントの途中で途切れた。
注意
UTF-8でないバイト列については削除や置き換えは行われずそのまま出力されます。エラーを返すこともありません。
参照
https://unicode.org/Public/10.0.0/ucd/CaseFolding.txt

◆ nlib_case_mapping()

nlib_case_mapping ( nlib_utf8_convert_info result,
nlib_utf8_t buf,
size_t  n,
const nlib_utf8_t first,
const nlib_utf8_t last,
nlib_case_mapping_option  option 
)

UTF-8文字列のケースマッピングを行います。

引数
[out]result変換結果に関する情報が格納されます
[out]buf変換結果が格納されるバッファ
[in]nバッファサイズ
[in]first変換対象のUTF-8文字列の先頭
[in]last変換対象のUTF-8文字列の末尾
[in]option変換オプション
戻り値
0変換が行われた場合
EINVALbufNULLで且つnが0より大きい場合
ERANGEbufNULLで且つnが0と等しい場合
説明
この関数では、UnicodeData.txtに記述されているSimple Case Mappingに加えてSpecialCasing.txtに記述されているUnconditional mappingsを反映した変換を行います。
関数が0を返した場合、bufnlib_utf8_convert_info::writtenバイトが書き込まれています。 nlib_utf8_convert_info::curは変換されなかったUTF-8文字列の先頭を指します。
ERANGEを返した場合、変換結果がnlib_utf8_convert_info::writtenは十分なサイズのバッファが存在した場合に書き込まれたであろうバイト数が書き込まれています。
また、以下の場合はnlib_utf8_convert_info::curlastと一致しない場合があることに注意してください。
  • bufのバッファサイズが足りないため途中で変換が終了した。
  • 入力のUTF-8がコードポイントの途中で途切れた。
注意
UTF-8でないバイト列については削除や置き換えは行われずそのまま出力されます。エラーを返すこともありません。
参照
https://unicode.org/Public/10.0.0/ucd/UnicodeData.txt
https://unicode.org/Public/10.0.0/ucd/SpecialCasing.txt

◆ nlib_clz32()

static int nlib_clz32 ( uint32_t  x)
inlinestatic

MSB(most significant bit)から見て連続する0ビットの数を返します。

引数
[in]x検索対象の32ビット値
戻り値
0から32までの整数
説明
以下がコード例です。
nlib_printf("nlib_clz32(0x80000000) -> %d\n", nlib_clz32(0x80000000));
nlib_printf("nlib_clz32(0x00000001) -> %d\n", nlib_clz32(0x00000001));
/*
Output:
nlib_clz32(0x80000000) -> 0
nlib_clz32(0x00000001) -> 31
*/
Platform Implementation
Win32 _BitScanReverse()
Linux __builtin_clz()
FreeBSD __builtin_clz()
OS X __builtin_clz()
CAFE __CLZ32()
CTR __builtin_clz()

Platform.h2690 行目に定義があります。

◆ nlib_clz64()

static int nlib_clz64 ( uint64_t  x)
inlinestatic

MSB(most significant bit)から見て連続する0ビットの数を返します。

引数
[in]x検索対象の64ビット値
戻り値
0から64までの整数
説明
以下がコード例です。
nlib_printf("nlib_clz64(0x8000000000000000ULL) -> %d\n", nlib_clz64(0x8000000000000000ULL));
nlib_printf("nlib_clz64(0x0000000000000001ULL) -> %d\n", nlib_clz64(0x0000000000000001ULL));
/*
Output:
nlib_clz64(0x8000000000000000ULL) -> 0
nlib_clz64(0x0000000000000001ULL) -> 63
*/
Platform Implementation
Win32 _BitScanReverse64()又は_BitScanReverse()
Linux __builtin_clzll()
FreeBSD __builtin_clzll()
OS X __builtin_clzll()
CAFE __CLZ32()
CTR __builtin_clzll()

Platform.h2692 行目に定義があります。

◆ nlib_cond_broadcast()

nlib_cond_broadcast ( nlib_cond cond)

条件変数cond を待っているスレッド全ての実行を再開させます。

引数
[in]cond条件変数オブジェクト
戻り値
0成功した場合
EINVALcondNULLである場合
説明
Platform Implementation
Win32 WakeAllConditionVariable()
Linux pthread_cond_broadcast()
FreeBSD pthread_cond_broadcast()
OS X pthread_cond_broadcast()
CAFE OSFastCond_Signal()
CTR Event::Signal()

◆ nlib_cond_destroy()

nlib_cond_destroy ( nlib_cond cond)

条件変数オブジェクトを破壊します。

引数
[in]cond条件変数オブジェクト
戻り値
0成功した場合
EINVALcondNULLである場合
説明
Platform Implementation
Win32 システムコールは呼び出されません
Linux pthread_cond_destroy()
FreeBSD pthread_cond_destroy()
OS X pthread_cond_destroy()
CAFE システムコールは呼び出されません
CTR Event::~Event()

◆ nlib_cond_init()

nlib_cond_init ( nlib_cond cond)

条件変数を初期化します。

引数
[in]cond条件変数オブジェクト
戻り値
0成功した場合
EINVALcondNULLである場合
説明
Platform Implementation
Win32 InitializeConditionVariable()
Linux pthread_cond_init()
FreeBSD pthread_cond_init()
OS X pthread_cond_init()
CAFE OSFastCond_Init()
CTR Event::TryInitialize(true)

◆ nlib_cond_signal()

nlib_cond_signal ( nlib_cond cond)

条件変数cond を待っているスレッドの1つの実行を再開させます。

引数
[in]cond条件変数オブジェクト
戻り値
0成功した場合
EINVALcondNULLである場合
説明
Platform Implementation
Win32 WakeConditionVariable()
Linux pthread_cond_signal()
FreeBSD pthread_cond_signal()
OS X pthread_cond_signal()
CAFE OSFastCond_Signal()
CTR Event::Signal()
CAFE及びCTRの場合は全てのスレッドの実行が再開します。

◆ nlib_cond_wait()

nlib_cond_wait ( nlib_cond cond,
nlib_mutex mutex 
)

mutexをアンロックし、条件変数を待機します。実行が再開したらmutexを再ロックします。

引数
[in]cond条件変数オブジェクト
[in]mutexミューテックスオブジェクト
戻り値
0成功した場合
EINVALcondNULLである場合
説明
mutexは呼び出し前に1回だけロックされている必要があります。
Platform Implementation
Win32 SleepConditionVariableCS()
Linux pthread_cond_wait()
FreeBSD pthread_cond_wait()
OS X pthread_cond_wait()
CAFE OSFastCond_Wait()
CTR Event::Wait() + Event::ClearSignal()
CTRの場合は、mutexをアンロックしてから再ロックするまでがatomicな動作ではありません。

◆ nlib_cond_wait_for()

nlib_cond_wait_for ( nlib_cond cond,
nlib_mutex mutex,
nlib_duration  duration 
)

mutexをアンロックし、条件変数をduration の間だけ待機します。実行が再開したらmutexを再ロックします。

引数
[in]cond条件変数オブジェクト
[in]mutexミューテックスオブジェクト
[in]durationタイムアウト時間
戻り値
0成功した場合
ETIMEDOUTタイムアウトした場合
EINVALcondNULLである場合
説明
mutexは呼び出し前に1回だけロックされている必要があります。
Platform Implementation
Win32 SleepConditionVariableCS()
Linux pthread_cond_timedwait(), errnoがEINTRの場合は内部で再度実行される。
FreeBSD pthread_cond_timedwait(), errnoがEINTRの場合は内部で再度実行される。
OS X pthread_cond_timedwait(), errnoがEINTRの場合は内部で再度実行される。
CAFE nlib_sleep()
CTR Event::Wait() + Event::ClearSignal()
CTRの場合は、mutexをアンロックしてから再ロックするまでがatomicな動作ではありません。 CAFEの場合は、mutexをアンロックし100usecスリープしてからmutexを再ロックし0を返します。 duration が負の場合はETIMEDOUTを返します。

◆ nlib_cond_wait_until()

nlib_cond_wait_until ( nlib_cond cond,
nlib_mutex mutex,
nlib_time  abstime 
)

mutexをアンロックし、条件変数をabstimeまで待機します。実行が再開したらmutexを再ロックします。

引数
[in]cond条件変数オブジェクト
[in]mutexミューテックスオブジェクト
[in]abstimeタイムアウト時刻
戻り値
0成功した場合
ETIMEDOUTタイムアウトした場合
EINVALcondNULLである場合
説明
条件変数にまつわるspurious wakeup を勘案した場合、時刻でタイムアウトするこの関数の方が時間でタイムアウトする nlib_cond_wait_for()より確実に動作するといえるでしょう。
mutexは呼び出し前に1回だけロックされている必要があります。
Platform Implementation
Win32 nlib_epochtime() + nlib_cond_wait_for()
Linux pthread_cond_timedwait()
FreeBSD pthread_cond_timedwait()
OS X pthread_cond_timedwait()
CAFE nlib_epochtime() + nlib_sleep()
CTR Event::Wait() + Event::ClearSignal()
CTRの場合は、mutexをアンロックしてから再ロックするまでがatomicな動作ではありません。 CAFEの場合は、mutexをアンロックし、100usecスリープしてから、mutexを再ロックし、0を返します。 現在時刻がabstime 以降ならばETIMEDOUTを返します。

◆ nlib_condrwlock_broadcast()

nlib_condrwlock_broadcast ( nlib_condrwlock cond)

リードライトロック用条件変数cond を待っているスレッド全ての実行を再開させます。

引数
[in]condリードライトロック用条件変数
戻り値
0成功した場合
EINVALcondNULLである場合
説明
Platform Implementation
Win32 WakeAllConditionVariable()
Linux nlib_mutex_lock(), nlib_cond_broadcast(), nlib_mutex_unlock()
FreeBSD nlib_mutex_lock(), nlib_cond_broadcast(), nlib_mutex_unlock()
OS X nlib_mutex_lock(), nlib_cond_broadcast(), nlib_mutex_unlock()
CAFE nlib_mutex_lock(), nlib_cond_broadcast(), nlib_mutex_unlock()
CTR nlib_mutex_lock(), nlib_cond_broadcast(), nlib_mutex_unlock()

◆ nlib_condrwlock_destroy()

nlib_condrwlock_destroy ( nlib_condrwlock cond)

リードライトロック用条件変数を破壊します。

引数
[in]condリードライトロック用条件変数
戻り値
0成功した場合
EINVALcondNULLである場合
説明
Platform Implementation
Win32 何もしません
Linux nlib_mutex_destroy(), nlib_cond_destroy()
FreeBSD nlib_mutex_destroy(), nlib_cond_destroy()
OS X nlib_mutex_destroy(), nlib_cond_destroy()
CAFE nlib_mutex_destroy(), nlib_cond_destroy()
CTR nlib_mutex_destroy(), nlib_cond_destroy()

◆ nlib_condrwlock_init()

nlib_condrwlock_init ( nlib_condrwlock cond)

リードライトロック用条件変数を初期化します。

引数
[in]condリードライトロック用条件変数
戻り値
0成功した場合
EINVALcondNULLである場合
説明
Platform Implementation
Win32 InitializeConditionVariable()
Linux nlib_mutex_init(), nlib_cond_init()
FreeBSD nlib_mutex_init(), nlib_cond_init()
OS X nlib_mutex_init(), nlib_cond_init()
CAFE nlib_mutex_init(), nlib_cond_init()
CTR nlib_mutex_init(), nlib_cond_init()

◆ nlib_condrwlock_signal()

nlib_condrwlock_signal ( nlib_condrwlock cond)

リードライトロック用条件変数cond を待っているスレッドの1つの実行を再開させます。

引数
[in]condリードライトロック用条件変数
戻り値
0成功した場合
EINVALcondNULLである場合
説明
Platform Implementation
Win32 WakeConditionVariable()
Linux nlib_mutex_lock(), nlib_cond_signal(), nlib_mutex_unlock()
FreeBSD nlib_mutex_lock(), nlib_cond_signal(), nlib_mutex_unlock()
OS X nlib_mutex_lock(), nlib_cond_signal(), nlib_mutex_unlock()
CAFE nlib_mutex_lock(), nlib_cond_signal(), nlib_mutex_unlock()
CTR nlib_mutex_lock(), nlib_cond_signal(), nlib_mutex_unlock()

◆ nlib_condrwlock_wait()

nlib_condrwlock_wait ( nlib_condrwlock cond,
nlib_rwlock rwlock,
int  rdlock 
)

rwlockをアンロックし、条件変数を待機します。実行が再開したらrwlockを再ロックします。

引数
[in]condリードライトロック用条件変数
[in]rwlockリードライトロック
[in]rdlock0ならばライトロック, 1ならばリードロックを指定
戻り値
0成功した場合
EINVALcond 又はrwlockNULLである場合
説明
Platform Implementation
Win32 SleepConditionVariableSRW()
Linux nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
FreeBSD nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
OS X nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
CAFE nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
CTR nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
参照
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2406.html#gen_cond_var

◆ nlib_condrwlock_wait_for()

nlib_condrwlock_wait_for ( nlib_condrwlock cond,
nlib_rwlock rwlock,
nlib_duration  duration,
int  rdlock 
)

rwlockをアンロックし、条件変数を待機します。実行が再開したらrwlockを再ロックします。

引数
[in]condリードライトロック用条件変数
[in]rwlockリードライトロック
[in]durationタイムアウト時間
[in]rdlock0ならばライトロック, 1ならばリードロックを指定
戻り値
0成功した場合
ETIMEDOUTタイムアウトした場合
EINVALcond 又はrwlockNULLである場合
説明
Platform Implementation
Win32 SleepConditionVariableSRW()
Linux nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait_for(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
FreeBSD nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait_for(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
OS X nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait_for(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
CAFE nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait_for(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
CTR nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait_for(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
参照
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2406.html#gen_cond_var

◆ nlib_condrwlock_wait_until()

nlib_condrwlock_wait_until ( nlib_condrwlock cond,
nlib_rwlock rwlock,
nlib_time  abstime,
int  rdlock 
)

rwlockをアンロックし、条件変数を待機します。実行が再開したらrwlockを再ロックします。

引数
[in]condリードライトロック用条件変数
[in]rwlockリードライトロック
[in]abstimeタイムアウト時刻
[in]rdlock0ならばライトロック, 1ならばリードロックを指定
戻り値
0成功した場合
ETIMEDOUTタイムアウトした場合
EINVALcond 又はrwlockNULLである場合
説明
Platform Implementation
Win32 SleepConditionVariableSRW()
Linux nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait_until(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
FreeBSD nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait_until(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
OS X nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait_until(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
CAFE nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait_until(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
CTR nlib_mutex_lock(), nlib_rwlock_rdunlock() or nlib_rwlock_wrunlock(), nlib_cond_wait_until(), nlib_mutex_unlock(), nlib_rwlock_rdlock() or nlib_rwlock_wrlock()
参照
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2406.html#gen_cond_var

◆ nlib_crc32()

nlib_crc32 ( uint32_t  crc32,
const void *  p,
size_t  n 
)

データのCRC-32チェックサムを計算する関数です。

引数
[in]crc32以前のCRC-32チェックサムの値(初期値は0)
[in]pnバイトのデータへのポインタ
[in]nデータサイズ
戻り値
与えられたデータによってCRC-32チェックサムの値
説明
CRC-32の計算方法は複数ありますが、この関数ではRFC2083(PNG), RFC1952(gzip)と同じ方式で計算を行います。
// 文字列のチェックサムを取る
const char str[] = "This is a string";
uint32_t crc32 = nlib_crc32(0, &str[0], strlen(str)); // 0x0876633FUL
Platform Implementation
SSE テーブル引き
NEON __crc32b(),__crc32h(),__crc32w(),__crc32d()
CAFE テーブル引き
CTR テーブル引き
参照
https://tools.ietf.org/html/rfc2083 (RFC2083)
https://www.ietf.org/rfc/rfc1952.txt (RFC1952)
http://www.futomi.com/lecture/japanese/rfc1952.html (RFC1952, in Japanese)

◆ nlib_crc32c()

nlib_crc32c ( uint32_t  crc32c,
const void *  p,
size_t  n 
)

データのCRC-32Cチェックサムを計算する関数です。

引数
[in]crc32c以前のCRC-32Cチェックサムの値(初期値は0)
[in]pnバイトのデータへのポインタ
[in]nデータサイズ
戻り値
与えられたデータによってCRC-32Cチェックサムの値
説明
CRC-32の計算方法は複数ありますが、この関数ではRFC3720と同じ方式で計算を行います。
Platform Implementation
SSE _mm_crc32_u8(),_mm_crc32_u16(),_mm_crc32_u32(),_mm_crc32_u64()
NEON __crc32b(),__crc32h(),__crc32w(),__crc32d()
CAFE テーブル引き
CTR テーブル引き
参照
https://tools.ietf.org/html/rfc3720 (RFC3720)

◆ nlib_ctz32()

static int nlib_ctz32 ( uint32_t  x)
inlinestatic

LSB(least significant bit)から見て連続する0ビットの数を返します。

引数
[in]x検索対象の32ビット値
戻り値
0から32までの整数
説明
以下がコード例です。
nlib_printf("nlib_ctz32(0x80000000) -> %d\n", nlib_ctz32(0x80000000));
nlib_printf("nlib_ctz32(0x00000001) -> %d\n", nlib_ctz32(0x00000001));
/*
Output:
nlib_ctz32(0x80000000) -> 31
nlib_ctz32(0x00000001) -> 0
*/
Platform Implementation
Win32 _BitScanForward()
Linux __builtin_ctz()
FreeBSD __builtin_ctz()
OS X __builtin_ctz()
CAFE 32 - nlib_clz32(~x & (x - 1));
CTR 32 - nlib_clz32(~x & (x - 1));

Platform.h2691 行目に定義があります。

◆ nlib_ctz64()

static int nlib_ctz64 ( uint64_t  x)
inlinestatic

LSB(least significant bit)から見て連続する0ビットの数を返します。

引数
[in]x検索対象の64ビット値
戻り値
0から64までの整数
説明
以下がコード例です。
nlib_printf("nlib_ctz64(0x8000000000000000ULL) -> %d\n", nlib_ctz64(0x8000000000000000ULL));
nlib_printf("nlib_ctz64(0x0000000000000001ULL) -> %d\n", nlib_ctz64(0x0000000000000001ULL));
/*
Output:
nlib_ctz64(0x8000000000000000ULL) -> 63
nlib_ctz64(0x0000000000000001ULL) -> 0
*/
Platform Implementation
Win32 _BitScanForward64()又は_BitScanForward()
Linux __builtin_ctzll()
FreeBSD __builtin_ctzll()
OS X __builtin_ctzll()
CAFE 64 - nlib_clz64(~x & (x - 1));
CTR 64 - nlib_clz64(~x & (x - 1));

Platform.h2693 行目に定義があります。

◆ nlib_debug_backtrace()

nlib_debug_backtrace ( size_t *  result,
void **  buffer,
size_t  count 
)

バックトレースをbuffer が指す配列に格納します。

引数
[out]result格納されたバックトレースの個数
[in,out]bufferバックトレースを格納するバッファ
[in]countbuffer に格納可能なバックトレースの個数(voidポインタの数)
戻り値
0成功した場合
ENOTSUPこの機能がサポートされていない場合。buffer は0で埋められる。
EINVALresult == 0, bufffer == NULL, 又はcount == 0だった場合
説明
Platform Implementation
Win32 CaptureStackBackTrace()
Linux backtrace(), cygwinではENOTSUPを返す
FreeBSD backtrace()
OS X backtrace()
CAFE ENOTSUPを返す
CTR ENOTSUPを返す

◆ nlib_debug_backtrace_gettext()

nlib_debug_backtrace_gettext ( char *  str,
size_t  strbufsize,
void *const *  buf,
size_t  count 
)

nlib_debug_backtrace()で得られた情報から文字列情報を作成します。

引数
[out]str文字列へのバッファ
[in]strbufsize文字列へのバッファのサイズ
[in]bufバックトレースが格納されたバッファ
[in]count格納されているバックトレースの数
戻り値
0成功した場合
ENOTSUPこの機能がサポートされていない場合。str には空文字列がセットされる。
EINVALstr == NULL, strbufsize == 0, buf == NULL, 又はcount == 0だった場合
説明
書きだされたテキストはヌル文字で終端されます。
Platform Implementation
Win32 SymFromAddr()
Linux backtrace_symbols(), cygwinではENOTSUPを返す
FreeBSD backtrace_symbols()
OS X backtrace_symbols()
CAFE ENOTSUPを返す
CTR ENOTSUPを返す

◆ nlib_dir_close()

nlib_dir_close ( nlib_dir  dir)

ディレクトリをクローズする

引数
[in]dirnlib_dir構造体
戻り値
0成功した場合
その他何らかの原因で失敗した場合
説明
Platform Implementation
Win32 FindClose()
Linux closedir()
FreeBSD closedir()
OS X closedir()
CAFE FSCloseDir()
CTR nn::fs::Directory::Finalize() + nn::fs::Directory::~Directory()

◆ nlib_dir_open()

nlib_dir_open ( nlib_dir *  dir,
const char *  native_path 
)

ディレクトリをオープンする

引数
[in]dir初期化するnlib_dir構造体へのポインタ
[in]native_pathパス名(UTF-8)
戻り値
0成功した場合
EINVALdir, native_pathNULLだった場合
ENOENTディレクトリが存在しなかった場合
ENOTDIRnative_path がディレクトリではない場合
ENOMEMメモリの確保に失敗した場合
その他何らかの原因で失敗した場合
説明
Platform Implementation
Win32 FindFirstFileW()
Linux opendir()
FreeBSD opendir()
OS X opendir()
CAFE FSOpenDir()
CTR nn::fs::Directory::Directory() + nn::fs::Directory::TryInitialize()
コード例
nlib_dir dir;
e = nlib_dir_open(&dir, "path");
if (nlib_is_error(e)) {
// ERROR
}
nlib_dirent ent;
while ((e = nlib_dir_read(&ent, dir)) != ENOENT) {
// file if (ent.flags & 1) == 0
// directory if (ent.flags & 1) == 1
// ent.name is a name of entry.
}
if (e != ENOENT) {
// ERROR
}
e = nlib_dir_close(dir);
if (nlib_is_error(e)) {
// ERROR
}

◆ nlib_dir_read()

nlib_dir_read ( nlib_dirent *  ent,
nlib_dir  dir 
)

ディレクトリエントリがあればそれをを1つ読み込む。

引数
[in]entディレクトリエントリへのポインタ
[in]dirnlib_dir構造体
戻り値
0成功した場合
ENOENT末尾に達してこれ以上ディレクトリ内にファイルがない場合
その他何らかの原因で失敗した場合
説明
Platform Implementation
Win32 FindNextFileW()
Linux readdir(), dirfd(), fstatat()
FreeBSD readdir(), dirfd(), fstatat()
OS X readdir(), dirfd(), fstatat()
CAFE FSReadDir()
CTR nn::fs::Directory::TryRead()

◆ nlib_dirname()

nlib_dirname ( size_t *  len,
const char *  path 
)
引数
[out]lenディレクトリ部分の長さ
[in]pathパス文字列
戻り値
戻り値となるポインタから先頭*len文字がディレクトリ部分になります。
説明
例で示すと下記のような動作となります。
path rval[0] .. rval[*len - 1]
"" "."
"/" "/"
"." "."
".." "."
"../" ".."
"./" "."
"/usr/lib" "/usr"
"/usr/" "/usr"
"usr" "."
"sdmc:/test.txt" "sdmc:"
"C:\\test.txt" "C:"(Windows only)

◆ nlib_disk_freespace()

nlib_disk_freespace ( const char *  native_path,
uint64_t *  free_bytes_available,
uint64_t *  total_bytes,
uint64_t *  total_free_bytes 
)

指定されたパスが属するストレージの容量に関する情報を取得します。

引数
[in]native_pathパス名(UTF-8)
[out]free_bytes_available呼び出し側スレッドが利用できるバイト数
[out]total_bytesストレージ全体のバイト数
[out]total_free_bytesストレージ全体の空きバイト数
戻り値
0成功した場合
その他プラットフォーム依存のエラー(アクセス権がない等)
説明
Platform Implementation
Win32 GetDiskFreeSpaceExW()
Linux statvfs()
FreeBSD statvfs()
OS X statvfs()
CAFE FSGetFreeSpaceSize()
CTR nn::fs::GetSdmcSize()
覚え書き
CAFE版では全ての変数にFSGetFreeSpaceSize()で取得した利用可能バイト数が格納されます。
CTR版ではパス文字列を無視してSDカードのサイズと空き容量を取得します。

◆ nlib_double_from_chars()

nlib_double_from_chars ( double *  result,
const char **  endptr,
const char *  first,
const char *  last 
)

文字列をdouble型に変換します。

引数
[out]result変換された数値
[out]endptr数値に変換されなかった最初の文字へのポインタが格納される
[in]firstパースされる文字列の先頭
[in]lastパースされる文字列の末尾
戻り値
0の場合は成功
説明
from_chars()のフォーマットにstd::chars_format::generalを指定して実行します。 戻り値についての詳細は、nlib_int32_from_chars()の項目を御覧ください。

◆ nlib_epochtime()

nlib_epochtime ( nlib_time t)

現在時刻を取得します。

引数
[out]t現在時刻が格納される変数へのポインタ
戻り値
0成功した場合
EINVALtNULLの場合
説明
Platform Implementation
Win32 GetSystemTimeAsFileTime(), GetSystemTimePreciseAsFileTime()
Linux clock_gettime(CLOCK_REALTIME, now)
FreeBSD clock_gettime(CLOCK_REALTIME, now)
OS X host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock), clock_get_time(cclock, &mts)
CAFE OSGetTime()
CTR nn::fnd::DateTime::GetNow()

◆ nlib_error_string()

nlib_error_string ( errno_t  e)

nlibのエラー値に対応する文字列リテラルを返します。

引数
[in]eエラー値
戻り値
エラー値に対応する文字列リテラル
各種例:
misc/handlemaker/handlemaker.cpp.

◆ nlib_exist_path()

nlib_exist_path ( int *  result,
const char *  native_path 
)

パスが存在するかどうかを検査します。

引数
[out]resultパスが存在するならば0以外の値が設定される。
[in]native_pathパス名(UTF-8)
戻り値
0成功した場合
その他プラットフォーム依存のエラー
説明
Platform Implementation
Win32 PathFileExistsW()
Linux stat()
FreeBSD stat()
OS X stat()
CAFE FSGetStat()
CTR nlib_fd_open()

◆ nlib_fd_close()

nlib_fd_close ( nlib_fd  fd)

ファイルをクローズします。エラーを返した場合でもファイルディスクリプタは解放されます。

引数
[in]fdファイルディスクリプタ
戻り値
0成功しました。
EBADFfd が有効かつオープンされたディスクリプタでない。
EIOI/Oエラーが発生した。
その他ネイティブAPIが返すエラーによる。
説明
Platform Implementation
Win32 CloseHandle()
Linux close()
FreeBSD close()
OS X close()
CAFE FSCloseFile()
CTR FileStream::Finalize()
各種例:
misc/readfile/readfile.cpp, misc/stringutils/stringutils.cpp.

◆ nlib_fd_fileid()

nlib_fd_fileid ( nlib_fileid *  result,
nlib_fd  fd 
)
引数
[out]resultファイルに対する一意なバイト列
[in]fdファイルディスクリプタ
戻り値
0ならば成功。それ以外はエラー。
説明
単一のコンピュータ内に存在するファイルに対する一意なIDを取得します。 これにより2つのディスクリプタが指し示すファイルが同一であるかどうかを調べることができます。 IDは環境毎に定義の異なる構造体に格納されるので、比較にはmemcmp()を用いてください。 また、IDはファイルの削除と作成を繰り返すことで同じIDが再利用されることがあります。 従って比較対処の両方のファイルディスクリプタがオープンしている状態である必要があります。
Platform Implementation
Win32 GetFileInformationByHandleEx()
Linux fstat()
FreeBSD fstat()
OS X fstat()
CAFE ENOTSUPを返します
CTR ENOTSUPを返します

◆ nlib_fd_flush()

nlib_fd_flush ( nlib_fd  fd)

ファイルディスクリプタへの書き込みをフラッシュします。

引数
[in]fdファイルディスクリプタ
戻り値
0成功しました。
EBADFfd が有効かつオープンされたディスクリプタでない。
その他ネイティブAPIが返すエラーによる。
説明
Platform Implementation
Win32 FlushFileBuffers()
Linux 何もしない
FreeBSD 何もしない
OS X 何もしない
CAFE FSFlushFile()
CTR FileStream::TryFlush()

◆ nlib_fd_getsize()

nlib_fd_getsize ( nlib_offset size,
nlib_fd  fd 
)

ファイルサイズを取得します。

引数
[out]sizeファイルサイズが格納されるポインタ
[in]fdファイルディスクリプタ
戻り値
0成功しました。
EINVALsizeNULLだった。
EBADFfd が有効かつオープンされたディスクリプタでない。
その他ネイティブAPIが返すエラーによる。
説明
Platform Implementation
Win32 GetFileSizeEx()
Linux fstat()
FreeBSD fstat()
OS X fstat()
CAFE FSGetStatFile()
CTR FileStream::TryGetSize()
各種例:
misc/readfile/readfile.cpp, misc/stringutils/stringutils.cpp.

◆ nlib_fd_native_handle()

nlib_fd_native_handle ( void **  native_handle,
nlib_fd  fd 
)

ネイティブのファイルハンドル(に相当するもの)を取得する。

引数
[in]native_handleネイティブのファイルハンドルが格納されるポインタ
[in]fdファイルディスクリプタ
戻り値
0成功しました。
EBADFfd が有効かつオープンされたディスクリプタでない。
その他ネイティブAPIが返すエラーによる。
説明
Platform Implementation
Win32 HANDLEが格納される
Linux fdと同じ値が格納される
FreeBSD fdと同じ値が格納される
OS X fdと同じ値が格納される
CAFE FSFileHandleが格納される
CTR nn::fs::FileStreamへのポインタが格納される

◆ nlib_fd_open()

nlib_fd_open ( nlib_fd fd,
const char *  native_path,
unsigned int  flags,
int  mode 
)

ファイルをオープンします。

引数
[out]fdオープンに成功するとファイルディスクリプタが格納されます。
[in]native_pathファイルパス文字列(UTF-8)
[in]flagsオープン用のフラグを論理和で組み合わせた値
[in]modeNLIB_FD_O_CREATでファイルを作成する場合にはアクセス許可を指定する必要があります。そうでない場合はこの引数を省略することができます。
戻り値
0成功しました。
EINVALfd, native_pathNULLだった。
ENOTSUPflags の値等がサポートされていない。
ENOMEM内部でメモリの確保に失敗した。
ELOOP指定されたパスがシンボリックリンクだった。
その他ネイティブAPIが返すエラーによる。
説明
flagsには、 NLIB_FD_O_RDONLY, NLIB_FD_O_WRONLY, NLIB_FD_O_RDWRなどを組みわせて指定します。
Platform Implementation
Win32 CreateFileW()。modeの値は無視されます。
Linux open()
FreeBSD open()
OS X open()
CAFE FSOpenFile(), modeの値は無視されます。
CTR FileStream::TryInitialize(), modeの値は無視されます。
Windowsにおける動作の詳細
内部では以下のような処理を行っています。
  1. パス文字列が予約デバイス名やデバイス名前空間を指している場合にはEACCESを返す。
  2. パス文字列をUTF-16に変換し、更にUNCパスに変換する。
  3. FILE_FLAG_OVERLAPPED,FILE_FLAG_OPEN_REPARSE_POINT,FILE_FLAG_POSIX_SEMANTICSを設定してファイルをオープン。
  4. ファイルハンドルの情報を取得し、シンボリックリンクやジャンクションを示すFILE_ATTRIBUTE_REPARSE_POINTが設定していた場合にはELOOPを返す。
  5. ファイルディスクリプタをユーザーに返す。
Unix系OSにおける動作の詳細
内部では以下のような処理を行っています。
  1. lstat()でステータスを取得し、通常ファイルかディレクトリでなければEACCESを返す。
  2. O_CLOEXEC, O_NOFOLLOW, O_NONBLOCKをユーザーが与えたフラグに追加してファイルをオープン。
  3. open()EINTRを返した場合は再度実行する。その他のエラーの場合はエラー値を返すが、EMLINKEFTYPEELOOPとして返す。
  4. fstat()で取得したステータスがlstat()のものと一致しなければEACCESを返す。
  5. ユーザーがO_NONBLOCKをセットしていなければリセットする。
  6. ファイルディスクリプタをユーザーに返す。
各種例:
misc/readfile/readfile.cpp, misc/stringutils/stringutils.cpp.

◆ nlib_fd_pread()

nlib_fd_pread ( size_t *  result,
nlib_fd  fd,
void *  buf,
size_t  count,
nlib_offset  offset 
)

指定したオフセットでファイルディスクリプタから読みこみます。ファイルディスクリプタのオフセットは変更されません。

引数
[out]result読み込んだバイト数が格納されるポインタ
[in]fdファイルディスクリプタ
[in]buf読み込みバッファ
[in]count読むこむ最大バイト数
[in]offsetオフセット
戻り値
nlib_fd_seek(), nlib_fd_read()が返しうる値
説明
Platform Implementation
Win32 ReadFile
Linux pread
FreeBSD pread
OS X pread
CAFE FSReadFileWithPos()
CTR nlib_fd_seek() + nlib_fd_read()
バグ:
NLIB_FD_O_APPENDフラグを用いてファイルをオープンした場合の動作は不定です。

◆ nlib_fd_pwrite()

nlib_fd_pwrite ( size_t *  result,
nlib_fd  fd,
const void *  buf,
size_t  count,
nlib_offset  offset 
)

指定したオフセットでファイルディスクリプタに書きこみます。ファイルディスクリプタのオフセットは変更されません。

引数
[out]result書き込んだバイト数が格納されるポインタ
[in]fdファイルディスクリプタ
[in]buf書きこみバッファ
[in]count書きこむ最大バイト数
[in]offsetオフセット
戻り値
nlib_fd_seek(), nlib_fd_write()が返しうる値
説明
Platform Implementation
Win32 WriteFile
Linux pwrite
FreeBSD pwrite
OS X pwrite
CAFE FSWriteFileWithPos()
CTR nlib_fd_seek() + nlib_fd_write()
バグ:
NLIB_FD_O_APPENDフラグを用いてファイルをオープンした場合の動作は不定です。

◆ nlib_fd_read()

nlib_fd_read ( size_t *  result,
nlib_fd  fd,
void *  buf,
size_t  count 
)

ファイルディスクリプタから、(最大)count バイトをbuf に読むこみます。

引数
[out]result読み込んだバイト数が格納されるポインタ
[in]fdファイルディスクリプタ
[in]buf読み込みバッファ
[in]count読むこむ最大バイト数
戻り値
0成功しました。
EINVALresult 又はbufNULLだった。
EBADFfd が有効かつオープンされたディスクリプタでない。
その他ネイティブAPIが返すエラーによる。
説明
エラーが発生せず、*result に0が格納された場合はファイルの終わりを意味します。
Platform Implementation
Win32 ReadFile()
Linux read(), errnoがEINTRの場合は内部で再度実行される。
FreeBSD read(), errnoがEINTRの場合は内部で再度実行される。
OS X read(), errnoがEINTRの場合は内部で再度実行される。
CAFE FSReadFile()
CTR FileStream::TryRead()
各種例:
misc/readfile/readfile.cpp, misc/stringutils/stringutils.cpp.

◆ nlib_fd_readv()

nlib_fd_readv ( size_t *  result,
nlib_fd  fd,
const nlib_fd_iovec *  iov,
int  iovcnt 
)

fdに関連付けられたファイルから複数の非連続なバッファへの読み込みを行います。

引数
[out]result成功した場合に読み込んだバイト数が格納される。
[in]fdファイルディスクリプタ
[in]ioviovcnt 個のバッファへのポインタとそのサイズ
[in]iovcntiov の個数
戻り値
0成功した場合。
EINVALresultNULLだった場合。
EINVALiovcntが0未満だったり1024を超えたりした場合。
EINVALバッファ・サイズの合計がRSIZE_MAXを超えた場合。
EBADFfd が有効かつオープンされたディスクリプタでない。
ENOMEMメモリの動的確保に失敗した場合。
その他ネイティブAPIが返すエラーによる。
説明
データの読み込みは1回のreadv()又はnlib_fd_read()によって行われます。
Platform Implementation
Win32 nlib_malloc(), nlib_fd_read(), nlib_free()
Linux readv(), errnoがEINTRの場合は内部で再度実行される。
FreeBSD readv(), errnoがEINTRの場合は内部で再度実行される。
OS X readv(), errnoがEINTRの場合は内部で再度実行される。
CAFE nlib_malloc(), nlib_fd_read(), nlib_free()
CTR nlib_malloc(), nlib_fd_read(), nlib_free()

◆ nlib_fd_seek()

nlib_fd_seek ( nlib_offset result,
nlib_fd  fd,
nlib_offset  offset,
int  whence 
)

ファイルのオフセットを変更する。

引数
[out]result変更後のオフセットが格納されるポインタ
[in]fdファイルディスクリプタ
[in]offsetオフセット
[in]whenceNLIB_SEEK_SET又は NLIB_SEEK_CUR
戻り値
0成功しました。
EINVALresultNULLであるか、whence の値が不正である。
EINVAL変更後のオフセットが負の値になった。
EBADFfd が有効かつオープンされたディスクリプタでない。
その他ネイティブAPIが返すエラーによる。
説明
Platform Implementation
Win32 nlibによる実装
Linux lseek()
FreeBSD lseek()
OS X lseek()
CAFE FSSetPosFile(), オフセットをファイル末尾より後に設定できない
CTR FileStream::TrySeek(), オフセットをファイル末尾より後に設定できない

◆ nlib_fd_sync()

nlib_fd_sync ( nlib_fd  fd)

メモリにあるファイルの内容をデバイス上のものと同期させます。

引数
[in]fdファイルディスクリプタ
戻り値
0成功しました。
EBADFfd が有効かつオープンされたディスクリプタでない。
その他ネイティブAPIが返すエラーによる。
説明
Platform Implementation
Win32 nlib_fd_flush()
Linux fsync()
FreeBSD fsync()
OS X fsync()
CAFE nlib_fd_flush()
CTR nlib_fd_flush()

◆ nlib_fd_truncate()

nlib_fd_truncate ( nlib_fd  fd,
nlib_offset  length 
)

指定した長さにファイルを延長、もしくは切り詰める。

引数
[in]fdファイルディスクリプタ
[in]lengthファイルの長さ
戻り値
0成功しました
EBADFfd が有効かつオープンされたディスクリプタでない。
その他ネイティブAPIが返すエラーによる。
説明
ファイルが延長された場合、その部分には0が書き込まれます。 ファイルオフセット(読み書きする位置)は変更されません。 また、fd は書き込み用に開かれている必要があります。
Platform Implementation
Win32 SetFilePointerEx() + SetEndOfFile()
Linux ftruncate()
FreeBSD ftruncate()
OS X ftruncate()
CAFE FSGetStatFile() + FSGetPosFile() + FSSetPosFile() + FSWriteFile() or FSTruncateFile()
CTR FileStream::TryGetSize() + FileStream::TrySetSize() + FileStream::TryWrite()

◆ nlib_fd_write()

nlib_fd_write ( size_t *  result,
nlib_fd  fd,
const void *  buf,
size_t  count 
)

ファイルディスクリプタへ、(最大)count バイトをbuf から書きこみます。

引数
[out]result書き込んだバイト数が格納されるポインタ
[in]fdファイルディスクリプタ
[in]buf書きこみバッファ
[in]count書きこむ最大バイト数
戻り値
0成功しました。
EINVALresult 又はbufNULLだった。
EBADFfd が有効かつオープンされたディスクリプタでない。
その他ネイティブAPIが返すエラーによる。
説明
Platform Implementation
Win32 WriteFile()
Linux write(), errnoがEINTRの場合は内部で再度実行される。
FreeBSD write(), errnoがEINTRの場合は内部で再度実行される。
OS X write(), errnoがEINTRの場合は内部で再度実行される。
CAFE FSWriteFile()
CTR FileStream::TryWrite()

◆ nlib_fd_writev()

nlib_fd_writev ( size_t *  result,
nlib_fd  fd,
const nlib_fd_iovec *  iov,
int  iovcnt 
)

複数の非連続なバッファからfdに関連付けられたファイルへの書き込みを行います。

引数
[out]result成功した場合に書き込んだバイト数が格納される。
[in]fdファイルディスクリプタ
[in]ioviovcnt 個のバッファへのポインタとそのサイズ
[in]iovcntiov の個数
戻り値
0成功した場合。
EINVALresultNULLだった場合。
EINVALiovcntが0未満だったり1024を超えたりした場合。
EINVALバッファ・サイズの合計がRSIZE_MAXを超えた場合。
EBADFfd が有効かつオープンされたディスクリプタでない。
ENOMEMメモリの動的確保に失敗した場合。
その他ネイティブAPIが返すエラーによる。
説明
データの書き込みは1回のwritev()又はnlib_fd_write()によって行われます。
Platform Implementation
Win32 nlib_malloc(), nlib_fd_write(), nlib_free()
Linux writev(), errnoがEINTRの場合は内部で再度実行される。
FreeBSD writev(), errnoがEINTRの場合は内部で再度実行される。
OS X writev(), errnoがEINTRの場合は内部で再度実行される。
CAFE nlib_malloc(), nlib_fd_write(), nlib_free()
CTR nlib_malloc(), nlib_fd_write(), nlib_free()

◆ nlib_find_break()

nlib_find_break ( const nlib_utf8_t **  pos,
const nlib_utf8_t first,
const nlib_utf8_t last,
nlib_unicode_break_property  property,
nlib_unicode_break_option  option 
)

UTF-8文字列内の次の区切の位置を計算します。

引数
[out]pos見つかった区切の位置
[in]firstUTF-8文字列の先頭
[in]lastUTF-8文字列の末尾
[in]property文字列の区切り方
[in]option入力文字列に関するオプション
戻り値
0次の区切が見つかった場合。*posにその位置が格納されます。
EINVAL入力引数のエラー
EILSEQコードポイントにならないバイト列が見つかった場合。*posに次のコードポイントの先頭になる可能性のある位置が格納されます。
ENOENToptionkUnicodeBreakContinueを指定した場合かつ入力文字列が不足していて区切を決定できない場合。*posfirstと一致します。
説明
文字列内の区切を見つけて*posに設定します。 文字列内の区切を見つけるアルゴリズムは単純かつ全ての言語に対応したもので、言語依存のより洗練された手法を利用しない場合のデフォルトとして利用することが可能です。 アルゴリズムはUnicode標準によって定義されています。
以下のコードでは文字列を書記素単位で分割し、1書記素単位で表示しています。
// 1 0xE2 0x83 0xA3 (1⃣, Emoji one, 1 U+20E3)
// 0xF0 0x9F 0x8F 0x83 0xF0 0x9F 0x8F 0xBF (🏃🏿, running man with skin tone selector, U+1F3C3 U+1F3FF)
// 0xF0 0x9F 0x87 0xAF 0xF0 0x9F 0x87 0xB5 (🇯🇵, JP, U+1F1EF U+1F1F5)
const nlib_utf8_t* str = "1\xE2\x83\xA3\xF0\x9F\x8F\x83\xF0\x9F\x8F\xBF\xF0\x9F\x87\xAF\xF0\x9F\x87\xB5";
const nlib_utf8_t* first = str;
const nlib_utf8_t* last = str + nlib_strlen(str);
while (first != last) {
const nlib_utf8_t* p;
nlib_find_break(&p, first, last, kUnicodeBreakPropertyGrapheme, kUnicodeBreakDefault);
nlib_printf("'%s'\n", std::string(first, p).c_str());
first = p;
}
/*
Output:
'1⃣'
'🏃🏿'
'🇯🇵'
*/
参照
http://www.unicode.org/reports/tr29/tr29-31.html
http://unicode.org/reports/tr14/

◆ nlib_free()

nlib_free ( void *  ptr)

C標準関数のfree()を呼び出すweak関数です。nlibはこの関数を経由してfree()を呼び出します。

引数
[in]ptr解放するポインタ
説明
cygwin版以外ではこの関数はユーザープログラムによって上書きすることが可能です。 上書きすることでnlibのメモリ解放をカスタマイズすることが可能です。
上書きする場合は以下のようにCリンケージにすることを忘れないでください。
extern "C" void nlib_free(void* ptr) {
.....
}
バグ:
cygwin版ではユーザープログラムによる上書きはできません。
各種例:
heap/replace_malloc/replace_malloc.cpp.

◆ nlib_free_size()

nlib_free_size ( void *  ptr,
size_t  size 
)

サイズを指定してメモリを解放します。デフォルトではnlib_free()を呼び出します。

引数
[in]ptr解放するポインタ
[in]sizeptr に割り当てられていたサイズ
説明
この関数はC++14のsized deallocationに対応するために用意されています。
各種例:
heap/replace_malloc/replace_malloc.cpp.

◆ nlib_gen_random()

nlib_gen_random ( void *  buf,
size_t  size 
)

ランダムな値をsize バイト生成してbuf に格納します。

引数
[out]bufランダム値が格納される領域へのポインタ
[in]sizeランダム値が格納される領域のサイズ
戻り値
0ならば成功
説明
Platform Implementation
Win32 CryptGenRandom()
Linux /dev/urandomを読みます
FreeBSD /dev/urandomを読みます
OS X /dev/urandomを読みます
CAFE ENOTSUPを返します
CTR ENOTSUPを返します
コード例
if (nlib_is_error(nlib_gen_random(buf, size))) {
// try another method to generate random values
}

◆ nlib_get_unicode_char_property()

nlib_get_unicode_char_property ( void *  value,
const nlib_utf8_t first,
const nlib_utf8_t last,
nlib_unicode_char_property  property 
)

指定されたユニコードのコードポイント1つに割り当てられたプロパティを取得します。

引数
[out]value取得したデータが格納されるポインタ
[in]firstUTF-8文字列の先頭へのポインタ
[in]lastUTF-8文字列の末尾へのポインタ
[in]property取得するプロパティ
戻り値
0成功した場合
EINVALpropertyの値が不正だった場合
ERANGEUTF-8の文字列がコードポイントの途中で途切れていた場合
説明
firstからUTF-8をコードポイント1つ分読み取り、コードポイントに割り当てられているプロパティを取得し、valueに格納します。
注意
関数内部でUTF-8が不正かどうかの検査は行われません。検証済みのUTF-8文字列を渡す必要があります。
参照
https://unicode.org/Public/10.0.0/ucd/UnicodeData.txt

◆ nlib_getenv()

nlib_getenv ( size_t *  result,
char *  buf,
size_t  bufsize,
const char *  varname 
)

環境変数の値を文字列で取得します。

引数
[out]result必要となる(なった)バッファ・サイズが格納される。環境変数が存在しない場合は0が格納される。
[out]buf環境変数の値を格納するバッファ
[in]bufsizebuf のサイズ
[in]varname環境変数名
戻り値
0成功した場合
EINVALresult 又はvarnameNULLだった場合
EINVALbufNULLbufsize が0でなかった場合
ERANGE用意されたバッファが小さすぎた場合。result に必要なバッファ・サイズが書き出されています。
説明
bufNULL, bufsizeに0を指定してこの関数を呼び出すと、環境変数の値の格納に必要なバッファ・サイズを得ることができます。
Platform Implementation
Win32 getenv_s()
Linux getenv()
FreeBSD getenv()
OS X getenv()
CAFE ENVGetEnvironmentVariable()
CTR nn::hio::CTR::GetEnvironmentVariable(), 事前にhioの初期化が必要

◆ nlib_int32_from_chars()

nlib_int32_from_chars ( int32_t *  result,
const char **  endptr,
const char *  first,
const char *  last,
int  base 
)

文字列をint32_t型に変換します。

引数
[out]result変換された整数値
[out]endptr整数値に変換されなかった最初の文字へのポインタが格納される
[in]firstパースされる文字列の先頭
[in]lastパースされる文字列の末尾
[in]base基数(少なくとも8, 10, 16をサポート)
戻り値
0成功した場合
EINVAL変換される文字が存在しなかった場合
ERANGE数値がint32_t型で表現できなかった場合
説明
C++17で導入されているfrom_chars()を用いた実装で、その仕様に従って動作します。 標準C++ライブラリにfrom_chars()が存在しない場合は、代替実装を実行します。
戻り値と格納される値の関係については以下の通りです。
  • 0の場合はresultに変換された整数値が格納され、endptrには整数値としてパースできなかった最初の文字へのポインタが格納されます。
  • EINVALの場合はresultは不変で、endptrfirstが格納されます。
  • ERANGEの場合はresultは不変で、endptrには整数値としてパースできなかった最初の文字へのポインタが格納されます。

◆ nlib_is_dir()

nlib_is_dir ( int *  result,
const char *  native_path 
)

パスがディレクトリかどうかを検査します。パスが存在しない場合は*resultに0を設定し、0を返します。

引数
[out]resultディレクトリならば0以外の値が設定される。
[in]native_pathパス名(UTF-8)
戻り値
0成功した場合
その他プラットフォーム依存のエラー
説明
Platform Implementation
Win32 PathIsDirectoryW()
Linux stat()
FreeBSD stat()
OS X stat()
CAFE FSGetStat()
CTR nlib_dir_open()

◆ nlib_is_error()

template<class T >
nlib_is_error ( const T &  obj)
inlinenoexcept

処理の結果やオブジェクトの状態がエラーである場合にtrueを返します。

テンプレート引数
Tbool, errno_tの値、又はoperator bool()を実装するクラス
引数
[in]obj関数の戻り値やオブジェクト
戻り値
エラーであった場合にtrue
説明
boolを返す関数は一般にtrueで成功、falseで失敗と判定されます。 一方、errno_tを返す関数は0で成功、0以外で失敗と判定されます。
nlib_is_error()を利用することで、どちらの場合も同じ記述で正しくエラーかどうかを判定することができます。 また、ポインタを引数にした場合はコンパイルエラーになるように実装されています。
各種例:
exi/script/script.cpp, exi/simple1/simple1.cpp, exi/textparser/textparser.cpp, heap/cachedheap/cachedheap.cpp, misc/datetime/datetime.cpp, misc/handlemaker/handlemaker.cpp, misc/nflags/nflags.cpp, misc/threading/condvar/condvar.cpp, misc/threading/future/future.cpp, misc/threading/threadpool/threadpool.cpp, misc/threading/tls/tls.cpp, misc/uri/uri.cpp, misc/usezlib/usezlib.cpp, msgpack/json/json.cpp, msgpack/jsonrpc/jsonrpc.cpp, msgpack/jsonrpc/server.cpp, msgpack/msgpack1/msgpack1.cpp, msgpack/msgpack2/msgpack2.cpp, msgpack/usertype/usertype.cpp, oss/binarypatch/binarypatch.cpp, succinct/detection/detection.cpp, succinct/ngc/ngc.cpp, succinct/simple/simple.cpp (計23項目).

Config.h658 行目に定義があります。

◆ nlib_log_attr_setint()

nlib_log_attr_setint ( int  prio,
int  key,
int  value 
)

優先度ごとの出力先の指定を行います。

引数
[in]prionlib_log_priorityの値(kNlibLogVerbose等を参照)を指定します。
[in]keynlib_log_keyから出力先を指定します。
[in]value設定する値(0以外ならON)
戻り値
0ならば成功
説明
key の値 説明
kNlibLogAttrStdout 標準出力への出力設定を指定します。
kNlibLogAttrStderr 標準エラー出力への出力設定を指定します。
kNlibLogAttrMsvcTrace Windows環境でOutputDebugString()を利用する出力の設定を指定します。
kNlibLogAttrSyslog イベントログ(Windows)又は、syslog(Linux/FreeBSD)への出力設定を指定します。
kNlibLogAttrNlibFd ファイルへの出力設定を指定します。value に nlib_fd を指定します。
以下が設定例となります。
// 全てのレベルのログを標準出力に出力するように設定します。
nlib_log_attr_setint(kNlibLogLevelAll, kNlibLogAttrStdout, 1);
// エラー以上のレベルのログをsyslogに出力するように設定します。
nlib_log_attr_setint(kNlibLogError | kNlibLogLevelEqualOrAbove, kNlibLogAttrSyslog, 1);

◆ nlib_log_print()

nlib_log_print ( int  prio,
const char *  tag,
const char *  fmt,
  ... 
)

ログメッセージを出力します。

引数
[in]prionlib_log_prioritykNlibLogVerboseからkNlibLogFatalまでの値
[in]tagタグ文字列
[in]fmtフォーマット文字列
戻り値
出力された文字数
説明
デバッグレベルの出力を標準出力に出すよう設定し、ログを出力するコード例を以下に示します。
nlib_log_attr_setint(kNlibLogDebug, kNlibLogAttrStdout, 1);
nlib_log_print(kNlibLogDebug, "mytag", "my message");

◆ nlib_log_vprint()

nlib_log_vprint ( int  prio,
const char *  tag,
const char *  fmt,
va_list  ap 
)

ログメッセージを出力します。

引数
[in]prionlib_log_prioritykNlibLogVerboseからkNlibLogFatalまでの値
[in]tagタグ文字列
[in]fmtフォーマット文字列
[in]apフォーマット文字列に対する可変長引数
戻り値
出力された文字数

◆ nlib_malloc()

nlib_malloc ( size_t  size)

C標準関数のmalloc()を呼び出すweak関数です。nlibはこの関数を経由してmalloc()を呼び出します。

引数
[in]size確保するバイト数
戻り値
確保された領域へのポインタ
説明
cygwin版以外ではこの関数はユーザープログラムによって上書きすることが可能です。 上書きすることでnlibのメモリ確保をカスタマイズすることが可能です。
上書きする場合は以下のようにCリンケージにすることを忘れないでください。
extern "C" void* nlib_malloc(size_t size) {
.....
}
バグ:
cygwin版ではユーザープログラムによる上書きはできません。
各種例:
heap/replace_malloc/replace_malloc.cpp, msgpack/jsonrpc/jsonrpc.cpp, msgpack/jsonrpc/server.cpp.

◆ nlib_malloc_size()

nlib_malloc_size ( const void *  ptr)

アロケートされたメモリのサイズを返します。

引数
[in]ptrnlib_mallocで割り当てられたメモリへのポインタ
戻り値
割り当てられたサイズ
説明
CAFE及びCTRの実装は存在しないことに注意してください。
Platform Implementation
Win32 _msize()
Linux malloc_usable_size()
FreeBSD malloc_usable_size()
OS X malloc_size()
CAFE 実装が存在しません
CTR 実装が存在しません

◆ nlib_memalign()

nlib_memalign ( size_t  alignment,
size_t  size 
)

memalign()を呼び出すweak関数です。nlibはこの関数を経由してmemalign()を呼び出します。

引数
[in]alignmentアライメント
[in]sizeサイズ
戻り値
確保された領域へのポインタ
説明
この関数はユーザープログラムによって上書きすることが可能です。 上書きすることでnlibのメモリ確保をカスタマイズすることが可能です。
上書きする場合は以下のようにCリンケージにすることを忘れないでください。
extern "C" void* nlib_memalign(size_t alignment, size_t size) {
.....
}
Win32及びCTRの実装は存在しないことに注意してください。 そのため移植性のためには nn::nlib::DynamicAlignedStorage を利用した方がよいでしょう。
バグ:
cygwin版ではユーザープログラムによる上書きはできません。
各種例:
heap/replace_malloc/replace_malloc.cpp.

◆ nlib_memccpy()

nlib_memccpy ( void *  dest,
size_t  dest_size,
const void *  src,
size_t  src_size,
int  c 
)

cが見つかるまでコピーを行います。見つかった場合そこでコピーを中止します。

引数
[in,out]destコピー先のバッファ
[in]dest_sizeコピー先のバッファ・サイズ
[in]srcコピー元のバッファ
[in]src_sizeコピー元のバッファ・サイズ
[in]cこの値のバイトをコピーすると、cのコピー後に関数から戻る
戻り値
cをコピーできた場合は、コピー先のバッファ内のcの次のバイトへのポインタを返します。 そうでない場合は、NULLを返します。
説明
最大でdest_sizesrc_sizeの小さい方のバイト数がコピーされます。 また、memccpy(dest, src, c, dest_size > src_size ? src_size : dest_size)と同等の動作になります。
以下のコードはテキスト内の改行文字が見つかるまでコピーを行います。
const size_t kBufSize = 1024;
char buf[kBufSize];
const char* src = "line1\nline2\n";
char* p = (char*)nlib_memccpy(buf, kBufSize, src, nlib_strlen(src), '\n');
SUCCEED_IF(p != nullptr); // nullptr if the line is too long
*(p - 1) = '\0'; // buf is not null-terminated, replace '\n' with '\0'
nlib_printf("Copied text is: %s\n", buf);
/*
Output:
Copied text is: line1
*/

◆ nlib_memchr()

nlib_memchr ( const void *  s,
int  c,
size_t  n 
)

メモリ領域[s, s + n)の先頭からn バイトを検索して、バイトc があるポインタを返します。

引数
[in]s検査対象のメモリ
[in]c検索対象の文字
[in]n検索するバイト数
戻り値
見つかった場合はバイトへのポインタ、見つからなかった場合はNULLを返します。
説明
Platform Implementation
Win32 SIMDを用いた実装
Linux SIMDを用いた実装
FreeBSD SIMDを用いた実装
OS X SIMDを用いた実装
CAFE 1ワード単位でスキャンする実装
CTR 1ワード単位でスキャンする実装

◆ nlib_memchr_gt()

nlib_memchr_gt ( const void *  s,
int  c,
size_t  n 
)

メモリ領域[s, s + n)の先頭からn バイトを検索して、バイトc より大きいの文字があるデータへのポインタを返します。

引数
[in]s検査対象のメモリ
[in]c検索対象の文字
[in]n検索するバイト数
戻り値
見つかった場合はバイトへのポインタ、見つからなかった場合はNULLを返します。
説明
比較は符号なしの8ビット整数として行われます。c は127以下である必要があります。

◆ nlib_memchr_lt()

nlib_memchr_lt ( const void *  s,
int  c,
size_t  n 
)

メモリ領域[s, s + n)の先頭からn バイトを検索して、バイトc 未満の文字があるデータへのポインタを返します。

引数
[in]s検査対象のメモリ
[in]c検索対象の文字
[in]n検索するバイト数
戻り値
見つかった場合はバイトへのポインタ、見つからなかった場合はNULLを返します。
説明
比較は符号なしの8ビット整数として行われます。c は127以下である必要があります。
例えば以下のように書くことで、文字列からASCIIコードの制御文字を検出することができます。
const void* p = nlib_memchr_lt(s, 0x20, len);
Platform Implementation
Win32 SIMDを用いた実装
Linux SIMDを用いた実装
FreeBSD SIMDを用いた実装
OS X SIMDを用いた実装
CAFE 1ワード単位でスキャンする実装
CTR 1ワード単位でスキャンする実装

◆ nlib_memchr_mb()

nlib_memchr_mb ( const void *  s,
size_t  n 
)

メモリ領域[s, s + n)の先頭からn バイトを検索して、0x80以上のバイトが格納されている場所へのポインタを返します。

引数
[in]s検査対象のメモリ
[in]n検索するバイト数
戻り値
見つかった場合はバイトへのポインタ、見つからなかった場合はNULLを返します。
説明
UTF-8文字列から、UTF-8のマルチバイト文字を探し出すために利用することができます。
Platform Implementation
Win32 SIMDを用いた実装
Linux SIMDを用いた実装
FreeBSD SIMDを用いた実装
OS X SIMDを用いた実装
CAFE 1バイト単位でスキャンする実装
CTR 1バイト単位でスキャンする実装

◆ nlib_memchr_not()

nlib_memchr_not ( const void *  s,
int  c,
size_t  n 
)

メモリ領域[s, s + n)の先頭からn バイトを検索して、バイトc でないポインタを返します。

引数
[in]s検査対象のメモリ
[in]c読み飛ばす対象の文字
[in]n検索するバイト数
戻り値
見つかった場合はバイトへのポインタ、見つからなかった場合はNULLを返します。
説明
Platform Implementation
Win32 SIMDを用いた実装
Linux SIMDを用いた実装
FreeBSD SIMDを用いた実装
OS X SIMDを用いた実装
CAFE 1ワード単位でスキャンする実装
CTR 1ワード単位でスキャンする実装

◆ nlib_memchr_range_not()

nlib_memchr_range_not ( const void *  s,
const char *  range,
size_t  n 
)

メモリ領域[s, s + n)の先頭からn バイトを検索して、最初のrange に含まない文字へのポインタを返します。

引数
[in]s検査対象のメモリ
[in]range範囲を表すASCII文字列
[in]n検索するバイト数
戻り値
見つかった場合はバイトへのポインタ、見つからなかった場合はNULLを返します。
説明
range は長さ2のASCII文字列(例えば"09","AZ","az")である必要があります。
例えば以下のように書くことで、[a-z]*にマッチする文字列の範囲を得ることができます。
const void* end = nlib_memchr_range_not(start, "az", len);
Platform Implementation
Win32 SIMDを用いた実装
Linux SIMDを用いた実装
FreeBSD SIMDを用いた実装
OS X SIMDを用いた実装
CAFE 1ワード単位でスキャンする実装
CTR 1ワード単位でスキャンする実装

◆ nlib_memcmp()

nlib_memcmp ( const void *  buf1,
const void *  buf2,
size_t  n 
)

buf1buf2 を先頭からn バイト分unsigned charとして比較します。

引数
[in]buf1比較元のメモリブロック1
[in]buf2比較元のメモリブロック2
[in]n比較バイト数
戻り値
buf1 > buf2
0buf1 == buf2
buf1 < buf2
説明
Platform Implementation
Win32 SIMDを用いた実装
Linux SIMDを用いた実装
FreeBSD SIMDを用いた実装
OS X SIMDを用いた実装
CAFE 1ワード単位でスキャンする実装
CTR memcmp()

◆ nlib_memcplen()

nlib_memcplen ( size_t *  codepoint_count,
size_t *  supplementary_codepoint_count,
size_t *  from_read,
const nlib_utf8_t from,
size_t  from_size 
)

文字列中のコードポイントの数と補助文字の数を取得します。

引数
[out]codepoint_countコードポイントの数が格納されるポインタ
[out]supplementary_codepoint_count補助文字(U+10000 - U+10FFFF)のコードポイントの数が格納されるポインタ
[out]from_readコードポイントの数の計測が行われたバイト数が格納されるポインタ
[in]from非ヌル終端のUTF-8文字列が格納されている領域
[in]from_sizefromのサイズ
戻り値
0成功した場合
EINVALfrom_read 又は fromNULLの場合
EILSEQコードポイントに変換できない(不正な)データがあった場合
説明
最大でfrom_sizeバイトのUTF-8文字列をカウントします。ヌル文字で止まることはなく1文字としてカウントされます。 fromから始まるUTF-8文字列がコードポイントの途中で終了している場合は、その文字の手前で処理を終了し0を返します。 EILSEQを返す場合も、その文字の手前で処理を終了する形になります。 このような場合は、from + *from_readからのデータが未処理となっています。
UTF-32に変換した場合の文字数は、*codepoint_countとなります。 また、UTF-16に変換した場合の文字数は、*codepoint_count + *supplementary_codepoint_countで計算することが可能です。

◆ nlib_memcspn()

nlib_memcspn ( const void *  buf,
size_t  len,
const char *  set,
size_t  n 
)

bufの先頭から続く部分バイト列の長さを返します。 部分バイト列は、setに含まれるバイト以外のみで構成されます。

引数
[in]bufスキャン対象となる領域へのポインタ
[in]lenbufのバイト数
[in]setバイトの集合(ヌル終端しなくてもよい)
[in]nsetのバイト数
戻り値
setに含まれないバイトで構成される区間のバイト数
説明
特定の文字集合が出てくるまで読み飛ばす用途に用いることが可能です。 標準C関数のstrcspn()に類似していますが、bufがヌル終端している必要がありません。

◆ nlib_memmove()

static errno_t nlib_memmove ( void *  s1,
size_t  s1max,
const void *  s2,
size_t  n 
)
inlinestatic

N1078のmemmove_sに相当する実装です。

引数
[in,out]s1コピー先のバッファ
[in]s1maxコピー先のバッファ・サイズ
[in]s2コピー元のバッファ
[in]nコピーするバイト数
戻り値
0成功した場合
ERANGEs1 又はs2NULLの場合
ERANGEバッファが足りなかった場合
説明
失敗した場合でs1NULLでない場合は、s1[0] = 0が設定されます。
Platform Implementation
Win32 memmove()
Linux memmove()
FreeBSD memmove()
OS X memmove()
CAFE OSBlockMove()
CTR memmove()

Platform.h2530 行目に定義があります。

◆ nlib_mempagesize()

nlib_mempagesize ( size_t *  size)

ページサイズを取得します。

引数
[out]sizeページサイズが格納される
戻り値
0ならば成功
説明
Platform Implementation
Win32 GetSystemInfo()(起動時に一回実行)
Linux getpagesize()(最初の実行時に一回実行)
FreeBSD getpagesize()(最初の実行時に一回実行)
OS X getpagesize()(最初の実行時に一回実行)
CAFE OSGetPageSize()を設定し0を返す
CTR NN_OS_MEMORY_PAGE_SIZEを設定し0を返す

◆ nlib_memrchr()

nlib_memrchr ( const void *  s,
int  c,
size_t  n 
)

メモリ領域[s, s + n)の後方からn バイトを検索して、バイトc があるポインタを返します。

引数
[in]s検査対象のメモリ
[in]c検索対象の文字
[in]n検索するバイト数
戻り値
見つかった場合はバイトへのポインタ、見つからなかった場合はNULLを返します。
説明
Platform Implementation
Win32 SIMDを用いた実装
Linux SIMDを用いた実装
FreeBSD SIMDを用いた実装
OS X SIMDを用いた実装
CAFE 1ワード単位でスキャンする実装
CTR 1ワード単位でスキャンする実装

◆ nlib_memset()

static errno_t nlib_memset ( void *  buf,
int  ch,
size_t  n 
)
inlinestatic

内部でmemset(buf, ch, n)相当の関数を呼び出します。

引数
[in,out]bufセット先のメモリブロック
[in]chセットするバイトデータ(文字)
[in]nバイト数
戻り値
0ならば成功
説明
各種例:
misc/stringutils/stringutils.cpp.

Platform.h2544 行目に定義があります。

◆ nlib_memspn()

nlib_memspn ( const void *  buf,
size_t  len,
const char *  set,
size_t  n 
)

bufの先頭から続く部分バイト列の長さを返します。 部分バイト列は、setに含まれるバイトのみで構成されます。

引数
[in]bufスキャン対象となる領域へのポインタ
[in]lenbufのバイト数
[in]setバイトの集合(ヌル終端しなくてもよい)
[in]nsetのバイト数
戻り値
setに含まれるバイトで構成される区間のバイト数
説明
特定の文字集合を読み飛ばす用途に用いることが可能です。 標準C関数のstrspn()に類似していますが、bufがヌル終端している必要がありません。

◆ nlib_memutf16_to_utf8()

nlib_memutf16_to_utf8 ( size_t *  to_count,
size_t *  from_count,
nlib_utf8_t to,
size_t  to_size,
const nlib_utf16_t from,
size_t  from_size 
)

ヌル終端しないUTF-16文字列をUTF-8文字列に変換します。

引数
[out]to_count変換された文字数が格納されます。
[out]from_count変換に成功した文字数が格納されます。
[out]to変換されたUTF-8文字列が格納される領域へのポインタ(ヌル終端しない)
[in]to_sizetoのバッファ・サイズ(文字数)
[in]fromUTF-16文字列が格納されている領域へのポインタ(ヌル終端しない)
[in]from_sizefromのバッファ・サイズ(文字数)
戻り値
0変換がすべて成功しました。
EINVALto_count, from_count, またはfromNULLの場合
EINVALtoNULLかつto_sizeが0でない場合
EILSEQ変換できない(不正な)データが検出された場合
説明
fromから始まるUTF-16文字列がコードポイントの途中で終了している場合は、その文字の手前で処理を終了し0を返します。 EILSEQを返す場合も、そのコードポイントの手前で処理を終了する形になります。 このような場合は、from + *from_countからのデータが未変換となっています。

◆ nlib_memutf32_to_utf8()

nlib_memutf32_to_utf8 ( size_t *  to_count,
size_t *  from_count,
nlib_utf8_t to,
size_t  to_size,
const nlib_utf32_t from,
size_t  from_size 
)

ヌル終端しないUTF-32文字列をUTF-8文字列に変換します。

引数
[out]to_count変換された文字数が格納されます。
[out]from_count変換に成功した文字数が格納されます。
[out]to変換されたUTF-8文字列が格納される領域へのポインタ(ヌル終端しない)
[in]to_sizetoのバッファ・サイズ(文字数)
[in]fromUTF-32文字列が格納されている領域へのポインタ(ヌル終端しない)
[in]from_sizefromのバッファ・サイズ(文字数)
戻り値
0変換がすべて成功しました。
EINVALto_count, from_count, またはfromNULLの場合
EINVALtoNULLかつto_sizeが0でない場合
EILSEQ変換できない(不正な)データが検出された場合

◆ nlib_memutf8_to_utf16()

nlib_memutf8_to_utf16 ( size_t *  to_count,
size_t *  from_count,
nlib_utf16_t to,
size_t  to_size,
const nlib_utf8_t from,
size_t  from_size 
)

ヌル終端しないUTF-8文字列をUTF-16文字列に変換します。

引数
[out]to_count変換された文字数が格納されます。
[out]from_count変換に成功した文字数が格納されます。
[out]to変換されたUTF-16文字列が格納される領域へのポインタ(ヌル終端しない)
[in]to_sizetoのバッファ・サイズ(文字数)
[in]fromUTF-8文字列が格納されている領域へのポインタ(ヌル終端しない)
[in]from_sizefromのバッファ・サイズ(文字数)
戻り値
0変換がすべて成功しました。
EINVALto_count, from_count, またはfromNULLの場合
EINVALtoNULLかつto_sizeが0でない場合
EILSEQ変換できない(不正な)データが検出された場合
説明
fromから始まるUTF-8文字列がコードポイントの途中で終了している場合は、その文字の手前で処理を終了し0を返します。 EILSEQを返す場合も、そのコードポイントの手前で処理を終了する形になります。 このような場合は、from + *from_countからのデータが未変換となっています。

◆ nlib_memutf8_to_utf32()

nlib_memutf8_to_utf32 ( size_t *  to_count,
size_t *  from_count,
nlib_utf32_t to,
size_t  to_size,
const nlib_utf8_t from,
size_t  from_size 
)

ヌル終端しないUTF-8文字列をUTF-32文字列に変換します。

引数
[out]to_count変換された文字数が格納されます。
[out]from_count変換に成功した文字数が格納されます。
[out]to変換されたUTF-32文字列が格納される領域へのポインタ(ヌル終端しない)
[in]to_sizetoのバッファ・サイズ(文字数)
[in]fromUTF-8文字列が格納されている領域へのポインタ(ヌル終端しない)
[in]from_sizefromのバッファ・サイズ(文字数)
戻り値
0変換がすべて成功しました。
EINVALto_count, from_count, またはfromNULLの場合
EINVALtoNULLかつto_sizeが0でない場合
EILSEQ変換できない(不正な)データが検出された場合
説明
fromから始まるUTF-8文字列がコードポイントの途中で終了している場合は、その文字の手前で処理を終了し0を返します。 EILSEQを返す場合も、そのコードポイントの手前で処理を終了する形になります。 このような場合は、from + *from_countからのデータが未変換となっています。

◆ nlib_mkdir()

nlib_mkdir ( const char *  native_path,
unsigned int  flags 
)

ディレクトリを作成する

引数
[in]native_pathパス名(UTF-8)
[in]flags現在使われていません
戻り値
0成功した場合
EINVALnative_pathNULLだった場合
EEXISTnative_path が既に存在している場合
その他何らかの原因で失敗した場合
説明
Platform Implementation
Win32 CreateDirectoryW()
Linux mkdir()
FreeBSD mkdir()
OS X mkdir()
CAFE FSMakeDir()
CTR nn::fs::TryCreateDirectory()

◆ nlib_mkostemps()

nlib_mkostemps ( nlib_fd fd,
char *  templ,
int  suffixlen,
int  flags 
)

ユニークで推測されにくい名前を持つ一時ファイルを作成します。

引数
[out]fdテンポラリファイルのファイルディスクリプタ
[in,out]templファイル名のテンプレート及び作成されたファイル名
[in]suffixlenテンプレート内のサフィックスの長さ
[in]flagsテンポラリファイルをオープンする際に指定するフラグ(NLIB_FD_O_APPENDが指定可能)
戻り値
0成功しました。
EINVALfdまたはtemplNULLだった。templのサフィックスの直前の6文字がXXXXXXでなかった。
EEXISTファイル名を複数回変更してリトライしても既に同じ名前を持つファイルが存在していた。templは不定。
説明
templで示される文字列から一時ファイルを作成し、fdにファイルディスクリプタを格納します。 アクセス許可は0600が指定され、ファイル作成フラグにはNLIB_FD_O_RDWR, NLIB_FD_O_CREAT, NLIB_FD_O_EXCLが必ず指定されます。 O_CLOEXECが指定可能な環境ではこれも指定されます。
引数templのサフィックス直前の6文字はXXXXXXである必要があります。 つまり、'mytmpfileXXXXXXsuffix'という形式になります。 この関数はtemplのこの部分を書き換えテンポラリファイルを作成します。
Linuxなどファイル作成フラグO_TMPFILEをサポートしている環境では、templにディレクトリを指定(templの末尾を'/'で終える必要)することで、O_TMPFILEが指定されてファイルがオープンされます。 この場合はO_EXCLは指定されずにオープンされます。
Platform Implementation
Win32 nlib_fd_open()
Linux mkostemps(), open()
FreeBSD mkostemps()
OS X mkstemps()
CAFE nlib_fd_open()
CTR nlib_fd_open()

◆ nlib_mlock()

nlib_mlock ( void *  addr,
size_t  len 
)

指定したメモリ領域がスワップアウトされないようにします。

引数
[in]addrロックしたい領域の先頭
[in]lenサイズ
戻り値
0ならば成功
説明
Platform Implementation
Win32 VirtualLock()
Linux mlock()
FreeBSD mlock()
OS X mlock()
CAFE 0を返す
CTR 0を返す

◆ nlib_mprotect()

nlib_mprotect ( void *  ptr,
size_t  size,
int  prot 
)

割り当てられた物理メモリに対してアクセス保護を設定します。

引数
[in]ptr仮想メモリへのポインタ
[in]size割り当てる物理メモリのサイズ(バイト単位)
[in]protアクセス指定
戻り値
0ならば成功
説明
nlib_physical_alloc()で確保した範囲内の領域を指定し、アクセス保護を設定します。
prot には以下の値の論理和を与えます.
説明
NLIB_PHYSICAL_ALLOC_PROT_NONE メモリにはアクセスできません。
NLIB_PHYSICAL_ALLOC_PROT_READ メモリを読み取ることができます。
NLIB_PHYSICAL_ALLOC_PROT_WRITE メモリを変更することができます。
NLIB_PHYSICAL_ALLOC_PROT_EXEC メモリを実行することができます。
Platform Implementation
Win32 VirtualProtect(ptr, size, ...)
Linux mprotect()
FreeBSD mprotect()
OS X mprotect()
CAFE 0を返す
CTR 0を返す

◆ nlib_mq_close()

nlib_mq_close ( nlib_mq  mq)

ハンドルで示されるメッセージキューをクローズします。

引数
[in]mqメッセージキューへのハンドル
戻り値
0成功した場合
EBADFmqで指定されたハンドルが無効な場合
説明
キューにメッセージが残っている場合には、それぞれのメッセージに対してデストラクタが実行されます。

◆ nlib_mq_drop()

nlib_mq_drop ( nlib_mq  mq,
nlib_mq_msg msg,
int *  prio 
)

キューに存在する最低の優先度のメッセージをキューから受信します。受信したメッセージはユーザーがデストラクタ関数で削除する必要があります。

引数
[in]mqメッセージキューへのハンドル
[out]msg受信されたメッセージが格納される
[out]prioNULL以外なら受信されたメッセージの優先度が格納される
戻り値
0成功した場合
EINVALmsgNULLだった場合
EBADFmqで指定されたハンドルが無効な場合
ENOENTキューが空だった場合

◆ nlib_mq_getattr()

nlib_mq_getattr ( nlib_mq  mq,
nlib_mq_attr attr 
)

ハンドルで示されるメッセージキューに設定されている属性を取得します。

引数
[in]mqメッセージキューへのハンドル
[in]attrメッセージキューの属性
戻り値
0成功した場合
EBADFmqで指定されたハンドルが無効な場合
EINVALattrNULLの場合

◆ nlib_mq_open()

nlib_mq_open ( nlib_mq mq,
const nlib_mq_attr attr 
)

スレッド間でメッセージをやりとりするためのメッセージキューを作成します。

引数
[out]mqメッセージキューへのハンドルが格納されます。
[in]attrメッセージキューの属性
戻り値
0成功した場合
ENOMEMメモリの確保に失敗した場合
ENFILE作成されているメッセージキューの数が上限に達している場合
EINVALmq又はattrNULLの場合
説明
この関数によってスレッド間でオブジェクトをやりとりする通信に利用できるメッセージキューをオープンすることができます。 nlibのメッセージキューは以下のような特徴を持ちます。
  • 0-31の32段階の優先度(高い方が優先度が高い)を持つ優先度つきキューです。
  • ブロッキングキュー、ノンブロッキングキュー、ロックフリーキューによるメッセージのやりとりをサポートします。
  • ブロッキングキューを用いた場合はタイムアウトつきの送信、受信を行うことができます。
  • 優先度が同じ場合は、メッセージは送信した順に受信されます。
  • スレッドセーフにクローズできます。無効になったハンドルを用いた読み書きに対してはエラーが返されます。
  • キューにメッセージを残したままでもクローズできます。残ったメッセージはデストラクタによって削除されます。
  • キューを受信専用状態にすることができます。終了処理の際に利用することができます。
  • 優先度の低いメッセージをキューから取り出すことができます。キューが一杯の場合にどうしても優先度の高いメッセージを送信しなければならない場合に利用できます。

◆ nlib_mq_readonly()

nlib_mq_readonly ( nlib_mq  mq)

ハンドルで示されるメッセージキューを受信専用にします。

引数
[in]mqメッセージキューへのハンドル
戻り値
0成功した場合
EBADFmqで指定されたハンドルが無効な場合
説明
この関数の実行後はメッセージキューへの書き込みにはEPERMエラーが返されるようになります。 メッセージの新規受付を終了したいが、キューに残っているメッセージを処理する必要がある場合に利用します。

◆ nlib_mq_receive()

nlib_mq_receive ( nlib_mq  mq,
nlib_mq_msg msg,
int *  prio 
)

メッセージをキューから受信します。受信したメッセージはユーザーがデストラクタ関数で削除する必要があります。

引数
[in]mqメッセージキューへのハンドル
[out]msg受信されたメッセージが格納される
[out]prioNULL以外なら受信されたメッセージの優先度が格納される
戻り値
0成功した場合
EINVALmsgNULLだった場合
EBADFmqで指定されたハンドルが無効な場合
EAGAINブロッキングキュー以外でメッセージキューが空の場合
説明
ロックフリーキューを利用した場合、この関数を実行中により高い優先度のメッセージが送信されてキューに格納されると、キューに格納されている最高の優先度のメッセージ(先述の送信されたメッセージ)が取り出されない場合があります。

◆ nlib_mq_receive_until()

nlib_mq_receive_until ( nlib_mq  mq,
nlib_mq_msg msg,
int *  prio,
nlib_time  abstime 
)

メッセージをキューからタイムアウトつきで受信します。受信したメッセージはユーザーがデストラクタ関数で削除する必要があります。

引数
[in]mqメッセージキューへのハンドル
[out]msg受信されたメッセージが格納される
[out]prioNULL以外なら受信されたメッセージの優先度が格納される
[in]abstimeタイムアウト時刻
戻り値
0成功した場合
EINVALmsgNULLだった場合
EBADFmqで指定されたハンドルが無効な場合
EINVALmsgNULLだった場合
EINVALメッセージキューがブロッキングキュー以外だった場合
ETIMEDOUTブロッキングキューで受信がタイムアウトした場合

◆ nlib_mq_send()

nlib_mq_send ( nlib_mq  mq,
nlib_mq_msg  msg,
int  prio 
)

メッセージをキューに送信します。

引数
[in]mqメッセージキューへのハンドル
[in]msg送信するメッセージ
[in]prioメッセージの優先度で0以上31以下の整数(31が最高の優先度)
戻り値
0成功した場合
EBADFmqで指定されたハンドルが無効な場合
EINVALprioで指定された優先度が0未満又は32以上の場合
EAGAINブロッキングキュー以外でメッセージキューが一杯の場合
EPERMキューが受信専用の場合

◆ nlib_mq_send_until()

nlib_mq_send_until ( nlib_mq  mq,
nlib_mq_msg  msg,
int  prio,
nlib_time  abstime 
)

メッセージをキューにタイムアウトつきで送信します。

引数
[in]mqメッセージキューへのハンドル
[in]msg送信するメッセージ
[in]prioメッセージの優先度で0以上31以下の整数(31が最高の優先度)
[in]abstimeタイムアウト時刻
戻り値
0成功した場合
EBADFmqで指定されたハンドルが無効な場合
EINVALprioで指定された優先度が0未満又は32以上の場合
EINVALメッセージキューがブロッキングキュー以外だった場合
ETIMEDOUTブロッキングキューで送信がタイムアウトした場合
EPERMキューが受信専用の場合

◆ nlib_munlock()

nlib_munlock ( void *  addr,
size_t  len 
)

指定したメモリ領域がスワップアウトできるようにします。

引数
[in]addrアンロックしたい領域の先頭
[in]lenサイズ
戻り値
0ならば成功
説明
Platform Implementation
Win32 VirtualUnlock()
Linux munlock()
FreeBSD munlock()
OS X munlock()
CAFE 0を返す
CTR 0を返す

◆ nlib_mutex_destroy()

nlib_mutex_destroy ( nlib_mutex mutex)

mutexオブジェクトを破壊し、関連付けられているリソース(あれば)を解放します。

引数
[in]mutex破壊するmutex
戻り値
0成功した場合
EINVALmutexNULLの場合
その他mutexがロック中であることが検出された場合等
説明
Platform Implementation
Win32 CloseHandle() or DeleteCriticalSection()
Linux pthread_mutex_destroy()
FreeBSD pthread_mutex_destroy()
OS X pthread_mutex_destroy()
CAFE No SDK API called
CTR CriticalSection::~CriticalSection()
各種例:
misc/handlemaker/handlemaker.cpp.

◆ nlib_mutex_init()

nlib_mutex_init ( nlib_mutex mutex)

ミューテックスを初期化します。

引数
[in]mutexmutex が指すミューテックスオブジェクトを初期化します。
戻り値
常に0を返す.
説明
Platform Implementation
Win32 InitializeCriticalSectionEx()
Linux pthread_mutex_init()
FreeBSD pthread_mutex_init()
OS X pthread_mutex_init()
CAFE OSFastMutex_Init()
CTR CriticalSection::CriticalSection()
各種例:
misc/handlemaker/handlemaker.cpp.

◆ nlib_mutex_lock()

nlib_mutex_lock ( nlib_mutex mutex)

与えられたmutexをロックします。

引数
[in]mutexロックするmutex
戻り値
0成功した場合
EINVALmutexNULLの場合かmutex が初期化されていない場合
EDEADLKデッドロックを検出することができた場合
説明
全てのプラットフォームにおいて、何らかのプログラミングエラーがない限り常に0を返すものとしてコーディングすることが可能です。
Platform Implementation
Win32 WaitForSingleObject() or EnterCriticalSection()
Linux pthread_mutex_lock()
FreeBSD pthread_mutex_lock()
OS X pthread_mutex_lock()
CAFE OSFastMutex_Lock()
CTR CriticalSection::Enter()
各種例:
heap/nmalloc_simple/nmalloc_simple.cpp, misc/handlemaker/handlemaker.cpp.

◆ nlib_mutex_recursive_init()

nlib_mutex_recursive_init ( nlib_mutex mutex)

再帰ミューテックスを初期化します。

引数
[in]mutexmutex が指すミューテックスオブジェクトを初期化します。
戻り値
常に0を返す.
説明
Platform Implementation
Win32 InitializeCriticalSectionEx()
Linux pthread_mutex_init()
FreeBSD pthread_mutex_init()
OS X pthread_mutex_init()
CAFE OSFastMutex_Init()
CTR CriticalSection::CriticalSection()

◆ nlib_mutex_recursive_timed_init()

nlib_mutex_recursive_timed_init ( nlib_mutex mutex)

再帰かつタイムアウト可能なミューテックスを初期化します。

引数
[in]mutexmutex が指すミューテックスオブジェクトを初期化します。
戻り値
常に0を返す.
説明
Platform Implementation
Win32 CreateMutex()
Linux NLIB_RECURSIVE_TIMED_MUTEX_INITIALIZER を代入
FreeBSD pthread_mutex_init()
OS X pthread_mutex_init()
CAFE OSFastMutex_Init()
CTR CriticalSection::CriticalSection()

◆ nlib_mutex_trylock()

nlib_mutex_trylock ( nlib_mutex mutex)

mutexがロックされていない場合のみロックします。

引数
[in]mutexロックするmutex
戻り値
0成功した場合
EINVALmutexNULLの場合かmutex が初期化されていない場合
EBUSY既に他のスレッドによりロックされている場合
その他何らかの理由でロックできなかった場合
説明
Platform Implementation
Win32 WaitForSingleObject() or TryEnterCriticalSection()
Linux pthread_mutex_trylock()
FreeBSD pthread_mutex_trylock()
OS X pthread_mutex_trylock()
CAFE OSFastMutex_TryLock()
CTR CriticalSection::TryEnter()

◆ nlib_mutex_trylock_for()

nlib_mutex_trylock_for ( nlib_mutex mutex,
nlib_duration  delta 
)

与えられたmutexをロックします。タイムアウトします。

引数
[in]mutexロックするmutex
[in]deltaタイムアウト時間
戻り値
0成功した場合
EINVALmutexNULLの場合かmutex が初期化されていない場合
ETIMEDOUTタイムアウトした場合
その他何らかの理由でロックできなかった場合
説明
Platform Implementation
Win32 WaitForSingleObject()
Linux pthread_mutex_timedlock()
FreeBSD pthread_mutex_timedlock()
OS X nlib_mutex_trylock(), nlib_sleep()
CAFE OSFastMutex_TryLock(), nlib_sleep()
CTR CriticalSection::TryEnter()
CAFEとCTRの場合は、100usecのスリープを繰り返しつつmutexのロックを試みます。

◆ nlib_mutex_unlock()

nlib_mutex_unlock ( nlib_mutex mutex)

与えられたmutex をアンロックします。

引数
[in]mutexアンロックするmutex
戻り値
0成功した場合
EINVALmutexNULLの場合かmutex が初期化されていない場合
その他何らかのプログラミングエラーが原因アンロックできなかった場合
説明
全てのプラットフォームにおいて、何らかのプログラミングエラーがない限り常に0を返すものとしてコーディングすることが可能です。
Platform Implementation
Win32 ReleaseMutex() or LeaveCriticalSection()
Linux pthread_mutex_unlock()
FreeBSD pthread_mutex_unlock()
OS X pthread_mutex_unlock()
CAFE OSFastMutex_Unlock()
CTR CriticalSection::Leave()
各種例:
heap/nmalloc_simple/nmalloc_simple.cpp, misc/handlemaker/handlemaker.cpp.

◆ nlib_nfkc()

nlib_nfkc ( nlib_utf8_convert_info result,
nlib_utf8_t buf,
size_t  n,
const nlib_utf8_t first,
const nlib_utf8_t last,
nlib_nfkc_option  option 
)

UTF-8文字列のNFKC正規化を行います。

引数
[out]result変換結果に関する情報が格納されます
[out]buf変換結果が格納されるバッファ
[in]nバッファサイズ
[in]first変換対象のUTF-8文字列の先頭
[in]last変換対象のUTF-8文字列の末尾
[in]option変換オプション
戻り値
0変換が行われた場合
EINVALbufNULLで且つnが0より大きい場合
ERANGEbufNULLで且つnが0と等しい場合
説明
関数が0を返した場合、bufnlib_utf8_convert_info::writtenバイトが書き込まれています。 nlib_utf8_convert_info::curは変換されなかったUTF-8文字列の先頭を指します。
ERANGEを返した場合、変換結果がnlib_utf8_convert_info::writtenは十分なサイズのバッファが存在した場合に書き込まれたであろうバイト数が書き込まれています。
また、以下の場合はnlib_utf8_convert_info::curlastと一致しない場合があることに注意してください。
  • bufのバッファサイズが足りないため途中で変換が終了した。
  • 入力のUTF-8がコードポイントの途中で途切れた。
注意
UTF-8でないバイト列については削除や置き換えは行われずそのまま出力されます。エラーを返すこともありません。
参照
https://unicode.org/Public/10.0.0/ucd/UnicodeData.txt
https://unicode.org/Public/10.0.0/ucd/CompositionExclusions.txt
各種例:
misc/stringutils/stringutils.cpp.

◆ nlib_once()

nlib_once ( nlib_onceflag flag,
nlib_oncefunc  func 
)

func を高々1回しか実行されないようします。

引数
[in]flag NLIB_ONCE_INITで初期化されていて、実行後に値が変化します。
[in]func高々1回実行される関数
戻り値
0関数の実行が完了している場合
EINVALflagNULLだった場合
説明
flag が指し示す値は事前に NLIB_ONCE_INITで初期化されている必要があります。 nlib_once()が複数回呼び出された場合、既に関数が呼び出されていれば何もせずに返ります。
各種例:
heap/gameheap/gameheap.cpp, misc/threading/callonce/callonce.cpp, misc/threading/safeinit/safeinit.cpp.

◆ nlib_pause()

nlib_pause ( void  )
inlinestatic

ごく短期間の間ウェイトします。

説明
スピンウェイトを行う場合に、ビジーウェイトを避けプロセッサの消費電力を減らすことを意図して利用します。 nlib_yield()よりもオーバーヘッドが低く、ハードウェアにウェイト中であることを示すことができます。
Platform Implementation
x86/x86_64 _mm_pause()
arm __yield() if __ARM_ACLE defined
others nlib_yield()

Platform.h1207 行目に定義があります。

◆ nlib_physical_alloc()

nlib_physical_alloc ( void *  ptr,
size_t  size,
int  prot 
)

物理メモリを割り当てます。

引数
[in]ptr仮想メモリへのポインタ
[in]size割り当てる物理メモリのサイズ(バイト単位)
[in]protアクセス指定
戻り値
0ならば成功
説明
nlib_virtual_alloc()で確保した範囲内の領域を指定し、物理メモリを割り当てます。
prot には以下の値の論理和を与えます.
説明
NLIB_PHYSICAL_ALLOC_PROT_NONE メモリにはアクセスできません。
NLIB_PHYSICAL_ALLOC_PROT_READ メモリを読み取ることができます。
NLIB_PHYSICAL_ALLOC_PROT_WRITE メモリを変更することができます。
NLIB_PHYSICAL_ALLOC_PROT_EXEC メモリを実行することができます。
Platform Implementation
Win32 VirtualAlloc(ptr, size, MEM_COMMIT, ...)
Linux mprotect()
FreeBSD mprotect()
OS X mprotect()
CAFE 0を返す
CTR 0を返す

◆ nlib_physical_free()

nlib_physical_free ( void *  ptr,
size_t  size 
)

物理メモリの割り当てを解除します。

引数
[in]ptr仮想メモリへのポインタ
[in]size物理メモリの割り当てを解除する領域のサイズ(バイト単位)
戻り値
0ならば成功
説明
nlib_virtual_alloc()で確保した範囲内の領域を指定し、物理メモリの割り当てを解除します。
Platform Implementation
Win32 VirtualFree(..., MEM_DECOMMIT)
Linux mprotect(..., PROT_NONE)
FreeBSD mprotect(..., PROT_NONE)
OS X mprotect(..., PROT_NONE)
CAFE 0を返す
CTR 0を返す

◆ nlib_popcnt16()

static int nlib_popcnt16 ( uint16_t  x)
inlinestatic

1となっているビットの数を返します。

引数
[in]x16ビット整数
戻り値
0から16までの整数

Platform.h2554 行目に定義があります。

◆ nlib_popcnt32()

static int nlib_popcnt32 ( uint32_t  x)
inlinestatic

1となっているビットの数を返します。

引数
[in]x32ビット整数
戻り値
0から32までの整数
説明
Platform Implementation
SSE _mm_popcnt_u32()
NEON vcnt_u8()
CAFE テーブル引き
CTR テーブル引き

Platform.h2557 行目に定義があります。

◆ nlib_popcnt64()

static int nlib_popcnt64 ( uint64_t  x)
inlinestatic

1となっているビットの数を返します。

引数
[in]x64ビット整数
戻り値
0から64までの整数
説明
Platform Implementation
SSE _mm_popcnt_u32(), _mm_popcnt_u64()
NEON vcnt_u8()
CAFE テーブル引き
CTR テーブル引き

Platform.h2560 行目に定義があります。

◆ nlib_readlink()

nlib_readlink ( size_t *  len,
const char *  native_path,
char *  buf,
size_t  bufsize 
)

シンボリックリンクを解決します。

引数
[out]lenbufに格納された文字列長(ヌル文字を含まない)
[in]native_pathシンボリックリンクへのパス
[out]bufシンボリックリンクの内容が格納されるバッファ
[in]bufsizeバッファ・サイズ
戻り値
0成功した場合
EINVALnaitive_pathがシンボリックリンクではない場合、他
ERANGEバッファ長さが足りなかった場合(*lenにシンボリックリンクの内容の文字列長が格納されている)
その他プラットフォームに依存したエラー値
説明
成功した場合、bufに格納される文字列はヌル終端されます。 また、bufが小さすぎた場合はERANGEを返し、*lenに文字列長を格納します。 その場合、*len + 1バイト以上のバッファを用意して再度この関数を実行することができます。
Platform Implementation
Win32 GetFinalPathNameByHandle()
Linux readlink(), lstat()
FreeBSD readlink(), lstat()
OS X readlink(), lstat()
CAFE ENOTSUPを返します
CTR ENOTSUPを返します

◆ nlib_realloc()

nlib_realloc ( void *  ptr,
size_t  size 
)

C標準関数のrealloc()を呼び出すweak関数です。nlibはこの関数を経由してrealloc()を呼び出します。

引数
[in]ptr事前に割り当てられているメモリ ブロックへのポインタ
[in]size新しいサイズ(バイト単位)
戻り値
確保された領域へのポインタ
説明
cygwin版以外ではこの関数はユーザープログラムによって上書きすることが可能です。 上書きすることでnlibのメモリ確保をカスタマイズすることが可能です。
上書きする場合は以下のようにCリンケージにすることを忘れないでください。
extern "C" void* nlib_realloc(void* ptr, size_t size) {
.....
}
バグ:
cygwin版ではユーザープログラムによる上書きはできません。
各種例:
heap/replace_malloc/replace_malloc.cpp.

◆ nlib_rename()

nlib_rename ( const char *  old_path,
const char *  new_path 
)

ファイル名の変更する

引数
[in]old_pathパス名(UTF-8)
[in]new_pathパス名(UTF-8)
戻り値
0成功した場合
EINVALold_path, new_pathNULLだった場合
ENOENTold_path が存在しない場合
EEXISTnew_path が存在している場合
ENOTEMPTYEEXISTと同様
EISDIRnew_path がディレクトリでnew_pathがディレクトリでない場合。EEXISTを返す場合もあります。
その他何らかの原因で失敗した場合
説明
Platform Implementation
Win32 MoveFileW()
Linux rename()
FreeBSD rename()
OS X rename()
CAFE FSRename()
CTR nn::fs::TryRenameFile() / nn::fs::TryRenameDirectory()
覚え書き
CTRの場合はEEXIST, EISDIRとなるケースでもENOENTを返します。
Linux等ではEEXISTを返さずにファイルを置き換える動作をします。

◆ nlib_rmdir()

nlib_rmdir ( const char *  native_path)

ディレクトリを削除する

引数
[in]native_pathパス名(UTF-8)
戻り値
0成功した場合
EINVALnative_pathNULLだった場合
ENOENTnative_path が存在しない場合
EEXISTディレクトリが空ではない場合
ENOTEMPTYEEXISTと同様
ENOTDIRnative_path がディレクトリではなかった場合
その他何らかの原因で失敗した場合
説明
Platform Implementation
Win32 RemoveDirectoryW()
Linux rmdir()
FreeBSD rmdir()
OS X rmdir()
CAFE nlib_unlink()
CTR nn::fs::TryDeleteDirectory()

◆ nlib_rwlock_destroy()

nlib_rwlock_destroy ( nlib_rwlock rwlock)

リードライトロックオブジェクトを破壊します。

引数
[in]rwlockリードライトロックオブジェクト
戻り値
0成功した場合
EINVALrwlockNULLである場合
説明
Platform Implementation
Win32 何もしません
Linux pthread_rwlock_destroy()
FreeBSD pthread_rwlock_destroy()
OS X pthread_rwlock_destroy()
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_rwlock_init()

nlib_rwlock_init ( nlib_rwlock rwlock)

リードライトロックを初期化します。

引数
[in]rwlockリードライトロックオブジェクト
戻り値
0成功した場合
EINVALrwlockNULLである場合
説明
Platform Implementation
Win32 InitializeSRWLock()
Linux pthread_rwlock_init()
FreeBSD pthread_rwlock_init()
OS X pthread_rwlock_init()
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_rwlock_rdlock()

nlib_rwlock_rdlock ( nlib_rwlock rwlock)

読み込みロックを取得しクリティカルセクションに入ります。取得できるまでブロックします。

引数
[in]rwlockリードライトロックオブジェクト
戻り値
0成功した場合
EINVALrwlockNULLである場合
その他実装依存のエラー
説明
Platform Implementation
Win32 AcquireSRWLockShared()
Linux pthread_rwlock_rdlock()
FreeBSD pthread_rwlock_rdlock()
OS X pthread_rwlock_rdlock()
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_rwlock_rdunlock()

nlib_rwlock_rdunlock ( nlib_rwlock rwlock)

読み込みロックを解放します。

引数
[in]rwlockリードライトロックオブジェクト
戻り値
0成功した場合
EINVALrwlockNULLである場合
その他実装依存のエラー
説明
Platform Implementation
Win32 ReleaseSRWLockShared()
Linux pthread_rwlock_unlock()
FreeBSD pthread_rwlock_unlock()
OS X pthread_rwlock_unlock()
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_rwlock_tryrdlock()

nlib_rwlock_tryrdlock ( nlib_rwlock rwlock)

読み込みロックを取得しクリティカルセクションに入ることを試みます。

引数
[in]rwlockリードライトロックオブジェクト
戻り値
0成功した場合
EINVALrwlockNULLである場合
EBUSYロックを取得できなかった場合
その他実装依存のエラー
説明
Platform Implementation
Win32 TryAcquireSRWLockShared()
Linux pthread_rwlock_tryrdlock()
FreeBSD pthread_rwlock_tryrdlock()
OS X pthread_rwlock_tryrdlock()
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_rwlock_tryrdlock_for()

nlib_rwlock_tryrdlock_for ( nlib_rwlock rwlock,
nlib_duration  duration 
)

読み込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。

引数
[in]rwlockリードライトロックオブジェクト
[in]durationタイムアウトまでの時間
戻り値
0成功した場合
EINVALrwlockNULLである場合
ETIMEDOUTタイムアウトした場合
その他実装依存のエラー
説明
Platform Implementation
Win32 TryAcquireSRWLockShared(), nlib_sleep()
Linux pthread_rwlock_timedrdlock()
FreeBSD pthread_rwlock_timedrdlock()
OS X nlib_rwlock_tryrdlock(), nlib_sleep()
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_rwlock_tryrdlock_until()

nlib_rwlock_tryrdlock_until ( nlib_rwlock rwlock,
nlib_time  abstime 
)

読み込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。

引数
[in]rwlockリードライトロックオブジェクト
[in]abstimeタイムアウトする時刻
戻り値
0成功した場合
EINVALrwlockNULLである場合
ETIMEDOUTタイムアウトした場合
その他実装依存のエラー
説明
Platform Implementation
Win32 TryAcquireSRWLockShared()とスリープ
Linux pthread_rwlock_timedrdlock()
FreeBSD pthread_rwlock_timedrdlock()
OS X nlib_rwlock_tryrdlock(), nlib_sleep()
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_rwlock_trywrlock()

nlib_rwlock_trywrlock ( nlib_rwlock rwlock)

書き込みロックを取得しクリティカルセクションに入ることを試みます。

引数
[in]rwlockリードライトロックオブジェクト
戻り値
0成功した場合
EINVALrwlockNULLである場合
EBUSYロックを取得できなかった場合
その他実装依存のエラー
説明
Platform Implementation
Win32 TryAcquireSRWLockExclusive()
Linux pthread_rwlock_trywrlock()
FreeBSD pthread_rwlock_trywrlock()
OS X pthread_rwlock_trywrlock()
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_rwlock_trywrlock_for()

nlib_rwlock_trywrlock_for ( nlib_rwlock rwlock,
nlib_duration  duration 
)

書き込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。

引数
[in]rwlockリードライトロックオブジェクト
[in]durationタイムアウトまでの時間
戻り値
0成功した場合
EINVALrwlockNULLである場合
ETIMEDOUTタイムアウトした場合
その他実装依存のエラー
説明
Platform Implementation
Win32 TryAcquireSRWLockExclusive()とスリープ
Linux pthread_rwlock_timedwrlock()
FreeBSD pthread_rwlock_timedwrlock()
OS X nlib_rwlock_trywrlock(), nlib_sleep()
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_rwlock_trywrlock_until()

nlib_rwlock_trywrlock_until ( nlib_rwlock rwlock,
nlib_time  abstime 
)

書き込みロックを取得しクリティカルセクションに入ることを試みます。タイムアウトします。

引数
[in]rwlockリードライトロックオブジェクト
[in]abstimeタイムアウトする時刻
戻り値
0成功した場合
EINVALrwlockNULLである場合
ETIMEDOUTタイムアウトした場合
その他実装依存のエラー
説明
Platform Implementation
Win32 TryAcquireSRWLockExclusive()とスリープ
Linux pthread_rwlock_timedwrlock()
FreeBSD pthread_rwlock_timedwrlock()
OS X nlib_rwlock_trywrlock(), nlib_sleep()
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_rwlock_wrlock()

nlib_rwlock_wrlock ( nlib_rwlock rwlock)

書き込みロックを取得しクリティカルセクションに入ります。取得できるまでブロックします。

引数
[in]rwlockリードライトロックオブジェクト
戻り値
0成功した場合
EINVALrwlockNULLである場合
その他実装依存のエラー
説明
Platform Implementation
Win32 AcquireSRWLockExclusive()
Linux pthread_rwlock_wrlock()
FreeBSD pthread_rwlock_wrlock()
OS X pthread_rwlock_wrlock()
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_rwlock_wrunlock()

nlib_rwlock_wrunlock ( nlib_rwlock rwlock)

書き込みロックを解放します。

引数
[in]rwlockリードライトロックオブジェクト
戻り値
0成功した場合
EINVALrwlockNULLである場合
その他実装依存のエラー
説明
Platform Implementation
Win32 ReleaseSRWLockExclusive()
Linux pthread_rwlock_unlock()
FreeBSD pthread_rwlock_unlock()
OS X pthread_rwlock_unlock()
CAFE nlibによる実装
CTR nlibによる実装

◆ nlib_semaphore_destroy()

nlib_semaphore_destroy ( nlib_semaphore sem)

セマフォオブジェクトを破壊する。

引数
[in]semセマフォオブジェクトへのポインタ
戻り値
0成功した場合
EINVALsemNULLの場合
その他ブロックされているスレッドがある等の不正な状態が検出された場合
説明
Platform Implementation
Win32 CloseHandle()
Linux sem_destroy()
FreeBSD sem_destroy()
OS X sem_close(), sem_unlink()
CAFE No SDK API called
CTR Semaphore::~Semaphore()

◆ nlib_semaphore_init()

nlib_semaphore_init ( nlib_semaphore sem,
int  initial_count 
)

sem で指定されるセマフォオブジェクトを初期化する。

引数
[out]semセマフォオブジェクトへのポインタ
[in]initial_countセマフォカウントの初期値
戻り値
0成功した場合
EINVALsemNULLの場合, initial_count が65535を超えている場合
説明
Platform Implementation
Win32 CreateSemaphore()
Linux sem_init()
FreeBSD sem_init()
OS X sem_open()
CAFE OSInitSemaphore()
CTR Semaphore::TryInitialize()

◆ nlib_semaphore_post()

nlib_semaphore_post ( nlib_semaphore sem,
int *  previous_count 
)

セマフォカウントを1つ増加させる。

引数
[in]semセマフォオブジェクトへのポインタ
[out]previous_count解放前のセマフォカウント
戻り値
0成功した場合
EINVALsemNULLの場合
その他セマフォカウントが上限を越えようとした場合等
説明
Platform Implementation
Win32 ReleaseSemaphore()
Linux sem_post()
FreeBSD sem_post()
OS X sem_post()
CAFE OSSignalSemaphore()
CTR Semaphore::Release()

◆ nlib_semaphore_post_ex()

nlib_semaphore_post_ex ( nlib_semaphore sem,
int  release_count,
int *  previous_count 
)

セマフォカウントをreleaseCount 増加させる。

引数
[in]semセマフォオブジェクトへのポインタ
[in]release_countセマフォの増加数
[out]previous_count解放前のセマフォカウント
戻り値
0成功した場合
EINVALsemNULLの場合
その他セマフォカウントが上限を越えようとした場合等
説明
Platform Implementation
Win32 ReleaseSemaphore()
Linux sem_post()
FreeBSD sem_post()
OS X sem_post()
CAFE OSSignalSemaphore()
CTR Semaphore::Release()
Linux, FreeBSD, CAFEではこの操作はatomicではない。

◆ nlib_semaphore_trywait()

nlib_semaphore_trywait ( nlib_semaphore sem)

セマフォカウントが0でなければ、セマフォカウントを1減少させる。

引数
[in]semセマフォオブジェクトへのポインタ
戻り値
0成功した場合
EAGAINセマフォカウントが0だった場合
EINVALsemNULLの場合
その他何らかの理由で失敗した場合
説明
Platform Implementation
Win32 WaitForSingleObject()
Linux sem_trywait(), errnoがEINTRの場合は内部で再度実行される。
FreeBSD sem_trywait(), errnoがEINTRの場合は内部で再度実行される。
OS X sem_trywait(), errnoがEINTRの場合は内部で再度実行される。
CAFE OSTryWaitSemaphore()
CTR Semaphore::TryAcquire()

◆ nlib_semaphore_trywait_for()

nlib_semaphore_trywait_for ( nlib_semaphore sem,
nlib_duration  duration 
)

セマフォカウントが0でなければ、セマフォカウントを1減少させる。0の場合はduration の期間だけ待つ。

引数
[in]semセマフォオブジェクトへのポインタ
[in]durationタイムアウト時間
戻り値
0成功した場合
ETIMEDOUTタイムアウトした場合
EINVALsemNULLの場合
その他何らかの理由で失敗した場合
説明
Platform Implementation
Win32 WaitForSingleObject()
Linux sem_timedwait(), errnoがEINTRの場合は内部で再度実行される。
FreeBSD sem_timedwait(), errnoがEINTRの場合は内部で再度実行される。
OS X nlib_semaphore_trywait(), nlib_sleep(), errnoがEINTRの場合は内部で再度実行される。
CAFE OSTryWaitSemaphore()
CTR Semaphore::TryAcquire()
CAFEの場合は、100usecのスリープを繰り返しつつセマフォの取得を試みます。

◆ nlib_semaphore_wait()

nlib_semaphore_wait ( nlib_semaphore sem)

セマフォカウントが0でなくなるまで待って、セマフォカウントを1減少させる。

引数
[in]semセマフォオブジェクトへのポインタ
戻り値
0成功した場合
EINVALsemNULLの場合
その他何らかの理由で失敗した場合
説明
Platform Implementation
Win32 WaitForSingleObject()
Linux sem_wait(), errnoがEINTRの場合は内部で再度実行される。
FreeBSD sem_wait(), errnoがEINTRの場合は内部で再度実行される。
OS X sem_wait(), errnoがEINTRの場合は内部で再度実行される。
CAFE OSWaitSemaphore()
CTR Semaphore::Acquire()

◆ nlib_skipws()

nlib_skipws ( size_t *  cnt_lf,
const char **  last_lf,
const char *  s,
size_t  n 
)

n 個の文字から成る文字列を探索して最初の空白でない文字へのポインタを返します。

引数
[in]cnt_lf見つかったLF(0x0A)の数が格納されます。
[in]last_lf最後のLF(0x0A)へのポインタが格納されます。
[in]s文字列へのポインタ
[in]n対象となる文字列の長さ
戻り値
最初の空白でない文字を指し示すポインタ(見つからなかった場合はs + n)
説明
ここで空白文字とは、HT(0x09), LF(0x0A), CR(0x0D), SPC(0x20)のことをいいます。
以下のコードでは、2行分の空白を読み飛ばし処理すべき次の文字列の先頭を取得しています。
const char* text = " \t\n \n string";
size_t cnt_lf;
const char* last_lf;
const char* target = nlib_skipws(&cnt_lf, &last_lf, text, nlib_strlen(text));
nlib_printf("Target String: %s\n", target);
nlib_printf("LF found: %" PRIuS "\n", cnt_lf);
nlib_printf("Last LF pos: %" PRIdS "\n", last_lf - text);
/*
Output:
Target String: string
LF found: 2
Last LF pos: 4
*/
Platform Implementation
Win32 SIMDを用いた実装
Linux SIMDを用いた実装
FreeBSD SIMDを用いた実装
OS X SIMDを用いた実装
CAFE nlib_memchr_not()を利用した実装
CTR nlib_memchr_not()を利用した実装

◆ nlib_sleep()

nlib_sleep ( nlib_duration  t)

t の間スリープする。

引数
[in]tスリープする時間
戻り値
0ならば成功
説明
以下のコードではそれぞれ1ミリ秒スリープさせるコードです。
nlib_sleep(10000); // sleep for 1 msec
nlib_sleep(nlib_ns::TimeSpan(0, 0, 1).ToTimeValue().tick); // sleep for 1 msec
Platform Implementation
Win32 Sleep()
Linux nanosleep(), errnoがEINTRの場合は内部で再度実行される。
FreeBSD nanosleep(), errnoがEINTRの場合は内部で再度実行される。
OS X nanosleep(), errnoがEINTRの場合は内部で再度実行される。
CAFE OSSleepNanoseconds()
CTR nn::os::Thread::Sleep()
各種例:
misc/threading/callonce/callonce.cpp, misc/threading/criticalsection/criticalsection.cpp, misc/threading/semaphore/semaphore.cpp, misc/threading/simpleringbuffer/simpleringbuffer.cpp, misc/threading/tls/tls.cpp.

◆ nlib_spinlock_init()

static void nlib_spinlock_init ( nlib_spinlock lock)
inlinestatic

スピンロックを初期化します。

引数
[in]lock初期化を行うスピンロック
説明
Platform Implementation
Win32 nlib独自の実装
Linux nlib独自の実装
FreeBSD nlib独自の実装
OS X 0を代入
CAFE nlib独自の実装
CTR nlib独自の実装

Platform.h1675 行目に定義があります。

◆ nlib_spinlock_lock()

static void nlib_spinlock_lock ( nlib_spinlock lock)
inlinestatic

スピンロックをロックします。再帰ロックを行った場合の動作は不定です。

引数
[in]lockロック対象となるスピンロック
説明
Platform Implementation
Win32 nlib独自の実装
Linux nlib独自の実装
FreeBSD nlib独自の実装
OS X OSSpinLockLock()
CAFE nlib独自の実装
CTR nlib独自の実装

Platform.h1678 行目に定義があります。

◆ nlib_spinlock_trylock()

static errno_t nlib_spinlock_trylock ( nlib_spinlock lock)
inlinestatic

スピンロックをロックします。成功した場合は0を返し、失敗した場合はEBUSYを返します。

引数
[in]lockロック対象となるスピンロック
戻り値
0ロックできた場合
EBUSYロックできなかった場合
説明
Platform Implementation
Win32 nlib独自の実装
Linux nlib独自の実装
FreeBSD nlib独自の実装
OS X OSSpinLockTry()
CAFE nlib独自の実装
CTR nlib独自の実装

Platform.h1708 行目に定義があります。

◆ nlib_spinlock_unlock()

static void nlib_spinlock_unlock ( nlib_spinlock lock)
inlinestatic

スピンロックをアンロックします。

引数
[in]lockロックされているスピンロック
説明
Platform Implementation
Win32 nlib独自の実装
Linux nlib独自の実装
FreeBSD nlib独自の実装
OS X OSSpinLockUnlock()
CAFE nlib独自の実装
CTR nlib独自の実装

Platform.h1739 行目に定義があります。

◆ nlib_strchr()

nlib_strchr ( const char *  s,
int  c 
)

文字列の先頭から文字を検索します。

引数
[in]s検索対象文字列
[in]c検索文字
戻り値
文字が見つかった場合は一致文字へのポインタを返します。見つからなかった場合はNULLを返します。
説明
Platform Implementation
Win32 SIMDを用いた実装
Linux SIMDを用いた実装
FreeBSD SIMDを用いた実装
OS X SIMDを用いた実装
CAFE 32bit単位でチェックする実装
CTR 32bit単位でチェックする実装

◆ nlib_strcplen()

nlib_strcplen ( size_t *  codepoint_count,
size_t *  supplementary_codepoint_count,
size_t *  len,
const nlib_utf8_t str 
)

文字列中のコードポイントの数と補助文字の数と文字列長を取得します。 EILSEQを返す場合は、その場所までのコードポイント数等が格納されています。

引数
[out]codepoint_countコードポイントの数が格納されるポインタ
[out]supplementary_codepoint_count補助文字(U+10000 - U+10FFFF)のコードポイントの数が格納されるポインタ
[out]len文字列長が格納されるポインタ
[in]str文字列
戻り値
0成功した場合
EINVALstrNULLの場合
EILSEQコードポイントに変換できないデータがあった場合
UTF-32に変換した場合の文字数は、*codepoint_countとなります。 また、UTF-16に変換した場合の文字数は、*codepoint_count + *supplementary_codepoint_countで計算することが可能です。

◆ nlib_strcpy()

nlib_strcpy ( char *  s1,
size_t  s1max,
const char *  s2 
)

N1078のstrcpy_sに相当する実装です。

引数
[in,out]s1コピー先のバッファ
[in]s1maxコピー先のバッファ・サイズ(文字数)
[in]s2コピー元のバッファ
戻り値
0成功した場合
ERANGEs1 又はs2NULLの場合
ERANGEバッファが足りなかった場合
説明
失敗した場合でs1NULLでない場合は、s1[0] = 0が設定されます。 バッファが重なる場合の動作は未定義です。
Platform Implementation
Win32 nlib_strnlen() + nlib_memcpy()
Linux nlib_strnlen() + nlib_memcpy()
FreeBSD nlib_strnlen() + nlib_memcpy()
OS X nlib_strnlen() + nlib_memcpy()
CAFE nlib_strnlen() + nlib_memcpy()
CTR nlib_strnlen() + nlib_memcpy()

◆ nlib_strlen()

nlib_strlen ( const char *  s)

内部でstrlen()を呼び出します。独自の実装が動作する場合もあります。

引数
[in]s文字列へのポインタ
戻り値
文字列の長さ
説明
sNULLの場合は0を返します。
Platform Implementation
Win32 SIMDを用いた実装
Linux SIMDを用いた実装
FreeBSD SIMDを用いた実装
OS X SIMDを用いた実装
CAFE 1ワード単位でスキャンする実装
CTR 1ワード単位でスキャンする実装
各種例:
exi/textparser/textparser.cpp.

◆ nlib_strncpy()

nlib_strncpy ( char *  s1,
size_t  s1max,
const char *  s2,
size_t  n 
)

N1078のstrncpy_sに相当する実装です。

引数
[in,out]s1コピー先のバッファ
[in]s1maxコピー先のバッファ・サイズ(文字数)
[in]s2コピー元のバッファ
[in]nコピーする文字数
戻り値
0成功した場合
ERANGEs1 又はs2NULLの場合
ERANGEバッファが足りなかった場合
説明
失敗した場合でs1NULLでない場合は、s1[0] = 0が設定されます。 バッファが重なる場合の動作は未定義です。
Platform Implementation
Win32 nlib_strnlen() + nlib_memcpy()
Linux nlib_strnlen() + nlib_memcpy()
FreeBSD nlib_strnlen() + nlib_memcpy()
OS X nlib_strnlen() + nlib_memcpy()
CAFE nlib_strnlen() + nlib_memcpy()
CTR nlib_strnlen() + nlib_memcpy()

◆ nlib_strnlen()

nlib_strnlen ( const char *  s,
size_t  maxsize 
)

N1078のstrnlen_sに相当する実装です。

引数
[in]s文字列へのポインタ
[in]maxsize文字列のサイズ(戻り値の最大数)
戻り値
文字列の長さ
説明
sNULLの場合は0を返します。文字列の長さがmaxsize 以上の場合はmaxsize を返します。
Platform Implementation
Win32 SIMDを用いた実装
Linux SIMDを用いた実装
FreeBSD SIMDを用いた実装
OS X SIMDを用いた実装
CAFE 1ワード単位でスキャンする実装
CTR 1ワード単位でスキャンする実装

◆ nlib_strrchr()

nlib_strrchr ( const char *  s,
int  c 
)

文字列の末尾から文字を検索します。

引数
[in]s検索対象文字列
[in]c検索文字
戻り値
文字が見つかった場合は一致文字へのポインタを返します。見つからなかった場合はNULLを返します。
説明
Platform Implementation
Win32 strrchr()
Linux SIMDを用いた実装
FreeBSD SIMDを用いた実装
OS X SIMDを用いた実装
CAFE nlib_strlen() + 後方から32bit単位でチェックする実装
CTR nlib_strlen() + 後方から32bit単位でチェックする実装

◆ nlib_strto_int32()

nlib_strto_int32 ( int32_t *  result,
const char *  nptr,
char **  endptr,
int  base 
)

文字列をint32_t型に変換します。

引数
[out]result読み込んだ文字数(ヌル文字を含まない)
[in]nptr変換する文字列
[out]endptr最初に現れた変換できない文字へのポインタが格納される
[in]base基数(最小で0, 8, 10, 16をサポート)
戻り値
0成功した場合
ERANGE結果の値がint32_tの範囲外の場合。*resultは設定されている。
EILSEQ値が読み込まれなかった場合
EINVAL与えられたbaseでの変換がサポートされていない場合
説明
strtol()と同様の動作を行いますが、以下の点で異なります。
  • errnoを事前に0に設定する必要がありません。
  • 設定される値はint32_t型です。
  • ヌル文字列を読んだ場合、EILSEQを返します。
  • 先頭が空白文字の場合、EILSEQを返します。
  • endptrNULLの場合、文字列の末尾まで変換できなかった場合はEILSEQを返します。
各種例:
exi/script/script.cpp, exi/simple1/simple1.cpp.

◆ nlib_swapendian_16()

nlib_swapendian_16 ( uint16_t *  p,
size_t  count 
)

エンディアンを変換します。

引数
[in,out]pエンディアンを変換する領域へのポインタ
[in]countデータの個数
戻り値
0成功。
EINVALpNULLの場合
説明
Platform Implementation
Win32 SIMDを利用した実装
Linux SIMDを利用した実装
FreeBSD SIMDを利用した実装
OS X SIMDを利用した実装
CAFE 一般的な実装
CTR 一般的な実装

◆ nlib_swapendian_32()

nlib_swapendian_32 ( uint32_t *  p,
size_t  count 
)

エンディアンを変換します。

引数
[in,out]pエンディアンを変換する領域へのポインタ
[in]countデータの個数
戻り値
0成功。
EINVALpNULLの場合
説明
Platform Implementation
Win32 SIMDを利用した実装
Linux SIMDを利用した実装
FreeBSD SIMDを利用した実装
OS X SIMDを利用した実装
CAFE 一般的な実装
CTR 一般的な実装

◆ nlib_swapendian_64()

nlib_swapendian_64 ( uint64_t *  p,
size_t  count 
)

エンディアンを変換します。

引数
[in,out]pエンディアンを変換する領域へのポインタ
[in]countデータの個数
戻り値
0成功。
EINVALpNULLの場合
説明
Platform Implementation
Win32 SIMDを利用した実装
Linux SIMDを利用した実装
FreeBSD SIMDを利用した実装
OS X SIMDを利用した実装
CAFE 一般的な実装
CTR 一般的な実装

◆ nlib_thread_attr_destroy()

nlib_thread_attr_destroy ( nlib_thread_attr attr)

スレッド初期化オブジェクトを破壊します。

引数
[out]attr破壊するオブジェクト
戻り値
0成功しました。
EINVALattrNULLだった場合

◆ nlib_thread_attr_getint()

nlib_thread_attr_getint ( const nlib_thread_attr attr,
int  key,
int *  value 
)

スレッドの属性オブジェクトのキーに対応する整数を取得する。

引数
[in]attrスレッドの属性
[in]keyキー
[out]valueキーに対応する値が設定される
戻り値
0成功しました。
EINVAL引数の値が不正です。
説明
Platform Implementation
Win32 nlib独自の実装
Linux pthread_attr_getdetachstate(), pthread_attr_getstacksize(), pthread_attr_getschedparam(), pthread_attr_getaffinity_np()
FreeBSD pthread_attr_getdetachstate(), pthread_attr_getstacksize(), pthread_attr_getschedparam(), pthread_attr_getaffinity_np()
OS X pthread_attr_getdetachstate(), pthread_attr_getstacksize(), pthread_attr_getschedparam()
CAFE nlib独自の実装
CTR nlib独自の実装

◆ nlib_thread_attr_getptr()

nlib_thread_attr_getptr ( const nlib_thread_attr attr,
int  key,
void **  value 
)

スレッドの属性オブジェクトのキーに対応するポインタを取得する。現在のところEINVALのみを返します。

引数
[in]attrスレッドの属性
[in]keyキー
[out]valueキーに対応する値が設定される
戻り値
0成功しました。
EINVAL引数の値が不正です。

◆ nlib_thread_attr_getstack()

nlib_thread_attr_getstack ( const nlib_thread_attr attr,
void **  stack_addr,
size_t *  stack_size 
)

スレッドの属性オブジェクトのスタック設定を取得する。

引数
[in]attrスレッドの属性
[out]stack_addrスタックアドレス
[out]stack_sizeスタックサイズ
戻り値
0ならば成功です。エラー値はプラットフォームに依存します。
説明
Platform Implementation
Win32 nlib独自の実装
Linux pthread_attr_getstack()
FreeBSD pthread_attr_getstack()
OS X pthread_attr_getstack()
CAFE nlib独自の実装
CTR nlib独自の実装

◆ nlib_thread_attr_init()

nlib_thread_attr_init ( nlib_thread_attr attr)

スレッド属性オブジェクトを初期化して、デフォルトに設定する。

引数
[out]attr初期化される属性
戻り値
0成功しました。
EINVALattrNULLだった場合

◆ nlib_thread_attr_setint()

nlib_thread_attr_setint ( nlib_thread_attr attr,
int  key,
int  value 
)

スレッドの属性オブジェクトのキーに対応する整数を設定する。

引数
[out]attrスレッドの属性
[in]keyキー
[in]value設定される値
戻り値
0成功しました。
EINVAL引数の値が不正です。
説明
キー 説明
NLIB_THREAD_ATTR_KEY_DETACHSTATE 0以外の場合はデタッチ状態でスレッドを立ち上げる
NLIB_THREAD_ATTR_KEY_STACKSIZE スレッドのスタックサイズ
NLIB_THREAD_ATTR_KEY_PRIORITY スレッドの優先度
NLIB_THREAD_ATTR_KEY_AFFINITY スレッドのアフィニティマスク
NLIB_THREAD_ATTR_KEY_EXPLICIT_SCHED 0以外の場合はNLIB_THREAD_ATTR_KEY_PRIORITYの設定が有効になる
Platform Implementation
Win32 スレッド起動直後にデタッチ, _beginthreadex(), スレッド起動直後に設定, スレッド起動直後に設定
Linux pthread_attr_setdetachstate(), pthread_attr_setstacksize(), pthread_attr_setschedparam(), pthread_attr_setaffinity_np()
FreeBSD pthread_attr_setdetachstate(), pthread_attr_setstacksize(), pthread_attr_setschedparam(), pthread_attr_setaffinity_np()
OS X pthread_attr_setdetachstate(), pthread_attr_setstacksize(), pthread_attr_setschedparam(), スレッド起動直後に設定
CAFE OSCreateThread(), OSCreateThread(), OSCreateThread(), OSCreateThread()
CTR スレッド起動直後にデタッチ, nn::os::Thread::TryStartUsingAutoStack(), nn::os::Thread::TryStartUsingAutoStack(), なし

◆ nlib_thread_attr_setptr()

nlib_thread_attr_setptr ( nlib_thread_attr attr,
int  key,
void *  value 
)

スレッドの属性オブジェクトのキーに対応するポインタを設定する。現在のところEINVALのみを返します。

引数
[out]attrスレッドの属性
[in]keyキー
[in]value設定される値
戻り値
0成功しました。
EINVAL引数の値が不正です。

◆ nlib_thread_attr_setstack()

nlib_thread_attr_setstack ( nlib_thread_attr attr,
void *  stack_addr,
size_t  stack_size 
)

スレッドの属性オブジェクトのスタック設定を設定します。

引数
[out]attrスレッドの属性
[in]stack_addrスタックアドレス
[in]stack_sizeスタックサイズ
戻り値
0ならば成功です。エラー値はプラットフォームに依存します。
説明
Platform Implementation
Win32 nlib独自の実装(設定した値は無視されます)
Linux pthread_attr_getstack()
FreeBSD pthread_attr_getstack()
OS X pthread_attr_getstack()
CAFE nlib独自の実装
CTR nlib独自の実装

◆ nlib_thread_cleanup_pop()

nlib_thread_cleanup_pop ( int  exec)

クリーンアップハンドラが格納されているスタックの一番上のハンドラを削除します。

引数
[in]exec0以外ならクリーンアップハンドラを実行する。0ならば実行しない。
説明
Platform Implementation
Win32 nlib独自の実装
Linux pthread_cleanup_pop()
FreeBSD pthread_cleanup_pop()
OS X pthread_cleanup_pop()
CAFE nlib独自の実装
CTR 実装が存在しません(コンパイルエラー)

◆ nlib_thread_cleanup_push()

nlib_thread_cleanup_push ( void(*)(void *)  fn,
void *  arg 
)

fnを専用のスタックにプッシュします。

引数
[in]fn
[in]arg
説明
nlib_thread_exit()の実行時に実行されるクリーンアップハンドラを専用のスタックにプッシュします。 nlib_thread_cleanup_pop()される前にnlib_thread_exit()(nlib_thread_exit_cpp()ではない)が呼ばれた場合、順番にハンドラを実行してスレッドの終了処理を行います。 return文の実行でスレッドから抜ける場合にはクリーンアップハンドラは実行されないことに注意してください。 また、C++例外を利用した場合にハンドラが実行されるかどうかは不定(プラットフォームに依存)で、クリーンアップハンドラ内でnlib_thread_exit()又はnlib_thred_exit_cpp()を呼び出した場合の動作は不定です。
Platform Implementation
Win32 nlib独自の実装
Linux pthread_cleanup_push()
FreeBSD pthread_cleanup_push()
OS X pthread_cleanup_push()
CAFE nlib独自の実装
CTR 実装が存在しません(コンパイルエラー)

◆ nlib_thread_create()

nlib_thread_create ( nlib_thread thread,
const nlib_thread_attr attr,
nlib_thread_func  func,
void *  arg 
)

新しいスレッド作成して実行します。

引数
[out]threadスレッドの作成が成功した場合、スレッドを指すデータが格納される。
[in]attrNULLを指定した場合はデフォルトの属性が指定されます。
[in]func新しいスレッドで実行する関数
[in]arg関数func に渡す引数
戻り値
0成功した場合
EINVALthread, funcNULLだった場合、その他パラメータが不正と判定された場合
ENOMEMメモリの動的確保に失敗した場合
EAGAINリソース不足等(スレッド数が多すぎる、メモリ不足)でスレッドを立ち上げられなかった場合
EACCESリソース不足等(スレッド数が多すぎる、メモリ不足)でスレッドを立ち上げられなかった場合
説明
新しいスレッドはfuncarg を引数として実行されます。 また、デフォルトではスレッドはJoin可能なものとして作成されます。
各種例:
exi/multithread/multithread.cpp, heap/cachedheap/cachedheap.cpp, heap/nmalloc_simple/nmalloc_simple.cpp, heap/object_tracking/object_tracking.cpp, misc/handlemaker/handlemaker.cpp, misc/threading/barrier/barrier.cpp, misc/threading/callonce/callonce.cpp, misc/threading/condvar/condvar.cpp, misc/threading/criticalsection/criticalsection.cpp, misc/threading/semaphore/semaphore.cpp, misc/threading/simpleringbuffer/simpleringbuffer.cpp, misc/threading/tls/tls.cpp, msgpack/jsonrpc/jsonrpc.cpp.

◆ nlib_thread_detach()

nlib_thread_detach ( nlib_thread  thread)

実行中のスレッドをデタッチ状態にします。

引数
[in]threadスレッドの識別子
戻り値
0成功した場合
EINVALスレッドが見つからなかったがデタッチされている
ESRCHスレッドが見つからなかったがデタッチされている
説明
Platform Implementation
Win32 CloseHandle()
Linux pthread_detach()
FreeBSD pthread_detach()
OS X pthread_detach()
CAFE OSDetachThread()
CTR Thread::Detach()
各種例:
exi/multithread/multithread.cpp, heap/cachedheap/cachedheap.cpp, misc/threading/simpleringbuffer/simpleringbuffer.cpp.

◆ nlib_thread_equal()

nlib_thread_equal ( nlib_thread  th1,
nlib_thread  th2 
)

2つのスレッドが同一スレッドを指すかどうかチェックします。

引数
[in]th1比較するnlib_thread型の値
[in]th2比較するnlib_thread型の値
戻り値
th1th2 が同一のスレッドを指している時、非0の値が返る。それ以外の場合、0が返る。

◆ nlib_thread_getconcurrency()

nlib_thread_getconcurrency ( unsigned int *  num_cpu)

ハードウェアスレッドの数を取得します。

引数
[out]num_cpuハードウェアスレッドの数が設定されます。
戻り値
0成功しました。
説明
Platform Implementation
Win32 GetSystemInfo(&sysinfo); sysinfo.dwNumberOfProcessors
Linux sysconf(_SC_NPROCESSORS_ONLN)
FreeBSD sysconf(_SC_NPROCESSORS_ONLN)
OS X sysconf(_SC_NPROCESSORS_ONLN)
CAFE OSGetCoreCount()
CTR 1

◆ nlib_thread_getcpu()

nlib_thread_getcpu ( int *  cpuid)

呼び出したスレッドが実行されているCPUを取得します。

引数
[out]cpuidCPU番号
戻り値
エラーが発生しなければ0を返す。cpuidNULLの場合はEINVALを返す
説明
エラーが発生した場合は、*cpuid を0に設定してエラーを返します。
Platform Implementation
Win32(VISTA) GetCurrentProcessorNumber()
Win32(Windows 7以降) GetCurrentProcessorNumberEx()
Linux sched_getcpu(), (GetCurrentProcessorNumber() if cygwin)
FreeBSD 0を設定しENOTSUPを返す
OS X 0を設定しENOTSUPを返す
CAFE OSGetCoreId()
CTR nn::os::Thread::GetCurrentProcessorNumber()

◆ nlib_thread_getid()

nlib_thread_getid ( nlib_thread_id id)

実行中のスレッドに対応する一意の整数値を格納する。

引数
[out]idスレッドに対応する整数値が格納される
戻り値
0成功しました
説明
Platform Implementation
Win32 GetCurrentThreadId()
Linux syscall(SYS_gettid), (GetCurrentThreadId() if cygwin)
FreeBSD thr_self()
OS X pthread_threadid_np()
CAFE OSGetCurrentThread()
CTR nn::os::Thread::GetCurrentId()
各種例:
exi/multithread/multithread.cpp, misc/handlemaker/handlemaker.cpp, misc/threading/callonce/callonce.cpp, misc/threading/tls/tls.cpp.

◆ nlib_thread_getname()

nlib_thread_getname ( nlib_thread  thread,
char *  name,
size_t  len 
)

スレッド名を取得します。

引数
[in]threadスレッドの識別子
[out]nameスレッド名が格納されるバッファ
[in]lennameのバッファ長
戻り値
0 ならば成功
説明
Platform Implementation
Win32 ENOTSUPを返す
Linux pthread_getname_np(), cygwinの場合はENOTSUPを返す。
FreeBSD ENOTSUPを返す
OS X pthread_getname_np()
CAFE OSGetThreadName()
CTR ENOTSUPを返す

◆ nlib_thread_getpriority()

nlib_thread_getpriority ( nlib_thread  thread,
int *  priority 
)

スレッドの現在の実行優先度を取得します。数値の意味は実装依存です。

引数
[in]threadスレッドの識別子
[out]priority実行優先度が格納されます。
戻り値
0成功しました。
EINVALpriorityNULLだった場合
ESRCHthread が無効であることが検出された場合(EINVALを返す場合もある)
説明
Platform Implementation
Win32 GetThreadPriority()
Linux pthread_getschedparam()
FreeBSD pthread_getschedparam()
OS X pthread_getschedparam()
CAFE OSGetThreadPriority()
CTR Thread::GetCurrentPriority()

◆ nlib_thread_join()

nlib_thread_join ( nlib_thread  thread)

スレッドの終了を待ちます。

引数
[in]thread終了を待つスレッドの識別子
戻り値
0成功した場合
EINVALスレッドが見つからなかったがデタッチされている
ESRCHスレッドが見つからなかったがデタッチされている
説明
Platform Implementation
Win32 WaitForSingleObject() + CloseHandle()
Linux pthread_join()
FreeBSD pthread_join()
OS X pthread_join()
CAFE OSJoinThread()
CTR Thread::Join()
各種例:
exi/multithread/multithread.cpp, heap/cachedheap/cachedheap.cpp, heap/nmalloc_simple/nmalloc_simple.cpp, heap/object_tracking/object_tracking.cpp, misc/handlemaker/handlemaker.cpp, misc/threading/barrier/barrier.cpp, misc/threading/callonce/callonce.cpp, misc/threading/condvar/condvar.cpp, misc/threading/criticalsection/criticalsection.cpp, misc/threading/semaphore/semaphore.cpp, misc/threading/tls/tls.cpp, msgpack/jsonrpc/jsonrpc.cpp.

◆ nlib_thread_priority_default()

nlib_thread_priority_default ( int *  priority)

実行優先度に指定できる数値のデフォルト値を取得します。

引数
[out]priority実行優先度
戻り値
0成功した場合
説明
Platform Implementation
Win32 THREAD_PRIORITY_NORMAL
Linux 0
FreeBSD 0
OS X 0
CAFE OS_PRIORITY_APP_DEFAULT
CTR 16

◆ nlib_thread_priority_max()

nlib_thread_priority_max ( int *  priority)

実行優先度に指定できる数値の最大値を取得します。

引数
[out]priority実行優先度
戻り値
0成功した場合
説明
Platform Implementation
Win32 THREAD_BASE_PRIORITY_LOWRT
Linux sched_get_priority_max(SCHED_OTHER)
FreeBSD sched_get_priority_max(SCHED_OTHER)
OS X sched_get_priority_max(SCHED_OTHER)
CAFE 31
CTR 31

◆ nlib_thread_priority_min()

nlib_thread_priority_min ( int *  priority)

実行優先度に指定できる数値の最小値を取得します。

引数
[out]priority実行優先度
戻り値
0成功した場合
説明
Platform Implementation
Win32 THREAD_BASE_PRIORITY_IDLE
Linux sched_get_priority_min(SCHED_OTHER)
FreeBSD sched_get_priority_min(SCHED_OTHER)
OS X sched_get_priority_min(SCHED_OTHER)
CAFE 0
CTR 0

◆ nlib_thread_self()

nlib_thread_self ( nlib_thread thread)

実行中のスレッドに対応するnlib_threadの値を格納する。

引数
[out]threadスレッドの識別子
戻り値
0成功しました。
説明
Platform Implementation
Win32 GetCurrentThread()
Linux pthread_self()
FreeBSD pthread_self()
OS X pthread_self()
CAFE OSGetCurrentThread()
CTR ENOTSUPを返す
この関数はCTRではサポートされず、Win32の場合は擬似ハンドルを返すことに注意してください。

◆ nlib_thread_setaffinity()

nlib_thread_setaffinity ( nlib_thread  thread,
uint32_t  affinity 
)

指定されたスレッドのプロセッサアフィニティマスクを設定します。

引数
[in]threadスレッドの識別子
[in]affinityスレッドアフィニティマスク
戻り値
0ならば成功
説明
Cygwin版及びLinux版ではthread に自身のスレッドを指定する必要があります。 これはLinuxでは自身以外のスレッドのtid(pthread_tではない)の取得がサポートされていないためです。 自身以外のスレッドを指定した場合はEINVALを返します。
Platform Implementation
Win32 SetThreadAffinityMask()
Linux pthread_setaffinity_np(), (SetThreadAffinityMask() if cygwin)
FreeBSD pthread_setaffinity_np()
OS X thread_policy_set()
CAFE OSSuspendThread(), OSSetThreadAffinity(), OSResumeThread()。1, 2, 4がそれぞれコア0, コア1, コア2に対応する。自スレッドに対する設定は不可。
CTR ENOTSUPを返す

◆ nlib_thread_setname()

nlib_thread_setname ( nlib_thread  thread,
const char *  name 
)

スレッドに名前をつけます。

引数
[in]threadスレッドの識別子
[in]nameスレッド名
戻り値
0ならば成功
説明
プラットフォームによっては、自身のスレッドにしか名前を付けられない場合があります。 その場合、異なるスレッドに名前をつけようとした場合にはENOTSUPを返します。
Platform Implementation
Win32 RaiseException(MS_VC_EXCEPTION, ....)
Linux pthread_setname_np(), cygwinの場合はENOTSUPを返す。
FreeBSD pthread_set_name_np()
OS X pthread_setname_np()
CAFE OSSetThreadName()
CTR ENOTSUPを返す

◆ nlib_thread_setpriority()

nlib_thread_setpriority ( nlib_thread  thread,
int  priority 
)

スレッドの実行優先度を設定します。数値の意味は実装依存です。

引数
[in]threadスレッドの識別子
[in]priority設定される実行優先度
戻り値
0成功しました。
EINVALpriorityNULLだった場合、priority の値が不正だった場合
ESRCHthread が無効であることが検出された場合(EINVALを返す場合もある)
その他権限が無い等の理由で設定できなかった場合
説明
Platform Implementation
Win32 SetThreadPriority()
Linux pthread_setschedparam()
FreeBSD pthread_setschedparam()
OS X pthread_setschedparam()
CAFE OSSetThreadPriority()
CTR Thread::ChangePriority()

◆ nlib_ticktime()

nlib_ticktime ( nlib_duration t)

ブートからの経過時間を取得します。

引数
[out]tブートからの経過時間が格納される変数へのポインタ
戻り値
0成功した場合
EINVALtNULLの場合
説明
Platform Implementation
Win32 QueryPerformanceCounter()
Linux clock_gettime(CLOCK_MONOTONIC, ...)
FreeBSD clock_gettime(CLOCK_MONOTONIC, ...)
OS X host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock), clock_get_time(cclock, &mts)
CAFE OSGetSystemTime()
CTR nn::os::Tick::GetSystemCurrent()

◆ nlib_timer_create()

nlib_timer_create ( nlib_timer timer,
nlib_timer_callback  callback,
void *  param,
uint32_t  flags 
)

タイマーを作成します。

引数
[out]timerタイマーの識別子が格納されます。
[in]callback実行するコールバック関数です。
[in]paramコールバック関数へ渡される引数です。
[in]flags0又は以下の値の論理和です。
Value Description
NLIB_TIMER_SHORTTERM_TASK コールバック関数をタイマースレッド自身で実行します
NLIB_TIMER_LONGTERM_TASK コールバック関数の実行時間が長時間になりうることをシステムにヒントとして示します
戻り値
0成功した場合
EINVALtimerNULLの場合
ENOMEMメモリの確保に失敗した場合
その他内部実装による
説明
タイマーを作成し、識別子をtimerに格納します。 コールバック関数はデフォルトでは新規スレッドかスレッドプールのワーカースレッドで実行されますが、flagsNLIB_TIMER_SHORTTERM_TASKを指定するとタイマースレッド自身で実行されます。 この場合、他のコールバック関数の実行が遅れることになるので短い時間で終わるコールバック関数にのみ設定してください。 NLIB_TIMER_LONGTERM_TASKは、コールバック関数の実行時間が長くなることをシステムに示すためのヒントして指定します。
Platform Implementation
Win32 CreateTimerQueueTimer()
Linux nlib独自の実装
FreeBSD nlib独自の実装
OS X nlib独自の実装
CAFE nlib独自の実装
CTR nlib独自の実装

◆ nlib_timer_delete()

nlib_timer_delete ( nlib_timer  timer,
int  wait_completion,
nlib_timer_callback  completion_callback 
)

タイマーを削除します。

引数
[in]timerタイマーの識別子
[in]wait_completion非0の場合、このタイマーの全てのコールバック関数の完了までブロックします。
[in]completion_callbackNULLでない場合、このタイマーの全てのコールバック関数の完了後に呼び出されます。
戻り値
0成功した場合
EBADFタイマーの識別子が有効でない場合
説明
wait_completionを非0にした場合は、このタイマーのコールバック関数の完了までブロックします(コールバック関数内で利用する場合には0を指定してください)。 この動作により、コールバック関数が利用しているリソースを安全に解放することができます。 また、completion_callbackに関数を指定した場合は、このタイマーのコールバック関数の完了後にこの関数が呼び出されます。
説明
Platform Implementation
Win32 DeleteTimerQueueTimer()
Linux nlib独自の実装
FreeBSD nlib独自の実装
OS X nlib独自の実装
CAFE nlib独自の実装
CTR nlib独自の実装

◆ nlib_timer_gettime()

nlib_timer_gettime ( nlib_timer  timer,
nlib_timerspec curr_value 
)

タイマーの現在の設定を取得します。

引数
[in]timerタイマーの識別子
[out]curr_value現在の設定が格納される。
戻り値
0成功した場合
EBADFタイマーの識別子が有効でない場合
EINVALcurr_valueNULLの場合

◆ nlib_timer_settime()

nlib_timer_settime ( nlib_timer  timer,
const nlib_timerspec new_value,
nlib_timerspec old_value 
)

タイマーを開始したり一時停止したりします。

引数
[in]timerタイマーの識別子
[in]new_value新しい設定
[out]old_valueNULLでない場合、以前の設定が格納される。
戻り値
0成功した場合
EBADFタイマーの識別子が有効でない場合
EINVALnew_valueNULLまたは、new_valueのフィールドが負数であった場合
説明
nlib_timerspec構造体は以下のように定義されています。
struct nlib_timerspec_ {
nlib_duration due_time;
nlib_duration interval;
};
typedef struct nlib_timerspec_ nlib_timerspec;
due_timeがタイマーの初回起動までの時間で、intervalがそれ以降の繰り返しの間隔です。 due_timeintervalを両方0に設定した場合、タイマーは一時停止し、 intervalのみを0に設定した場合、タイマーは初回起動のみで繰り返しません。 この関数はタイマーのコールバック関数内部から呼び出すことが可能です。
コールバック関数の実行間隔は、コールバック関数の実行開始時にカウントが開始されます。 従ってコールバック関数の実行時間が長い場合、コールバック関数が並列に実行される場合があることに注意してください。 コールバック関数が並列に実行される状況を確実に避けたい場合、intervalを0にしてこの関数を呼び出し、コールバック関数の最後で再度この関数を呼び出して次回の起動を設定します。
Platform Implementation
Win32 ChangeTimerQueueTimer()
Linux nlib独自の実装
FreeBSD nlib独自の実装
OS X nlib独自の実装
CAFE nlib独自の実装
CTR nlib独自の実装

◆ nlib_tls_alloc()

nlib_tls_alloc ( nlib_tls tls,
nlib_tls_destructor  destr 
)

TLSスロットに対する新しいIDを確保します。

引数
[out]tlsTLSスロットのIDが格納されるポインタ
[in]destrスレッド終了時に呼び出されるデストラクタ関数
戻り値
0成功した場合
EINVALtlsNULLの場合
EAGAINTLSスロットを確保するためのリソースが不足した場合、又は、TLSスロットの数がシステムの上限に達した場合
説明
destr関数内で、nlib_tls_alloc()を呼んだ場合の動作は未定義です。
Platform Implementation
Win32 TlsAlloc()+
Linux pthread_key_create()
FreeBSD pthread_key_create()
OS X pthread_key_create()
CAFE No SDK API called
CTR nn::os::ThreadLocalStorage
バグ:
デストラクタ関数内でnlib_tls_setvalue()で値を設定した場合、デストラクタ関数が複数回呼ばれる実装と1回だけ呼ばれる実装が存在します。 現在のところcygwinとCTRでは1回だけ呼び出されることに注意してください。この場合、前述のような状況でメモリリークを引き起こす可能性があります。
各種例:
heap/gameheap/gameheap.cpp.

◆ nlib_tls_free()

nlib_tls_free ( nlib_tls  tls)

TLSスロットに対応するIDを解放します。

引数
[in]tls解放するID
戻り値
0成功した場合
EINVALtlsは有効なIDではない。
説明
該当するTLSスロットが利用されている場合、そのデストラクタが呼ばれる保証はありません。
Platform Implementation
Win32 TlsFree()
Linux pthread_key_delete()
FreeBSD pthread_key_delete()
OS X pthread_key_delete()
CAFE No SDK API called
CTR ThreadLocalStorage::~ThreadLocalStorage()

◆ nlib_tls_getvalue()

nlib_tls_getvalue ( nlib_tls  tls,
void **  value 
)

TLSスロットから値を取り出します。

引数
[in]tlsTLSスロットのID
[out]value格納されている値を取得するポインタ
戻り値
0成功した場合
EINVALtlsは有効なIDではない。
説明
Platform Implementation
Win32 TlsGetValue()
Linux pthread_getspecific()
FreeBSD pthread_getspecific()
OS X pthread_getspecific()
CAFE OSGetThreadSpecific()
CTR ThreadLocalStorage::GetValue()
各種例:
heap/gameheap/gameheap.cpp.

◆ nlib_tls_setvalue()

nlib_tls_setvalue ( nlib_tls  tls,
const void *  value 
)

TLSスロットに値を格納します。

引数
[in]tlsTLSスロットのID
[in]value設定する値
戻り値
0成功した場合
EINVALtlsは有効なIDではない。
説明
Platform Implementation
Win32 TlsSetValue()
Linux pthread_setspecific()
FreeBSD pthread_setspecific()
OS X pthread_setspecific()
CAFE OSSetThreadSpecific() + OSSetThreadCleanupCallback()
CTR ThreadLocalStorage::SetValue()
各種例:
heap/gameheap/gameheap.cpp.

◆ nlib_unlink()

nlib_unlink ( const char *  native_path)

ファイルを削除する

引数
[in]native_pathパス名(UTF-8)
戻り値
0成功した場合
EINVALnative_pathNULLだった場合
ENOENTnative_path が存在しない場合
EISDIRnative_path がディレクトリだった場合
その他何らかの原因で失敗した場合
説明
Platform Implementation
Win32 DeleteFileW()
Linux unlink()
FreeBSD unlink()
OS X unlink()
CAFE FSRemove()
CTR nn::fs::TryDeleteFile()

◆ nlib_utf16_to_utf32char()

nlib_utf16_to_utf32char ( nlib_utf32_t utf32,
nlib_utf16_t  upper,
nlib_utf16_t  lower 
)

1つのコードポイントをUTF-16からUTF-32に変換します。

引数
[out]utf32UTF-32の文字が格納される
[in]upperUTF-16の最初の16bit
[in]lowerupper に続く16bit
戻り値
0変換できなかった場合
1upper のみがUTF-32に変換された場合
2upperlower が組み合わされてUTF-32に変換された場合

◆ nlib_utf16_to_utf8()

nlib_utf16_to_utf8 ( size_t *  utf8count,
nlib_utf8_t utf8,
size_t  buflen,
const nlib_utf16_t utf16 
)

UTF-16文字列からUTF-8文字列に変換します。

引数
[out]utf8count変換された文字数(ヌル文字を含まないcharの個数)が格納されます。
[out]utf8変換された文字列を格納するためのバッファ
[in]buflenutf8 のバッファ・サイズ(ヌル文字を含む文字数単位)
[in]utf16UTF-16文字列
戻り値
0エラーは発生していません。
EINVALutf8 がNULLbuflen > 0の場合、又はutf16NULLの場合
ERANGE変換後の文字列が収まらない場合(文字列は切り詰められて途中まで格納される)
EILSEQ変換できないデータが検出された場合
説明
変換に成功した場合は、ヌル文字を含まない変換された文字数(charの個数)を *utf8count に設定します(utf8countNULLでない場合)。
utf8NULL, buflen に0を指定するとutf8count に変換されたUTF-8の数(必ずしもコードポイントの数ではない)を格納します。
UTF-16として無効な文字を検出した場合は、0を*utf8count に設定し、utf8 に空文字列を設定してEILSEQを返します。

◆ nlib_utf16cplen()

nlib_utf16cplen ( size_t *  count,
const nlib_utf16_t str 
)
inlinestatic

文字列中のコードポイントの数を取得します。

引数
[out]countコードポイントの数が格納されるポインタ
[in]str文字列
戻り値
0成功した場合
EINVALcount 又は strNULLの場合
EILSEQコードポイントに変換できないデータがあった場合

Platform.h2281 行目に定義があります。

◆ nlib_utf16cplen_ex()

nlib_utf16cplen_ex ( size_t *  count,
size_t *  len,
const nlib_utf16_t str 
)
inlinestatic

文字列中のコードポイントの数を取得します。

引数
[out]countコードポイントの数が格納されるポインタ
[out]lenstr の長さが格納されるポインタ
[in]str文字列
戻り値
0成功した場合
EINVALcount 又は strNULLの場合
EILSEQコードポイントに変換できないデータがあった場合

Platform.h2285 行目に定義があります。

◆ nlib_utf16cpy()

nlib_utf16cpy ( nlib_utf16_t s1,
size_t  s1max,
const nlib_utf16_t s2 
)
inlinestatic

nlib_strcpy()のUTF-16版です。

引数
[in,out]s1コピー先のバッファ
[in]s1maxコピー先のバッファ・サイズ(文字数)
[in]s2コピー元のバッファ
戻り値
0成功した場合
ERANGEs1 又はs2NULLの場合
ERANGEバッファが足りなかった場合
説明
失敗した場合でs1NULLでない場合は、s1[0] = 0が設定されます。 バッファが重なる場合の動作は未定義です。
Platform Implementation
Win32 nlib_utf16nlen() + nlib_memcpy()
Linux nlib_utf16nlen() + nlib_memcpy()
FreeBSD nlib_utf16nlen() + nlib_memcpy()
OS X nlib_utf16nlen() + nlib_memcpy()
CAFE nlib_utf16nlen() + nlib_memcpy()
CTR nlib_utf16nlen() + nlib_memcpy()

Platform.h2244 行目に定義があります。

◆ nlib_utf16len()

nlib_utf16len ( const nlib_utf16_t str)
inlinestatic

ヌル文字を含まないnlib_utf16_tの数を数えます。

引数
[in]strUTF-16文字列
戻り値
文字数(末尾のヌル文字を含まないnlib_utf16_tの数)を返します。
説明
Platform Implementation
Win32 SIMDを用いた実装
Linux SIMDを用いた実装
FreeBSD SIMDを用いた実装
OS X SIMDを用いた実装
CAFE ループを展開した実装
CTR ループを展開した実装

Platform.h2236 行目に定義があります。

◆ nlib_utf16ncpy()

nlib_utf16ncpy ( nlib_utf16_t s1,
size_t  s1max,
const nlib_utf16_t s2,
size_t  n 
)
inlinestatic

nlib_strcpy()のUTF-16版です。

引数
[in,out]s1コピー先のバッファ
[in]s1maxコピー先のバッファ・サイズ(文字数)
[in]s2コピー元のバッファ
[in]nコピーする文字数
戻り値
0成功した場合
ERANGEs1 又はs2NULLの場合
ERANGEバッファが足りなかった場合
説明
失敗した場合でs1NULLでない場合は、s1[0] = 0が設定されます。 バッファが重なる場合の動作は未定義です。
Platform Implementation
Win32 nlib_utf16nlen() + nlib_memcpy()
Linux nlib_utf16nlen() + nlib_memcpy()
FreeBSD nlib_utf16nlen() + nlib_memcpy()
OS X nlib_utf16nlen() + nlib_memcpy()
CAFE nlib_utf16nlen() + nlib_memcpy()
CTR nlib_utf16nlen() + nlib_memcpy()

Platform.h2248 行目に定義があります。

◆ nlib_utf16nlen()

nlib_utf16nlen ( const nlib_utf16_t s,
size_t  maxsize 
)
inlinestatic

nlib_strnlen()のUTF-16版です。

引数
[in]s文字列へのポインタ
[in]maxsize文字列のサイズ(戻り値の最大数)
戻り値
文字列の長さ
説明
sNULLの場合は0を返します。文字列の長さがmaxsize 以上の場合は maxsize を返します。
Platform Implementation
Win32 SIMDを用いた実装
Linux SIMDを用いた実装
FreeBSD SIMDを用いた実装
OS X SIMDを用いた実装
CAFE ループを展開した実装
CTR ループを展開した実装

Platform.h2240 行目に定義があります。

◆ nlib_utf32_to_utf8()

nlib_utf32_to_utf8 ( size_t *  utf8count,
nlib_utf8_t utf8,
size_t  buflen,
const nlib_utf32_t utf32 
)

UTF-32文字列からUTF-8文字列に変換します。

引数
[out]utf8count変換された文字数(ヌル文字を含まないcharの個数)が格納されます。
[out]utf8変換された文字列を格納するためのバッファ
[in]buflenutf8 のバッファ・サイズ(ヌル文字を含む文字数単位)
[in]utf32UTF-32文字列
戻り値
0エラーは発生していません。
EINVALutf8NULLbuflen > 0の場合、又はutf32NULLの場合
ERANGE変換後の文字列が収まらない場合(文字列は切り詰められて途中まで格納される)
EILSEQ変換できないデータが検出された場合
説明
変換に成功した場合は、ヌル文字を含まない変換された文字数(charの個数)を*utf8count に設定します(utf8countNULLでない場合)。
utf8NULL, buflen に0を指定するとutf8count に変換されたUTF-8の数を格納します。
UTF-32として無効な文字を検出した場合は、0を*utf8count に設定し、utf8 に空文字列を設定してEILSEQを返します。

◆ nlib_utf32char_to_utf16()

nlib_utf32char_to_utf16 ( nlib_utf16_t upper,
nlib_utf16_t lower,
nlib_utf32_t  utf32 
)

1つのUTF-32文字をUTF-16に変換します。

引数
[out]upperUTF-16の最初の16bitが格納される
[out]lowerupper に続く16bit(あれば)が格納される
[in]utf321文字のUTF-32
戻り値
0変換できなかった場合
1upper のみに結果が格納されている場合
2upperlower に結果が格納されている場合

◆ nlib_utf32char_to_utf8()

nlib_utf32char_to_utf8 ( nlib_utf8_t(&)  utf8[4],
nlib_utf32_t  utf32 
)

1文字のUTF-32をUTF-8に変換します。

引数
[out]utf8変換されたUTF-8文字列が格納されます。ヌル終端しないことに注意してください。
[in]utf321文字のUTF-32
戻り値
0変換できなかった場合
1utf8[0]のみに値が設定された場合
2utf8[0], utf8[1]に値が設定された場合
3utf8[0], utf8[1], utf8[2]に値が設定された場合
4utf8[0], utf8[1], utf8[2], utf8[3]に値が設定された場合
各種例:
misc/stringutils/stringutils.cpp.

◆ nlib_utf32cplen()

nlib_utf32cplen ( size_t *  count,
const nlib_utf32_t str 
)

文字列中のコードポイントの数を取得します。

引数
[out]countコードポイントの数が格納されるポインタ
[in]str文字列
戻り値
0成功した場合
EINVALcount 又は strNULLの場合
EILSEQコードポイントに変換できないデータがあった場合

◆ nlib_utf32cpy()

nlib_utf32cpy ( nlib_utf32_t s1,
size_t  s1max,
const nlib_utf32_t s2 
)
inlinestatic

nlib_strcpy()のUTF-32版です。

引数
[in,out]s1コピー先のバッファ
[in]s1maxコピー先のバッファ・サイズ(文字数)
[in]s2コピー元のバッファ
戻り値
0成功した場合
ERANGEs1 又はs2NULLの場合
ERANGEバッファが足りなかった場合
説明
失敗した場合でs1NULLでない場合は、s1[0] = 0が設定されます。 バッファが重なる場合の動作は未定義です。
Platform Implementation
Win32 nlib_utf32nlen() + nlib_memcpy()
Linux nlib_utf32nlen() + nlib_memcpy()
FreeBSD nlib_utf32nlen() + nlib_memcpy()
OS X nlib_utf32nlen() + nlib_memcpy()
CAFE nlib_utf32nlen() + nlib_memcpy()
CTR nlib_utf32nlen() + nlib_memcpy()

Platform.h2269 行目に定義があります。

◆ nlib_utf32len()

nlib_utf32len ( const nlib_utf32_t str)
inlinestatic

ヌル文字を含まないnlib_utf32_tの数を数えます。

引数
[in]strUTF-32文字列
戻り値
文字数(末尾のヌル文字を含まないnlib_utf32_tの数)を返します。

Platform.h2261 行目に定義があります。

◆ nlib_utf32ncpy()

nlib_utf32ncpy ( nlib_utf32_t s1,
size_t  s1max,
const nlib_utf32_t s2,
size_t  n 
)
inlinestatic

nlib_strcpy()のUTF-32版です。

引数
[in,out]s1コピー先のバッファ
[in]s1maxコピー先のバッファ・サイズ(文字数)
[in]s2コピー元のバッファ
[in]nコピーする文字数
戻り値
0成功した場合
ERANGEs1 又はs2NULLの場合
ERANGEバッファが足りなかった場合
説明
失敗した場合でs1NULLでない場合は、s1[0] = 0が設定されます。 バッファが重なる場合の動作は未定義です。
Platform Implementation
Win32 nlib_utf32nlen() + nlib_memcpy()
Linux nlib_utf32nlen() + nlib_memcpy()
FreeBSD nlib_utf32nlen() + nlib_memcpy()
OS X nlib_utf32nlen() + nlib_memcpy()
CAFE nlib_utf32nlen() + nlib_memcpy()
CTR nlib_utf32nlen() + nlib_memcpy()

Platform.h2273 行目に定義があります。

◆ nlib_utf32nlen()

nlib_utf32nlen ( const nlib_utf32_t s,
size_t  maxsize 
)
inlinestatic

nlib_strnlen()のUTF-32版です。

引数
[in]s文字列へのポインタ
[in]maxsize文字列のサイズ(戻り値の最大数)
戻り値
文字列の長さ
説明
sNULLの場合は0を返します。文字列の長さがmaxsize 以上の場合はmaxsize を返します。

Platform.h2265 行目に定義があります。

◆ nlib_utf8_to_utf16()

nlib_utf8_to_utf16 ( size_t *  utf16count,
nlib_utf16_t utf16,
size_t  buflen,
const nlib_utf8_t utf8 
)

UTF-8文字列からUTF-16文字列に変換します。UTF-16文字列はヌル終端されます。

引数
[out]utf16count変換された文字数(ヌル文字を含まないnlib_utf16_tの個数)が格納されます。
[out]utf16変換された文字列を格納するためのバッファ
[in]buflenutf16 のバッファ・サイズ(ヌル文字を含む文字数単位)
[in]utf8UTF-8文字列
戻り値
0成功しました。
EINVALutf16NULLbuflen > 0の場合、又はutf8NULLの場合
ERANGE変換後の文字列が収まらない場合(文字列は切り詰められて途中まで格納される)
EILSEQ変換できないデータが検出された場合
説明
変換に成功した場合は、ヌル文字を含まない変換された文字数(nlib_utf16_tの個数)を*utf16count に設定します(utf16countNULLでない場合)。
utf16NULL, buflen に0を指定するとutf16count に変換されたUTF-16の数(必ずしもコードポイントの数ではない)を格納します。
UTF-8として無効な文字を検出した場合は、0を*utf16count に設定し、utf16 に空文字列を設定してEILSEQを返します。

◆ nlib_utf8_to_utf32()

nlib_utf8_to_utf32 ( size_t *  utf32count,
nlib_utf32_t utf32,
size_t  buflen,
const nlib_utf8_t utf8 
)

UTF-8文字列からUTF-32文字列に変換します。

引数
[out]utf32count変換された文字数(ヌル文字を含まないnlib_utf32_tの個数)が格納されます。
[out]utf32変換された文字列を格納するためのバッファ
[out]buflenutf32 のバッファ・サイズ(ヌル文字を含む文字数単位)
[in]utf8UTF-8文字列
戻り値
0エラーは発生していません。
EINVALutf32NULLbuflen > 0の場合、又はutf8NULLの場合
ERANGE変換後の文字列が収まらない場合(文字列は切り詰められて途中まで格納される)
EILSEQ変換できないデータが検出された場合
説明
変換に成功した場合は、ヌル文字を含まない変換された文字数(nlib_utf32_tの個数)を*utf32count に設定します(utf32countNULLでない場合)。
utf32NULL, buflen に0を指定するとutf32count に変換されたUTF-32の数を格納します。
UTF-8として無効な文字を検出した場合は、0を*utf32count に設定し、utf32 に空文字列を設定してEILSEQを返します。

◆ nlib_utf8_to_utf32char()

nlib_utf8_to_utf32char ( nlib_utf32_t utf32,
const nlib_utf8_t utf8 
)

UTF-8を1文字分のUTF-32に変換します。

引数
[out]utf32変換された文字が格納される
[in]utf8UTF-8文字列
戻り値
0変換できなかった場合
1utf8[0]のみを変換した場合
2utf8[0], utf8[1]を変換した場合
3utf8[0], utf8[1], utf8[2]を変換した場合
4utf8[0], utf8[1], utf8[2], utf8[3]を変換した場合
各種例:
succinct/kwlink/kwlink.cpp.

◆ nlib_utf8_to_wide()

nlib_utf8_to_wide ( size_t *  wccount,
wchar_t *  wcstr,
size_t  buflen,
const nlib_utf8_t utf8 
)

UTF-8文字列からUTF-16/UTF-32文字列に変換します。

引数
[out]wccount変換された文字数(ヌル文字を含まないwchar_tの個数)が格納されます。
[out]wcstr変換された文字列を格納するためのバッファ
[in]buflenwcstr のバッファ・サイズ(ヌル文字を含む文字数単位)
[in]utf8UTF-8文字列
戻り値
0ならば成功
説明
wchar_tが16bitか32bitかによって、nlib_utf8_to_utf16()nlib_utf8_to_utf32()が呼び出されます。

◆ nlib_virtual_alloc()

nlib_virtual_alloc ( void **  ptr,
size_t  size 
)

仮想メモリアドレス空間を割り当てます。

引数
[out]ptr割り当てられた仮想メモリアドレス空間の開始アドレスが書き込まれます。
[in]size割り当てる仮想メモリアドレス空間のサイズ(バイト単位)
戻り値
0ならば成功
説明
Platform Implementation
Win32 VirtualAlloc(NULL, size, MEM_RESERVE, PAGE_READWRITE);
Linux mmap(NULL, size, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
FreeBSD mmap(NULL, size, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
OS X mmap(NULL, size, PROT_NONE, MAP_ANON | MAP_PRIVATE, -1, 0);
CAFE MEMAllocFromDefaultHeapEx(size, OSGetPageSize())
CTR MemoryBlockのコンストラクト(最大8領域のみ確保可能)

◆ nlib_virtual_free()

nlib_virtual_free ( void *  ptr,
size_t  size 
)

仮想メモリアドレス空間の割り当てを解除します

引数
[in]ptrnlib_virtual_alloc()に与えた値
[in]sizenlib_virtual_alloc()に与えた値
戻り値
0ならば成功
説明
ptr, size がnlib_virtual_alloc()に与えた値と違う場合の動作は不定です。
Platform Implementation
Win32 VirtualFree(ptr, 0, MEM_RELEASE);
Linux munmap(ptr, size)
FreeBSD munmap(ptr, size)
OS X munmap(ptr, size)
CAFE MEMFreeToDefaultHeap(ptr)
CTR MemoryBlockのデストラクト

◆ nlib_vsnprintf()

nlib_vsnprintf ( size_t *  count,
char *  buf,
size_t  size,
const char *  fmt,
va_list  args 
)

より安全な形式のvsnprintfで、標準のvsnprintfの動作の違いも吸収します。

引数
[out]count書き込まれた文字数(ヌル文字を含まない)
[in]buf出力が書き込まれるバッファ
[in]sizeバッファのサイズ(ヌル文字を含む文字数)
[in]fmt書式の設定
[in]args引数リスト
戻り値
0成功した場合
ERANGE出力がバッファに入りきらない場合
EINVALcount 等がNULLの場合
説明
エラー値を書き込まれた文字数と分離することにより、より安全に利用することができます。 また、vsnprintf()は実装により戻り値やerrnoの設定値が異なることが多いのですが、これを統一します。
ERANGEを返した場合、count には書き込まれるはずだった文字数が設定され、buf には収まる限りのNULL終端された文字列が格納されます。
同様の関数に、nlib_snprintf(), nlib_vdprintf(), nlib_dprintf(), nlib_printf()が存在します。
また、buf に配列を利用していてC++の場合には、引数size を省略できるバージョンが実装されています。
Platform Implementation
Win32 _vsnprintf_s_l + _vscprintf_l
Linux vsnprintf
FreeBSD vsnprintf
OS X vsnprintf
CAFE vsnprintf
CTR vsnprintf

◆ nlib_vsnwprintf()

nlib_vsnwprintf ( size_t *  count,
wchar_t *  buf,
size_t  size,
const wchar_t *  fmt,
va_list  args 
)

より安全な形式のvswprintfで、各種vswprintfの動作の違いも吸収します。

引数
[out]count書き込まれた文字数(ヌル文字を含まない)
[in]buf出力が書き込まれるバッファ
[in]sizeバッファのサイズ(ヌル文字を含む文字数)
[in]fmt書式の設定
[in]args引数リスト
戻り値
0成功した場合
ERANGE出力がバッファに入りきらない場合
EINVALcount 等がNULLの場合
説明
エラー値を書き込まれた文字数と分離することにより、より安全に利用することができます。 また、vswprintf()は実装により戻り値やerrnoの設定値が異なることが多いのですが、これを統一します。
ERANGEを返した場合、count には書き込まれるはずだった文字数が設定され、buf には収まる限りのNULL 終端された文字列が格納されます。
同様の関数に、nlib_snwprintf(), nlib_vdwprintf(), nlib_dwprintf(), nlib_wprintf()が存在します。
また、buf に配列を利用していてC++の場合には、引数size を省略できるバージョンが実装されています。
Platform Implementation
Win32 _vsnwprintf_s_l + _vscwprintf_l
Linux vswprintf + nlib_vsnwprintf_fallback()
FreeBSD nlib_vsnwprintf_fallback()
OS X nlib_vsnwprintf_fallback()
CAFE vswprintf + nlib_vsnwprintf_fallback()
CTR vswprintf + nlib_vsnwprintf_fallback()

◆ nlib_wcscplen()

nlib_wcscplen ( size_t *  count,
const wchar_t *  str 
)

文字列中のコードポイントの数を取得します。

引数
[out]countコードポイントの数が格納されるポインタ
[in]str文字列
戻り値
0成功した場合
EINVALcount 又は strNULLの場合
EILSEQコードポイントに変換できないデータがあった場合

◆ nlib_wcscpy()

nlib_wcscpy ( wchar_t *  s1,
size_t  s1max,
const wchar_t *  s2 
)

N1078のwcscpy_sに相当する実装です。

引数
[in,out]s1コピー先のバッファ
[in]s1maxコピー先のバッファ・サイズ(文字数)
[in]s2コピー元のバッファ
戻り値
0成功した場合
ERANGEs1 又はs2NULLの場合
ERANGEバッファが足りなかった場合
説明
失敗した場合でs1NULLでない場合は、s1[0] = 0が設定されます。 バッファが重なる場合の動作は未定義です。
Platform Implementation
Win32 nlib_wcsnlen() + nlib_memcpy()
Linux nlib_wcsnlen() + nlib_memcpy()
FreeBSD nlib_wcsnlen() + nlib_memcpy()
OS X nlib_wcsnlen() + nlib_memcpy()
CAFE nlib_wcsnlen() + nlib_memcpy()
CTR nlib_wcsnlen() + nlib_memcpy()

◆ nlib_wcslen()

nlib_wcslen ( const wchar_t *  s)

内部でwcslen()を呼び出します。独自の実装が動作する場合もあります。

引数
[in]s文字列へのポインタ
戻り値
文字列の長さ
説明
sNULLの場合は0を返します。

◆ nlib_wcsncpy()

nlib_wcsncpy ( wchar_t *  s1,
size_t  s1max,
const wchar_t *  s2,
size_t  n 
)

N1078のwcsncpy_sに相当する実装です。

引数
[in,out]s1コピー先のバッファ
[in]s1maxコピー先のバッファ・サイズ(文字数)
[in]s2コピー元のバッファ
[in]nコピーする文字数
戻り値
0成功した場合
ERANGEs1 又はs2NULLの場合
ERANGEバッファが足りなかった場合
説明
失敗した場合でs1NULLでない場合は、s1[0] = 0が設定されます。 バッファが重なる場合の動作は未定義です。
Platform Implementation
Win32 nlib_wcsnlen() + nlib_memcpy()
Linux nlib_wcsnlen() + nlib_memcpy()
FreeBSD nlib_wcsnlen() + nlib_memcpy()
OS X nlib_wcsnlen() + nlib_memcpy()
CAFE nlib_wcsnlen() + nlib_memcpy()
CTR nlib_wcsnlen() + nlib_memcpy()

◆ nlib_wcsnlen()

nlib_wcsnlen ( const wchar_t *  s,
size_t  maxsize 
)

N1078のwcsnlen_sに相当する実装です。

引数
[in]s文字列へのポインタ
[in]maxsize文字列のサイズ(戻り値の最大数)
戻り値
文字列の長さ
説明
sNULLの場合は0を返します。文字列の長さがmaxsize 以上の場合はmaxsize を返します。
Platform Implementation
Win32 nlib_utf16nlen()
Linux nlib_utf32nlen()
FreeBSD nlib_utf32nlen()
OS X nlib_utf32nlen()
CAFE nlib_utf16nlen()
CTR nlib_utf16nlen()

◆ nlib_wide_to_utf8()

nlib_wide_to_utf8 ( size_t *  utf8count,
nlib_utf8_t utf8,
size_t  buflen,
const wchar_t *  wcstr 
)

UTF-16/UTF-32文字列からUTF-8文字列に変換します。

引数
[out]utf8count変換された文字数(ヌル文字を含まないcharの個数)が格納されます。
[out]utf8変換された文字列を格納するためのバッファ
[in]buflenutf8のバッファ・サイズ(ヌル文字を含む文字数単位)
[in]wcstrUTF-16/UTF-32文字列
戻り値
0ならば成功
説明
wchar_tが16bitか32bitかによって、nlib_utf16_to_utf8()nlib_utf32_to_utf8()が呼び出されます。

◆ nlib_write_stderr()

nlib_write_stderr ( size_t *  result,
const void *  buf,
size_t  count 
)

標準エラー出力に文字列を書き出します。

引数
[out]result書き出すことのできた文字の数
[in]bufUTF-8文字列へのポインタ(NULL終端しない)
[in]count文字数
戻り値
0成功した場合
説明
Platform Implementation
Win32 MultiByteToWideChar() + GetStdHandle(STD_ERROR_HANDLE) + WriteConsoleW()
Linux write()
FreeBSD write()
OS X write()
CAFE OSConsoleWrite()
CTR nn::dbg::detail::PutString()

◆ nlib_write_stdout()

nlib_write_stdout ( size_t *  result,
const void *  buf,
size_t  count 
)

標準出力に文字列を書き出します。

引数
[out]result書き出すことのできた文字の数
[in]bufUTF-8文字列へのポインタ(NULL終端しない)
[in]count文字数
戻り値
0成功した場合
説明
Platform Implementation
Win32 MultiByteToWideChar() + GetStdHandle(STD_OUTPUT_HANDLE) + WriteConsoleW()
Linux write(), errnoがEINTRの場合は内部で再度実行される。
FreeBSD write(), errnoがEINTRの場合は内部で再度実行される。
OS X write(), errnoがEINTRの場合は内部で再度実行される。
CAFE OSConsoleWrite()
CTR nn::dbg::detail::PutString()

変数詳解

◆ flag

nlib_mq_attr::flag

メッセージキューを作成する際の設定です。

説明
説明
NLIB_MQ_BLOCK 空のキューを読み込んだり、一杯のキューに書き込んだりする場合はブロックして待ちます。
NLIB_MQ_NONBLOCK 通常はブロックする状況でエラー(EAGAIN)を返します。
NLIB_MQ_LOCKFREE ロックフリーなキューが作成されます。通常はブロックする状況でエラー(EAGAIN)を返します。

Platform.h1172 行目に定義があります。