API.ja 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. 鬼車インターフェース Version 5.9.2 2008/02/19
  2. #include <oniguruma.h>
  3. # int onig_init(void)
  4. ライブラリの初期化
  5. onig_new()の中で呼び出されるので、この関数を明示的に呼び出さなくてもよい。
  6. # int onig_error_code_to_str(UChar* err_buf, int err_code, ...)
  7. エラーメッセージを取得する。
  8. この関数を、onig_new()の結果に対して呼び出す場合には、onig_new()のpattern引数を
  9. メモリ解放するよりも前に呼び出さなければならない。
  10. 正常終了戻り値: エラーメッセージ文字列のバイト長
  11. 引数
  12. 1 err_buf: エラーメッセージを格納する領域
  13. (必要なサイズ: ONIG_MAX_ERROR_MESSAGE_LEN)
  14. 2 err_code: エラーコード
  15. 3 err_info (optional): onig_new()のerr_info
  16. # void onig_set_warn_func(OnigWarnFunc func)
  17. 警告通知関数をセットする。
  18. 警告:
  19. '[', '-', ']' in character class without escape.
  20. ']' in pattern without escape.
  21. 引数
  22. 1 func: 警告関数 void (*func)(char* warning_message)
  23. # void onig_set_verb_warn_func(OnigWarnFunc func)
  24. 詳細警告通知関数をセットする。
  25. 詳細警告:
  26. redundant nested repeat operator.
  27. 引数
  28. 1 func: 詳細警告関数 void (*func)(char* warning_message)
  29. # int onig_new(regex_t** reg, const UChar* pattern, const UChar* pattern_end,
  30. OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax,
  31. OnigErrorInfo* err_info)
  32. 正規表現オブジェクト(regex)を作成する。
  33. 正常終了戻り値: ONIG_NORMAL
  34. 引数
  35. 1 reg: 作成された正規表現オブジェクトを返すアドレス
  36. 2 pattern: 正規表現パターン文字列
  37. 3 pattern_end: 正規表現パターン文字列の終端アドレス(pattern + pattern length)
  38. 4 option: 正規表現コンパイル時オプション
  39. ONIG_OPTION_NONE オプションなし
  40. ONIG_OPTION_SINGLELINE '^' -> '\A', '$' -> '\Z'
  41. ONIG_OPTION_MULTILINE '.'が改行にマッチする
  42. ONIG_OPTION_IGNORECASE 曖昧マッチ オン
  43. ONIG_OPTION_EXTEND パターン拡張形式
  44. ONIG_OPTION_FIND_LONGEST 最長マッチ
  45. ONIG_OPTION_FIND_NOT_EMPTY 空マッチを無視
  46. ONIG_OPTION_NEGATE_SINGLELINE
  47. ONIG_SYNTAX_POSIX_BASIC, ONIG_SYNTAX_POSIX_EXTENDED,
  48. ONIG_SYNTAX_PERL, ONIG_SYNTAX_PERL_NG, ONIG_SYNTAX_JAVAで
  49. デフォルトで有効なONIG_OPTION_SINGLELINEをクリアする。
  50. ONIG_OPTION_DONT_CAPTURE_GROUP 名前付き捕獲式集合のみ捕獲
  51. ONIG_OPTION_CAPTURE_GROUP 名前無し捕獲式集合も捕獲
  52. 5 enc: 文字エンコーディング
  53. ONIG_ENCODING_ASCII ASCII
  54. ONIG_ENCODING_ISO_8859_1 ISO 8859-1
  55. ONIG_ENCODING_ISO_8859_2 ISO 8859-2
  56. ONIG_ENCODING_ISO_8859_3 ISO 8859-3
  57. ONIG_ENCODING_ISO_8859_4 ISO 8859-4
  58. ONIG_ENCODING_ISO_8859_5 ISO 8859-5
  59. ONIG_ENCODING_ISO_8859_6 ISO 8859-6
  60. ONIG_ENCODING_ISO_8859_7 ISO 8859-7
  61. ONIG_ENCODING_ISO_8859_8 ISO 8859-8
  62. ONIG_ENCODING_ISO_8859_9 ISO 8859-9
  63. ONIG_ENCODING_ISO_8859_10 ISO 8859-10
  64. ONIG_ENCODING_ISO_8859_11 ISO 8859-11
  65. ONIG_ENCODING_ISO_8859_13 ISO 8859-13
  66. ONIG_ENCODING_ISO_8859_14 ISO 8859-14
  67. ONIG_ENCODING_ISO_8859_15 ISO 8859-15
  68. ONIG_ENCODING_ISO_8859_16 ISO 8859-16
  69. ONIG_ENCODING_UTF8 UTF-8
  70. ONIG_ENCODING_UTF16_BE UTF-16BE
  71. ONIG_ENCODING_UTF16_LE UTF-16LE
  72. ONIG_ENCODING_UTF32_BE UTF-32BE
  73. ONIG_ENCODING_UTF32_LE UTF-32LE
  74. ONIG_ENCODING_EUC_JP EUC-JP
  75. ONIG_ENCODING_EUC_TW EUC-TW
  76. ONIG_ENCODING_EUC_KR EUC-KR
  77. ONIG_ENCODING_EUC_CN EUC-CN
  78. ONIG_ENCODING_SJIS Shift_JIS
  79. ONIG_ENCODING_KOI8_R KOI8-R
  80. ONIG_ENCODING_CP1251 CP1251
  81. ONIG_ENCODING_BIG5 Big5
  82. ONIG_ENCODING_GB18030 GB18030
  83. または、ユーザが定義したOnigEncodingTypeデータのアドレス
  84. 6 syntax: 正規表現パターン文法定義
  85. ONIG_SYNTAX_ASIS plain text
  86. ONIG_SYNTAX_POSIX_BASIC POSIX Basic RE
  87. ONIG_SYNTAX_POSIX_EXTENDED POSIX Extended RE
  88. ONIG_SYNTAX_EMACS Emacs
  89. ONIG_SYNTAX_GREP grep
  90. ONIG_SYNTAX_GNU_REGEX GNU regex
  91. ONIG_SYNTAX_JAVA Java (Sun java.util.regex)
  92. ONIG_SYNTAX_PERL Perl
  93. ONIG_SYNTAX_PERL_NG Perl + 名前付き捕獲式集合
  94. ONIG_SYNTAX_RUBY Ruby
  95. ONIG_SYNTAX_DEFAULT default (== Ruby)
  96. onig_set_default_syntax()
  97. または、ユーザが定義したOnigSyntaxTypeデータのアドレス
  98. 7 err_info: エラー情報を返すためのアドレス
  99. onig_error_code_to_str()の三番目の引数として使用する
  100. # int onig_new_without_alloc(regex_t* reg, const UChar* pattern,
  101. const UChar* pattern_end,
  102. OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax,
  103. OnigErrorInfo* err_info)
  104. 正規表現オブジェクト(regex)を作成する。
  105. regの領域を内部で割り当てない。
  106. 正常終了戻り値: ONIG_NORMAL
  107. # int onig_new_deluxe(regex_t** reg, const UChar* pattern, const UChar* pattern_end,
  108. OnigCompileInfo* ci, OnigErrorInfo* einfo)
  109. 正規表現オブジェクト(regex)を作成する。
  110. この関数は、onig_new()のデラックス版。
  111. 正常終了戻り値: ONIG_NORMAL
  112. 引数
  113. 1 reg: 作成された正規表現オブジェクトを返すアドレス
  114. 2 pattern: 正規表現パターン文字列
  115. 3 pattern_end: 正規表現パターン文字列の終端アドレス(pattern + pattern length)
  116. 4 ci: コンパイル情報
  117. ci->num_of_elements: ciの要素数 (現在の版では: 5)
  118. ci->pattern_enc: パターン文字列の文字エンコーディング
  119. ci->target_enc: 対象文字列の文字エンコーディング
  120. ci->syntax: 正規表現パターン文法定義
  121. ci->option: 正規表現コンパイル時オプション
  122. ci->case_fold_flag: ONIG_OPTION_IGNORECASEモードでの
  123. 文字曖昧マッチ指定ビットフラグ
  124. ONIGENC_CASE_FOLD_MIN: 最小
  125. ONIGENC_CASE_FOLD_DEFAULT: 最小
  126. onig_set_default_case_fold_flag()
  127. 5 err_info: エラー情報を返すためのアドレス
  128. onig_error_code_to_str()の三番目の引数として使用する
  129. 異なる文字エンコーディングの組み合わせは、以下の場合にのみ許される。
  130. pattern_enc: ASCII, ISO_8859_1
  131. target_enc: UTF16_BE, UTF16_LE, UTF32_BE, UTF32_LE
  132. pattern_enc: UTF16_BE/LE
  133. target_enc: UTF16_LE/BE
  134. pattern_enc: UTF32_BE/LE
  135. target_enc: UTF32_LE/BE
  136. # void onig_free(regex_t* reg)
  137. 正規表現オブジェクトのメモリを解放する。
  138. 引数
  139. 1 reg: 正規表現オブジェクト
  140. # void onig_free_body(regex_t* reg)
  141. 正規表現オブジェクトのメモリを解放する。(reg自身の領域を除いて)
  142. 引数
  143. 1 reg: 正規表現オブジェクト
  144. # int onig_search(regex_t* reg, const UChar* str, const UChar* end, const UChar* start,
  145. const UChar* range, OnigRegion* region, OnigOptionType option)
  146. 正規表現で文字列を検索し、検索結果とマッチ領域を返す。
  147. 正常終了戻り値: マッチ位置 (p - str >= 0)
  148. 検索失敗: ONIG_MISMATCH (< 0)
  149. 引数
  150. 1 reg: 正規表現オブジェクト
  151. 2 str: 検索対象文字列
  152. 3 end: 検索対象文字列の終端アドレス
  153. 4 start: 検索対象文字列の検索先頭位置アドレス
  154. 5 range: 検索対象文字列の検索終了位置アドレス
  155. 前方探索 (start <= 探索される文字列 < range)
  156. 後方探索 (range <= 探索される文字列 <= start)
  157. 6 region: マッチ領域情報(region) (NULLも許される)
  158. 7 option: 検索時オプション
  159. ONIG_OPTION_NOTBOL 文字列の先頭(str)を行頭と看做さない
  160. ONIG_OPTION_NOTEOL 文字列の終端(end)を行末と看做さない
  161. ONIG_OPTION_POSIX_REGION region引数をPOSIX APIのregmatch_t[]にする
  162. # int onig_match(regex_t* reg, const UChar* str, const UChar* end, const UChar* at,
  163. OnigRegion* region, OnigOptionType option)
  164. 文字列の指定位置でマッチングを行い、結果とマッチ領域を返す。
  165. 正常終了戻り値: マッチしたバイト長 (>= 0)
  166. not match: ONIG_MISMATCH ( < 0)
  167. 引数
  168. 1 reg: 正規表現オブジェクト
  169. 2 str: 検索対象文字列
  170. 3 end: 検索対象文字列の終端アドレス
  171. 4 at: 検索対象文字列の検索アドレス
  172. 5 region: マッチ領域情報(region) (NULLも許される)
  173. 6 option: 検索時オプション
  174. ONIG_OPTION_NOTBOL 文字列の先頭(str)を行頭と看做さない
  175. ONIG_OPTION_NOTEOL 文字列の終端(end)を行末と看做さない
  176. ONIG_OPTION_POSIX_REGION region引数をPOSIX APIのregmatch_t[]にする
  177. # OnigRegion* onig_region_new(void)
  178. マッチ領域情報(region)を作成する。
  179. # void onig_region_free(OnigRegion* region, int free_self)
  180. マッチ領域情報(region)で使用されているメモリを解放する。
  181. 引数
  182. 1 region: マッチ領域情報オブジェクト
  183. 2 free_self: [1: region自身を含めて全て解放, 0: region自身は解放しない]
  184. # void onig_region_copy(OnigRegion* to, OnigRegion* from)
  185. マッチ領域情報(region)を複製する。
  186. 引数
  187. 1 to: 対象領域
  188. 2 from: 元領域
  189. # void onig_region_clear(OnigRegion* region)
  190. マッチ領域情報(region)の中味をクリアする。
  191. 引数
  192. 1 region: 対象領域
  193. # int onig_region_resize(OnigRegion* region, int n)
  194. マッチ領域情報(region)の捕獲式集合(グループ)数を変更する。
  195. 正常終了戻り値: ONIG_NORMAL
  196. 引数
  197. 1 region: 対象領域
  198. 2 n: 新しいサイズ
  199. # int onig_name_to_group_numbers(regex_t* reg, const UChar* name, const UChar* name_end,
  200. int** num_list)
  201. 指定した名前に対する名前付き捕獲式集合(グループ)の
  202. グループ番号リストを返す。
  203. 名前付き捕獲式集合は、(?<name>....)によって定義できる。
  204. 正常終了戻り値: 指定された名前に対するグループ数
  205. (例 /(?<x>..)(?<x>..)/ ==> 2)
  206. 名前に対するグループが存在しない: -1
  207. 引数
  208. 1 reg: 正規表現オブジェクト
  209. 2 name: 捕獲式集合(グループ)名
  210. 3 name_end: 捕獲式集合(グループ)名の終端アドレス
  211. 4 num_list: 番号リストを返すアドレス
  212. # int onig_name_to_backref_number(regex_t* reg, const UChar* name, const UChar* name_end,
  213. OnigRegion *region)
  214. 指定された名前の後方参照(\k<name>)に対する捕獲式集合(グループ)の番号を返す。
  215. 名前に対して、複数のマッチ領域が有効であれば、その中の最大の番号を返す。
  216. 名前に対する捕獲式集合が一個しかないときには、対応するマッチ領域が有効か
  217. どうかに関係なく、その番号を返す。(従って、regionにはNULLを渡してもよい。)
  218. 正常終了戻り値: 番号
  219. 引数
  220. 1 reg: 正規表現オブジェクト
  221. 2 name: 捕獲式集合(グループ)名
  222. 3 name_end: 捕獲式集合(グループ)名の終端アドレス
  223. 4 region: search/match結果のマッチ領域
  224. # int onig_foreach_name(regex_t* reg,
  225. int (*func)(const UChar*, const UChar*, int,int*,regex_t*,void*),
  226. void* arg)
  227. 全ての名前に対してコールバック関数呼び出しを実行する。
  228. 正常終了戻り値: 0
  229. エラー: コールバック関数の戻り値
  230. 引数
  231. 1 reg: 正規表現オブジェクト
  232. 2 func: コールバック関数
  233. func(name, name_end, <number of groups>, <group number's list>,
  234. reg, arg);
  235. funcが0以外の値を返すと、それ以降のコールバックは行なわずに
  236. 終了する。
  237. 3 arg: funcに対する追加引数
  238. # int onig_number_of_names(regex_t* reg)
  239. パターン中で定義された名前の数を返す。
  240. 一個の名前の多重定義は一個と看做す。
  241. 引数
  242. 1 reg: 正規表現オブジェクト
  243. # OnigEncoding onig_get_encoding(regex_t* reg)
  244. # OnigOptionType onig_get_options(regex_t* reg)
  245. # OnigCaseFoldType onig_get_case_fold_flag(regex_t* reg)
  246. # OnigSyntaxType* onig_get_syntax(regex_t* reg)
  247. 正規表現オブジェクトに対して、対応する値を返す。
  248. 引数
  249. 1 reg: 正規表現オブジェクト
  250. # int onig_number_of_captures(regex_t* reg)
  251. パターン中で定義された捕獲グループの数を返す。
  252. 引数
  253. 1 reg: 正規表現オブジェクト
  254. # int onig_number_of_capture_histories(regex_t* reg)
  255. パターン中で定義された捕獲履歴(?@...)の数を返す。
  256. 使用する文法で捕獲履歴機能が有効(ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY)
  257. でなければ、捕獲履歴機能は使用できない。
  258. 引数
  259. 1 reg: 正規表現オブジェクト
  260. # OnigCaptureTreeNode* onig_get_capture_tree(OnigRegion* region)
  261. 捕獲履歴データのルートノードを返す。
  262. マッチが失敗している場合には、この値は不定である。
  263. 引数
  264. 1 region: マッチ領域
  265. # int onig_capture_tree_traverse(OnigRegion* region, int at,
  266. int(*func)(int,int,int,int,int,void*), void* arg)
  267. 捕獲履歴データ木を巡回してコールバックする。
  268. 正常終了戻り値: 0
  269. エラー: コールバック関数の戻り値
  270. 引数
  271. 1 region: マッチ領域
  272. 2 at: コールバックを行なうタイミング
  273. ONIG_TRAVERSE_CALLBACK_AT_FIRST:
  274. 最初にコールバックして、子ノードを巡回
  275. ONIG_TRAVERSE_CALLBACK_AT_LAST:
  276. 子ノードを巡回して、コールバック
  277. ONIG_TRAVERSE_CALLBACK_AT_BOTH:
  278. 最初にコールバックして、子ノードを巡回、最後にもう一度コールバック
  279. 3 func: コールバック関数
  280. funcが0以外の値を返すと、それ以降の巡回は行なわずに
  281. 終了する。
  282. int func(int group, int beg, int end, int level, int at,
  283. void* arg)
  284. group: グループ番号
  285. beg: マッチ開始位置
  286. end マッチ終了位置
  287. level: ネストレベル (0から)
  288. at: コールバックが呼び出されたタイミング
  289. ONIG_TRAVERSE_CALLBACK_AT_FIRST
  290. ONIG_TRAVERSE_CALLBACK_AT_LAST
  291. arg: 追加引数
  292. 4 arg; funcに対する追加引数
  293. # int onig_noname_group_capture_is_active(regex_t* reg)
  294. 名前なし式集合の捕獲機能が有効かどうかを返す。
  295. 有効: 1
  296. 無効: 0
  297. 引数
  298. 1 reg: 正規表現オブジェクト
  299. オプションのONIG_OPTION_DONT_CAPTURE_GROUPがON --> 無効
  300. パターンが名前つき式集合を使用している
  301. AND 使用文法で、ONIG_SYN_CAPTURE_ONLY_NAMED_GROUPがON
  302. AND オプションのONIG_OPTION_CAPTURE_GROUPがOFF
  303. --> 無効
  304. 上記以外の場合 --> 有効
  305. # UChar* onigenc_get_prev_char_head(OnigEncoding enc, const UChar* start, const UChar* s)
  306. 文字一個分前の文字列位置を返す。
  307. 引数
  308. 1 enc: 文字エンコーディング
  309. 2 start: 文字列の先頭アドレス
  310. 3 s: 文字列中の位置
  311. # UChar* onigenc_get_left_adjust_char_head(OnigEncoding enc,
  312. const UChar* start, const UChar* s)
  313. 文字の先頭バイト位置になるように左側に調整したアドレスを返す。
  314. 引数
  315. 1 enc: 文字エンコーディング
  316. 2 start: 文字列の先頭アドレス
  317. 3 s: 文字列中の位置
  318. # UChar* onigenc_get_right_adjust_char_head(OnigEncoding enc,
  319. const UChar* start, const UChar* s)
  320. 文字の先頭バイト位置になるように右側に調整したアドレスを返す。
  321. 引数
  322. 1 enc: 文字エンコーディング
  323. 2 start: 文字列の先頭アドレス
  324. 3 s: 文字列中の位置
  325. # int onigenc_strlen(OnigEncoding enc, const UChar* s, const UChar* end)
  326. # int onigenc_strlen_null(OnigEncoding enc, const UChar* s)
  327. 文字列の文字数を返す。
  328. # int onigenc_str_bytelen_null(OnigEncoding enc, const UChar* s)
  329. 文字列のバイト数を返す。
  330. # int onig_set_default_syntax(OnigSyntaxType* syntax)
  331. デフォルトの正規表現パターン文法をセットする。
  332. 引数
  333. 1 syntax: 正規表現パターン文法
  334. # void onig_copy_syntax(OnigSyntaxType* to, OnigSyntaxType* from)
  335. 正規表現パターン文法をコピーする。
  336. 引数
  337. 1 to: 対象
  338. 2 from: 元
  339. # unsigned int onig_get_syntax_op(OnigSyntaxType* syntax)
  340. # unsigned int onig_get_syntax_op2(OnigSyntaxType* syntax)
  341. # unsigned int onig_get_syntax_behavior(OnigSyntaxType* syntax)
  342. # OnigOptionType onig_get_syntax_options(OnigSyntaxType* syntax)
  343. # void onig_set_syntax_op(OnigSyntaxType* syntax, unsigned int op)
  344. # void onig_set_syntax_op2(OnigSyntaxType* syntax, unsigned int op2)
  345. # void onig_set_syntax_behavior(OnigSyntaxType* syntax, unsigned int behavior)
  346. # void onig_set_syntax_options(OnigSyntaxType* syntax, OnigOptionType options)
  347. 正規表現パターン文法の要素を参照/取得する。
  348. 引数
  349. 1 syntax: 正規表現パターン文法
  350. 2 op, op2, behavior, options: 要素の値
  351. # void onig_copy_encoding(OnigEncoding to, OnigOnigEncoding from)
  352. 文字エンコーディングをコピーする。
  353. 引数
  354. 1 to: 対象
  355. 2 from: 元
  356. # int onig_set_meta_char(OnigSyntaxType* syntax, unsigned int what,
  357. OnigCodePoint code)
  358. メタ文字を指定したコードポイント値にセットする。
  359. ONIG_SYN_OP_VARIABLE_META_CHARACTERSが正規表現パターン文法で有効に
  360. なっていない場合には、エスケープ文字を除いて、ここで指定したメタ文字は
  361. 機能しない。(組込みの文法では有効にしていない。)
  362. 正常終了戻り値: ONIG_NORMAL
  363. 引数
  364. 1 syntax: 対象文法
  365. 2 what: メタ文字機能の指定
  366. ONIG_META_CHAR_ESCAPE
  367. ONIG_META_CHAR_ANYCHAR
  368. ONIG_META_CHAR_ANYTIME
  369. ONIG_META_CHAR_ZERO_OR_ONE_TIME
  370. ONIG_META_CHAR_ONE_OR_MORE_TIME
  371. ONIG_META_CHAR_ANYCHAR_ANYTIME
  372. 3 code: メタ文字のコードポイント または ONIG_INEFFECTIVE_META_CHAR.
  373. # OnigCaseFoldType onig_get_default_case_fold_flag()
  374. デフォルトのcase foldフラグを取得する。
  375. # int onig_set_default_case_fold_flag(OnigCaseFoldType case_fold_flag)
  376. デフォルトのcase foldフラグをセットする。
  377. 引数
  378. 1 case_fold_flag: case foldフラグ
  379. # unsigned int onig_get_match_stack_limit_size(void)
  380. マッチスタックサイズの最大値を返す。
  381. (デフォルト: 0 == 無制限)
  382. # int onig_set_match_stack_limit_size(unsigned int size)
  383. マッチスタックサイズの最大値を指定する。
  384. (size = 0: 無制限)
  385. 正常終了戻り値: ONIG_NORMAL
  386. # int onig_end(void)
  387. ライブラリの使用を終了する。
  388. 正常終了戻り値: ONIG_NORMAL
  389. onig_init()を再度呼び出しても、以前に作成した正規表現オブジェクト
  390. を使用することはできない。
  391. # const char* onig_version(void)
  392. バージョン文字列を返す。(例 "5.0.3")
  393. // END