From 7ebea2b0895ecdb74fd51fa41a91f8f956df6747 Mon Sep 17 00:00:00 2001 From: rozmansi Date: Wed, 21 Feb 2024 16:33:30 +0000 Subject: [PATCH] deploy: c20d9dbc099f1c12c56c72ed7b5254938a98d176 --- _unit_tests_2compat_8hpp_source.html | 2 +- annotated.html | 2 +- base64_8hpp_source.html | 2 +- chrono_8hpp_source.html | 2 +- classes.html | 2 +- ...sstdex_1_1aggregate__progress-members.html | 2 +- classstdex_1_1aggregate__progress.html | 2 +- ..._progress_1_1worker__progress-members.html | 2 +- ...gregate__progress_1_1worker__progress.html | 2 +- classstdex_1_1base64__dec-members.html | 2 +- classstdex_1_1base64__dec.html | 2 +- classstdex_1_1base64__enc-members.html | 2 +- classstdex_1_1base64__enc.html | 2 +- classstdex_1_1base64__reader-members.html | 2 +- classstdex_1_1base64__reader.html | 2 +- classstdex_1_1base64__writer-members.html | 2 +- classstdex_1_1base64__writer.html | 2 +- classstdex_1_1basic__hash-members.html | 2 +- classstdex_1_1basic__hash.html | 2 +- classstdex_1_1benchmark-members.html | 2 +- classstdex_1_1benchmark.html | 2 +- classstdex_1_1block__hash-members.html | 2 +- classstdex_1_1block__hash.html | 2 +- classstdex_1_1charset__encoder-members.html | 2 +- classstdex_1_1charset__encoder.html | 2 +- classstdex_1_1crc32__hash-members.html | 2 +- classstdex_1_1crc32__hash.html | 2 +- classstdex_1_1global__progress-members.html | 2 +- classstdex_1_1global__progress.html | 2 +- classstdex_1_1hex__dec-members.html | 2 +- classstdex_1_1hex__dec.html | 2 +- classstdex_1_1hex__enc-members.html | 2 +- classstdex_1_1hex__enc.html | 2 +- classstdex_1_1html_1_1comment-members.html | 2 +- classstdex_1_1html_1_1comment.html | 2 +- ...sstdex_1_1html_1_1declaration-members.html | 2 +- classstdex_1_1html_1_1declaration.html | 2 +- classstdex_1_1html_1_1document-members.html | 2 +- classstdex_1_1html_1_1document.html | 2 +- classstdex_1_1html_1_1element-members.html | 2 +- classstdex_1_1html_1_1element.html | 2 +- ...stdex_1_1html_1_1element__end-members.html | 2 +- classstdex_1_1html_1_1element__end.html | 2 +- ...dex_1_1html_1_1element__start-members.html | 2 +- classstdex_1_1html_1_1element__start.html | 2 +- ...sstdex_1_1html_1_1instruction-members.html | 2 +- classstdex_1_1html_1_1instruction.html | 2 +- classstdex_1_1html_1_1parser-members.html | 2 +- classstdex_1_1html_1_1parser.html | 2 +- classstdex_1_1html_1_1sequence-members.html | 2 +- classstdex_1_1html_1_1sequence.html | 2 +- ...ex_1_1html_1_1starting__token-members.html | 2 +- classstdex_1_1html_1_1starting__token.html | 2 +- ...sstdex_1_1html_1_1text__token-members.html | 2 +- classstdex_1_1html_1_1text__token.html | 2 +- classstdex_1_1html_1_1token-members.html | 2 +- classstdex_1_1html_1_1token.html | 2 +- classstdex_1_1html_1_1url__token-members.html | 2 +- classstdex_1_1html_1_1url__token.html | 2 +- classstdex_1_1idrec_1_1record-members.html | 2 +- classstdex_1_1idrec_1_1record.html | 2 +- classstdex_1_1lazy__progress-members.html | 2 +- classstdex_1_1lazy__progress.html | 2 +- classstdex_1_1locale-members.html | 2 +- classstdex_1_1locale.html | 2 +- classstdex_1_1md5__hash-members.html | 2 +- classstdex_1_1md5__hash.html | 2 +- ...dex_1_1parser_1_1basic__angle-members.html | 2 +- classstdex_1_1parser_1_1basic__angle.html | 2 +- ...x_1_1parser_1_1basic__any__cu-members.html | 2 +- classstdex_1_1parser_1_1basic__any__cu.html | 2 +- ...stdex_1_1parser_1_1basic__bol-members.html | 2 +- classstdex_1_1parser_1_1basic__bol.html | 2 +- ...ex_1_1parser_1_1basic__branch-members.html | 2 +- classstdex_1_1parser_1_1basic__branch.html | 2 +- ...r_1_1basic__chemical__formula-members.html | 2 +- ...1_1parser_1_1basic__chemical__formula.html | 2 +- ...1_1basic__creditor__reference-members.html | 2 +- ...1parser_1_1basic__creditor__reference.html | 2 +- ..._1_1parser_1_1basic__css__cdc-members.html | 2 +- classstdex_1_1parser_1_1basic__css__cdc.html | 2 +- ..._1_1parser_1_1basic__css__cdo-members.html | 2 +- classstdex_1_1parser_1_1basic__css__cdo.html | 2 +- ...parser_1_1basic__css__comment-members.html | 2 +- ...tdex_1_1parser_1_1basic__css__comment.html | 2 +- ...1parser_1_1basic__css__import-members.html | 2 +- ...stdex_1_1parser_1_1basic__css__import.html | 2 +- ...1parser_1_1basic__css__string-members.html | 2 +- ...stdex_1_1parser_1_1basic__css__string.html | 2 +- ..._1_1parser_1_1basic__css__uri-members.html | 2 +- classstdex_1_1parser_1_1basic__css__uri.html | 2 +- ...sstdex_1_1parser_1_1basic__cu-members.html | 2 +- classstdex_1_1parser_1_1basic__cu.html | 2 +- ...x_1_1parser_1_1basic__cu__set-members.html | 2 +- classstdex_1_1parser_1_1basic__cu__set.html | 2 +- ...tdex_1_1parser_1_1basic__date-members.html | 2 +- classstdex_1_1parser_1_1basic__date.html | 2 +- ...r_1_1basic__dns__domain__char-members.html | 2 +- ...1_1parser_1_1basic__dns__domain__char.html | 2 +- ...1_1parser_1_1basic__dns__name-members.html | 2 +- classstdex_1_1parser_1_1basic__dns__name.html | 2 +- ...rser_1_1basic__email__address-members.html | 2 +- ...ex_1_1parser_1_1basic__email__address.html | 2 +- ..._1_1parser_1_1basic__emoticon-members.html | 2 +- classstdex_1_1parser_1_1basic__emoticon.html | 2 +- ...stdex_1_1parser_1_1basic__eol-members.html | 2 +- classstdex_1_1parser_1_1basic__eol.html | 2 +- ..._1_1parser_1_1basic__fraction-members.html | 2 +- classstdex_1_1parser_1_1basic__fraction.html | 2 +- ...__declaration__condition__end-members.html | 2 +- ...ic__html__declaration__condition__end.html | 2 +- ...declaration__condition__start-members.html | 2 +- ...__html__declaration__condition__start.html | 2 +- ...1parser_1_1basic__html__ident-members.html | 2 +- ...stdex_1_1parser_1_1basic__html__ident.html | 2 +- ...1_1parser_1_1basic__html__tag-members.html | 2 +- classstdex_1_1parser_1_1basic__html__tag.html | 2 +- ...1parser_1_1basic__html__value-members.html | 2 +- ...stdex_1_1parser_1_1basic__html__value.html | 2 +- ...tdex_1_1parser_1_1basic__iban-members.html | 2 +- classstdex_1_1parser_1_1basic__iban.html | 2 +- ...x_1_1parser_1_1basic__integer-members.html | 2 +- classstdex_1_1parser_1_1basic__integer.html | 2 +- ...1_1parser_1_1basic__integer10-members.html | 2 +- classstdex_1_1parser_1_1basic__integer10.html | 2 +- ...1parser_1_1basic__integer10ts-members.html | 2 +- ...stdex_1_1parser_1_1basic__integer10ts.html | 2 +- ...1_1parser_1_1basic__integer16-members.html | 2 +- classstdex_1_1parser_1_1basic__integer16.html | 2 +- ...arser_1_1basic__ipv4__address-members.html | 2 +- ...dex_1_1parser_1_1basic__ipv4__address.html | 2 +- ...arser_1_1basic__ipv6__address-members.html | 2 +- ...dex_1_1parser_1_1basic__ipv6__address.html | 2 +- ...1basic__ipv6__scope__id__char-members.html | 2 +- ...arser_1_1basic__ipv6__scope__id__char.html | 2 +- ..._1parser_1_1basic__iterations-members.html | 2 +- ...sstdex_1_1parser_1_1basic__iterations.html | 2 +- ...parser_1_1basic__json__string-members.html | 2 +- ...tdex_1_1parser_1_1basic__json__string.html | 2 +- ..._1parser_1_1basic__mime__type-members.html | 2 +- ...sstdex_1_1parser_1_1basic__mime__type.html | 2 +- ...rser_1_1basic__mixed__numeral-members.html | 2 +- ...ex_1_1parser_1_1basic__mixed__numeral.html | 2 +- ...r_1_1basic__monetary__numeral-members.html | 2 +- ...1_1parser_1_1basic__monetary__numeral.html | 2 +- ...tdex_1_1parser_1_1basic__noop-members.html | 2 +- classstdex_1_1parser_1_1basic__noop.html | 2 +- ...ex_1_1parser_1_1basic__parser-members.html | 2 +- classstdex_1_1parser_1_1basic__parser.html | 2 +- ...1parser_1_1basic__permutation-members.html | 2 +- ...stdex_1_1parser_1_1basic__permutation.html | 2 +- ...arser_1_1basic__phone__number-members.html | 2 +- ...dex_1_1parser_1_1basic__phone__number.html | 2 +- ...1_1parser_1_1basic__punct__cu-members.html | 2 +- classstdex_1_1parser_1_1basic__punct__cu.html | 2 +- ...rser_1_1basic__roman__numeral-members.html | 2 +- ...ex_1_1parser_1_1basic__roman__numeral.html | 2 +- ...1_1basic__scientific__numeral-members.html | 2 +- ...1parser_1_1basic__scientific__numeral.html | 2 +- ...dex_1_1parser_1_1basic__score-members.html | 2 +- classstdex_1_1parser_1_1basic__score.html | 2 +- ..._1_1parser_1_1basic__sequence-members.html | 2 +- classstdex_1_1parser_1_1basic__sequence.html | 2 +- ...stdex_1_1parser_1_1basic__set-members.html | 2 +- classstdex_1_1parser_1_1basic__set.html | 2 +- ...arser_1_1basic__si__reference-members.html | 2 +- ...dex_1_1parser_1_1basic__si__reference.html | 2 +- ...sic__si__reference__delimiter-members.html | 2 +- ...er_1_1basic__si__reference__delimiter.html | 2 +- ...1_1basic__si__reference__part-members.html | 2 +- ...1parser_1_1basic__si__reference__part.html | 2 +- ...ser_1_1basic__signed__numeral-members.html | 2 +- ...x_1_1parser_1_1basic__signed__numeral.html | 2 +- ...1_1parser_1_1basic__space__cu-members.html | 2 +- classstdex_1_1parser_1_1basic__space__cu.html | 2 +- ..._1basic__space__or__punct__cu-members.html | 2 +- ...parser_1_1basic__space__or__punct__cu.html | 2 +- ...ex_1_1parser_1_1basic__string-members.html | 2 +- classstdex_1_1parser_1_1basic__string.html | 2 +- ...rser_1_1basic__string__branch-members.html | 2 +- ...ex_1_1parser_1_1basic__string__branch.html | 2 +- ...tdex_1_1parser_1_1basic__time-members.html | 2 +- classstdex_1_1parser_1_1basic__time.html | 2 +- ...stdex_1_1parser_1_1basic__url-members.html | 2 +- classstdex_1_1parser_1_1basic__url.html | 2 +- ...1_1basic__url__password__char-members.html | 2 +- ...1parser_1_1basic__url__password__char.html | 2 +- ...1_1parser_1_1basic__url__path-members.html | 2 +- classstdex_1_1parser_1_1basic__url__path.html | 2 +- ...ser_1_1basic__url__path__char-members.html | 2 +- ...x_1_1parser_1_1basic__url__path__char.html | 2 +- ...1_1basic__url__username__char-members.html | 2 +- ...1parser_1_1basic__url__username__char.html | 2 +- ...tdex_1_1parser_1_1http__agent-members.html | 2 +- classstdex_1_1parser_1_1http__agent.html | 2 +- ..._1_1parser_1_1http__any__type-members.html | 2 +- classstdex_1_1parser_1_1http__any__type.html | 2 +- ...x_1_1parser_1_1http__asterisk-members.html | 2 +- classstdex_1_1parser_1_1http__asterisk.html | 2 +- ...dex_1_1parser_1_1http__cookie-members.html | 2 +- classstdex_1_1parser_1_1http__cookie.html | 2 +- ...er_1_1http__cookie__parameter-members.html | 2 +- ..._1_1parser_1_1http__cookie__parameter.html | 2 +- ...dex_1_1parser_1_1http__header-members.html | 2 +- classstdex_1_1parser_1_1http__header.html | 2 +- ...x_1_1parser_1_1http__language-members.html | 2 +- classstdex_1_1parser_1_1http__language.html | 2 +- ..._1parser_1_1http__line__break-members.html | 2 +- ...sstdex_1_1parser_1_1http__line__break.html | 2 +- ...1parser_1_1http__media__range-members.html | 2 +- ...stdex_1_1parser_1_1http__media__range.html | 2 +- ..._1parser_1_1http__media__type-members.html | 2 +- ...sstdex_1_1parser_1_1http__media__type.html | 2 +- ..._1_1parser_1_1http__parameter-members.html | 2 +- classstdex_1_1parser_1_1http__parameter.html | 2 +- ...x_1_1parser_1_1http__protocol-members.html | 2 +- classstdex_1_1parser_1_1http__protocol.html | 2 +- ...arser_1_1http__quoted__string-members.html | 2 +- ...dex_1_1parser_1_1http__quoted__string.html | 2 +- ...ex_1_1parser_1_1http__request-members.html | 2 +- classstdex_1_1parser_1_1http__request.html | 2 +- ...tdex_1_1parser_1_1http__space-members.html | 2 +- classstdex_1_1parser_1_1http__space.html | 2 +- ...1_1parser_1_1http__text__char-members.html | 2 +- classstdex_1_1parser_1_1http__text__char.html | 2 +- ...tdex_1_1parser_1_1http__token-members.html | 2 +- classstdex_1_1parser_1_1http__token.html | 2 +- ...sstdex_1_1parser_1_1http__url-members.html | 2 +- classstdex_1_1parser_1_1http__url.html | 2 +- ...arser_1_1http__url__parameter-members.html | 2 +- ...dex_1_1parser_1_1http__url__parameter.html | 2 +- ..._1_1parser_1_1http__url__path-members.html | 2 +- classstdex_1_1parser_1_1http__url__path.html | 2 +- ...r_1_1http__url__path__segment-members.html | 2 +- ...1_1parser_1_1http__url__path__segment.html | 2 +- ..._1_1parser_1_1http__url__port-members.html | 2 +- classstdex_1_1parser_1_1http__url__port.html | 2 +- ..._1parser_1_1http__url__server-members.html | 2 +- ...sstdex_1_1parser_1_1http__url__server.html | 2 +- ...tdex_1_1parser_1_1http__value-members.html | 2 +- classstdex_1_1parser_1_1http__value.html | 2 +- ...er_1_1http__value__collection-members.html | 2 +- ..._1_1parser_1_1http__value__collection.html | 2 +- ...dex_1_1parser_1_1http__weight-members.html | 2 +- classstdex_1_1parser_1_1http__weight.html | 2 +- ...rser_1_1http__weighted__value-members.html | 2 +- ...ex_1_1parser_1_1http__weighted__value.html | 2 +- ...1parser_1_1parser__collection-members.html | 2 +- ...stdex_1_1parser_1_1parser__collection.html | 2 +- ...ex_1_1parser_1_1sgml__any__cp-members.html | 2 +- classstdex_1_1parser_1_1sgml__any__cp.html | 2 +- classstdex_1_1parser_1_1sgml__cp-members.html | 2 +- classstdex_1_1parser_1_1sgml__cp.html | 2 +- ...ex_1_1parser_1_1sgml__cp__set-members.html | 2 +- classstdex_1_1parser_1_1sgml__cp__set.html | 2 +- ...er_1_1sgml__dns__domain__char-members.html | 2 +- ..._1_1parser_1_1sgml__dns__domain__char.html | 2 +- ..._1sgml__ipv6__scope__id__char-members.html | 2 +- ...parser_1_1sgml__ipv6__scope__id__char.html | 2 +- ..._1_1parser_1_1sgml__punct__cp-members.html | 2 +- classstdex_1_1parser_1_1sgml__punct__cp.html | 2 +- ..._1_1parser_1_1sgml__space__cp-members.html | 2 +- classstdex_1_1parser_1_1sgml__space__cp.html | 2 +- ...1_1sgml__space__or__punct__cp-members.html | 2 +- ...1parser_1_1sgml__space__or__punct__cp.html | 2 +- ...dex_1_1parser_1_1sgml__string-members.html | 2 +- classstdex_1_1parser_1_1sgml__string.html | 2 +- ..._1_1sgml__url__password__char-members.html | 2 +- ..._1parser_1_1sgml__url__password__char.html | 2 +- ...rser_1_1sgml__url__path__char-members.html | 2 +- ...ex_1_1parser_1_1sgml__url__path__char.html | 2 +- ..._1_1sgml__url__username__char-members.html | 2 +- ..._1parser_1_1sgml__url__username__char.html | 2 +- classstdex_1_1pool-members.html | 2 +- classstdex_1_1pool.html | 2 +- classstdex_1_1progress-members.html | 2 +- classstdex_1_1progress.html | 2 +- classstdex_1_1progress__switcher-members.html | 2 +- classstdex_1_1progress__switcher.html | 2 +- classstdex_1_1ring-members.html | 2 +- classstdex_1_1ring.html | 2 +- classstdex_1_1sha1__hash-members.html | 2 +- classstdex_1_1sha1__hash.html | 2 +- classstdex_1_1spinlock-members.html | 2 +- classstdex_1_1spinlock.html | 2 +- ...ex_1_1stream_1_1async__reader-members.html | 2 +- classstdex_1_1stream_1_1async__reader.html | 2 +- ...ex_1_1stream_1_1async__writer-members.html | 2 +- classstdex_1_1stream_1_1async__writer.html | 2 +- classstdex_1_1stream_1_1basic-members.html | 2 +- classstdex_1_1stream_1_1basic.html | 2 +- ...tdex_1_1stream_1_1basic__file-members.html | 2 +- classstdex_1_1stream_1_1basic__file.html | 2 +- ...stdex_1_1stream_1_1basic__sys-members.html | 2 +- classstdex_1_1stream_1_1basic__sys.html | 2 +- classstdex_1_1stream_1_1buffer-members.html | 2 +- classstdex_1_1stream_1_1buffer.html | 2 +- ...ex_1_1stream_1_1buffered__sys-members.html | 2 +- classstdex_1_1stream_1_1buffered__sys.html | 2 +- classstdex_1_1stream_1_1cache-members.html | 2 +- classstdex_1_1stream_1_1cache.html | 2 +- ...dex_1_1stream_1_1cached__file-members.html | 2 +- classstdex_1_1stream_1_1cached__file.html | 2 +- ...sstdex_1_1stream_1_1converter-members.html | 2 +- classstdex_1_1stream_1_1converter.html | 2 +- ...stdex_1_1stream_1_1diag__file-members.html | 2 +- classstdex_1_1stream_1_1diag__file.html | 2 +- classstdex_1_1stream_1_1fifo-members.html | 2 +- classstdex_1_1stream_1_1fifo.html | 2 +- classstdex_1_1stream_1_1file-members.html | 2 +- classstdex_1_1stream_1_1file.html | 2 +- ...dex_1_1stream_1_1file__window-members.html | 2 +- classstdex_1_1stream_1_1file__window.html | 2 +- classstdex_1_1stream_1_1limiter-members.html | 2 +- classstdex_1_1stream_1_1limiter.html | 2 +- ...dex_1_1stream_1_1memory__file-members.html | 2 +- classstdex_1_1stream_1_1memory__file.html | 2 +- ...stdex_1_1stream_1_1replicator-members.html | 2 +- classstdex_1_1stream_1_1replicator.html | 2 +- ...tream_1_1replicator_1_1worker-members.html | 2 +- ...dex_1_1stream_1_1replicator_1_1worker.html | 2 +- classstdex_1_1stream_1_1socket-members.html | 2 +- classstdex_1_1stream_1_1socket.html | 2 +- classstdex_1_1stream_1_1window-members.html | 2 +- classstdex_1_1stream_1_1window.html | 2 +- classstdex_1_1stream__hasher-members.html | 2 +- classstdex_1_1stream__hasher.html | 2 +- classstdex_1_1sys__object-members.html | 2 +- classstdex_1_1sys__object.html | 2 +- classstdex_1_1timeout__progress-members.html | 2 +- classstdex_1_1timeout__progress.html | 2 +- classstdex_1_1user__cancelled-members.html | 2 +- classstdex_1_1user__cancelled.html | 2 +- classstdex_1_1vector__queue-members.html | 2 +- classstdex_1_1vector__queue.html | 2 +- classstdex_1_1watchdog-members.html | 2 +- classstdex_1_1watchdog.html | 2 +- classstdex_1_1zlib__reader-members.html | 2 +- classstdex_1_1zlib__reader.html | 2 +- classstdex_1_1zlib__writer-members.html | 2 +- classstdex_1_1zlib__writer.html | 2 +- debug_8hpp_source.html | 2 +- dir_4be4f7b278e009bf0f1906cf31fb73bd.html | 2 +- dir_d44c64559bbebec7f509842c48db8b23.html | 2 +- dir_fca3c47b2ea228727bd6729832f89576.html | 2 +- endian_8hpp_source.html | 2 +- exception_8hpp_source.html | 2 +- files.html | 2 +- functions.html | 2 +- functions_b.html | 2 +- functions_c.html | 2 +- functions_d.html | 2 +- functions_e.html | 2 +- functions_enum.html | 2 +- functions_f.html | 2 +- functions_func.html | 2 +- functions_func_b.html | 2 +- functions_func_c.html | 2 +- functions_func_d.html | 2 +- functions_func_e.html | 2 +- functions_func_f.html | 2 +- functions_func_g.html | 2 +- functions_func_h.html | 2 +- functions_func_i.html | 2 +- functions_func_l.html | 2 +- functions_func_m.html | 2 +- functions_func_n.html | 2 +- functions_func_o.html | 2 +- functions_func_p.html | 2 +- functions_func_q.html | 2 +- functions_func_r.html | 2 +- functions_func_s.html | 2 +- functions_func_t.html | 2 +- functions_func_u.html | 2 +- functions_func_v.html | 2 +- functions_func_w.html | 2 +- functions_func_~.html | 2 +- functions_g.html | 2 +- functions_h.html | 2 +- functions_i.html | 2 +- functions_l.html | 2 +- functions_m.html | 2 +- functions_n.html | 2 +- functions_o.html | 2 +- functions_p.html | 2 +- functions_q.html | 2 +- functions_r.html | 2 +- functions_rela.html | 2 +- functions_s.html | 2 +- functions_t.html | 2 +- functions_type.html | 2 +- functions_u.html | 2 +- functions_v.html | 2 +- functions_vars.html | 2 +- functions_vars_b.html | 2 +- functions_vars_c.html | 2 +- functions_vars_d.html | 2 +- functions_vars_e.html | 2 +- functions_vars_f.html | 2 +- functions_vars_h.html | 2 +- functions_vars_i.html | 2 +- functions_vars_l.html | 2 +- functions_vars_m.html | 2 +- functions_vars_n.html | 2 +- functions_vars_o.html | 2 +- functions_vars_p.html | 2 +- functions_vars_r.html | 2 +- functions_vars_s.html | 2 +- functions_vars_t.html | 2 +- functions_vars_u.html | 2 +- functions_vars_v.html | 2 +- functions_vars_w.html | 2 +- functions_w.html | 2 +- functions_~.html | 2 +- hash_8hpp_source.html | 2 +- hex_8hpp_source.html | 2 +- hierarchy.html | 2 +- html_8hpp_source.html | 8 +- idrec_8hpp_source.html | 2 +- include_2stdex_2compat_8hpp_source.html | 2 +- index.html | 2 +- interval_8hpp_source.html | 2 +- locale_8hpp_source.html | 2 +- mapping_8hpp_source.html | 2 +- math_8hpp_source.html | 2 +- memory_8hpp_source.html | 2 +- parser_8hpp_source.html | 16305 ++++++++-------- pch_8hpp_source.html | 2 +- pool_8hpp_source.html | 2 +- progress_8hpp_source.html | 2 +- ring_8hpp_source.html | 2 +- sgml_8hpp_source.html | 1348 +- sgml__unicode_8hpp_source.html | 6170 +++--- socket_8hpp_source.html | 2 +- spinlock_8hpp_source.html | 2 +- stream_8hpp_source.html | 2 +- string_8hpp_source.html | 3547 ++-- ...stdex_1_1chrono_1_1aosn__date-members.html | 2 +- structstdex_1_1chrono_1_1aosn__date.html | 2 +- ..._1_1chrono_1_1aosn__timestamp-members.html | 2 +- structstdex_1_1chrono_1_1aosn__timestamp.html | 2 +- ...stdex_1_1free__locale__delete-members.html | 2 +- structstdex_1_1free__locale__delete.html | 2 +- ...ex_1_1html_1_1element__traits-members.html | 2 +- structstdex_1_1html_1_1element__traits.html | 2 +- structstdex_1_1html_1_1entity-members.html | 2 +- structstdex_1_1html_1_1entity.html | 2 +- ...ex_1_1html_1_1inserted__token-members.html | 2 +- structstdex_1_1html_1_1inserted__token.html | 2 +- structstdex_1_1interval-members.html | 2 +- structstdex_1_1interval.html | 2 +- structstdex_1_1mapping-members.html | 2 +- structstdex_1_1mapping.html | 2 +- structstdex_1_1no__delete-members.html | 2 +- structstdex_1_1no__delete.html | 2 +- ..._1_1no__delete_3_01_t_0f_0e_4-members.html | 2 +- structstdex_1_1no__delete_3_01_t_0f_0e_4.html | 2 +- ..._1_1parser_1_1html__attribute-members.html | 2 +- structstdex_1_1parser_1_1html__attribute.html | 2 +- ...1parser_1_1http__factor__more-members.html | 2 +- ...stdex_1_1parser_1_1http__factor__more.html | 2 +- ...stream_1_1buffer_1_1buffer__t-members.html | 2 +- ...tdex_1_1stream_1_1buffer_1_1buffer__t.html | 2 +- ..._1_1stream_1_1fifo_1_1node__t-members.html | 2 +- structstdex_1_1stream_1_1fifo_1_1node__t.html | 2 +- structstdex_1_1sys__info__t-members.html | 2 +- structstdex_1_1sys__info__t.html | 2 +- structstdex_1_1wav_1_1cue-members.html | 2 +- structstdex_1_1wav_1_1cue.html | 2 +- structstdex_1_1wav_1_1cue__ex-members.html | 2 +- structstdex_1_1wav_1_1cue__ex.html | 2 +- structstdex_1_1wav_1_1data-members.html | 2 +- structstdex_1_1wav_1_1data.html | 2 +- structstdex_1_1wav_1_1format-members.html | 2 +- structstdex_1_1wav_1_1format.html | 2 +- structstdex_1_1wav_1_1header-members.html | 2 +- structstdex_1_1wav_1_1header.html | 2 +- structstdex_1_1wav_1_1label-members.html | 2 +- structstdex_1_1wav_1_1label.html | 2 +- structstdex_1_1wav_1_1list-members.html | 2 +- structstdex_1_1wav_1_1list.html | 2 +- structstdex_1_1wav_1_1ltxt-members.html | 2 +- structstdex_1_1wav_1_1ltxt.html | 2 +- structstdex_1_1wav_1_1note-members.html | 2 +- structstdex_1_1wav_1_1note.html | 2 +- structstdex_1_1wav_1_1silence-members.html | 2 +- structstdex_1_1wav_1_1silence.html | 2 +- structstdex_1_1wav_1_1wave-members.html | 2 +- structstdex_1_1wav_1_1wave.html | 2 +- sys__info_8hpp_source.html | 2 +- system_8hpp_source.html | 2 +- unicode_8hpp_source.html | 2 +- unionstdex_1_1md2__t-members.html | 2 +- unionstdex_1_1md2__t.html | 2 +- unionstdex_1_1sha256__t-members.html | 2 +- unionstdex_1_1sha256__t.html | 2 +- unionstdex_1_1sha__t-members.html | 2 +- unionstdex_1_1sha__t.html | 2 +- uuid_8hpp_source.html | 2 +- vector__queue_8hpp_source.html | 2 +- watchdog_8hpp_source.html | 2 +- wav_8hpp_source.html | 2 +- windows_8h_source.html | 2 +- zlib_8hpp_source.html | 2 +- 504 files changed, 14201 insertions(+), 14175 deletions(-) diff --git a/_unit_tests_2compat_8hpp_source.html b/_unit_tests_2compat_8hpp_source.html index 2a31ddeda..7fa52275f 100644 --- a/_unit_tests_2compat_8hpp_source.html +++ b/_unit_tests_2compat_8hpp_source.html @@ -172,7 +172,7 @@ $(function() { codefold.init(0); }); diff --git a/annotated.html b/annotated.html index 25f78793c..fcae0573a 100644 --- a/annotated.html +++ b/annotated.html @@ -289,7 +289,7 @@ $(function() { diff --git a/base64_8hpp_source.html b/base64_8hpp_source.html index 018a1091a..1d15a5508 100644 --- a/base64_8hpp_source.html +++ b/base64_8hpp_source.html @@ -548,7 +548,7 @@ $(function() { codefold.init(0); }); diff --git a/chrono_8hpp_source.html b/chrono_8hpp_source.html index f02358351..c0008269c 100644 --- a/chrono_8hpp_source.html +++ b/chrono_8hpp_source.html @@ -469,7 +469,7 @@ $(function() { codefold.init(0); }); diff --git a/classes.html b/classes.html index 667f32be2..75f119450 100644 --- a/classes.html +++ b/classes.html @@ -141,7 +141,7 @@ $(function() { diff --git a/classstdex_1_1aggregate__progress-members.html b/classstdex_1_1aggregate__progress-members.html index f4bce2bf1..0a327e8e3 100644 --- a/classstdex_1_1aggregate__progress-members.html +++ b/classstdex_1_1aggregate__progress-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1aggregate__progress.html b/classstdex_1_1aggregate__progress.html index db6217e17..64a00248c 100644 --- a/classstdex_1_1aggregate__progress.html +++ b/classstdex_1_1aggregate__progress.html @@ -285,7 +285,7 @@ template<class T > diff --git a/classstdex_1_1aggregate__progress_1_1worker__progress-members.html b/classstdex_1_1aggregate__progress_1_1worker__progress-members.html index 44dfe7118..da90f611b 100644 --- a/classstdex_1_1aggregate__progress_1_1worker__progress-members.html +++ b/classstdex_1_1aggregate__progress_1_1worker__progress-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1aggregate__progress_1_1worker__progress.html b/classstdex_1_1aggregate__progress_1_1worker__progress.html index 31dc01053..174a314e5 100644 --- a/classstdex_1_1aggregate__progress_1_1worker__progress.html +++ b/classstdex_1_1aggregate__progress_1_1worker__progress.html @@ -328,7 +328,7 @@ template<class T > diff --git a/classstdex_1_1base64__dec-members.html b/classstdex_1_1base64__dec-members.html index 39b4d4a1e..cc2290e0b 100644 --- a/classstdex_1_1base64__dec-members.html +++ b/classstdex_1_1base64__dec-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1base64__dec.html b/classstdex_1_1base64__dec.html index 514f64d26..51f97785f 100644 --- a/classstdex_1_1base64__dec.html +++ b/classstdex_1_1base64__dec.html @@ -231,7 +231,7 @@ template<class T_to , class AX , class T_from > diff --git a/classstdex_1_1base64__enc-members.html b/classstdex_1_1base64__enc-members.html index 89f4457aa..7975109e0 100644 --- a/classstdex_1_1base64__enc-members.html +++ b/classstdex_1_1base64__enc-members.html @@ -93,7 +93,7 @@ $(function() { diff --git a/classstdex_1_1base64__enc.html b/classstdex_1_1base64__enc.html index 13fc444ba..6a4a77da3 100644 --- a/classstdex_1_1base64__enc.html +++ b/classstdex_1_1base64__enc.html @@ -236,7 +236,7 @@ template<class T , class TR , class AX > diff --git a/classstdex_1_1base64__reader-members.html b/classstdex_1_1base64__reader-members.html index 8d1ae4ed8..e3f8e2519 100644 --- a/classstdex_1_1base64__reader-members.html +++ b/classstdex_1_1base64__reader-members.html @@ -163,7 +163,7 @@ $(function() { diff --git a/classstdex_1_1base64__reader.html b/classstdex_1_1base64__reader.html index 42d6da2f3..0a068f0ee 100644 --- a/classstdex_1_1base64__reader.html +++ b/classstdex_1_1base64__reader.html @@ -434,7 +434,7 @@ size_t m_num diff --git a/classstdex_1_1base64__writer-members.html b/classstdex_1_1base64__writer-members.html index 96e1c8e80..7f1ca88c0 100644 --- a/classstdex_1_1base64__writer-members.html +++ b/classstdex_1_1base64__writer-members.html @@ -165,7 +165,7 @@ $(function() { diff --git a/classstdex_1_1base64__writer.html b/classstdex_1_1base64__writer.html index b427c089c..20868fe44 100644 --- a/classstdex_1_1base64__writer.html +++ b/classstdex_1_1base64__writer.html @@ -441,7 +441,7 @@ size_t m_num diff --git a/classstdex_1_1basic__hash-members.html b/classstdex_1_1basic__hash-members.html index bc968772d..df9b552f0 100644 --- a/classstdex_1_1basic__hash-members.html +++ b/classstdex_1_1basic__hash-members.html @@ -93,7 +93,7 @@ $(function() { diff --git a/classstdex_1_1basic__hash.html b/classstdex_1_1basic__hash.html index 0af7162ca..dd78b06bc 100644 --- a/classstdex_1_1basic__hash.html +++ b/classstdex_1_1basic__hash.html @@ -250,7 +250,7 @@ template<class T > diff --git a/classstdex_1_1benchmark-members.html b/classstdex_1_1benchmark-members.html index 4f215ee9a..a80fec166 100644 --- a/classstdex_1_1benchmark-members.html +++ b/classstdex_1_1benchmark-members.html @@ -89,7 +89,7 @@ $(function() { diff --git a/classstdex_1_1benchmark.html b/classstdex_1_1benchmark.html index e9ae9f1c3..86e1ee18a 100644 --- a/classstdex_1_1benchmark.html +++ b/classstdex_1_1benchmark.html @@ -150,7 +150,7 @@ std::chrono::time_point< std::chrono::high_resolution_clock >  diff --git a/classstdex_1_1block__hash-members.html b/classstdex_1_1block__hash-members.html index 95f728e07..3eb642448 100644 --- a/classstdex_1_1block__hash-members.html +++ b/classstdex_1_1block__hash-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1block__hash.html b/classstdex_1_1block__hash.html index c357af35a..4163e407e 100644 --- a/classstdex_1_1block__hash.html +++ b/classstdex_1_1block__hash.html @@ -240,7 +240,7 @@ template<class T > diff --git a/classstdex_1_1charset__encoder-members.html b/classstdex_1_1charset__encoder-members.html index 56c3ccca1..dc0654029 100644 --- a/classstdex_1_1charset__encoder-members.html +++ b/classstdex_1_1charset__encoder-members.html @@ -104,7 +104,7 @@ $(function() { diff --git a/classstdex_1_1charset__encoder.html b/classstdex_1_1charset__encoder.html index 4560b8fbc..98d381f5e 100644 --- a/classstdex_1_1charset__encoder.html +++ b/classstdex_1_1charset__encoder.html @@ -556,7 +556,7 @@ template<class TR_to = std::char_traits<T_to>, class AX_to = std::all diff --git a/classstdex_1_1crc32__hash-members.html b/classstdex_1_1crc32__hash-members.html index 309092d70..2ac495932 100644 --- a/classstdex_1_1crc32__hash-members.html +++ b/classstdex_1_1crc32__hash-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1crc32__hash.html b/classstdex_1_1crc32__hash.html index ef8ee168f..cf65771c3 100644 --- a/classstdex_1_1crc32__hash.html +++ b/classstdex_1_1crc32__hash.html @@ -240,7 +240,7 @@ crc32_t m_value diff --git a/classstdex_1_1global__progress-members.html b/classstdex_1_1global__progress-members.html index cb67cf579..4773489c2 100644 --- a/classstdex_1_1global__progress-members.html +++ b/classstdex_1_1global__progress-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/classstdex_1_1global__progress.html b/classstdex_1_1global__progress.html index be0818ef3..d2fed3cbf 100644 --- a/classstdex_1_1global__progress.html +++ b/classstdex_1_1global__progress.html @@ -523,7 +523,7 @@ template<class T > diff --git a/classstdex_1_1hex__dec-members.html b/classstdex_1_1hex__dec-members.html index 850af1b3d..63c558264 100644 --- a/classstdex_1_1hex__dec-members.html +++ b/classstdex_1_1hex__dec-members.html @@ -91,7 +91,7 @@ $(function() { diff --git a/classstdex_1_1hex__dec.html b/classstdex_1_1hex__dec.html index 91181b6f3..e3b12a24b 100644 --- a/classstdex_1_1hex__dec.html +++ b/classstdex_1_1hex__dec.html @@ -213,7 +213,7 @@ template<class T_to , class AX , class T_from > diff --git a/classstdex_1_1hex__enc-members.html b/classstdex_1_1hex__enc-members.html index 41e422a3a..c5fac0772 100644 --- a/classstdex_1_1hex__enc-members.html +++ b/classstdex_1_1hex__enc-members.html @@ -88,7 +88,7 @@ $(function() { diff --git a/classstdex_1_1hex__enc.html b/classstdex_1_1hex__enc.html index 4804aa2fe..cfc693999 100644 --- a/classstdex_1_1hex__enc.html +++ b/classstdex_1_1hex__enc.html @@ -191,7 +191,7 @@ template<class T , class TR , class AX > diff --git a/classstdex_1_1html_1_1comment-members.html b/classstdex_1_1html_1_1comment-members.html index 5825423be..952b0f75f 100644 --- a/classstdex_1_1html_1_1comment-members.html +++ b/classstdex_1_1html_1_1comment-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1comment.html b/classstdex_1_1html_1_1comment.html index 3df9f1db7..0d39cba3c 100644 --- a/classstdex_1_1html_1_1comment.html +++ b/classstdex_1_1html_1_1comment.html @@ -137,7 +137,7 @@ stdex::parser::html_sequence_t  diff --git a/classstdex_1_1html_1_1declaration-members.html b/classstdex_1_1html_1_1declaration-members.html index e6ca3bd16..0e1ef103a 100644 --- a/classstdex_1_1html_1_1declaration-members.html +++ b/classstdex_1_1html_1_1declaration-members.html @@ -93,7 +93,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1declaration.html b/classstdex_1_1html_1_1declaration.html index b209110a0..ae341155a 100644 --- a/classstdex_1_1html_1_1declaration.html +++ b/classstdex_1_1html_1_1declaration.html @@ -141,7 +141,7 @@ stdex::parser::html_sequence_t  diff --git a/classstdex_1_1html_1_1document-members.html b/classstdex_1_1html_1_1document-members.html index e510ac29e..40c3329cb 100644 --- a/classstdex_1_1html_1_1document-members.html +++ b/classstdex_1_1html_1_1document-members.html @@ -109,7 +109,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1document.html b/classstdex_1_1html_1_1document.html index 5c6d1f27d..042a6421c 100644 --- a/classstdex_1_1html_1_1document.html +++ b/classstdex_1_1html_1_1document.html @@ -199,7 +199,7 @@ class stdex::html::document< T, TR, AX >

HTML document.

diff --git a/classstdex_1_1html_1_1element-members.html b/classstdex_1_1html_1_1element-members.html index d5482c430..9eead7ded 100644 --- a/classstdex_1_1html_1_1element-members.html +++ b/classstdex_1_1html_1_1element-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1element.html b/classstdex_1_1html_1_1element.html index b8e315e69..b88bad6fe 100644 --- a/classstdex_1_1html_1_1element.html +++ b/classstdex_1_1html_1_1element.html @@ -154,7 +154,7 @@ stdex::parser::html_sequence_t  diff --git a/classstdex_1_1html_1_1element__end-members.html b/classstdex_1_1html_1_1element__end-members.html index 3ef3c1463..b85556241 100644 --- a/classstdex_1_1html_1_1element__end-members.html +++ b/classstdex_1_1html_1_1element__end-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1element__end.html b/classstdex_1_1html_1_1element__end.html index b85076cc5..bb682c4be 100644 --- a/classstdex_1_1html_1_1element__end.html +++ b/classstdex_1_1html_1_1element__end.html @@ -145,7 +145,7 @@ stdex::parser::html_sequence_t  diff --git a/classstdex_1_1html_1_1element__start-members.html b/classstdex_1_1html_1_1element__start-members.html index 997d18dd4..c32e64315 100644 --- a/classstdex_1_1html_1_1element__start-members.html +++ b/classstdex_1_1html_1_1element__start-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1element__start.html b/classstdex_1_1html_1_1element__start.html index ef828783b..e5f5bc60f 100644 --- a/classstdex_1_1html_1_1element__start.html +++ b/classstdex_1_1html_1_1element__start.html @@ -164,7 +164,7 @@ template<class T > diff --git a/classstdex_1_1html_1_1instruction-members.html b/classstdex_1_1html_1_1instruction-members.html index 1d3e75119..ed0dfcc36 100644 --- a/classstdex_1_1html_1_1instruction-members.html +++ b/classstdex_1_1html_1_1instruction-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1instruction.html b/classstdex_1_1html_1_1instruction.html index b1b026df6..479595d57 100644 --- a/classstdex_1_1html_1_1instruction.html +++ b/classstdex_1_1html_1_1instruction.html @@ -137,7 +137,7 @@ stdex::parser::html_sequence_t  diff --git a/classstdex_1_1html_1_1parser-members.html b/classstdex_1_1html_1_1parser-members.html index 15c01b879..02fb173be 100644 --- a/classstdex_1_1html_1_1parser-members.html +++ b/classstdex_1_1html_1_1parser-members.html @@ -112,7 +112,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1parser.html b/classstdex_1_1html_1_1parser.html index fa61a9133..35cd8fa1b 100644 --- a/classstdex_1_1html_1_1parser.html +++ b/classstdex_1_1html_1_1parser.html @@ -564,7 +564,7 @@ template<class T , class TR , class AX > diff --git a/classstdex_1_1html_1_1sequence-members.html b/classstdex_1_1html_1_1sequence-members.html index 2199f04f4..4cee6cdaa 100644 --- a/classstdex_1_1html_1_1sequence-members.html +++ b/classstdex_1_1html_1_1sequence-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1sequence.html b/classstdex_1_1html_1_1sequence.html index 35dac6285..00bc541bd 100644 --- a/classstdex_1_1html_1_1sequence.html +++ b/classstdex_1_1html_1_1sequence.html @@ -132,7 +132,7 @@ stdex::parser::html_sequence_t  diff --git a/classstdex_1_1html_1_1starting__token-members.html b/classstdex_1_1html_1_1starting__token-members.html index 372db94b4..c7451d906 100644 --- a/classstdex_1_1html_1_1starting__token-members.html +++ b/classstdex_1_1html_1_1starting__token-members.html @@ -101,7 +101,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1starting__token.html b/classstdex_1_1html_1_1starting__token.html index e2015cca2..54383efa4 100644 --- a/classstdex_1_1html_1_1starting__token.html +++ b/classstdex_1_1html_1_1starting__token.html @@ -183,7 +183,7 @@ class stdex::html::starting_token< T, TR, AX >

Token representing

diff --git a/classstdex_1_1html_1_1text__token-members.html b/classstdex_1_1html_1_1text__token-members.html index 2b8125b82..160be1a35 100644 --- a/classstdex_1_1html_1_1text__token-members.html +++ b/classstdex_1_1html_1_1text__token-members.html @@ -98,7 +98,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1text__token.html b/classstdex_1_1html_1_1text__token.html index bf3deabdd..865e0a6cc 100644 --- a/classstdex_1_1html_1_1text__token.html +++ b/classstdex_1_1html_1_1text__token.html @@ -170,7 +170,7 @@ class stdex::html::text_token< T, TR, AX >

Token representing part

diff --git a/classstdex_1_1html_1_1token-members.html b/classstdex_1_1html_1_1token-members.html index 0f588cd2a..c676da60c 100644 --- a/classstdex_1_1html_1_1token-members.html +++ b/classstdex_1_1html_1_1token-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1token.html b/classstdex_1_1html_1_1token.html index 500ac2b76..51dbf34a4 100644 --- a/classstdex_1_1html_1_1token.html +++ b/classstdex_1_1html_1_1token.html @@ -231,7 +231,7 @@ template<class TR = std::char_traits<wchar_t>, class AX = std::alloca diff --git a/classstdex_1_1html_1_1url__token-members.html b/classstdex_1_1html_1_1url__token-members.html index ef938f8eb..e5551198b 100644 --- a/classstdex_1_1html_1_1url__token-members.html +++ b/classstdex_1_1html_1_1url__token-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1url__token.html b/classstdex_1_1html_1_1url__token.html index fa3207da3..b9dc1479f 100644 --- a/classstdex_1_1html_1_1url__token.html +++ b/classstdex_1_1html_1_1url__token.html @@ -165,7 +165,7 @@ class stdex::html::url_token< T, TR, AX >

HTTP token representing

diff --git a/classstdex_1_1idrec_1_1record-members.html b/classstdex_1_1idrec_1_1record-members.html index 680fcb83a..a68e6813a 100644 --- a/classstdex_1_1idrec_1_1record-members.html +++ b/classstdex_1_1idrec_1_1record-members.html @@ -102,7 +102,7 @@ $(function() { diff --git a/classstdex_1_1idrec_1_1record.html b/classstdex_1_1idrec_1_1record.html index 1e84e4b1e..ac9b09d17 100644 --- a/classstdex_1_1idrec_1_1record.html +++ b/classstdex_1_1idrec_1_1record.html @@ -764,7 +764,7 @@ template<class T , class T_id , const T_id ID, class T_size , T_size N_align& diff --git a/classstdex_1_1lazy__progress-members.html b/classstdex_1_1lazy__progress-members.html index a0a5a4f2e..db71c285c 100644 --- a/classstdex_1_1lazy__progress-members.html +++ b/classstdex_1_1lazy__progress-members.html @@ -98,7 +98,7 @@ $(function() { diff --git a/classstdex_1_1lazy__progress.html b/classstdex_1_1lazy__progress.html index 2eabd5541..661cca90e 100644 --- a/classstdex_1_1lazy__progress.html +++ b/classstdex_1_1lazy__progress.html @@ -272,7 +272,7 @@ template<class T > diff --git a/classstdex_1_1locale-members.html b/classstdex_1_1locale-members.html index 3ca7a0f20..18fad34a7 100644 --- a/classstdex_1_1locale-members.html +++ b/classstdex_1_1locale-members.html @@ -89,7 +89,7 @@ $(function() { diff --git a/classstdex_1_1locale.html b/classstdex_1_1locale.html index cf2989369..16c0d204a 100644 --- a/classstdex_1_1locale.html +++ b/classstdex_1_1locale.html @@ -114,7 +114,7 @@ Public Member Functions diff --git a/classstdex_1_1md5__hash-members.html b/classstdex_1_1md5__hash-members.html index 3eb1c4add..18c25a5cd 100644 --- a/classstdex_1_1md5__hash-members.html +++ b/classstdex_1_1md5__hash-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1md5__hash.html b/classstdex_1_1md5__hash.html index 52f999e86..343d14837 100644 --- a/classstdex_1_1md5__hash.html +++ b/classstdex_1_1md5__hash.html @@ -261,7 +261,7 @@ uint32_t m_temp [16] diff --git a/classstdex_1_1parser_1_1basic__angle-members.html b/classstdex_1_1parser_1_1basic__angle-members.html index 9b67dc85d..e6e3bd556 100644 --- a/classstdex_1_1parser_1_1basic__angle-members.html +++ b/classstdex_1_1parser_1_1basic__angle-members.html @@ -102,7 +102,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__angle.html b/classstdex_1_1parser_1_1basic__angle.html index cccf7c1d5..758e4875a 100644 --- a/classstdex_1_1parser_1_1basic__angle.html +++ b/classstdex_1_1parser_1_1basic__angle.html @@ -243,7 +243,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__any__cu-members.html b/classstdex_1_1parser_1_1basic__any__cu-members.html index e34fb6134..7d122f200 100644 --- a/classstdex_1_1parser_1_1basic__any__cu-members.html +++ b/classstdex_1_1parser_1_1basic__any__cu-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__any__cu.html b/classstdex_1_1parser_1_1basic__any__cu.html index 2e4c85873..dd7fdcf4e 100644 --- a/classstdex_1_1parser_1_1basic__any__cu.html +++ b/classstdex_1_1parser_1_1basic__any__cu.html @@ -190,7 +190,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__bol-members.html b/classstdex_1_1parser_1_1basic__bol-members.html index a51e54880..a5292aa1b 100644 --- a/classstdex_1_1parser_1_1basic__bol-members.html +++ b/classstdex_1_1parser_1_1basic__bol-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__bol.html b/classstdex_1_1parser_1_1basic__bol.html index ad8a2c9db..fa136209b 100644 --- a/classstdex_1_1parser_1_1basic__bol.html +++ b/classstdex_1_1parser_1_1basic__bol.html @@ -197,7 +197,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__branch-members.html b/classstdex_1_1parser_1_1basic__branch-members.html index c5787fac0..0dcf50d1b 100644 --- a/classstdex_1_1parser_1_1basic__branch-members.html +++ b/classstdex_1_1parser_1_1basic__branch-members.html @@ -102,7 +102,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__branch.html b/classstdex_1_1parser_1_1basic__branch.html index 4874c8096..05ac67b20 100644 --- a/classstdex_1_1parser_1_1basic__branch.html +++ b/classstdex_1_1parser_1_1basic__branch.html @@ -248,7 +248,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__chemical__formula-members.html b/classstdex_1_1parser_1_1basic__chemical__formula-members.html index 49bf6ca36..7cf0c6c4f 100644 --- a/classstdex_1_1parser_1_1basic__chemical__formula-members.html +++ b/classstdex_1_1parser_1_1basic__chemical__formula-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__chemical__formula.html b/classstdex_1_1parser_1_1basic__chemical__formula.html index 320e4fcdc..78ce400f3 100644 --- a/classstdex_1_1parser_1_1basic__chemical__formula.html +++ b/classstdex_1_1parser_1_1basic__chemical__formula.html @@ -238,7 +238,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__creditor__reference-members.html b/classstdex_1_1parser_1_1basic__creditor__reference-members.html index e8f5f6c86..f36d8387f 100644 --- a/classstdex_1_1parser_1_1basic__creditor__reference-members.html +++ b/classstdex_1_1parser_1_1basic__creditor__reference-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__creditor__reference.html b/classstdex_1_1parser_1_1basic__creditor__reference.html index ff798490e..7e3f5f395 100644 --- a/classstdex_1_1parser_1_1basic__creditor__reference.html +++ b/classstdex_1_1parser_1_1basic__creditor__reference.html @@ -239,7 +239,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__css__cdc-members.html b/classstdex_1_1parser_1_1basic__css__cdc-members.html index a5b5fce3e..9e564e9e9 100644 --- a/classstdex_1_1parser_1_1basic__css__cdc-members.html +++ b/classstdex_1_1parser_1_1basic__css__cdc-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__css__cdc.html b/classstdex_1_1parser_1_1basic__css__cdc.html index 523ebe769..e72d3c016 100644 --- a/classstdex_1_1parser_1_1basic__css__cdc.html +++ b/classstdex_1_1parser_1_1basic__css__cdc.html @@ -183,7 +183,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__css__cdo-members.html b/classstdex_1_1parser_1_1basic__css__cdo-members.html index ab540e12c..927961bd8 100644 --- a/classstdex_1_1parser_1_1basic__css__cdo-members.html +++ b/classstdex_1_1parser_1_1basic__css__cdo-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__css__cdo.html b/classstdex_1_1parser_1_1basic__css__cdo.html index db1e1b1cb..68b912513 100644 --- a/classstdex_1_1parser_1_1basic__css__cdo.html +++ b/classstdex_1_1parser_1_1basic__css__cdo.html @@ -183,7 +183,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__css__comment-members.html b/classstdex_1_1parser_1_1basic__css__comment-members.html index 5bc1f610b..37ecd8f6d 100644 --- a/classstdex_1_1parser_1_1basic__css__comment-members.html +++ b/classstdex_1_1parser_1_1basic__css__comment-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__css__comment.html b/classstdex_1_1parser_1_1basic__css__comment.html index 2b392626c..dd4a5cd77 100644 --- a/classstdex_1_1parser_1_1basic__css__comment.html +++ b/classstdex_1_1parser_1_1basic__css__comment.html @@ -223,7 +223,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__css__import-members.html b/classstdex_1_1parser_1_1basic__css__import-members.html index 544eca903..90e5a8187 100644 --- a/classstdex_1_1parser_1_1basic__css__import-members.html +++ b/classstdex_1_1parser_1_1basic__css__import-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__css__import.html b/classstdex_1_1parser_1_1basic__css__import.html index 609244f8d..9bbeefb2a 100644 --- a/classstdex_1_1parser_1_1basic__css__import.html +++ b/classstdex_1_1parser_1_1basic__css__import.html @@ -223,7 +223,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__css__string-members.html b/classstdex_1_1parser_1_1basic__css__string-members.html index f53913f62..59b5bc806 100644 --- a/classstdex_1_1parser_1_1basic__css__string-members.html +++ b/classstdex_1_1parser_1_1basic__css__string-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__css__string.html b/classstdex_1_1parser_1_1basic__css__string.html index 16847cc3d..37fe2a7e8 100644 --- a/classstdex_1_1parser_1_1basic__css__string.html +++ b/classstdex_1_1parser_1_1basic__css__string.html @@ -223,7 +223,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__css__uri-members.html b/classstdex_1_1parser_1_1basic__css__uri-members.html index 33b98025b..6c55fa3cb 100644 --- a/classstdex_1_1parser_1_1basic__css__uri-members.html +++ b/classstdex_1_1parser_1_1basic__css__uri-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__css__uri.html b/classstdex_1_1parser_1_1basic__css__uri.html index efa2f4d10..184ee4719 100644 --- a/classstdex_1_1parser_1_1basic__css__uri.html +++ b/classstdex_1_1parser_1_1basic__css__uri.html @@ -223,7 +223,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__cu-members.html b/classstdex_1_1parser_1_1basic__cu-members.html index 7d0522f67..dbd64f81e 100644 --- a/classstdex_1_1parser_1_1basic__cu-members.html +++ b/classstdex_1_1parser_1_1basic__cu-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__cu.html b/classstdex_1_1parser_1_1basic__cu.html index daadcaaa4..defc5db0e 100644 --- a/classstdex_1_1parser_1_1basic__cu.html +++ b/classstdex_1_1parser_1_1basic__cu.html @@ -200,7 +200,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__cu__set-members.html b/classstdex_1_1parser_1_1basic__cu__set-members.html index e3ef2d2e6..858f49579 100644 --- a/classstdex_1_1parser_1_1basic__cu__set-members.html +++ b/classstdex_1_1parser_1_1basic__cu__set-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__cu__set.html b/classstdex_1_1parser_1_1basic__cu__set.html index fcdf7bcc4..26d65cba5 100644 --- a/classstdex_1_1parser_1_1basic__cu__set.html +++ b/classstdex_1_1parser_1_1basic__cu__set.html @@ -209,7 +209,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__date-members.html b/classstdex_1_1parser_1_1basic__date-members.html index 311881db2..8068a86bb 100644 --- a/classstdex_1_1parser_1_1basic__date-members.html +++ b/classstdex_1_1parser_1_1basic__date-members.html @@ -103,7 +103,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__date.html b/classstdex_1_1parser_1_1basic__date.html index 813788445..5ad073884 100644 --- a/classstdex_1_1parser_1_1basic__date.html +++ b/classstdex_1_1parser_1_1basic__date.html @@ -251,7 +251,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__dns__domain__char-members.html b/classstdex_1_1parser_1_1basic__dns__domain__char-members.html index dcb9fc823..9664e37de 100644 --- a/classstdex_1_1parser_1_1basic__dns__domain__char-members.html +++ b/classstdex_1_1parser_1_1basic__dns__domain__char-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__dns__domain__char.html b/classstdex_1_1parser_1_1basic__dns__domain__char.html index ac110e76f..420eea7f4 100644 --- a/classstdex_1_1parser_1_1basic__dns__domain__char.html +++ b/classstdex_1_1parser_1_1basic__dns__domain__char.html @@ -202,7 +202,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__dns__name-members.html b/classstdex_1_1parser_1_1basic__dns__name-members.html index 58c88b8d5..56aa6b190 100644 --- a/classstdex_1_1parser_1_1basic__dns__name-members.html +++ b/classstdex_1_1parser_1_1basic__dns__name-members.html @@ -98,7 +98,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__dns__name.html b/classstdex_1_1parser_1_1basic__dns__name.html index 515b27cb0..ea52cacd9 100644 --- a/classstdex_1_1parser_1_1basic__dns__name.html +++ b/classstdex_1_1parser_1_1basic__dns__name.html @@ -204,7 +204,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__email__address-members.html b/classstdex_1_1parser_1_1basic__email__address-members.html index e93698a94..6c4f27cc0 100644 --- a/classstdex_1_1parser_1_1basic__email__address-members.html +++ b/classstdex_1_1parser_1_1basic__email__address-members.html @@ -102,7 +102,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__email__address.html b/classstdex_1_1parser_1_1basic__email__address.html index da5072550..b6a7f093d 100644 --- a/classstdex_1_1parser_1_1basic__email__address.html +++ b/classstdex_1_1parser_1_1basic__email__address.html @@ -244,7 +244,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__emoticon-members.html b/classstdex_1_1parser_1_1basic__emoticon-members.html index 9d7e361b0..9e0d94c62 100644 --- a/classstdex_1_1parser_1_1basic__emoticon-members.html +++ b/classstdex_1_1parser_1_1basic__emoticon-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__emoticon.html b/classstdex_1_1parser_1_1basic__emoticon.html index 8eb79d5fa..396da7880 100644 --- a/classstdex_1_1parser_1_1basic__emoticon.html +++ b/classstdex_1_1parser_1_1basic__emoticon.html @@ -242,7 +242,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__eol-members.html b/classstdex_1_1parser_1_1basic__eol-members.html index 4904075fd..b2a59fc09 100644 --- a/classstdex_1_1parser_1_1basic__eol-members.html +++ b/classstdex_1_1parser_1_1basic__eol-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__eol.html b/classstdex_1_1parser_1_1basic__eol.html index fbc7153d4..4734cf7c8 100644 --- a/classstdex_1_1parser_1_1basic__eol.html +++ b/classstdex_1_1parser_1_1basic__eol.html @@ -197,7 +197,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__fraction-members.html b/classstdex_1_1parser_1_1basic__fraction-members.html index efac1af0b..a59c7b113 100644 --- a/classstdex_1_1parser_1_1basic__fraction-members.html +++ b/classstdex_1_1parser_1_1basic__fraction-members.html @@ -98,7 +98,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__fraction.html b/classstdex_1_1parser_1_1basic__fraction.html index 9592687ac..4c30ab3d8 100644 --- a/classstdex_1_1parser_1_1basic__fraction.html +++ b/classstdex_1_1parser_1_1basic__fraction.html @@ -231,7 +231,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__html__declaration__condition__end-members.html b/classstdex_1_1parser_1_1basic__html__declaration__condition__end-members.html index 09364404d..54e5b44d7 100644 --- a/classstdex_1_1parser_1_1basic__html__declaration__condition__end-members.html +++ b/classstdex_1_1parser_1_1basic__html__declaration__condition__end-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__html__declaration__condition__end.html b/classstdex_1_1parser_1_1basic__html__declaration__condition__end.html index f09591ab3..93838d18d 100644 --- a/classstdex_1_1parser_1_1basic__html__declaration__condition__end.html +++ b/classstdex_1_1parser_1_1basic__html__declaration__condition__end.html @@ -183,7 +183,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__html__declaration__condition__start-members.html b/classstdex_1_1parser_1_1basic__html__declaration__condition__start-members.html index 6fac6f079..bbc0a68ef 100644 --- a/classstdex_1_1parser_1_1basic__html__declaration__condition__start-members.html +++ b/classstdex_1_1parser_1_1basic__html__declaration__condition__start-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__html__declaration__condition__start.html b/classstdex_1_1parser_1_1basic__html__declaration__condition__start.html index 1f99afb1d..60c5c7551 100644 --- a/classstdex_1_1parser_1_1basic__html__declaration__condition__start.html +++ b/classstdex_1_1parser_1_1basic__html__declaration__condition__start.html @@ -225,7 +225,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__html__ident-members.html b/classstdex_1_1parser_1_1basic__html__ident-members.html index bed06ade3..1a72caf6d 100644 --- a/classstdex_1_1parser_1_1basic__html__ident-members.html +++ b/classstdex_1_1parser_1_1basic__html__ident-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__html__ident.html b/classstdex_1_1parser_1_1basic__html__ident.html index ad2b32e23..cbd8c5b8f 100644 --- a/classstdex_1_1parser_1_1basic__html__ident.html +++ b/classstdex_1_1parser_1_1basic__html__ident.html @@ -183,7 +183,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__html__tag-members.html b/classstdex_1_1parser_1_1basic__html__tag-members.html index 89af734ae..a1b37b93e 100644 --- a/classstdex_1_1parser_1_1basic__html__tag-members.html +++ b/classstdex_1_1parser_1_1basic__html__tag-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__html__tag.html b/classstdex_1_1parser_1_1basic__html__tag.html index be3ec7e36..cf2f1e202 100644 --- a/classstdex_1_1parser_1_1basic__html__tag.html +++ b/classstdex_1_1parser_1_1basic__html__tag.html @@ -241,7 +241,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__html__value-members.html b/classstdex_1_1parser_1_1basic__html__value-members.html index 1f0392bd6..ef41795f3 100644 --- a/classstdex_1_1parser_1_1basic__html__value-members.html +++ b/classstdex_1_1parser_1_1basic__html__value-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__html__value.html b/classstdex_1_1parser_1_1basic__html__value.html index 38080887b..8b5d5e51d 100644 --- a/classstdex_1_1parser_1_1basic__html__value.html +++ b/classstdex_1_1parser_1_1basic__html__value.html @@ -223,7 +223,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__iban-members.html b/classstdex_1_1parser_1_1basic__iban-members.html index fa73dc23e..ba3b95a1b 100644 --- a/classstdex_1_1parser_1_1basic__iban-members.html +++ b/classstdex_1_1parser_1_1basic__iban-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__iban.html b/classstdex_1_1parser_1_1basic__iban.html index abf9cbb2c..341497f43 100644 --- a/classstdex_1_1parser_1_1basic__iban.html +++ b/classstdex_1_1parser_1_1basic__iban.html @@ -243,7 +243,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__integer-members.html b/classstdex_1_1parser_1_1basic__integer-members.html index bda591208..3fd5634ee 100644 --- a/classstdex_1_1parser_1_1basic__integer-members.html +++ b/classstdex_1_1parser_1_1basic__integer-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__integer.html b/classstdex_1_1parser_1_1basic__integer.html index 4e68d098c..6272019e3 100644 --- a/classstdex_1_1parser_1_1basic__integer.html +++ b/classstdex_1_1parser_1_1basic__integer.html @@ -184,7 +184,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__integer10-members.html b/classstdex_1_1parser_1_1basic__integer10-members.html index 324551d3d..a40b0e85a 100644 --- a/classstdex_1_1parser_1_1basic__integer10-members.html +++ b/classstdex_1_1parser_1_1basic__integer10-members.html @@ -107,7 +107,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__integer10.html b/classstdex_1_1parser_1_1basic__integer10.html index 92cb1b49b..5e7b1df5c 100644 --- a/classstdex_1_1parser_1_1basic__integer10.html +++ b/classstdex_1_1parser_1_1basic__integer10.html @@ -233,7 +233,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__integer10ts-members.html b/classstdex_1_1parser_1_1basic__integer10ts-members.html index 82a0f4833..6d36853b2 100644 --- a/classstdex_1_1parser_1_1basic__integer10ts-members.html +++ b/classstdex_1_1parser_1_1basic__integer10ts-members.html @@ -101,7 +101,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__integer10ts.html b/classstdex_1_1parser_1_1basic__integer10ts.html index 8da928261..ea262bbb1 100644 --- a/classstdex_1_1parser_1_1basic__integer10ts.html +++ b/classstdex_1_1parser_1_1basic__integer10ts.html @@ -247,7 +247,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__integer16-members.html b/classstdex_1_1parser_1_1basic__integer16-members.html index 4437f5a71..5f15d2448 100644 --- a/classstdex_1_1parser_1_1basic__integer16-members.html +++ b/classstdex_1_1parser_1_1basic__integer16-members.html @@ -113,7 +113,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__integer16.html b/classstdex_1_1parser_1_1basic__integer16.html index 7d4fe61d3..a9a37a6f9 100644 --- a/classstdex_1_1parser_1_1basic__integer16.html +++ b/classstdex_1_1parser_1_1basic__integer16.html @@ -251,7 +251,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__ipv4__address-members.html b/classstdex_1_1parser_1_1basic__ipv4__address-members.html index c479d46c4..7cae33895 100644 --- a/classstdex_1_1parser_1_1basic__ipv4__address-members.html +++ b/classstdex_1_1parser_1_1basic__ipv4__address-members.html @@ -108,7 +108,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__ipv4__address.html b/classstdex_1_1parser_1_1basic__ipv4__address.html index 957718546..58f41629c 100644 --- a/classstdex_1_1parser_1_1basic__ipv4__address.html +++ b/classstdex_1_1parser_1_1basic__ipv4__address.html @@ -264,7 +264,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__ipv6__address-members.html b/classstdex_1_1parser_1_1basic__ipv6__address-members.html index 70e6d7552..d4030fcb9 100644 --- a/classstdex_1_1parser_1_1basic__ipv6__address-members.html +++ b/classstdex_1_1parser_1_1basic__ipv6__address-members.html @@ -116,7 +116,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__ipv6__address.html b/classstdex_1_1parser_1_1basic__ipv6__address.html index 759cde1b1..02bbb6ad9 100644 --- a/classstdex_1_1parser_1_1basic__ipv6__address.html +++ b/classstdex_1_1parser_1_1basic__ipv6__address.html @@ -289,7 +289,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__ipv6__scope__id__char-members.html b/classstdex_1_1parser_1_1basic__ipv6__scope__id__char-members.html index dfc04e278..ce55f51ab 100644 --- a/classstdex_1_1parser_1_1basic__ipv6__scope__id__char-members.html +++ b/classstdex_1_1parser_1_1basic__ipv6__scope__id__char-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__ipv6__scope__id__char.html b/classstdex_1_1parser_1_1basic__ipv6__scope__id__char.html index f234f1dfb..d89a96b58 100644 --- a/classstdex_1_1parser_1_1basic__ipv6__scope__id__char.html +++ b/classstdex_1_1parser_1_1basic__ipv6__scope__id__char.html @@ -190,7 +190,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__iterations-members.html b/classstdex_1_1parser_1_1basic__iterations-members.html index bc6420a63..40f5015e9 100644 --- a/classstdex_1_1parser_1_1basic__iterations-members.html +++ b/classstdex_1_1parser_1_1basic__iterations-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__iterations.html b/classstdex_1_1parser_1_1basic__iterations.html index 3cb695b8b..e1b35ce25 100644 --- a/classstdex_1_1parser_1_1basic__iterations.html +++ b/classstdex_1_1parser_1_1basic__iterations.html @@ -210,7 +210,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__json__string-members.html b/classstdex_1_1parser_1_1basic__json__string-members.html index 5d7b2f100..b556c7f42 100644 --- a/classstdex_1_1parser_1_1basic__json__string-members.html +++ b/classstdex_1_1parser_1_1basic__json__string-members.html @@ -107,7 +107,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__json__string.html b/classstdex_1_1parser_1_1basic__json__string.html index 7c95be2e8..42a26fa76 100644 --- a/classstdex_1_1parser_1_1basic__json__string.html +++ b/classstdex_1_1parser_1_1basic__json__string.html @@ -259,7 +259,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__mime__type-members.html b/classstdex_1_1parser_1_1basic__mime__type-members.html index abb5989cb..0cc98e0bc 100644 --- a/classstdex_1_1parser_1_1basic__mime__type-members.html +++ b/classstdex_1_1parser_1_1basic__mime__type-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__mime__type.html b/classstdex_1_1parser_1_1basic__mime__type.html index c50a446d2..787dbd1cb 100644 --- a/classstdex_1_1parser_1_1basic__mime__type.html +++ b/classstdex_1_1parser_1_1basic__mime__type.html @@ -231,7 +231,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__mixed__numeral-members.html b/classstdex_1_1parser_1_1basic__mixed__numeral-members.html index 35628cc80..8c8cece0e 100644 --- a/classstdex_1_1parser_1_1basic__mixed__numeral-members.html +++ b/classstdex_1_1parser_1_1basic__mixed__numeral-members.html @@ -101,7 +101,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__mixed__numeral.html b/classstdex_1_1parser_1_1basic__mixed__numeral.html index 033e7e621..2aa09bee7 100644 --- a/classstdex_1_1parser_1_1basic__mixed__numeral.html +++ b/classstdex_1_1parser_1_1basic__mixed__numeral.html @@ -246,7 +246,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__monetary__numeral-members.html b/classstdex_1_1parser_1_1basic__monetary__numeral-members.html index dc91be5df..ef3de054e 100644 --- a/classstdex_1_1parser_1_1basic__monetary__numeral-members.html +++ b/classstdex_1_1parser_1_1basic__monetary__numeral-members.html @@ -102,7 +102,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__monetary__numeral.html b/classstdex_1_1parser_1_1basic__monetary__numeral.html index 5bfde0205..a1dad96d9 100644 --- a/classstdex_1_1parser_1_1basic__monetary__numeral.html +++ b/classstdex_1_1parser_1_1basic__monetary__numeral.html @@ -250,7 +250,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__noop-members.html b/classstdex_1_1parser_1_1basic__noop-members.html index 56c99dce8..4e4c212ee 100644 --- a/classstdex_1_1parser_1_1basic__noop-members.html +++ b/classstdex_1_1parser_1_1basic__noop-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__noop.html b/classstdex_1_1parser_1_1basic__noop.html index c58426927..331e13088 100644 --- a/classstdex_1_1parser_1_1basic__noop.html +++ b/classstdex_1_1parser_1_1basic__noop.html @@ -183,7 +183,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__parser-members.html b/classstdex_1_1parser_1_1basic__parser-members.html index ee199647a..5b91f3df0 100644 --- a/classstdex_1_1parser_1_1basic__parser-members.html +++ b/classstdex_1_1parser_1_1basic__parser-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__parser.html b/classstdex_1_1parser_1_1basic__parser.html index 6f825d057..bea218ac3 100644 --- a/classstdex_1_1parser_1_1basic__parser.html +++ b/classstdex_1_1parser_1_1basic__parser.html @@ -251,7 +251,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__permutation-members.html b/classstdex_1_1parser_1_1basic__permutation-members.html index 0e672b009..d83eec005 100644 --- a/classstdex_1_1parser_1_1basic__permutation-members.html +++ b/classstdex_1_1parser_1_1basic__permutation-members.html @@ -101,7 +101,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__permutation.html b/classstdex_1_1parser_1_1basic__permutation.html index 656913e74..4529ef4df 100644 --- a/classstdex_1_1parser_1_1basic__permutation.html +++ b/classstdex_1_1parser_1_1basic__permutation.html @@ -211,7 +211,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__phone__number-members.html b/classstdex_1_1parser_1_1basic__phone__number-members.html index e8fbbb892..5e91fb3bc 100644 --- a/classstdex_1_1parser_1_1basic__phone__number-members.html +++ b/classstdex_1_1parser_1_1basic__phone__number-members.html @@ -102,7 +102,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__phone__number.html b/classstdex_1_1parser_1_1basic__phone__number.html index 578733025..50a3b8db2 100644 --- a/classstdex_1_1parser_1_1basic__phone__number.html +++ b/classstdex_1_1parser_1_1basic__phone__number.html @@ -245,7 +245,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__punct__cu-members.html b/classstdex_1_1parser_1_1basic__punct__cu-members.html index d0184db79..d6a254a7c 100644 --- a/classstdex_1_1parser_1_1basic__punct__cu-members.html +++ b/classstdex_1_1parser_1_1basic__punct__cu-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__punct__cu.html b/classstdex_1_1parser_1_1basic__punct__cu.html index 763459c80..e6f412fb3 100644 --- a/classstdex_1_1parser_1_1basic__punct__cu.html +++ b/classstdex_1_1parser_1_1basic__punct__cu.html @@ -197,7 +197,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__roman__numeral-members.html b/classstdex_1_1parser_1_1basic__roman__numeral-members.html index 422f23a74..60edda016 100644 --- a/classstdex_1_1parser_1_1basic__roman__numeral-members.html +++ b/classstdex_1_1parser_1_1basic__roman__numeral-members.html @@ -106,7 +106,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__roman__numeral.html b/classstdex_1_1parser_1_1basic__roman__numeral.html index ae4403988..7b933b3f5 100644 --- a/classstdex_1_1parser_1_1basic__roman__numeral.html +++ b/classstdex_1_1parser_1_1basic__roman__numeral.html @@ -230,7 +230,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__scientific__numeral-members.html b/classstdex_1_1parser_1_1basic__scientific__numeral-members.html index 05e98bea9..9cf1c5634 100644 --- a/classstdex_1_1parser_1_1basic__scientific__numeral-members.html +++ b/classstdex_1_1parser_1_1basic__scientific__numeral-members.html @@ -106,7 +106,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__scientific__numeral.html b/classstdex_1_1parser_1_1basic__scientific__numeral.html index 02da709c4..0f101cff6 100644 --- a/classstdex_1_1parser_1_1basic__scientific__numeral.html +++ b/classstdex_1_1parser_1_1basic__scientific__numeral.html @@ -266,7 +266,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__score-members.html b/classstdex_1_1parser_1_1basic__score-members.html index 5cae3d340..c767cba35 100644 --- a/classstdex_1_1parser_1_1basic__score-members.html +++ b/classstdex_1_1parser_1_1basic__score-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__score.html b/classstdex_1_1parser_1_1basic__score.html index 64a51ce2f..1d384a075 100644 --- a/classstdex_1_1parser_1_1basic__score.html +++ b/classstdex_1_1parser_1_1basic__score.html @@ -235,7 +235,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__sequence-members.html b/classstdex_1_1parser_1_1basic__sequence-members.html index 2a650202f..9441a0ca4 100644 --- a/classstdex_1_1parser_1_1basic__sequence-members.html +++ b/classstdex_1_1parser_1_1basic__sequence-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__sequence.html b/classstdex_1_1parser_1_1basic__sequence.html index 0d6c6daa4..3af883ed0 100644 --- a/classstdex_1_1parser_1_1basic__sequence.html +++ b/classstdex_1_1parser_1_1basic__sequence.html @@ -208,7 +208,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__set-members.html b/classstdex_1_1parser_1_1basic__set-members.html index 631248d4a..c22de70e7 100644 --- a/classstdex_1_1parser_1_1basic__set-members.html +++ b/classstdex_1_1parser_1_1basic__set-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__set.html b/classstdex_1_1parser_1_1basic__set.html index 1eb8a72ac..7eccd74da 100644 --- a/classstdex_1_1parser_1_1basic__set.html +++ b/classstdex_1_1parser_1_1basic__set.html @@ -222,7 +222,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__si__reference-members.html b/classstdex_1_1parser_1_1basic__si__reference-members.html index 645d5774e..671828dcb 100644 --- a/classstdex_1_1parser_1_1basic__si__reference-members.html +++ b/classstdex_1_1parser_1_1basic__si__reference-members.html @@ -105,7 +105,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__si__reference.html b/classstdex_1_1parser_1_1basic__si__reference.html index 670224524..9bc3fb35a 100644 --- a/classstdex_1_1parser_1_1basic__si__reference.html +++ b/classstdex_1_1parser_1_1basic__si__reference.html @@ -264,7 +264,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__si__reference__delimiter-members.html b/classstdex_1_1parser_1_1basic__si__reference__delimiter-members.html index d0acd05bf..9de7ca350 100644 --- a/classstdex_1_1parser_1_1basic__si__reference__delimiter-members.html +++ b/classstdex_1_1parser_1_1basic__si__reference__delimiter-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__si__reference__delimiter.html b/classstdex_1_1parser_1_1basic__si__reference__delimiter.html index bd6c72565..c352431eb 100644 --- a/classstdex_1_1parser_1_1basic__si__reference__delimiter.html +++ b/classstdex_1_1parser_1_1basic__si__reference__delimiter.html @@ -191,7 +191,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__si__reference__part-members.html b/classstdex_1_1parser_1_1basic__si__reference__part-members.html index d36e7e01a..a68f02f6c 100644 --- a/classstdex_1_1parser_1_1basic__si__reference__part-members.html +++ b/classstdex_1_1parser_1_1basic__si__reference__part-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__si__reference__part.html b/classstdex_1_1parser_1_1basic__si__reference__part.html index 73fcfd4d4..90af76136 100644 --- a/classstdex_1_1parser_1_1basic__si__reference__part.html +++ b/classstdex_1_1parser_1_1basic__si__reference__part.html @@ -191,7 +191,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__signed__numeral-members.html b/classstdex_1_1parser_1_1basic__signed__numeral-members.html index 22b797cbf..1ad21ed9b 100644 --- a/classstdex_1_1parser_1_1basic__signed__numeral-members.html +++ b/classstdex_1_1parser_1_1basic__signed__numeral-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__signed__numeral.html b/classstdex_1_1parser_1_1basic__signed__numeral.html index 29f7f80e2..1bbc46ade 100644 --- a/classstdex_1_1parser_1_1basic__signed__numeral.html +++ b/classstdex_1_1parser_1_1basic__signed__numeral.html @@ -238,7 +238,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__space__cu-members.html b/classstdex_1_1parser_1_1basic__space__cu-members.html index 3042759b3..47cf76fb4 100644 --- a/classstdex_1_1parser_1_1basic__space__cu-members.html +++ b/classstdex_1_1parser_1_1basic__space__cu-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__space__cu.html b/classstdex_1_1parser_1_1basic__space__cu.html index b16fd1cf1..81084bb49 100644 --- a/classstdex_1_1parser_1_1basic__space__cu.html +++ b/classstdex_1_1parser_1_1basic__space__cu.html @@ -197,7 +197,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__space__or__punct__cu-members.html b/classstdex_1_1parser_1_1basic__space__or__punct__cu-members.html index f21e1d5a7..7f289649c 100644 --- a/classstdex_1_1parser_1_1basic__space__or__punct__cu-members.html +++ b/classstdex_1_1parser_1_1basic__space__or__punct__cu-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__space__or__punct__cu.html b/classstdex_1_1parser_1_1basic__space__or__punct__cu.html index 85d524b98..c132a6c54 100644 --- a/classstdex_1_1parser_1_1basic__space__or__punct__cu.html +++ b/classstdex_1_1parser_1_1basic__space__or__punct__cu.html @@ -197,7 +197,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__string-members.html b/classstdex_1_1parser_1_1basic__string-members.html index b0618d538..f8c5c9215 100644 --- a/classstdex_1_1parser_1_1basic__string-members.html +++ b/classstdex_1_1parser_1_1basic__string-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__string.html b/classstdex_1_1parser_1_1basic__string.html index e1af5433d..c65560c9c 100644 --- a/classstdex_1_1parser_1_1basic__string.html +++ b/classstdex_1_1parser_1_1basic__string.html @@ -197,7 +197,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__string__branch-members.html b/classstdex_1_1parser_1_1basic__string__branch-members.html index 1f06f3951..26ada693b 100644 --- a/classstdex_1_1parser_1_1basic__string__branch-members.html +++ b/classstdex_1_1parser_1_1basic__string__branch-members.html @@ -107,7 +107,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__string__branch.html b/classstdex_1_1parser_1_1basic__string__branch.html index d9fb60ad8..8a02d374f 100644 --- a/classstdex_1_1parser_1_1basic__string__branch.html +++ b/classstdex_1_1parser_1_1basic__string__branch.html @@ -189,7 +189,7 @@ class stdex::parser::basic_string_branch< T, T_parser >

Test for a

diff --git a/classstdex_1_1parser_1_1basic__time-members.html b/classstdex_1_1parser_1_1basic__time-members.html index 4e67f9856..460951397 100644 --- a/classstdex_1_1parser_1_1basic__time-members.html +++ b/classstdex_1_1parser_1_1basic__time-members.html @@ -101,7 +101,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__time.html b/classstdex_1_1parser_1_1basic__time.html index d2a584061..47ed3e0eb 100644 --- a/classstdex_1_1parser_1_1basic__time.html +++ b/classstdex_1_1parser_1_1basic__time.html @@ -241,7 +241,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__url-members.html b/classstdex_1_1parser_1_1basic__url-members.html index a046758ba..b61c5d2e9 100644 --- a/classstdex_1_1parser_1_1basic__url-members.html +++ b/classstdex_1_1parser_1_1basic__url-members.html @@ -111,7 +111,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__url.html b/classstdex_1_1parser_1_1basic__url.html index 36526794b..530c74425 100644 --- a/classstdex_1_1parser_1_1basic__url.html +++ b/classstdex_1_1parser_1_1basic__url.html @@ -271,7 +271,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__url__password__char-members.html b/classstdex_1_1parser_1_1basic__url__password__char-members.html index e43cc83f2..ac391d43e 100644 --- a/classstdex_1_1parser_1_1basic__url__password__char-members.html +++ b/classstdex_1_1parser_1_1basic__url__password__char-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__url__password__char.html b/classstdex_1_1parser_1_1basic__url__password__char.html index cd5a2506a..abe2c09f1 100644 --- a/classstdex_1_1parser_1_1basic__url__password__char.html +++ b/classstdex_1_1parser_1_1basic__url__password__char.html @@ -190,7 +190,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__url__path-members.html b/classstdex_1_1parser_1_1basic__url__path-members.html index 71ba09ae1..78d3ffe82 100644 --- a/classstdex_1_1parser_1_1basic__url__path-members.html +++ b/classstdex_1_1parser_1_1basic__url__path-members.html @@ -101,7 +101,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__url__path.html b/classstdex_1_1parser_1_1basic__url__path.html index bdc26facb..38c905624 100644 --- a/classstdex_1_1parser_1_1basic__url__path.html +++ b/classstdex_1_1parser_1_1basic__url__path.html @@ -241,7 +241,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__url__path__char-members.html b/classstdex_1_1parser_1_1basic__url__path__char-members.html index a0591b1ca..f06d4de27 100644 --- a/classstdex_1_1parser_1_1basic__url__path__char-members.html +++ b/classstdex_1_1parser_1_1basic__url__path__char-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__url__path__char.html b/classstdex_1_1parser_1_1basic__url__path__char.html index 9b9a61ba7..a761c03ee 100644 --- a/classstdex_1_1parser_1_1basic__url__path__char.html +++ b/classstdex_1_1parser_1_1basic__url__path__char.html @@ -190,7 +190,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__url__username__char-members.html b/classstdex_1_1parser_1_1basic__url__username__char-members.html index cbc254447..6d369fedd 100644 --- a/classstdex_1_1parser_1_1basic__url__username__char-members.html +++ b/classstdex_1_1parser_1_1basic__url__username__char-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__url__username__char.html b/classstdex_1_1parser_1_1basic__url__username__char.html index d4a90ad1a..c81421c82 100644 --- a/classstdex_1_1parser_1_1basic__url__username__char.html +++ b/classstdex_1_1parser_1_1basic__url__username__char.html @@ -190,7 +190,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1http__agent-members.html b/classstdex_1_1parser_1_1http__agent-members.html index f69767c05..2bfa8ee38 100644 --- a/classstdex_1_1parser_1_1http__agent-members.html +++ b/classstdex_1_1parser_1_1http__agent-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__agent.html b/classstdex_1_1parser_1_1http__agent.html index 048bdeb5f..d7e9d54b6 100644 --- a/classstdex_1_1parser_1_1http__agent.html +++ b/classstdex_1_1parser_1_1http__agent.html @@ -184,7 +184,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__any__type-members.html b/classstdex_1_1parser_1_1http__any__type-members.html index 098599115..bbb503fb3 100644 --- a/classstdex_1_1parser_1_1http__any__type-members.html +++ b/classstdex_1_1parser_1_1http__any__type-members.html @@ -87,7 +87,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__any__type.html b/classstdex_1_1parser_1_1http__any__type.html index 08f5aa59f..acc4166e1 100644 --- a/classstdex_1_1parser_1_1http__any__type.html +++ b/classstdex_1_1parser_1_1http__any__type.html @@ -143,7 +143,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__asterisk-members.html b/classstdex_1_1parser_1_1http__asterisk-members.html index 5c6bf19b9..5910588b2 100644 --- a/classstdex_1_1parser_1_1http__asterisk-members.html +++ b/classstdex_1_1parser_1_1http__asterisk-members.html @@ -87,7 +87,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__asterisk.html b/classstdex_1_1parser_1_1http__asterisk.html index 0228597bc..92c0fdea6 100644 --- a/classstdex_1_1parser_1_1http__asterisk.html +++ b/classstdex_1_1parser_1_1http__asterisk.html @@ -143,7 +143,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__cookie-members.html b/classstdex_1_1parser_1_1http__cookie-members.html index 28bbfb963..431c1017a 100644 --- a/classstdex_1_1parser_1_1http__cookie-members.html +++ b/classstdex_1_1parser_1_1http__cookie-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__cookie.html b/classstdex_1_1parser_1_1http__cookie.html index 2552cdf46..be9cf147b 100644 --- a/classstdex_1_1parser_1_1http__cookie.html +++ b/classstdex_1_1parser_1_1http__cookie.html @@ -194,7 +194,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__cookie__parameter-members.html b/classstdex_1_1parser_1_1http__cookie__parameter-members.html index 287f5929a..56a9366b9 100644 --- a/classstdex_1_1parser_1_1http__cookie__parameter-members.html +++ b/classstdex_1_1parser_1_1http__cookie__parameter-members.html @@ -91,7 +91,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__cookie__parameter.html b/classstdex_1_1parser_1_1http__cookie__parameter.html index d33d54c53..98eef7f0c 100644 --- a/classstdex_1_1parser_1_1http__cookie__parameter.html +++ b/classstdex_1_1parser_1_1http__cookie__parameter.html @@ -188,7 +188,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__header-members.html b/classstdex_1_1parser_1_1http__header-members.html index f0e8f9c6c..424c4c1f2 100644 --- a/classstdex_1_1parser_1_1http__header-members.html +++ b/classstdex_1_1parser_1_1http__header-members.html @@ -91,7 +91,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__header.html b/classstdex_1_1parser_1_1http__header.html index 28547d99c..1ffed02e8 100644 --- a/classstdex_1_1parser_1_1http__header.html +++ b/classstdex_1_1parser_1_1http__header.html @@ -188,7 +188,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__language-members.html b/classstdex_1_1parser_1_1http__language-members.html index a6144b973..701e94181 100644 --- a/classstdex_1_1parser_1_1http__language-members.html +++ b/classstdex_1_1parser_1_1http__language-members.html @@ -89,7 +89,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__language.html b/classstdex_1_1parser_1_1http__language.html index 46cccce8c..60715233e 100644 --- a/classstdex_1_1parser_1_1http__language.html +++ b/classstdex_1_1parser_1_1http__language.html @@ -181,7 +181,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__line__break-members.html b/classstdex_1_1parser_1_1http__line__break-members.html index cfd428f34..98c6964e1 100644 --- a/classstdex_1_1parser_1_1http__line__break-members.html +++ b/classstdex_1_1parser_1_1http__line__break-members.html @@ -87,7 +87,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__line__break.html b/classstdex_1_1parser_1_1http__line__break.html index 5eb719b11..f162f37a7 100644 --- a/classstdex_1_1parser_1_1http__line__break.html +++ b/classstdex_1_1parser_1_1http__line__break.html @@ -143,7 +143,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__media__range-members.html b/classstdex_1_1parser_1_1http__media__range-members.html index bfec1d21b..e888ef8d6 100644 --- a/classstdex_1_1parser_1_1http__media__range-members.html +++ b/classstdex_1_1parser_1_1http__media__range-members.html @@ -91,7 +91,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__media__range.html b/classstdex_1_1parser_1_1http__media__range.html index c5e834221..aa40b2566 100644 --- a/classstdex_1_1parser_1_1http__media__range.html +++ b/classstdex_1_1parser_1_1http__media__range.html @@ -189,7 +189,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__media__type-members.html b/classstdex_1_1parser_1_1http__media__type-members.html index 17c468ace..60f6a6c45 100644 --- a/classstdex_1_1parser_1_1http__media__type-members.html +++ b/classstdex_1_1parser_1_1http__media__type-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__media__type.html b/classstdex_1_1parser_1_1http__media__type.html index 972316518..561512fc4 100644 --- a/classstdex_1_1parser_1_1http__media__type.html +++ b/classstdex_1_1parser_1_1http__media__type.html @@ -233,7 +233,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__parameter-members.html b/classstdex_1_1parser_1_1http__parameter-members.html index 72e3cb7a7..c9b4dc0eb 100644 --- a/classstdex_1_1parser_1_1http__parameter-members.html +++ b/classstdex_1_1parser_1_1http__parameter-members.html @@ -91,7 +91,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__parameter.html b/classstdex_1_1parser_1_1http__parameter.html index c823b857f..e5b3a567c 100644 --- a/classstdex_1_1parser_1_1http__parameter.html +++ b/classstdex_1_1parser_1_1http__parameter.html @@ -190,7 +190,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__protocol-members.html b/classstdex_1_1parser_1_1http__protocol-members.html index 4cd774f01..359d7670a 100644 --- a/classstdex_1_1parser_1_1http__protocol-members.html +++ b/classstdex_1_1parser_1_1http__protocol-members.html @@ -93,7 +93,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__protocol.html b/classstdex_1_1parser_1_1http__protocol.html index 1a1a5eb48..69a942d99 100644 --- a/classstdex_1_1parser_1_1http__protocol.html +++ b/classstdex_1_1parser_1_1http__protocol.html @@ -194,7 +194,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__quoted__string-members.html b/classstdex_1_1parser_1_1http__quoted__string-members.html index b82fd99a7..74a171f02 100644 --- a/classstdex_1_1parser_1_1http__quoted__string-members.html +++ b/classstdex_1_1parser_1_1http__quoted__string-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__quoted__string.html b/classstdex_1_1parser_1_1http__quoted__string.html index 0b48f32b6..ed85c37b1 100644 --- a/classstdex_1_1parser_1_1http__quoted__string.html +++ b/classstdex_1_1parser_1_1http__quoted__string.html @@ -186,7 +186,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__request-members.html b/classstdex_1_1parser_1_1http__request-members.html index c8809f3be..d6df65a28 100644 --- a/classstdex_1_1parser_1_1http__request-members.html +++ b/classstdex_1_1parser_1_1http__request-members.html @@ -93,7 +93,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__request.html b/classstdex_1_1parser_1_1http__request.html index 127410f91..fd6b7839a 100644 --- a/classstdex_1_1parser_1_1http__request.html +++ b/classstdex_1_1parser_1_1http__request.html @@ -194,7 +194,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__space-members.html b/classstdex_1_1parser_1_1http__space-members.html index 903b35d1d..17fcc197a 100644 --- a/classstdex_1_1parser_1_1http__space-members.html +++ b/classstdex_1_1parser_1_1http__space-members.html @@ -88,7 +88,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__space.html b/classstdex_1_1parser_1_1http__space.html index d4addf52a..5e9ec6542 100644 --- a/classstdex_1_1parser_1_1http__space.html +++ b/classstdex_1_1parser_1_1http__space.html @@ -150,7 +150,7 @@ Additional Inherited Members diff --git a/classstdex_1_1parser_1_1http__text__char-members.html b/classstdex_1_1parser_1_1http__text__char-members.html index 8a23ae0cd..336239cca 100644 --- a/classstdex_1_1parser_1_1http__text__char-members.html +++ b/classstdex_1_1parser_1_1http__text__char-members.html @@ -88,7 +88,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__text__char.html b/classstdex_1_1parser_1_1http__text__char.html index 8fb3c4dbb..3dc7d12b6 100644 --- a/classstdex_1_1parser_1_1http__text__char.html +++ b/classstdex_1_1parser_1_1http__text__char.html @@ -150,7 +150,7 @@ Additional Inherited Members diff --git a/classstdex_1_1parser_1_1http__token-members.html b/classstdex_1_1parser_1_1http__token-members.html index f3b6f4ff2..abad5bb87 100644 --- a/classstdex_1_1parser_1_1http__token-members.html +++ b/classstdex_1_1parser_1_1http__token-members.html @@ -87,7 +87,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__token.html b/classstdex_1_1parser_1_1http__token.html index 9f3881be5..67f300ec3 100644 --- a/classstdex_1_1parser_1_1http__token.html +++ b/classstdex_1_1parser_1_1http__token.html @@ -143,7 +143,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__url-members.html b/classstdex_1_1parser_1_1http__url-members.html index 4695c9083..8307afb14 100644 --- a/classstdex_1_1parser_1_1http__url-members.html +++ b/classstdex_1_1parser_1_1http__url-members.html @@ -93,7 +93,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__url.html b/classstdex_1_1parser_1_1http__url.html index 53c66e86e..7712ea8bd 100644 --- a/classstdex_1_1parser_1_1http__url.html +++ b/classstdex_1_1parser_1_1http__url.html @@ -193,7 +193,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__url__parameter-members.html b/classstdex_1_1parser_1_1http__url__parameter-members.html index de9f950e6..d718a9187 100644 --- a/classstdex_1_1parser_1_1http__url__parameter-members.html +++ b/classstdex_1_1parser_1_1http__url__parameter-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__url__parameter.html b/classstdex_1_1parser_1_1http__url__parameter.html index 5fb3d62fc..8d26b5742 100644 --- a/classstdex_1_1parser_1_1http__url__parameter.html +++ b/classstdex_1_1parser_1_1http__url__parameter.html @@ -184,7 +184,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__url__path-members.html b/classstdex_1_1parser_1_1http__url__path-members.html index 1041d009e..93de9dba9 100644 --- a/classstdex_1_1parser_1_1http__url__path-members.html +++ b/classstdex_1_1parser_1_1http__url__path-members.html @@ -89,7 +89,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__url__path.html b/classstdex_1_1parser_1_1http__url__path.html index 8afc6699f..1186c060d 100644 --- a/classstdex_1_1parser_1_1http__url__path.html +++ b/classstdex_1_1parser_1_1http__url__path.html @@ -182,7 +182,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__url__path__segment-members.html b/classstdex_1_1parser_1_1http__url__path__segment-members.html index d2b183243..8a50355be 100644 --- a/classstdex_1_1parser_1_1http__url__path__segment-members.html +++ b/classstdex_1_1parser_1_1http__url__path__segment-members.html @@ -87,7 +87,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__url__path__segment.html b/classstdex_1_1parser_1_1http__url__path__segment.html index ac8bdc687..d81329b70 100644 --- a/classstdex_1_1parser_1_1http__url__path__segment.html +++ b/classstdex_1_1parser_1_1http__url__path__segment.html @@ -143,7 +143,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__url__port-members.html b/classstdex_1_1parser_1_1http__url__port-members.html index bd9ea9dee..4454ed02b 100644 --- a/classstdex_1_1parser_1_1http__url__port-members.html +++ b/classstdex_1_1parser_1_1http__url__port-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__url__port.html b/classstdex_1_1parser_1_1http__url__port.html index 17c2ba0e3..a0fe7cf16 100644 --- a/classstdex_1_1parser_1_1http__url__port.html +++ b/classstdex_1_1parser_1_1http__url__port.html @@ -184,7 +184,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__url__server-members.html b/classstdex_1_1parser_1_1http__url__server-members.html index b29dd1d73..af1c010c2 100644 --- a/classstdex_1_1parser_1_1http__url__server-members.html +++ b/classstdex_1_1parser_1_1http__url__server-members.html @@ -87,7 +87,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__url__server.html b/classstdex_1_1parser_1_1http__url__server.html index 1e6b9ce5f..4c58c8eb5 100644 --- a/classstdex_1_1parser_1_1http__url__server.html +++ b/classstdex_1_1parser_1_1http__url__server.html @@ -143,7 +143,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__value-members.html b/classstdex_1_1parser_1_1http__value-members.html index 43147cd95..82e797962 100644 --- a/classstdex_1_1parser_1_1http__value-members.html +++ b/classstdex_1_1parser_1_1http__value-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__value.html b/classstdex_1_1parser_1_1http__value.html index 8a5a3f62c..2237ec912 100644 --- a/classstdex_1_1parser_1_1http__value.html +++ b/classstdex_1_1parser_1_1http__value.html @@ -186,7 +186,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__value__collection-members.html b/classstdex_1_1parser_1_1http__value__collection-members.html index cf4b889fc..bdd19b6ba 100644 --- a/classstdex_1_1parser_1_1http__value__collection-members.html +++ b/classstdex_1_1parser_1_1http__value__collection-members.html @@ -86,7 +86,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__value__collection.html b/classstdex_1_1parser_1_1http__value__collection.html index 2c8ad08dc..c47c18fe1 100644 --- a/classstdex_1_1parser_1_1http__value__collection.html +++ b/classstdex_1_1parser_1_1http__value__collection.html @@ -109,7 +109,7 @@ class stdex::parser::http_value_collection< KEY, T >

Collection of

diff --git a/classstdex_1_1parser_1_1http__weight-members.html b/classstdex_1_1parser_1_1http__weight-members.html index 04d2567c0..591439aa0 100644 --- a/classstdex_1_1parser_1_1http__weight-members.html +++ b/classstdex_1_1parser_1_1http__weight-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__weight.html b/classstdex_1_1parser_1_1http__weight.html index fd579573e..6fca25093 100644 --- a/classstdex_1_1parser_1_1http__weight.html +++ b/classstdex_1_1parser_1_1http__weight.html @@ -185,7 +185,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__weighted__value-members.html b/classstdex_1_1parser_1_1http__weighted__value-members.html index cce07a740..d9133ccc6 100644 --- a/classstdex_1_1parser_1_1http__weighted__value-members.html +++ b/classstdex_1_1parser_1_1http__weighted__value-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__weighted__value.html b/classstdex_1_1parser_1_1http__weighted__value.html index ab16bc1ea..363cd5fd5 100644 --- a/classstdex_1_1parser_1_1http__weighted__value.html +++ b/classstdex_1_1parser_1_1http__weighted__value.html @@ -193,7 +193,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1parser__collection-members.html b/classstdex_1_1parser_1_1parser__collection-members.html index 7b47e9409..637a3fa3c 100644 --- a/classstdex_1_1parser_1_1parser__collection-members.html +++ b/classstdex_1_1parser_1_1parser__collection-members.html @@ -98,7 +98,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1parser__collection.html b/classstdex_1_1parser_1_1parser__collection.html index 33e83d3f4..ba0e7ecda 100644 --- a/classstdex_1_1parser_1_1parser__collection.html +++ b/classstdex_1_1parser_1_1parser__collection.html @@ -193,7 +193,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1sgml__any__cp-members.html b/classstdex_1_1parser_1_1sgml__any__cp-members.html index b310b5caf..3e352ec26 100644 --- a/classstdex_1_1parser_1_1sgml__any__cp-members.html +++ b/classstdex_1_1parser_1_1sgml__any__cp-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__any__cp.html b/classstdex_1_1parser_1_1sgml__any__cp.html index a4266614f..2ec9cace5 100644 --- a/classstdex_1_1parser_1_1sgml__any__cp.html +++ b/classstdex_1_1parser_1_1sgml__any__cp.html @@ -158,7 +158,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__cp-members.html b/classstdex_1_1parser_1_1sgml__cp-members.html index 923b31e94..4ce8f172e 100644 --- a/classstdex_1_1parser_1_1sgml__cp-members.html +++ b/classstdex_1_1parser_1_1sgml__cp-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__cp.html b/classstdex_1_1parser_1_1sgml__cp.html index 409d373af..da10951bd 100644 --- a/classstdex_1_1parser_1_1sgml__cp.html +++ b/classstdex_1_1parser_1_1sgml__cp.html @@ -160,7 +160,7 @@ Additional Inherited Members diff --git a/classstdex_1_1parser_1_1sgml__cp__set-members.html b/classstdex_1_1parser_1_1sgml__cp__set-members.html index d873ac61f..86b970acb 100644 --- a/classstdex_1_1parser_1_1sgml__cp__set-members.html +++ b/classstdex_1_1parser_1_1sgml__cp__set-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__cp__set.html b/classstdex_1_1parser_1_1sgml__cp__set.html index 40138c3fd..e95792e11 100644 --- a/classstdex_1_1parser_1_1sgml__cp__set.html +++ b/classstdex_1_1parser_1_1sgml__cp__set.html @@ -172,7 +172,7 @@ Additional Inherited Members diff --git a/classstdex_1_1parser_1_1sgml__dns__domain__char-members.html b/classstdex_1_1parser_1_1sgml__dns__domain__char-members.html index e9a89db85..79cc01906 100644 --- a/classstdex_1_1parser_1_1sgml__dns__domain__char-members.html +++ b/classstdex_1_1parser_1_1sgml__dns__domain__char-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__dns__domain__char.html b/classstdex_1_1parser_1_1sgml__dns__domain__char.html index aeca61657..276b21c57 100644 --- a/classstdex_1_1parser_1_1sgml__dns__domain__char.html +++ b/classstdex_1_1parser_1_1sgml__dns__domain__char.html @@ -167,7 +167,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char-members.html b/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char-members.html index 491544581..baac7dc73 100644 --- a/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char-members.html +++ b/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char-members.html @@ -88,7 +88,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char.html b/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char.html index b3052aa65..20d30bb6a 100644 --- a/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char.html +++ b/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char.html @@ -150,7 +150,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__punct__cp-members.html b/classstdex_1_1parser_1_1sgml__punct__cp-members.html index fe8ac1e7f..ea2e60136 100644 --- a/classstdex_1_1parser_1_1sgml__punct__cp-members.html +++ b/classstdex_1_1parser_1_1sgml__punct__cp-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__punct__cp.html b/classstdex_1_1parser_1_1sgml__punct__cp.html index ecba87e1b..a7709519c 100644 --- a/classstdex_1_1parser_1_1sgml__punct__cp.html +++ b/classstdex_1_1parser_1_1sgml__punct__cp.html @@ -162,7 +162,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__space__cp-members.html b/classstdex_1_1parser_1_1sgml__space__cp-members.html index b7af4c57b..1f867d2a6 100644 --- a/classstdex_1_1parser_1_1sgml__space__cp-members.html +++ b/classstdex_1_1parser_1_1sgml__space__cp-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__space__cp.html b/classstdex_1_1parser_1_1sgml__space__cp.html index fb721df58..c8045a572 100644 --- a/classstdex_1_1parser_1_1sgml__space__cp.html +++ b/classstdex_1_1parser_1_1sgml__space__cp.html @@ -162,7 +162,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__space__or__punct__cp-members.html b/classstdex_1_1parser_1_1sgml__space__or__punct__cp-members.html index 7e0ec0a8d..ef6240bd8 100644 --- a/classstdex_1_1parser_1_1sgml__space__or__punct__cp-members.html +++ b/classstdex_1_1parser_1_1sgml__space__or__punct__cp-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__space__or__punct__cp.html b/classstdex_1_1parser_1_1sgml__space__or__punct__cp.html index 6a92002b7..4944d3e9b 100644 --- a/classstdex_1_1parser_1_1sgml__space__or__punct__cp.html +++ b/classstdex_1_1parser_1_1sgml__space__or__punct__cp.html @@ -162,7 +162,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__string-members.html b/classstdex_1_1parser_1_1sgml__string-members.html index b64be4d3b..8bc405fa6 100644 --- a/classstdex_1_1parser_1_1sgml__string-members.html +++ b/classstdex_1_1parser_1_1sgml__string-members.html @@ -89,7 +89,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__string.html b/classstdex_1_1parser_1_1sgml__string.html index d951bc6bb..437ea2414 100644 --- a/classstdex_1_1parser_1_1sgml__string.html +++ b/classstdex_1_1parser_1_1sgml__string.html @@ -157,7 +157,7 @@ Additional Inherited Members diff --git a/classstdex_1_1parser_1_1sgml__url__password__char-members.html b/classstdex_1_1parser_1_1sgml__url__password__char-members.html index 367296fef..49f82c3e0 100644 --- a/classstdex_1_1parser_1_1sgml__url__password__char-members.html +++ b/classstdex_1_1parser_1_1sgml__url__password__char-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__url__password__char.html b/classstdex_1_1parser_1_1sgml__url__password__char.html index 8375e48c1..ad1492060 100644 --- a/classstdex_1_1parser_1_1sgml__url__password__char.html +++ b/classstdex_1_1parser_1_1sgml__url__password__char.html @@ -158,7 +158,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__url__path__char-members.html b/classstdex_1_1parser_1_1sgml__url__path__char-members.html index 41fb901ab..8c0f7c8cc 100644 --- a/classstdex_1_1parser_1_1sgml__url__path__char-members.html +++ b/classstdex_1_1parser_1_1sgml__url__path__char-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__url__path__char.html b/classstdex_1_1parser_1_1sgml__url__path__char.html index 7ce8d5690..1d210ca01 100644 --- a/classstdex_1_1parser_1_1sgml__url__path__char.html +++ b/classstdex_1_1parser_1_1sgml__url__path__char.html @@ -158,7 +158,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__url__username__char-members.html b/classstdex_1_1parser_1_1sgml__url__username__char-members.html index 4901ae801..b9e2e8bac 100644 --- a/classstdex_1_1parser_1_1sgml__url__username__char-members.html +++ b/classstdex_1_1parser_1_1sgml__url__username__char-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__url__username__char.html b/classstdex_1_1parser_1_1sgml__url__username__char.html index 3136a0c9d..0f3a44e46 100644 --- a/classstdex_1_1parser_1_1sgml__url__username__char.html +++ b/classstdex_1_1parser_1_1sgml__url__username__char.html @@ -158,7 +158,7 @@ std::locale m_locale diff --git a/classstdex_1_1pool-members.html b/classstdex_1_1pool-members.html index 2b4bcfd5c..b3d062a5a 100644 --- a/classstdex_1_1pool-members.html +++ b/classstdex_1_1pool-members.html @@ -89,7 +89,7 @@ $(function() { diff --git a/classstdex_1_1pool.html b/classstdex_1_1pool.html index dfb153126..8cc4eb3f3 100644 --- a/classstdex_1_1pool.html +++ b/classstdex_1_1pool.html @@ -194,7 +194,7 @@ template<class T > diff --git a/classstdex_1_1progress-members.html b/classstdex_1_1progress-members.html index cde0e5873..139c71685 100644 --- a/classstdex_1_1progress-members.html +++ b/classstdex_1_1progress-members.html @@ -91,7 +91,7 @@ $(function() { diff --git a/classstdex_1_1progress.html b/classstdex_1_1progress.html index f56a87a8d..35465d56e 100644 --- a/classstdex_1_1progress.html +++ b/classstdex_1_1progress.html @@ -313,7 +313,7 @@ template<class T > diff --git a/classstdex_1_1progress__switcher-members.html b/classstdex_1_1progress__switcher-members.html index 275c85050..16406d1b3 100644 --- a/classstdex_1_1progress__switcher-members.html +++ b/classstdex_1_1progress__switcher-members.html @@ -103,7 +103,7 @@ $(function() { diff --git a/classstdex_1_1progress__switcher.html b/classstdex_1_1progress__switcher.html index e4013d75d..a51aaeb4c 100644 --- a/classstdex_1_1progress__switcher.html +++ b/classstdex_1_1progress__switcher.html @@ -165,7 +165,7 @@ class stdex::progress_switcher< T >

Progress indicator switcher. <

diff --git a/classstdex_1_1ring-members.html b/classstdex_1_1ring-members.html index 666f2209f..0705225de 100644 --- a/classstdex_1_1ring-members.html +++ b/classstdex_1_1ring-members.html @@ -102,7 +102,7 @@ $(function() { diff --git a/classstdex_1_1ring.html b/classstdex_1_1ring.html index 2b57d203b..0f62f030c 100644 --- a/classstdex_1_1ring.html +++ b/classstdex_1_1ring.html @@ -296,7 +296,7 @@ template<class T , size_t N_cap> diff --git a/classstdex_1_1sha1__hash-members.html b/classstdex_1_1sha1__hash-members.html index 0942295ff..f92ad7da2 100644 --- a/classstdex_1_1sha1__hash-members.html +++ b/classstdex_1_1sha1__hash-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1sha1__hash.html b/classstdex_1_1sha1__hash.html index a723b5ef5..dae94d9fa 100644 --- a/classstdex_1_1sha1__hash.html +++ b/classstdex_1_1sha1__hash.html @@ -261,7 +261,7 @@ uint32_t m_temp [16] diff --git a/classstdex_1_1spinlock-members.html b/classstdex_1_1spinlock-members.html index 5dd26dd93..f8351a643 100644 --- a/classstdex_1_1spinlock-members.html +++ b/classstdex_1_1spinlock-members.html @@ -88,7 +88,7 @@ $(function() { diff --git a/classstdex_1_1spinlock.html b/classstdex_1_1spinlock.html index 89e5b83ec..31a514b08 100644 --- a/classstdex_1_1spinlock.html +++ b/classstdex_1_1spinlock.html @@ -140,7 +140,7 @@ void unlock () noexcep diff --git a/classstdex_1_1stream_1_1async__reader-members.html b/classstdex_1_1stream_1_1async__reader-members.html index e72822f3b..30f7e7e55 100644 --- a/classstdex_1_1stream_1_1async__reader-members.html +++ b/classstdex_1_1stream_1_1async__reader-members.html @@ -156,7 +156,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1async__reader.html b/classstdex_1_1stream_1_1async__reader.html index 8e1227f70..bb6eea4a6 100644 --- a/classstdex_1_1stream_1_1async__reader.html +++ b/classstdex_1_1stream_1_1async__reader.html @@ -405,7 +405,7 @@ template<size_t N_cap = default_async_limit> diff --git a/classstdex_1_1stream_1_1async__writer-members.html b/classstdex_1_1stream_1_1async__writer-members.html index aad61b00a..cd1143018 100644 --- a/classstdex_1_1stream_1_1async__writer-members.html +++ b/classstdex_1_1stream_1_1async__writer-members.html @@ -156,7 +156,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1async__writer.html b/classstdex_1_1stream_1_1async__writer.html index 5316152ba..5a106de2c 100644 --- a/classstdex_1_1stream_1_1async__writer.html +++ b/classstdex_1_1stream_1_1async__writer.html @@ -436,7 +436,7 @@ template<size_t N_cap = default_async_limit> diff --git a/classstdex_1_1stream_1_1basic-members.html b/classstdex_1_1stream_1_1basic-members.html index 6711c39d6..dc4e79341 100644 --- a/classstdex_1_1stream_1_1basic-members.html +++ b/classstdex_1_1stream_1_1basic-members.html @@ -149,7 +149,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1basic.html b/classstdex_1_1stream_1_1basic.html index f64113241..8fbc4e886 100644 --- a/classstdex_1_1stream_1_1basic.html +++ b/classstdex_1_1stream_1_1basic.html @@ -1255,7 +1255,7 @@ template<class T > diff --git a/classstdex_1_1stream_1_1basic__file-members.html b/classstdex_1_1stream_1_1basic__file-members.html index becbb2edc..ae502a689 100644 --- a/classstdex_1_1stream_1_1basic__file-members.html +++ b/classstdex_1_1stream_1_1basic__file-members.html @@ -165,7 +165,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1basic__file.html b/classstdex_1_1stream_1_1basic__file.html index a70fd51d5..e27610199 100644 --- a/classstdex_1_1stream_1_1basic__file.html +++ b/classstdex_1_1stream_1_1basic__file.html @@ -929,7 +929,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1basic__sys-members.html b/classstdex_1_1stream_1_1basic__sys-members.html index 31e51e09f..1ad227d61 100644 --- a/classstdex_1_1stream_1_1basic__sys-members.html +++ b/classstdex_1_1stream_1_1basic__sys-members.html @@ -161,7 +161,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1basic__sys.html b/classstdex_1_1stream_1_1basic__sys.html index c51b8e8a3..0c8a5a8ef 100644 --- a/classstdex_1_1stream_1_1basic__sys.html +++ b/classstdex_1_1stream_1_1basic__sys.html @@ -511,7 +511,7 @@ sys_handle m_h
diff --git a/classstdex_1_1stream_1_1buffer-members.html b/classstdex_1_1stream_1_1buffer-members.html index 33574a69d..0bf4637fd 100644 --- a/classstdex_1_1stream_1_1buffer-members.html +++ b/classstdex_1_1stream_1_1buffer-members.html @@ -156,7 +156,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1buffer.html b/classstdex_1_1stream_1_1buffer.html index a45f932b7..53377d1f9 100644 --- a/classstdex_1_1stream_1_1buffer.html +++ b/classstdex_1_1stream_1_1buffer.html @@ -473,7 +473,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1buffered__sys-members.html b/classstdex_1_1stream_1_1buffered__sys-members.html index 8b51cde0d..7c8d40c93 100644 --- a/classstdex_1_1stream_1_1buffered__sys-members.html +++ b/classstdex_1_1stream_1_1buffered__sys-members.html @@ -158,7 +158,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1buffered__sys.html b/classstdex_1_1stream_1_1buffered__sys.html index 7ff126899..6b0f89e44 100644 --- a/classstdex_1_1stream_1_1buffered__sys.html +++ b/classstdex_1_1stream_1_1buffered__sys.html @@ -363,7 +363,7 @@ void flush_write () diff --git a/classstdex_1_1stream_1_1cache-members.html b/classstdex_1_1stream_1_1cache-members.html index 357d19b6b..0f5d19445 100644 --- a/classstdex_1_1stream_1_1cache-members.html +++ b/classstdex_1_1stream_1_1cache-members.html @@ -167,7 +167,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1cache.html b/classstdex_1_1stream_1_1cache.html index 1b3d14cc4..404f02732 100644 --- a/classstdex_1_1stream_1_1cache.html +++ b/classstdex_1_1stream_1_1cache.html @@ -885,7 +885,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1cached__file-members.html b/classstdex_1_1stream_1_1cached__file-members.html index 34c42b99b..55f29906f 100644 --- a/classstdex_1_1stream_1_1cached__file-members.html +++ b/classstdex_1_1stream_1_1cached__file-members.html @@ -175,7 +175,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1cached__file.html b/classstdex_1_1stream_1_1cached__file.html index bc16b7d8b..4c5a9f191 100644 --- a/classstdex_1_1stream_1_1cached__file.html +++ b/classstdex_1_1stream_1_1cached__file.html @@ -578,7 +578,7 @@ template<class TR = std::char_traits<schar_t>, class AX = std::alloca diff --git a/classstdex_1_1stream_1_1converter-members.html b/classstdex_1_1stream_1_1converter-members.html index f6badb1b4..87f0c4919 100644 --- a/classstdex_1_1stream_1_1converter-members.html +++ b/classstdex_1_1stream_1_1converter-members.html @@ -151,7 +151,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1converter.html b/classstdex_1_1stream_1_1converter.html index d659481bc..8fbcf2232 100644 --- a/classstdex_1_1stream_1_1converter.html +++ b/classstdex_1_1stream_1_1converter.html @@ -491,7 +491,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1diag__file-members.html b/classstdex_1_1stream_1_1diag__file-members.html index ab4d3bc90..28697cff9 100644 --- a/classstdex_1_1stream_1_1diag__file-members.html +++ b/classstdex_1_1stream_1_1diag__file-members.html @@ -168,7 +168,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1diag__file.html b/classstdex_1_1stream_1_1diag__file.html index 00c8d4e30..9866c8ff3 100644 --- a/classstdex_1_1stream_1_1diag__file.html +++ b/classstdex_1_1stream_1_1diag__file.html @@ -717,7 +717,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1fifo-members.html b/classstdex_1_1stream_1_1fifo-members.html index 385b8c5f8..a7f4a50dd 100644 --- a/classstdex_1_1stream_1_1fifo-members.html +++ b/classstdex_1_1stream_1_1fifo-members.html @@ -156,7 +156,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1fifo.html b/classstdex_1_1stream_1_1fifo.html index ba238dc70..896c13de8 100644 --- a/classstdex_1_1stream_1_1fifo.html +++ b/classstdex_1_1stream_1_1fifo.html @@ -463,7 +463,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1file-members.html b/classstdex_1_1stream_1_1file-members.html index cabe96fd6..6b4f85a96 100644 --- a/classstdex_1_1stream_1_1file-members.html +++ b/classstdex_1_1stream_1_1file-members.html @@ -190,7 +190,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1file.html b/classstdex_1_1stream_1_1file.html index 06392912a..ae65561d7 100644 --- a/classstdex_1_1stream_1_1file.html +++ b/classstdex_1_1stream_1_1file.html @@ -1115,7 +1115,7 @@ template<class TR = std::char_traits<schar_t>, class AX = std::alloca diff --git a/classstdex_1_1stream_1_1file__window-members.html b/classstdex_1_1stream_1_1file__window-members.html index 1974436b3..96a91e37c 100644 --- a/classstdex_1_1stream_1_1file__window-members.html +++ b/classstdex_1_1stream_1_1file__window-members.html @@ -169,7 +169,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1file__window.html b/classstdex_1_1stream_1_1file__window.html index 1b9df3274..802687f77 100644 --- a/classstdex_1_1stream_1_1file__window.html +++ b/classstdex_1_1stream_1_1file__window.html @@ -749,7 +749,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1limiter-members.html b/classstdex_1_1stream_1_1limiter-members.html index fdc794885..12e6196e9 100644 --- a/classstdex_1_1stream_1_1limiter-members.html +++ b/classstdex_1_1stream_1_1limiter-members.html @@ -154,7 +154,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1limiter.html b/classstdex_1_1stream_1_1limiter.html index 83e7fd6a8..8727d91d0 100644 --- a/classstdex_1_1stream_1_1limiter.html +++ b/classstdex_1_1stream_1_1limiter.html @@ -440,7 +440,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1memory__file-members.html b/classstdex_1_1stream_1_1memory__file-members.html index cf16dbf96..9f6659e23 100644 --- a/classstdex_1_1stream_1_1memory__file-members.html +++ b/classstdex_1_1stream_1_1memory__file-members.html @@ -213,7 +213,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1memory__file.html b/classstdex_1_1stream_1_1memory__file.html index a80176519..b097d9626 100644 --- a/classstdex_1_1stream_1_1memory__file.html +++ b/classstdex_1_1stream_1_1memory__file.html @@ -1719,7 +1719,7 @@ template<class T > diff --git a/classstdex_1_1stream_1_1replicator-members.html b/classstdex_1_1stream_1_1replicator-members.html index 5469a194a..76421b717 100644 --- a/classstdex_1_1stream_1_1replicator-members.html +++ b/classstdex_1_1stream_1_1replicator-members.html @@ -154,7 +154,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1replicator.html b/classstdex_1_1stream_1_1replicator.html index e9a7d0e76..90c11dca1 100644 --- a/classstdex_1_1stream_1_1replicator.html +++ b/classstdex_1_1stream_1_1replicator.html @@ -453,7 +453,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1replicator_1_1worker-members.html b/classstdex_1_1stream_1_1replicator_1_1worker-members.html index 799d286d3..cd83af9d9 100644 --- a/classstdex_1_1stream_1_1replicator_1_1worker-members.html +++ b/classstdex_1_1stream_1_1replicator_1_1worker-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1replicator_1_1worker.html b/classstdex_1_1stream_1_1replicator_1_1worker.html index e12fee05c..9721c4efc 100644 --- a/classstdex_1_1stream_1_1replicator_1_1worker.html +++ b/classstdex_1_1stream_1_1replicator_1_1worker.html @@ -151,7 +151,7 @@ void process_op () diff --git a/classstdex_1_1stream_1_1socket-members.html b/classstdex_1_1stream_1_1socket-members.html index 8a3219da0..a38921a09 100644 --- a/classstdex_1_1stream_1_1socket-members.html +++ b/classstdex_1_1stream_1_1socket-members.html @@ -157,7 +157,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1socket.html b/classstdex_1_1stream_1_1socket.html index c9b5950e7..d0d27b9ee 100644 --- a/classstdex_1_1stream_1_1socket.html +++ b/classstdex_1_1stream_1_1socket.html @@ -509,7 +509,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1window-members.html b/classstdex_1_1stream_1_1window-members.html index afb1e4210..4014a457b 100644 --- a/classstdex_1_1stream_1_1window-members.html +++ b/classstdex_1_1stream_1_1window-members.html @@ -157,7 +157,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1window.html b/classstdex_1_1stream_1_1window.html index 912596568..742b7decc 100644 --- a/classstdex_1_1stream_1_1window.html +++ b/classstdex_1_1stream_1_1window.html @@ -449,7 +449,7 @@ state_t m_state diff --git a/classstdex_1_1stream__hasher-members.html b/classstdex_1_1stream__hasher-members.html index 5b4e77a3f..ffc035506 100644 --- a/classstdex_1_1stream__hasher-members.html +++ b/classstdex_1_1stream__hasher-members.html @@ -153,7 +153,7 @@ $(function() { diff --git a/classstdex_1_1stream__hasher.html b/classstdex_1_1stream__hasher.html index d0ddc3398..74eeb2ac6 100644 --- a/classstdex_1_1stream__hasher.html +++ b/classstdex_1_1stream__hasher.html @@ -432,7 +432,7 @@ template<class T > diff --git a/classstdex_1_1sys__object-members.html b/classstdex_1_1sys__object-members.html index dd9e5bb00..033412784 100644 --- a/classstdex_1_1sys__object-members.html +++ b/classstdex_1_1sys__object-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1sys__object.html b/classstdex_1_1sys__object.html index cd7938027..41212b954 100644 --- a/classstdex_1_1sys__object.html +++ b/classstdex_1_1sys__object.html @@ -184,7 +184,7 @@ sys_handle m_h diff --git a/classstdex_1_1timeout__progress-members.html b/classstdex_1_1timeout__progress-members.html index 0177053be..b93a7f75a 100644 --- a/classstdex_1_1timeout__progress-members.html +++ b/classstdex_1_1timeout__progress-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1timeout__progress.html b/classstdex_1_1timeout__progress.html index ca3fe3006..347960bfc 100644 --- a/classstdex_1_1timeout__progress.html +++ b/classstdex_1_1timeout__progress.html @@ -363,7 +363,7 @@ template<class T > diff --git a/classstdex_1_1user__cancelled-members.html b/classstdex_1_1user__cancelled-members.html index ca5af0ae8..4aa802a20 100644 --- a/classstdex_1_1user__cancelled-members.html +++ b/classstdex_1_1user__cancelled-members.html @@ -86,7 +86,7 @@ $(function() { diff --git a/classstdex_1_1user__cancelled.html b/classstdex_1_1user__cancelled.html index 743181aed..cc8321edb 100644 --- a/classstdex_1_1user__cancelled.html +++ b/classstdex_1_1user__cancelled.html @@ -142,7 +142,7 @@ Public Member Functions diff --git a/classstdex_1_1vector__queue-members.html b/classstdex_1_1vector__queue-members.html index 24da7b285..77db6ef2c 100644 --- a/classstdex_1_1vector__queue-members.html +++ b/classstdex_1_1vector__queue-members.html @@ -124,7 +124,7 @@ $(function() { diff --git a/classstdex_1_1vector__queue.html b/classstdex_1_1vector__queue.html index 650c30252..8a140537b 100644 --- a/classstdex_1_1vector__queue.html +++ b/classstdex_1_1vector__queue.html @@ -782,7 +782,7 @@ template<class T > diff --git a/classstdex_1_1watchdog-members.html b/classstdex_1_1watchdog-members.html index 41cfcab5f..baaf43338 100644 --- a/classstdex_1_1watchdog-members.html +++ b/classstdex_1_1watchdog-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1watchdog.html b/classstdex_1_1watchdog.html index 01ea49530..8cf506472 100644 --- a/classstdex_1_1watchdog.html +++ b/classstdex_1_1watchdog.html @@ -218,7 +218,7 @@ template<class _Clock , class _Duration = typename _Clock::duration> diff --git a/classstdex_1_1zlib__reader-members.html b/classstdex_1_1zlib__reader-members.html index f75a16353..4d0c77bc7 100644 --- a/classstdex_1_1zlib__reader-members.html +++ b/classstdex_1_1zlib__reader-members.html @@ -156,7 +156,7 @@ $(function() { diff --git a/classstdex_1_1zlib__reader.html b/classstdex_1_1zlib__reader.html index da0cf45d1..77492f45b 100644 --- a/classstdex_1_1zlib__reader.html +++ b/classstdex_1_1zlib__reader.html @@ -392,7 +392,7 @@ state_t m_state diff --git a/classstdex_1_1zlib__writer-members.html b/classstdex_1_1zlib__writer-members.html index 2d9c5f8f3..f31ecb9a5 100644 --- a/classstdex_1_1zlib__writer-members.html +++ b/classstdex_1_1zlib__writer-members.html @@ -156,7 +156,7 @@ $(function() { diff --git a/classstdex_1_1zlib__writer.html b/classstdex_1_1zlib__writer.html index 5b254b598..3de72d067 100644 --- a/classstdex_1_1zlib__writer.html +++ b/classstdex_1_1zlib__writer.html @@ -392,7 +392,7 @@ state_t m_state diff --git a/debug_8hpp_source.html b/debug_8hpp_source.html index 0039142a4..97a188d8b 100644 --- a/debug_8hpp_source.html +++ b/debug_8hpp_source.html @@ -213,7 +213,7 @@ $(function() { codefold.init(0); }); diff --git a/dir_4be4f7b278e009bf0f1906cf31fb73bd.html b/dir_4be4f7b278e009bf0f1906cf31fb73bd.html index 70134200a..8f2038418 100644 --- a/dir_4be4f7b278e009bf0f1906cf31fb73bd.html +++ b/dir_4be4f7b278e009bf0f1906cf31fb73bd.html @@ -90,7 +90,7 @@ Files diff --git a/dir_d44c64559bbebec7f509842c48db8b23.html b/dir_d44c64559bbebec7f509842c48db8b23.html index 5446e96b5..834721b2e 100644 --- a/dir_d44c64559bbebec7f509842c48db8b23.html +++ b/dir_d44c64559bbebec7f509842c48db8b23.html @@ -88,7 +88,7 @@ Directories diff --git a/dir_fca3c47b2ea228727bd6729832f89576.html b/dir_fca3c47b2ea228727bd6729832f89576.html index 3fc03d9ed..cd1881292 100644 --- a/dir_fca3c47b2ea228727bd6729832f89576.html +++ b/dir_fca3c47b2ea228727bd6729832f89576.html @@ -154,7 +154,7 @@ Files diff --git a/endian_8hpp_source.html b/endian_8hpp_source.html index b92c105b3..278abb853 100644 --- a/endian_8hpp_source.html +++ b/endian_8hpp_source.html @@ -227,7 +227,7 @@ $(function() { codefold.init(0); }); diff --git a/exception_8hpp_source.html b/exception_8hpp_source.html index d0e95d0b5..0e1b39a37 100644 --- a/exception_8hpp_source.html +++ b/exception_8hpp_source.html @@ -109,7 +109,7 @@ $(function() { codefold.init(0); }); diff --git a/files.html b/files.html index e63317dbc..7383142aa 100644 --- a/files.html +++ b/files.html @@ -121,7 +121,7 @@ $(function() { diff --git a/functions.html b/functions.html index 10ae6541f..d8f11b11b 100644 --- a/functions.html +++ b/functions.html @@ -97,7 +97,7 @@ $(function() { diff --git a/functions_b.html b/functions_b.html index 0c53e9cb5..d3403ea30 100644 --- a/functions_b.html +++ b/functions_b.html @@ -91,7 +91,7 @@ $(function() { diff --git a/functions_c.html b/functions_c.html index f852bfa62..7c5e3320a 100644 --- a/functions_c.html +++ b/functions_c.html @@ -100,7 +100,7 @@ $(function() { diff --git a/functions_d.html b/functions_d.html index 506a97f93..0e0575df1 100644 --- a/functions_d.html +++ b/functions_d.html @@ -93,7 +93,7 @@ $(function() { diff --git a/functions_e.html b/functions_e.html index 72efb68ec..635c3b514 100644 --- a/functions_e.html +++ b/functions_e.html @@ -93,7 +93,7 @@ $(function() { diff --git a/functions_enum.html b/functions_enum.html index e1b9ae162..72e71c46d 100644 --- a/functions_enum.html +++ b/functions_enum.html @@ -78,7 +78,7 @@ $(function() { diff --git a/functions_f.html b/functions_f.html index 971ce6ab4..bdff111fe 100644 --- a/functions_f.html +++ b/functions_f.html @@ -89,7 +89,7 @@ $(function() { diff --git a/functions_func.html b/functions_func.html index 2a868dd2f..3121d4389 100644 --- a/functions_func.html +++ b/functions_func.html @@ -91,7 +91,7 @@ $(function() { diff --git a/functions_func_b.html b/functions_func_b.html index 128a71994..54174a20d 100644 --- a/functions_func_b.html +++ b/functions_func_b.html @@ -83,7 +83,7 @@ $(function() { diff --git a/functions_func_c.html b/functions_func_c.html index ee1061c28..4a14b47a7 100644 --- a/functions_func_c.html +++ b/functions_func_c.html @@ -87,7 +87,7 @@ $(function() { diff --git a/functions_func_d.html b/functions_func_d.html index aaa41ddf1..037bd72d2 100644 --- a/functions_func_d.html +++ b/functions_func_d.html @@ -87,7 +87,7 @@ $(function() { diff --git a/functions_func_e.html b/functions_func_e.html index 7faebe61f..0f00ecba0 100644 --- a/functions_func_e.html +++ b/functions_func_e.html @@ -84,7 +84,7 @@ $(function() { diff --git a/functions_func_f.html b/functions_func_f.html index 04307766f..1a926172e 100644 --- a/functions_func_f.html +++ b/functions_func_f.html @@ -88,7 +88,7 @@ $(function() { diff --git a/functions_func_g.html b/functions_func_g.html index 2edda4186..55200e47d 100644 --- a/functions_func_g.html +++ b/functions_func_g.html @@ -81,7 +81,7 @@ $(function() { diff --git a/functions_func_h.html b/functions_func_h.html index 514223c6c..4dea8b992 100644 --- a/functions_func_h.html +++ b/functions_func_h.html @@ -83,7 +83,7 @@ $(function() { diff --git a/functions_func_i.html b/functions_func_i.html index aac0ca483..b4a613e9a 100644 --- a/functions_func_i.html +++ b/functions_func_i.html @@ -100,7 +100,7 @@ $(function() { diff --git a/functions_func_l.html b/functions_func_l.html index d5ef47388..b8704875f 100644 --- a/functions_func_l.html +++ b/functions_func_l.html @@ -83,7 +83,7 @@ $(function() { diff --git a/functions_func_m.html b/functions_func_m.html index 18b619321..ef56fd708 100644 --- a/functions_func_m.html +++ b/functions_func_m.html @@ -85,7 +85,7 @@ $(function() { diff --git a/functions_func_n.html b/functions_func_n.html index d0106dc74..59e22057f 100644 --- a/functions_func_n.html +++ b/functions_func_n.html @@ -80,7 +80,7 @@ $(function() { diff --git a/functions_func_o.html b/functions_func_o.html index b7e2df08f..f52ec5a6a 100644 --- a/functions_func_o.html +++ b/functions_func_o.html @@ -94,7 +94,7 @@ $(function() { diff --git a/functions_func_p.html b/functions_func_p.html index 2fee5ed9d..d2c57f3f3 100644 --- a/functions_func_p.html +++ b/functions_func_p.html @@ -87,7 +87,7 @@ $(function() { diff --git a/functions_func_q.html b/functions_func_q.html index c06ec5027..22f1ff149 100644 --- a/functions_func_q.html +++ b/functions_func_q.html @@ -80,7 +80,7 @@ $(function() { diff --git a/functions_func_r.html b/functions_func_r.html index f0b78f3dd..0cfffabd6 100644 --- a/functions_func_r.html +++ b/functions_func_r.html @@ -94,7 +94,7 @@ $(function() { diff --git a/functions_func_s.html b/functions_func_s.html index 6ddc0cdb3..7885dea69 100644 --- a/functions_func_s.html +++ b/functions_func_s.html @@ -103,7 +103,7 @@ $(function() { diff --git a/functions_func_t.html b/functions_func_t.html index 1e9a10e04..1dd8e24f9 100644 --- a/functions_func_t.html +++ b/functions_func_t.html @@ -88,7 +88,7 @@ $(function() { diff --git a/functions_func_u.html b/functions_func_u.html index b7a754b12..dbf458215 100644 --- a/functions_func_u.html +++ b/functions_func_u.html @@ -81,7 +81,7 @@ $(function() { diff --git a/functions_func_v.html b/functions_func_v.html index f516f01b8..bd575a350 100644 --- a/functions_func_v.html +++ b/functions_func_v.html @@ -80,7 +80,7 @@ $(function() { diff --git a/functions_func_w.html b/functions_func_w.html index 764917a99..ba6f14a3b 100644 --- a/functions_func_w.html +++ b/functions_func_w.html @@ -89,7 +89,7 @@ $(function() { diff --git a/functions_func_~.html b/functions_func_~.html index 9e9e45acf..185c8ab5d 100644 --- a/functions_func_~.html +++ b/functions_func_~.html @@ -82,7 +82,7 @@ $(function() { diff --git a/functions_g.html b/functions_g.html index a45371e44..ece548a94 100644 --- a/functions_g.html +++ b/functions_g.html @@ -81,7 +81,7 @@ $(function() { diff --git a/functions_h.html b/functions_h.html index 99cc63d9b..51a32ddef 100644 --- a/functions_h.html +++ b/functions_h.html @@ -84,7 +84,7 @@ $(function() { diff --git a/functions_i.html b/functions_i.html index c374b00a2..969733c97 100644 --- a/functions_i.html +++ b/functions_i.html @@ -103,7 +103,7 @@ $(function() { diff --git a/functions_l.html b/functions_l.html index 2eb1b9f57..3032d2404 100644 --- a/functions_l.html +++ b/functions_l.html @@ -85,7 +85,7 @@ $(function() { diff --git a/functions_m.html b/functions_m.html index 4144f10a8..27e5536b1 100644 --- a/functions_m.html +++ b/functions_m.html @@ -126,7 +126,7 @@ $(function() { diff --git a/functions_n.html b/functions_n.html index e09e6a802..bfe3e6988 100644 --- a/functions_n.html +++ b/functions_n.html @@ -90,7 +90,7 @@ $(function() { diff --git a/functions_o.html b/functions_o.html index 6f77ac09a..1174d8301 100644 --- a/functions_o.html +++ b/functions_o.html @@ -98,7 +98,7 @@ $(function() { diff --git a/functions_p.html b/functions_p.html index 4fbc961ef..52b42129d 100644 --- a/functions_p.html +++ b/functions_p.html @@ -97,7 +97,7 @@ $(function() { diff --git a/functions_q.html b/functions_q.html index f61376ec4..447691ea0 100644 --- a/functions_q.html +++ b/functions_q.html @@ -80,7 +80,7 @@ $(function() { diff --git a/functions_r.html b/functions_r.html index 2b7c0c4a4..5fb39279f 100644 --- a/functions_r.html +++ b/functions_r.html @@ -97,7 +97,7 @@ $(function() { diff --git a/functions_rela.html b/functions_rela.html index 19f935fb6..52cd3c12d 100644 --- a/functions_rela.html +++ b/functions_rela.html @@ -79,7 +79,7 @@ $(function() { diff --git a/functions_s.html b/functions_s.html index d7bad8fe9..a9a0c8202 100644 --- a/functions_s.html +++ b/functions_s.html @@ -112,7 +112,7 @@ $(function() { diff --git a/functions_t.html b/functions_t.html index db6b91467..b859db425 100644 --- a/functions_t.html +++ b/functions_t.html @@ -93,7 +93,7 @@ $(function() { diff --git a/functions_type.html b/functions_type.html index bef320516..1dc84574d 100644 --- a/functions_type.html +++ b/functions_type.html @@ -83,7 +83,7 @@ $(function() { diff --git a/functions_u.html b/functions_u.html index 59d12e9a3..0bdd80ed9 100644 --- a/functions_u.html +++ b/functions_u.html @@ -82,7 +82,7 @@ $(function() { diff --git a/functions_v.html b/functions_v.html index 47b2d199d..0a7425e91 100644 --- a/functions_v.html +++ b/functions_v.html @@ -83,7 +83,7 @@ $(function() { diff --git a/functions_vars.html b/functions_vars.html index 23f3b7674..d2763543e 100644 --- a/functions_vars.html +++ b/functions_vars.html @@ -85,7 +85,7 @@ $(function() { diff --git a/functions_vars_b.html b/functions_vars_b.html index 38b20a17d..24f4ad6de 100644 --- a/functions_vars_b.html +++ b/functions_vars_b.html @@ -87,7 +87,7 @@ $(function() { diff --git a/functions_vars_c.html b/functions_vars_c.html index ef162d6b1..ece81f066 100644 --- a/functions_vars_c.html +++ b/functions_vars_c.html @@ -89,7 +89,7 @@ $(function() { diff --git a/functions_vars_d.html b/functions_vars_d.html index 0e86a4865..9b57295da 100644 --- a/functions_vars_d.html +++ b/functions_vars_d.html @@ -86,7 +86,7 @@ $(function() { diff --git a/functions_vars_e.html b/functions_vars_e.html index 306ca99d5..21017e580 100644 --- a/functions_vars_e.html +++ b/functions_vars_e.html @@ -88,7 +88,7 @@ $(function() { diff --git a/functions_vars_f.html b/functions_vars_f.html index 28f5fe59b..6d669f296 100644 --- a/functions_vars_f.html +++ b/functions_vars_f.html @@ -80,7 +80,7 @@ $(function() { diff --git a/functions_vars_h.html b/functions_vars_h.html index 06fff83d1..f86c4d0f8 100644 --- a/functions_vars_h.html +++ b/functions_vars_h.html @@ -80,7 +80,7 @@ $(function() { diff --git a/functions_vars_i.html b/functions_vars_i.html index ff0b099ca..a7d2dfc08 100644 --- a/functions_vars_i.html +++ b/functions_vars_i.html @@ -84,7 +84,7 @@ $(function() { diff --git a/functions_vars_l.html b/functions_vars_l.html index dbda7ba7d..d013f13a8 100644 --- a/functions_vars_l.html +++ b/functions_vars_l.html @@ -81,7 +81,7 @@ $(function() { diff --git a/functions_vars_m.html b/functions_vars_m.html index 456dcb224..931ea99c0 100644 --- a/functions_vars_m.html +++ b/functions_vars_m.html @@ -121,7 +121,7 @@ $(function() { diff --git a/functions_vars_n.html b/functions_vars_n.html index 70ffb982c..cce0f5051 100644 --- a/functions_vars_n.html +++ b/functions_vars_n.html @@ -89,7 +89,7 @@ $(function() { diff --git a/functions_vars_o.html b/functions_vars_o.html index e9908e07f..4c31cd69c 100644 --- a/functions_vars_o.html +++ b/functions_vars_o.html @@ -81,7 +81,7 @@ $(function() { diff --git a/functions_vars_p.html b/functions_vars_p.html index 4222203da..01543880f 100644 --- a/functions_vars_p.html +++ b/functions_vars_p.html @@ -88,7 +88,7 @@ $(function() { diff --git a/functions_vars_r.html b/functions_vars_r.html index d0d6b1025..ee275e2b6 100644 --- a/functions_vars_r.html +++ b/functions_vars_r.html @@ -82,7 +82,7 @@ $(function() { diff --git a/functions_vars_s.html b/functions_vars_s.html index 73c469a08..4607a20ed 100644 --- a/functions_vars_s.html +++ b/functions_vars_s.html @@ -87,7 +87,7 @@ $(function() { diff --git a/functions_vars_t.html b/functions_vars_t.html index b8e7a01ec..a916e9e83 100644 --- a/functions_vars_t.html +++ b/functions_vars_t.html @@ -84,7 +84,7 @@ $(function() { diff --git a/functions_vars_u.html b/functions_vars_u.html index 1e4d4693c..ea6827993 100644 --- a/functions_vars_u.html +++ b/functions_vars_u.html @@ -80,7 +80,7 @@ $(function() { diff --git a/functions_vars_v.html b/functions_vars_v.html index fa209ce8b..fa82a8682 100644 --- a/functions_vars_v.html +++ b/functions_vars_v.html @@ -81,7 +81,7 @@ $(function() { diff --git a/functions_vars_w.html b/functions_vars_w.html index f04a005b1..1995d3d63 100644 --- a/functions_vars_w.html +++ b/functions_vars_w.html @@ -82,7 +82,7 @@ $(function() { diff --git a/functions_w.html b/functions_w.html index 23ef2917f..18444e69d 100644 --- a/functions_w.html +++ b/functions_w.html @@ -92,7 +92,7 @@ $(function() { diff --git a/functions_~.html b/functions_~.html index 0399ea77b..8a3540426 100644 --- a/functions_~.html +++ b/functions_~.html @@ -82,7 +82,7 @@ $(function() { diff --git a/hash_8hpp_source.html b/hash_8hpp_source.html index 14c314ea4..183c5b8a7 100644 --- a/hash_8hpp_source.html +++ b/hash_8hpp_source.html @@ -748,7 +748,7 @@ $(function() { codefold.init(0); }); diff --git a/hex_8hpp_source.html b/hex_8hpp_source.html index bb4044da4..7b5176b73 100644 --- a/hex_8hpp_source.html +++ b/hex_8hpp_source.html @@ -223,7 +223,7 @@ $(function() { codefold.init(0); }); diff --git a/hierarchy.html b/hierarchy.html index dcdbb772d..0ebe3482a 100644 --- a/hierarchy.html +++ b/hierarchy.html @@ -311,7 +311,7 @@ $(function() { diff --git a/html_8hpp_source.html b/html_8hpp_source.html index 6e4f21294..943ed421f 100644 --- a/html_8hpp_source.html +++ b/html_8hpp_source.html @@ -2521,7 +2521,7 @@ $(function() { codefold.init(0); });
token_url_t encoding
URL encoding.
Definition html.hpp:2156
std::basic_string< T, TR, AX > url
URL.
Definition html.hpp:2155
stdex::interval< size_t > interval
Region of the last match.
Definition parser.hpp:120
-
Test for given string.
Definition parser.hpp:835
+
Test for given string.
Definition parser.hpp:814
Progress indicator base class.
Definition progress.hpp:22
virtual bool cancel()
Query whether user requested abort.
Definition progress.hpp:70
virtual void set(T value)
Set current progress.
Definition progress.hpp:52
@@ -2560,12 +2560,12 @@ $(function() { codefold.init(0); });
T end
interval end
Definition interval.hpp:20
T start
interval start
Definition interval.hpp:19
Maps index in source string to index in destination string.
Definition mapping.hpp:17
-
Tag attribute.
Definition parser.hpp:8044
-
stdex::interval< size_t > value
attribute value position in source
Definition parser.hpp:8046
+
Tag attribute.
Definition parser.hpp:8023
+
stdex::interval< size_t > value
attribute value position in source
Definition parser.hpp:8025
diff --git a/idrec_8hpp_source.html b/idrec_8hpp_source.html index 7ae344b0b..00864ad0f 100644 --- a/idrec_8hpp_source.html +++ b/idrec_8hpp_source.html @@ -480,7 +480,7 @@ $(function() { codefold.init(0); }); diff --git a/include_2stdex_2compat_8hpp_source.html b/include_2stdex_2compat_8hpp_source.html index 83237dccd..55f0aef1b 100644 --- a/include_2stdex_2compat_8hpp_source.html +++ b/include_2stdex_2compat_8hpp_source.html @@ -299,7 +299,7 @@ $(function() { codefold.init(0); }); diff --git a/index.html b/index.html index 7fe629db7..4a06cf320 100644 --- a/index.html +++ b/index.html @@ -87,7 +87,7 @@ Requirements diff --git a/interval_8hpp_source.html b/interval_8hpp_source.html index f48eec520..9e3f72aa2 100644 --- a/interval_8hpp_source.html +++ b/interval_8hpp_source.html @@ -253,7 +253,7 @@ $(function() { codefold.init(0); }); diff --git a/locale_8hpp_source.html b/locale_8hpp_source.html index 7dd6b2f58..d241dec29 100644 --- a/locale_8hpp_source.html +++ b/locale_8hpp_source.html @@ -189,7 +189,7 @@ $(function() { codefold.init(0); }); diff --git a/mapping_8hpp_source.html b/mapping_8hpp_source.html index 7f085656d..ad39acf01 100644 --- a/mapping_8hpp_source.html +++ b/mapping_8hpp_source.html @@ -134,7 +134,7 @@ $(function() { codefold.init(0); }); diff --git a/math_8hpp_source.html b/math_8hpp_source.html index 70b42328a..8bea68acf 100644 --- a/math_8hpp_source.html +++ b/math_8hpp_source.html @@ -169,7 +169,7 @@ $(function() { codefold.init(0); }); diff --git a/memory_8hpp_source.html b/memory_8hpp_source.html index ecf0f17a2..c3806b8d8 100644 --- a/memory_8hpp_source.html +++ b/memory_8hpp_source.html @@ -131,7 +131,7 @@ $(function() { codefold.init(0); }); diff --git a/parser_8hpp_source.html b/parser_8hpp_source.html index 21fec93f4..6d58a8c06 100644 --- a/parser_8hpp_source.html +++ b/parser_8hpp_source.html @@ -207,8358 +207,8337 @@ $(function() { codefold.init(0); });
126 _In_ size_t end = SIZE_MAX,
127 _In_ int flags = match_default) = 0;
128
-
130 const wchar_t* next_sgml_cp(_In_ const char* text, _In_ size_t start, _In_ size_t end, _Out_ size_t& chr_end, _Out_ wchar_t(&buf)[3])
-
131 {
-
132 if (text[start] == '&') {
-
133 // Potential entity start
-
134 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
-
135 for (chr_end = start + 1;; chr_end++) {
-
136 if (chr_end >= end || text[chr_end] == 0) {
-
137 // Unterminated entity
-
138 break;
-
139 }
-
140 if (text[chr_end] == ';') {
-
141 // Entity end
-
142 size_t n = chr_end - start - 1;
-
143 if (n >= 2 && text[start + 1] == '#') {
-
144 // Numerical entity
-
145 utf32_t unicode;
-
146 if (text[start + 2] == 'x' || text[start + 2] == 'X')
-
147 unicode = static_cast<utf32_t>(strtou32(text + start + 3, n - 2, nullptr, 16));
-
148 else
-
149 unicode = static_cast<utf32_t>(strtou32(text + start + 2, n - 1, nullptr, 10));
-
150#ifdef _WIN32
-
151 if (unicode < 0x10000) {
-
152 buf[0] = (wchar_t)unicode;
-
153 buf[1] = 0;
-
154 }
-
155 else {
-
156 ucs4_to_surrogate_pair(buf, unicode);
-
157 buf[2] = 0;
-
158 }
-
159#else
-
160 buf[0] = (wchar_t)unicode;
-
161 buf[1] = 0;
-
162#endif
-
163 chr_end++;
-
164 return buf;
-
165 }
-
166 const wchar_t* entity_w = sgml2uni(text + start + 1, n);
-
167 if (entity_w) {
-
168 chr_end++;
-
169 return entity_w;
-
170 }
-
171 // Unknown entity.
-
172 break;
-
173 }
-
174 else if (text[chr_end] == '&' || ctype.is(ctype.space, text[chr_end])) {
-
175 // This char cannot possibly be a part of entity.
-
176 break;
-
177 }
-
178 }
-
179 }
-
180 buf[0] = text[start];
-
181 buf[1] = 0;
-
182 chr_end = start + 1;
-
183 return buf;
-
184 }
-
186
-
187 std::locale m_locale;
-
188 };
+
130 template <class T = wchar_t>
+
131 const T* next_sgml_cp(_In_ const char* text, _In_ size_t start, _In_ size_t end, _Out_ size_t& chr_end, _Out_ T(&buf)[5])
+
132 {
+
133 if (text[start] == '&') {
+
134 // Potential entity start
+
135 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
+
136 for (chr_end = start + 1;; chr_end++) {
+
137 if (chr_end >= end || text[chr_end] == 0) {
+
138 // Unterminated entity
+
139 break;
+
140 }
+
141 if (text[chr_end] == ';') {
+
142 // Entity end
+
143 utf32_t buf32[2];
+
144 size_t n = chr_end - start - 1;
+
145 auto entity_w = utf32_to_wstr(sgml2uni(text + start + 1, n, buf32), buf);
+
146 if (entity_w) {
+
147 chr_end++;
+
148 return entity_w;
+
149 }
+
150 // Unknown entity.
+
151 break;
+
152 }
+
153 else if (text[chr_end] == '&' || ctype.is(ctype.space, text[chr_end])) {
+
154 // This char cannot possibly be a part of entity.
+
155 break;
+
156 }
+
157 }
+
158 }
+
159 buf[0] = text[start];
+
160 buf[1] = 0;
+
161 chr_end = start + 1;
+
162 return buf;
+
163 }
+
165
+
166 std::locale m_locale;
+
167 };
-
189
-
190 using parser = basic_parser<char>;
-
191 using wparser = basic_parser<wchar_t>;
-
192#ifdef _UNICODE
-
193 using tparser = wparser;
-
194#else
-
195 using tparser = parser;
-
196#endif
-
197 using sgml_parser = basic_parser<char>;
-
198
-
202 template <class T>
-
-
203 class basic_noop : public basic_parser<T>
-
204 {
-
205 protected:
-
206 virtual bool do_match(
-
207 _In_reads_or_z_opt_(end) const T* text,
-
208 _In_ size_t start = 0,
-
209 _In_ size_t end = SIZE_MAX,
-
210 _In_ int flags = match_default)
-
211 {
-
212 _Assume_(text || start >= end);
-
213 if (start < end && text[start]) {
-
214 this->interval.start = this->interval.end = start;
-
215 return true;
-
216 }
-
217 this->interval.invalidate();
-
218 return false;
-
219 }
-
220 };
+
168
+
169 using parser = basic_parser<char>;
+
170 using wparser = basic_parser<wchar_t>;
+
171#ifdef _UNICODE
+
172 using tparser = wparser;
+
173#else
+
174 using tparser = parser;
+
175#endif
+
176 using sgml_parser = basic_parser<char>;
+
177
+
181 template <class T>
+
+
182 class basic_noop : public basic_parser<T>
+
183 {
+
184 protected:
+
185 virtual bool do_match(
+
186 _In_reads_or_z_opt_(end) const T* text,
+
187 _In_ size_t start = 0,
+
188 _In_ size_t end = SIZE_MAX,
+
189 _In_ int flags = match_default)
+
190 {
+
191 _Assume_(text || start >= end);
+
192 if (start < end && text[start]) {
+
193 this->interval.start = this->interval.end = start;
+
194 return true;
+
195 }
+
196 this->interval.invalidate();
+
197 return false;
+
198 }
+
199 };
-
221
-
222 using noop = basic_noop<char>;
- -
224#ifdef _UNICODE
-
225 using tnoop = wnoop;
-
226#else
-
227 using tnoop = noop;
-
228#endif
- -
230
-
234 template <class T>
-
-
235 class basic_any_cu : public basic_parser<T>
-
236 {
-
237 public:
-
238 basic_any_cu(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
-
239
-
240 protected:
-
241 virtual bool do_match(
-
242 _In_reads_or_z_opt_(end) const T* text,
-
243 _In_ size_t start = 0,
-
244 _In_ size_t end = SIZE_MAX,
-
245 _In_ int flags = match_default)
-
246 {
-
247 _Assume_(text || start >= end);
-
248 if (start < end && text[start]) {
-
249 this->interval.end = (this->interval.start = start) + 1;
-
250 return true;
-
251 }
-
252 this->interval.invalidate();
-
253 return false;
-
254 }
-
255 };
+
200
+
201 using noop = basic_noop<char>;
+ +
203#ifdef _UNICODE
+
204 using tnoop = wnoop;
+
205#else
+
206 using tnoop = noop;
+
207#endif
+ +
209
+
213 template <class T>
+
+
214 class basic_any_cu : public basic_parser<T>
+
215 {
+
216 public:
+
217 basic_any_cu(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
+
218
+
219 protected:
+
220 virtual bool do_match(
+
221 _In_reads_or_z_opt_(end) const T* text,
+
222 _In_ size_t start = 0,
+
223 _In_ size_t end = SIZE_MAX,
+
224 _In_ int flags = match_default)
+
225 {
+
226 _Assume_(text || start >= end);
+
227 if (start < end && text[start]) {
+
228 this->interval.end = (this->interval.start = start) + 1;
+
229 return true;
+
230 }
+
231 this->interval.invalidate();
+
232 return false;
+
233 }
+
234 };
-
256
- - -
259#ifdef _UNICODE
-
260 using tany_cu = wany_cu;
-
261#else
-
262 using tany_cu = any_cu;
-
263#endif
-
264
-
-
268 class sgml_any_cp : public basic_any_cu<char>
-
269 {
-
270 public:
-
271 sgml_any_cp(_In_ const std::locale& locale = std::locale()) : basic_any_cu<char>(locale) {}
-
272
-
273 protected:
-
274 virtual bool do_match(
-
275 _In_reads_or_z_(end) const char* text,
-
276 _In_ size_t start = 0,
-
277 _In_ size_t end = SIZE_MAX,
-
278 _In_ int flags = match_default)
-
279 {
-
280 _Assume_(text || start >= end);
-
281 if (start < end && text[start]) {
-
282 if (text[start] == '&') {
-
283 // SGML entity
-
284 const auto& ctype = std::use_facet<std::ctype<char>>(m_locale);
-
285 for (this->interval.end = start + 1; this->interval.end < end && text[this->interval.end]; this->interval.end++)
-
286 if (text[this->interval.end] == ';') {
-
287 this->interval.end++;
-
288 this->interval.start = start;
-
289 return true;
-
290 }
-
291 else if (text[this->interval.end] == '&' || ctype.is(ctype.space, text[this->interval.end]))
-
292 break;
-
293 // Unterminated entity
-
294 }
-
295 this->interval.end = (this->interval.start = start) + 1;
-
296 return true;
-
297 }
-
298 this->interval.invalidate();
-
299 return false;
-
300 }
-
301 };
+
235
+ + +
238#ifdef _UNICODE
+
239 using tany_cu = wany_cu;
+
240#else
+
241 using tany_cu = any_cu;
+
242#endif
+
243
+
+
247 class sgml_any_cp : public basic_any_cu<char>
+
248 {
+
249 public:
+
250 sgml_any_cp(_In_ const std::locale& locale = std::locale()) : basic_any_cu<char>(locale) {}
+
251
+
252 protected:
+
253 virtual bool do_match(
+
254 _In_reads_or_z_(end) const char* text,
+
255 _In_ size_t start = 0,
+
256 _In_ size_t end = SIZE_MAX,
+
257 _In_ int flags = match_default)
+
258 {
+
259 _Assume_(text || start >= end);
+
260 if (start < end && text[start]) {
+
261 if (text[start] == '&') {
+
262 // SGML entity
+
263 const auto& ctype = std::use_facet<std::ctype<char>>(m_locale);
+
264 for (this->interval.end = start + 1; this->interval.end < end && text[this->interval.end]; this->interval.end++)
+
265 if (text[this->interval.end] == ';') {
+
266 this->interval.end++;
+
267 this->interval.start = start;
+
268 return true;
+
269 }
+
270 else if (text[this->interval.end] == '&' || ctype.is(ctype.space, text[this->interval.end]))
+
271 break;
+
272 // Unterminated entity
+
273 }
+
274 this->interval.end = (this->interval.start = start) + 1;
+
275 return true;
+
276 }
+
277 this->interval.invalidate();
+
278 return false;
+
279 }
+
280 };
-
302
-
306 template <class T>
-
-
307 class basic_cu : public basic_parser<T>
-
308 {
-
309 public:
-
310 basic_cu(T chr, bool invert = false, _In_ const std::locale& locale = std::locale()) :
- -
312 m_chr(chr),
-
313 m_invert(invert)
-
314 {}
-
315
-
316 protected:
-
317 virtual bool do_match(
-
318 _In_reads_or_z_opt_(end) const T* text,
-
319 _In_ size_t start = 0,
-
320 _In_ size_t end = SIZE_MAX,
-
321 _In_ int flags = match_default)
-
322 {
-
323 _Assume_(text || start >= end);
-
324 if (start < end && text[start]) {
-
325 bool r;
-
326 if (flags & match_case_insensitive) {
-
327 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
-
328 r = ctype.tolower(text[start]) == ctype.tolower(m_chr);
-
329 }
-
330 else
-
331 r = text[start] == m_chr;
-
332 if ((r && !m_invert) || (!r && m_invert)) {
-
333 this->interval.end = (this->interval.start = start) + 1;
-
334 return true;
-
335 }
-
336 }
-
337 this->interval.invalidate();
-
338 return false;
-
339 }
-
340
-
341 T m_chr;
-
342 bool m_invert;
-
343 };
+
281
+
285 template <class T>
+
+
286 class basic_cu : public basic_parser<T>
+
287 {
+
288 public:
+
289 basic_cu(T chr, bool invert = false, _In_ const std::locale& locale = std::locale()) :
+ +
291 m_chr(chr),
+
292 m_invert(invert)
+
293 {}
+
294
+
295 protected:
+
296 virtual bool do_match(
+
297 _In_reads_or_z_opt_(end) const T* text,
+
298 _In_ size_t start = 0,
+
299 _In_ size_t end = SIZE_MAX,
+
300 _In_ int flags = match_default)
+
301 {
+
302 _Assume_(text || start >= end);
+
303 if (start < end && text[start]) {
+
304 bool r;
+
305 if (flags & match_case_insensitive) {
+
306 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
+
307 r = ctype.tolower(text[start]) == ctype.tolower(m_chr);
+
308 }
+
309 else
+
310 r = text[start] == m_chr;
+
311 if ((r && !m_invert) || (!r && m_invert)) {
+
312 this->interval.end = (this->interval.start = start) + 1;
+
313 return true;
+
314 }
+
315 }
+
316 this->interval.invalidate();
+
317 return false;
+
318 }
+
319
+
320 T m_chr;
+
321 bool m_invert;
+
322 };
-
344
-
345 using cu = basic_cu<char>;
-
346 using wcu = basic_cu<wchar_t>;
-
347#ifdef _UNICODE
-
348 using tcu = wcu;
-
349#else
-
350 using tcu = cu;
-
351#endif
-
352
-
-
356 class sgml_cp : public sgml_parser
-
357 {
-
358 public:
-
359 sgml_cp(const char* chr, size_t count = SIZE_MAX, bool invert = false, _In_ const std::locale& locale = std::locale()) :
- -
361 m_invert(invert)
-
362 {
-
363 _Assume_(chr || !count);
-
364 wchar_t buf[3];
-
365 size_t chr_end;
-
366 m_chr.assign(count ? next_sgml_cp(chr, 0, count, chr_end, buf) : L"");
-
367 }
-
368
-
369 protected:
-
370 virtual bool do_match(
-
371 _In_reads_or_z_(end) const char* text,
-
372 _In_ size_t start = 0,
-
373 _In_ size_t end = SIZE_MAX,
-
374 _In_ int flags = match_default)
-
375 {
-
376 _Assume_(text || start >= end);
-
377 if (start < end && text[start]) {
-
378 wchar_t buf[3];
-
379 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
-
380 bool r = ((flags & match_case_insensitive) ?
-
381 stdex::strnicmp(chr, stdex::strlen(chr), m_chr.data(), m_chr.size(), m_locale) :
-
382 stdex::strncmp(chr, stdex::strlen(chr), m_chr.data(), m_chr.size())) == 0;
-
383 if ((r && !m_invert) || (!r && m_invert)) {
-
384 this->interval.start = start;
-
385 return true;
-
386 }
-
387 }
-
388 this->interval.invalidate();
-
389 return false;
-
390 }
-
391
-
392 std::wstring m_chr;
-
393 bool m_invert;
-
394 };
+
323
+
324 using cu = basic_cu<char>;
+
325 using wcu = basic_cu<wchar_t>;
+
326#ifdef _UNICODE
+
327 using tcu = wcu;
+
328#else
+
329 using tcu = cu;
+
330#endif
+
331
+
+
335 class sgml_cp : public sgml_parser
+
336 {
+
337 public:
+
338 sgml_cp(const char* chr, size_t count = SIZE_MAX, bool invert = false, _In_ const std::locale& locale = std::locale()) :
+ +
340 m_invert(invert)
+
341 {
+
342 _Assume_(chr || !count);
+
343 wchar_t buf[5];
+
344 size_t chr_end;
+
345 m_chr.assign(count ? next_sgml_cp(chr, 0, count, chr_end, buf) : L"");
+
346 }
+
347
+
348 protected:
+
349 virtual bool do_match(
+
350 _In_reads_or_z_(end) const char* text,
+
351 _In_ size_t start = 0,
+
352 _In_ size_t end = SIZE_MAX,
+
353 _In_ int flags = match_default)
+
354 {
+
355 _Assume_(text || start >= end);
+
356 if (start < end && text[start]) {
+
357 wchar_t buf[5];
+
358 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
+
359 bool r = ((flags & match_case_insensitive) ?
+
360 stdex::strnicmp(chr, stdex::strlen(chr), m_chr.data(), m_chr.size(), m_locale) :
+
361 stdex::strncmp(chr, stdex::strlen(chr), m_chr.data(), m_chr.size())) == 0;
+
362 if ((r && !m_invert) || (!r && m_invert)) {
+
363 this->interval.start = start;
+
364 return true;
+
365 }
+
366 }
+
367 this->interval.invalidate();
+
368 return false;
+
369 }
+
370
+
371 std::wstring m_chr;
+
372 bool m_invert;
+
373 };
-
395
-
399 template <class T>
-
-
400 class basic_space_cu : public basic_parser<T>
-
401 {
-
402 public:
-
403 basic_space_cu(bool invert = false, _In_ const std::locale& locale = std::locale()) :
- -
405 m_invert(invert)
-
406 {}
+
374
+
378 template <class T>
+
+
379 class basic_space_cu : public basic_parser<T>
+
380 {
+
381 public:
+
382 basic_space_cu(bool invert = false, _In_ const std::locale& locale = std::locale()) :
+ +
384 m_invert(invert)
+
385 {}
+
386
+
387 protected:
+
388 virtual bool do_match(
+
389 _In_reads_or_z_opt_(end) const T* text,
+
390 _In_ size_t start = 0,
+
391 _In_ size_t end = SIZE_MAX,
+
392 _In_ int flags = match_default)
+
393 {
+
394 _Assume_(text || start >= end);
+
395 if (start < end && text[start]) {
+
396 bool r =
+
397 ((flags & match_multiline) || !stdex::islbreak(text[start])) &&
+
398 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::space, text[start]);
+
399 if ((r && !m_invert) || (!r && m_invert)) {
+
400 this->interval.end = (this->interval.start = start) + 1;
+
401 return true;
+
402 }
+
403 }
+
404 this->interval.invalidate();
+
405 return false;
+
406 }
407
-
408 protected:
-
409 virtual bool do_match(
-
410 _In_reads_or_z_opt_(end) const T* text,
-
411 _In_ size_t start = 0,
-
412 _In_ size_t end = SIZE_MAX,
-
413 _In_ int flags = match_default)
-
414 {
-
415 _Assume_(text || start >= end);
-
416 if (start < end && text[start]) {
-
417 bool r =
-
418 ((flags & match_multiline) || !stdex::islbreak(text[start])) &&
-
419 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::space, text[start]);
-
420 if ((r && !m_invert) || (!r && m_invert)) {
-
421 this->interval.end = (this->interval.start = start) + 1;
-
422 return true;
-
423 }
-
424 }
-
425 this->interval.invalidate();
-
426 return false;
-
427 }
+
408 bool m_invert;
+
409 };
+
+
410
+ + +
413#ifdef _UNICODE
+
414 using tspace_cu = wspace_cu;
+
415#else
+
416 using tspace_cu = space_cu;
+
417#endif
+
418
+
+
422 class sgml_space_cp : public basic_space_cu<char>
+
423 {
+
424 public:
+
425 sgml_space_cp(_In_ bool invert = false, _In_ const std::locale& locale = std::locale()) :
+ +
427 {}
428
-
429 bool m_invert;
-
430 };
-
-
431
- - -
434#ifdef _UNICODE
-
435 using tspace_cu = wspace_cu;
-
436#else
-
437 using tspace_cu = space_cu;
-
438#endif
-
439
-
-
443 class sgml_space_cp : public basic_space_cu<char>
-
444 {
-
445 public:
-
446 sgml_space_cp(_In_ bool invert = false, _In_ const std::locale& locale = std::locale()) :
- -
448 {}
+
429 protected:
+
430 virtual bool do_match(
+
431 _In_reads_or_z_(end) const char* text,
+
432 _In_ size_t start = 0,
+
433 _In_ size_t end = SIZE_MAX,
+
434 _In_ int flags = match_default)
+
435 {
+
436 _Assume_(text || start >= end);
+
437 if (start < end && text[start]) {
+
438 wchar_t buf[5];
+
439 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
+
440 const wchar_t* chr_end = chr + stdex::strlen(chr);
+
441 bool r =
+
442 ((flags & match_multiline) || !stdex::islbreak(chr, SIZE_MAX)) &&
+
443 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::space, chr, chr_end) == chr_end;
+
444 if ((r && !m_invert) || (!r && m_invert)) {
+
445 this->interval.start = start;
+
446 return true;
+
447 }
+
448 }
449
-
450 protected:
-
451 virtual bool do_match(
-
452 _In_reads_or_z_(end) const char* text,
-
453 _In_ size_t start = 0,
-
454 _In_ size_t end = SIZE_MAX,
-
455 _In_ int flags = match_default)
-
456 {
-
457 _Assume_(text || start >= end);
-
458 if (start < end && text[start]) {
-
459 wchar_t buf[3];
-
460 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
-
461 const wchar_t* chr_end = chr + stdex::strlen(chr);
-
462 bool r =
-
463 ((flags & match_multiline) || !stdex::islbreak(chr, SIZE_MAX)) &&
-
464 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::space, chr, chr_end) == chr_end;
-
465 if ((r && !m_invert) || (!r && m_invert)) {
-
466 this->interval.start = start;
-
467 return true;
-
468 }
-
469 }
-
470
-
471 this->interval.invalidate();
-
472 return false;
-
473 }
-
474 };
+
450 this->interval.invalidate();
+
451 return false;
+
452 }
+
453 };
-
475
-
479 template <class T>
-
-
480 class basic_punct_cu : public basic_parser<T>
-
481 {
-
482 public:
-
483 basic_punct_cu(bool invert = false, _In_ const std::locale& locale = std::locale()) :
- -
485 m_invert(invert)
-
486 {}
-
487
-
488 protected:
-
489 virtual bool do_match(
-
490 _In_reads_or_z_opt_(end) const T* text,
-
491 _In_ size_t start = 0,
-
492 _In_ size_t end = SIZE_MAX,
-
493 _In_ int flags = match_default)
-
494 {
-
495 _Assume_(text || start >= end);
-
496 if (start < end && text[start]) {
-
497 bool r = std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::punct, text[start]);
-
498 if ((r && !m_invert) || (!r && m_invert)) {
-
499 this->interval.end = (this->interval.start = start) + 1;
-
500 return true;
-
501 }
-
502 }
-
503 this->interval.invalidate();
-
504 return false;
-
505 }
+
454
+
458 template <class T>
+
+
459 class basic_punct_cu : public basic_parser<T>
+
460 {
+
461 public:
+
462 basic_punct_cu(bool invert = false, _In_ const std::locale& locale = std::locale()) :
+ +
464 m_invert(invert)
+
465 {}
+
466
+
467 protected:
+
468 virtual bool do_match(
+
469 _In_reads_or_z_opt_(end) const T* text,
+
470 _In_ size_t start = 0,
+
471 _In_ size_t end = SIZE_MAX,
+
472 _In_ int flags = match_default)
+
473 {
+
474 _Assume_(text || start >= end);
+
475 if (start < end && text[start]) {
+
476 bool r = std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::punct, text[start]);
+
477 if ((r && !m_invert) || (!r && m_invert)) {
+
478 this->interval.end = (this->interval.start = start) + 1;
+
479 return true;
+
480 }
+
481 }
+
482 this->interval.invalidate();
+
483 return false;
+
484 }
+
485
+
486 bool m_invert;
+
487 };
+
+
488
+ + +
491#ifdef _UNICODE
+
492 using tpunct_cu = wpunct_cu;
+
493#else
+
494 using tpunct_cu = punct_cu;
+
495#endif
+
496
+
+
500 class sgml_punct_cp : public basic_punct_cu<char>
+
501 {
+
502 public:
+
503 sgml_punct_cp(bool invert = false, _In_ const std::locale& locale = std::locale()) :
+ +
505 {}
506
-
507 bool m_invert;
-
508 };
+
507 protected:
+
508 virtual bool do_match(
+
509 _In_reads_or_z_(end) const char* text,
+
510 _In_ size_t start = 0,
+
511 _In_ size_t end = SIZE_MAX,
+
512 _In_ int flags = match_default)
+
513 {
+
514 _Assume_(text || start >= end);
+
515 if (start < end && text[start]) {
+
516 wchar_t buf[5];
+
517 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
+
518 const wchar_t* chr_end = chr + stdex::strlen(chr);
+
519 bool r = std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::punct, chr, chr_end) == chr_end;
+
520 if ((r && !m_invert) || (!r && m_invert)) {
+
521 this->interval.start = start;
+
522 return true;
+
523 }
+
524 }
+
525 this->interval.invalidate();
+
526 return false;
+
527 }
+
528 };
-
509
- - -
512#ifdef _UNICODE
-
513 using tpunct_cu = wpunct_cu;
-
514#else
-
515 using tpunct_cu = punct_cu;
-
516#endif
-
517
-
-
521 class sgml_punct_cp : public basic_punct_cu<char>
-
522 {
-
523 public:
-
524 sgml_punct_cp(bool invert = false, _In_ const std::locale& locale = std::locale()) :
- -
526 {}
-
527
-
528 protected:
-
529 virtual bool do_match(
-
530 _In_reads_or_z_(end) const char* text,
-
531 _In_ size_t start = 0,
-
532 _In_ size_t end = SIZE_MAX,
-
533 _In_ int flags = match_default)
-
534 {
-
535 _Assume_(text || start >= end);
-
536 if (start < end && text[start]) {
-
537 wchar_t buf[3];
-
538 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
-
539 const wchar_t* chr_end = chr + stdex::strlen(chr);
-
540 bool r = std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::punct, chr, chr_end) == chr_end;
-
541 if ((r && !m_invert) || (!r && m_invert)) {
-
542 this->interval.start = start;
-
543 return true;
-
544 }
-
545 }
-
546 this->interval.invalidate();
-
547 return false;
-
548 }
-
549 };
-
-
550
-
554 template <class T>
-
- -
556 {
-
557 public:
-
558 basic_space_or_punct_cu(bool invert = false, _In_ const std::locale& locale = std::locale()) :
- -
560 m_invert(invert)
-
561 {}
+
529
+
533 template <class T>
+
+ +
535 {
+
536 public:
+
537 basic_space_or_punct_cu(bool invert = false, _In_ const std::locale& locale = std::locale()) :
+ +
539 m_invert(invert)
+
540 {}
+
541
+
542 protected:
+
543 virtual bool do_match(
+
544 _In_reads_or_z_opt_(end) const T* text,
+
545 _In_ size_t start = 0,
+
546 _In_ size_t end = SIZE_MAX,
+
547 _In_ int flags = match_default)
+
548 {
+
549 _Assume_(text || start >= end);
+
550 if (start < end && text[start]) {
+
551 bool r =
+
552 ((flags & match_multiline) || !stdex::islbreak(text[start])) &&
+
553 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::space | std::ctype_base::punct, text[start]);
+
554 if ((r && !m_invert) || (!r && m_invert)) {
+
555 this->interval.end = (this->interval.start = start) + 1;
+
556 return true;
+
557 }
+
558 }
+
559 this->interval.invalidate();
+
560 return false;
+
561 }
562
-
563 protected:
-
564 virtual bool do_match(
-
565 _In_reads_or_z_opt_(end) const T* text,
-
566 _In_ size_t start = 0,
-
567 _In_ size_t end = SIZE_MAX,
-
568 _In_ int flags = match_default)
-
569 {
-
570 _Assume_(text || start >= end);
-
571 if (start < end && text[start]) {
-
572 bool r =
-
573 ((flags & match_multiline) || !stdex::islbreak(text[start])) &&
-
574 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::space | std::ctype_base::punct, text[start]);
-
575 if ((r && !m_invert) || (!r && m_invert)) {
-
576 this->interval.end = (this->interval.start = start) + 1;
-
577 return true;
-
578 }
-
579 }
-
580 this->interval.invalidate();
-
581 return false;
-
582 }
+
563 bool m_invert;
+
564 };
+
+
565
+ + +
568#ifdef _UNICODE
+ +
570#else
+ +
572#endif
+
573
+
+ +
578 {
+
579 public:
+
580 sgml_space_or_punct_cp(bool invert = false, _In_ const std::locale& locale = std::locale()) :
+ +
582 {}
583
-
584 bool m_invert;
-
585 };
+
584 protected:
+
585 virtual bool do_match(
+
586 _In_reads_or_z_(end) const char* text,
+
587 _In_ size_t start = 0,
+
588 _In_ size_t end = SIZE_MAX,
+
589 _In_ int flags = match_default)
+
590 {
+
591 _Assume_(text || start >= end);
+
592 if (start < end && text[start]) {
+
593 wchar_t buf[5];
+
594 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
+
595 const wchar_t* chr_end = chr + stdex::strlen(chr);
+
596 bool r =
+
597 ((flags & match_multiline) || !stdex::islbreak(chr, SIZE_MAX)) &&
+
598 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::space | std::ctype_base::punct, chr, chr_end) == chr_end;
+
599 if ((r && !m_invert) || (!r && m_invert)) {
+
600 this->interval.start = start;
+
601 return true;
+
602 }
+
603 }
+
604 this->interval.invalidate();
+
605 return false;
+
606 }
+
607 };
-
586
- - -
589#ifdef _UNICODE
- -
591#else
- -
593#endif
-
594
-
- -
599 {
-
600 public:
-
601 sgml_space_or_punct_cp(bool invert = false, _In_ const std::locale& locale = std::locale()) :
- -
603 {}
-
604
-
605 protected:
-
606 virtual bool do_match(
-
607 _In_reads_or_z_(end) const char* text,
-
608 _In_ size_t start = 0,
-
609 _In_ size_t end = SIZE_MAX,
-
610 _In_ int flags = match_default)
-
611 {
-
612 _Assume_(text || start >= end);
-
613 if (start < end && text[start]) {
-
614 wchar_t buf[3];
-
615 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
-
616 const wchar_t* chr_end = chr + stdex::strlen(chr);
-
617 bool r =
-
618 ((flags & match_multiline) || !stdex::islbreak(chr, SIZE_MAX)) &&
-
619 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::space | std::ctype_base::punct, chr, chr_end) == chr_end;
-
620 if ((r && !m_invert) || (!r && m_invert)) {
-
621 this->interval.start = start;
-
622 return true;
-
623 }
-
624 }
-
625 this->interval.invalidate();
-
626 return false;
-
627 }
-
628 };
+
608
+
612 template <class T>
+
+
613 class basic_bol : public basic_parser<T>
+
614 {
+
615 public:
+
616 basic_bol(bool invert = false) : m_invert(invert) {}
+
617
+
618 protected:
+
619 virtual bool do_match(
+
620 _In_reads_or_z_opt_(end) const T* text,
+
621 _In_ size_t start = 0,
+
622 _In_ size_t end = SIZE_MAX,
+
623 _In_ int flags = match_default)
+
624 {
+
625 _Assume_(text || !end);
+
626 _Assume_(text || start >= end);
+
627 bool r = start == 0 || (start <= end && stdex::islbreak(text[start - 1]));
+
628 if ((r && !m_invert) || (!r && m_invert)) {
+
629 this->interval.end = this->interval.start = start;
+
630 return true;
+
631 }
+
632 this->interval.invalidate();
+
633 return false;
+
634 }
+
635
+
636 bool m_invert;
+
637 };
-
629
-
633 template <class T>
-
-
634 class basic_bol : public basic_parser<T>
-
635 {
-
636 public:
-
637 basic_bol(bool invert = false) : m_invert(invert) {}
638
-
639 protected:
-
640 virtual bool do_match(
-
641 _In_reads_or_z_opt_(end) const T* text,
-
642 _In_ size_t start = 0,
-
643 _In_ size_t end = SIZE_MAX,
-
644 _In_ int flags = match_default)
-
645 {
-
646 _Assume_(text || !end);
-
647 _Assume_(text || start >= end);
-
648 bool r = start == 0 || (start <= end && stdex::islbreak(text[start - 1]));
-
649 if ((r && !m_invert) || (!r && m_invert)) {
-
650 this->interval.end = this->interval.start = start;
-
651 return true;
-
652 }
-
653 this->interval.invalidate();
-
654 return false;
-
655 }
+
639 using bol = basic_bol<char>;
+
640 using wbol = basic_bol<wchar_t>;
+
641#ifdef _UNICODE
+
642 using tbol = wbol;
+
643#else
+
644 using tbol = bol;
+
645#endif
+ +
647
+
651 template <class T>
+
+
652 class basic_eol : public basic_parser<T>
+
653 {
+
654 public:
+
655 basic_eol(bool invert = false) : m_invert(invert) {}
656
-
657 bool m_invert;
-
658 };
+
657 protected:
+
658 virtual bool do_match(
+
659 _In_reads_or_z_opt_(end) const T* text,
+
660 _In_ size_t start = 0,
+
661 _In_ size_t end = SIZE_MAX,
+
662 _In_ int flags = match_default)
+
663 {
+
664 _Assume_(text || start >= end);
+
665 bool r = start >= end || !text[start] || stdex::islbreak(text[start]);
+
666 if ((r && !m_invert) || (!r && m_invert)) {
+
667 this->interval.end = this->interval.start = start;
+
668 return true;
+
669 }
+
670 this->interval.invalidate();
+
671 return false;
+
672 }
+
673
+
674 bool m_invert;
+
675 };
-
659
-
660 using bol = basic_bol<char>;
-
661 using wbol = basic_bol<wchar_t>;
-
662#ifdef _UNICODE
-
663 using tbol = wbol;
-
664#else
-
665 using tbol = bol;
-
666#endif
- -
668
-
672 template <class T>
-
-
673 class basic_eol : public basic_parser<T>
-
674 {
-
675 public:
-
676 basic_eol(bool invert = false) : m_invert(invert) {}
-
677
-
678 protected:
-
679 virtual bool do_match(
-
680 _In_reads_or_z_opt_(end) const T* text,
-
681 _In_ size_t start = 0,
-
682 _In_ size_t end = SIZE_MAX,
-
683 _In_ int flags = match_default)
-
684 {
-
685 _Assume_(text || start >= end);
-
686 bool r = start >= end || !text[start] || stdex::islbreak(text[start]);
-
687 if ((r && !m_invert) || (!r && m_invert)) {
-
688 this->interval.end = this->interval.start = start;
-
689 return true;
-
690 }
-
691 this->interval.invalidate();
-
692 return false;
-
693 }
-
694
-
695 bool m_invert;
-
696 };
+
676
+
677 using eol = basic_eol<char>;
+
678 using weol = basic_eol<wchar_t>;
+
679#ifdef _UNICODE
+
680 using teol = weol;
+
681#else
+
682 using teol = eol;
+
683#endif
+ +
685
+
686 template <class T>
+
+
687 class basic_set : public basic_parser<T>
+
688 {
+
689 public:
+
690 basic_set(bool invert = false, _In_ const std::locale& locale = std::locale()) :
+ +
692 hit_offset(SIZE_MAX),
+
693 m_invert(invert)
+
694 {}
+
695
+
696 virtual void invalidate()
+
697 {
+
698 hit_offset = SIZE_MAX;
+ +
700 }
+
701
+
702 size_t hit_offset;
+
703
+
704 protected:
+
705 virtual bool do_match(
+
706 _In_reads_or_z_opt_(end) const T* text,
+
707 _In_ size_t start = 0,
+
708 _In_ size_t end = SIZE_MAX,
+
709 _In_ int flags = match_default) = 0;
+
710
+
711 bool m_invert;
+
712 };
-
697
-
698 using eol = basic_eol<char>;
-
699 using weol = basic_eol<wchar_t>;
-
700#ifdef _UNICODE
-
701 using teol = weol;
-
702#else
-
703 using teol = eol;
-
704#endif
- -
706
-
707 template <class T>
-
-
708 class basic_set : public basic_parser<T>
-
709 {
-
710 public:
-
711 basic_set(bool invert = false, _In_ const std::locale& locale = std::locale()) :
- -
713 hit_offset(SIZE_MAX),
-
714 m_invert(invert)
-
715 {}
-
716
-
717 virtual void invalidate()
-
718 {
-
719 hit_offset = SIZE_MAX;
- -
721 }
-
722
-
723 size_t hit_offset;
-
724
-
725 protected:
-
726 virtual bool do_match(
-
727 _In_reads_or_z_opt_(end) const T* text,
-
728 _In_ size_t start = 0,
-
729 _In_ size_t end = SIZE_MAX,
-
730 _In_ int flags = match_default) = 0;
+
713
+
717 template <class T>
+
+
718 class basic_cu_set : public basic_set<T>
+
719 {
+
720 public:
+ +
722 _In_reads_or_z_(count) const T* set,
+
723 _In_ size_t count = SIZE_MAX,
+
724 _In_ bool invert = false,
+
725 _In_ const std::locale& locale = std::locale()) :
+ +
727 {
+
728 if (set)
+
729 m_set.assign(set, set + stdex::strnlen(set, count));
+
730 }
731
-
732 bool m_invert;
-
733 };
-
-
734
-
738 template <class T>
-
-
739 class basic_cu_set : public basic_set<T>
-
740 {
-
741 public:
- -
743 _In_reads_or_z_(count) const T* set,
-
744 _In_ size_t count = SIZE_MAX,
-
745 _In_ bool invert = false,
-
746 _In_ const std::locale& locale = std::locale()) :
- -
748 {
-
749 if (set)
-
750 m_set.assign(set, set + stdex::strnlen(set, count));
-
751 }
-
752
-
753 protected:
-
754 virtual bool do_match(
-
755 _In_reads_or_z_opt_(end) const T* text,
-
756 _In_ size_t start = 0,
-
757 _In_ size_t end = SIZE_MAX,
-
758 _In_ int flags = match_default)
-
759 {
-
760 _Assume_(text || start >= end);
-
761 if (start < end && text[start]) {
-
762 const T* set = m_set.data();
-
763 size_t r = (flags & match_case_insensitive) ?
-
764 stdex::strnichr(set, m_set.size(), text[start], this->m_locale) :
-
765 stdex::strnchr(set, m_set.size(), text[start]);
-
766 if ((r != stdex::npos && !this->m_invert) || (r == stdex::npos && this->m_invert)) {
-
767 this->hit_offset = r;
-
768 this->interval.end = (this->interval.start = start) + 1;
-
769 return true;
-
770 }
-
771 }
-
772 this->hit_offset = SIZE_MAX;
-
773 this->interval.invalidate();
-
774 return false;
-
775 }
-
776
-
777 std::basic_string<T> m_set;
-
778 };
+
732 protected:
+
733 virtual bool do_match(
+
734 _In_reads_or_z_opt_(end) const T* text,
+
735 _In_ size_t start = 0,
+
736 _In_ size_t end = SIZE_MAX,
+
737 _In_ int flags = match_default)
+
738 {
+
739 _Assume_(text || start >= end);
+
740 if (start < end && text[start]) {
+
741 const T* set = m_set.data();
+
742 size_t r = (flags & match_case_insensitive) ?
+
743 stdex::strnichr(set, m_set.size(), text[start], this->m_locale) :
+
744 stdex::strnchr(set, m_set.size(), text[start]);
+
745 if ((r != stdex::npos && !this->m_invert) || (r == stdex::npos && this->m_invert)) {
+
746 this->hit_offset = r;
+
747 this->interval.end = (this->interval.start = start) + 1;
+
748 return true;
+
749 }
+
750 }
+
751 this->hit_offset = SIZE_MAX;
+
752 this->interval.invalidate();
+
753 return false;
+
754 }
+
755
+
756 std::basic_string<T> m_set;
+
757 };
+
758
+ + +
761#ifdef _UNICODE
+
762 using tcu_set = wcu_set;
+
763#else
+
764 using tcu_set = cu_set;
+
765#endif
+
766
+
+
770 class sgml_cp_set : public basic_set<char>
+
771 {
+
772 public:
+
773 sgml_cp_set(const char* set, size_t count = SIZE_MAX, bool invert = false, _In_ const std::locale& locale = std::locale()) :
+ +
775 {
+
776 if (set)
+
777 m_set = sgml2str(set, count);
+
778 }
779
- - -
782#ifdef _UNICODE
-
783 using tcu_set = wcu_set;
-
784#else
-
785 using tcu_set = cu_set;
-
786#endif
-
787
-
-
791 class sgml_cp_set : public basic_set<char>
-
792 {
-
793 public:
-
794 sgml_cp_set(const char* set, size_t count = SIZE_MAX, bool invert = false, _In_ const std::locale& locale = std::locale()) :
- -
796 {
-
797 if (set)
-
798 m_set = sgml2str(set, count);
-
799 }
-
800
-
801 protected:
-
802 virtual bool do_match(
-
803 _In_reads_or_z_(end) const char* text,
-
804 _In_ size_t start = 0,
-
805 _In_ size_t end = SIZE_MAX,
-
806 _In_ int flags = match_default)
-
807 {
-
808 _Assume_(text || start >= end);
-
809 if (start < end && text[start]) {
-
810 wchar_t buf[3];
-
811 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
-
812 const wchar_t* set = m_set.data();
-
813 size_t r = (flags & match_case_insensitive) ?
-
814 stdex::strnistr(set, m_set.size(), chr, m_locale) :
-
815 stdex::strnstr(set, m_set.size(), chr);
-
816 if ((r != stdex::npos && !m_invert) || (r == stdex::npos && m_invert)) {
-
817 hit_offset = r;
-
818 this->interval.start = start;
-
819 return true;
-
820 }
-
821 }
-
822 hit_offset = SIZE_MAX;
-
823 this->interval.invalidate();
-
824 return false;
-
825 }
-
826
-
827 std::wstring m_set;
-
828 };
+
780 protected:
+
781 virtual bool do_match(
+
782 _In_reads_or_z_(end) const char* text,
+
783 _In_ size_t start = 0,
+
784 _In_ size_t end = SIZE_MAX,
+
785 _In_ int flags = match_default)
+
786 {
+
787 _Assume_(text || start >= end);
+
788 if (start < end && text[start]) {
+
789 wchar_t buf[5];
+
790 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
+
791 const wchar_t* set = m_set.data();
+
792 size_t r = (flags & match_case_insensitive) ?
+
793 stdex::strnistr(set, m_set.size(), chr, m_locale) :
+
794 stdex::strnstr(set, m_set.size(), chr);
+
795 if ((r != stdex::npos && !m_invert) || (r == stdex::npos && m_invert)) {
+
796 hit_offset = r;
+
797 this->interval.start = start;
+
798 return true;
+
799 }
+
800 }
+
801 hit_offset = SIZE_MAX;
+
802 this->interval.invalidate();
+
803 return false;
+
804 }
+
805
+
806 std::wstring m_set;
+
807 };
-
829
-
833 template <class T>
-
-
834 class basic_string : public basic_parser<T>
-
835 {
-
836 public:
- -
838 _In_reads_or_z_(count) const T* str,
-
839 _In_ size_t count = SIZE_MAX,
-
840 _In_ const std::locale& locale = std::locale()) :
- -
842 m_str(str, str + stdex::strnlen(str, count))
-
843 {}
-
844
-
845 protected:
-
846 virtual bool do_match(
-
847 _In_reads_or_z_opt_(end) const T* text,
-
848 _In_ size_t start = 0,
-
849 _In_ size_t end = SIZE_MAX,
-
850 _In_ int flags = match_default)
-
851 {
-
852 _Assume_(text || start >= end);
-
853 size_t
-
854 m = m_str.size(),
-
855 n = std::min<size_t>(end - start, m);
-
856 bool r = ((flags & match_case_insensitive) ?
-
857 stdex::strnicmp(text + start, n, m_str.data(), m, this->m_locale) :
-
858 stdex::strncmp(text + start, n, m_str.data(), m)) == 0;
-
859 if (r) {
-
860 this->interval.end = (this->interval.start = start) + n;
-
861 return true;
-
862 }
-
863 this->interval.invalidate();
-
864 return false;
-
865 }
-
866
-
867 std::basic_string<T> m_str;
-
868 };
+
808
+
812 template <class T>
+
+
813 class basic_string : public basic_parser<T>
+
814 {
+
815 public:
+ +
817 _In_reads_or_z_(count) const T* str,
+
818 _In_ size_t count = SIZE_MAX,
+
819 _In_ const std::locale& locale = std::locale()) :
+ +
821 m_str(str, str + stdex::strnlen(str, count))
+
822 {}
+
823
+
824 protected:
+
825 virtual bool do_match(
+
826 _In_reads_or_z_opt_(end) const T* text,
+
827 _In_ size_t start = 0,
+
828 _In_ size_t end = SIZE_MAX,
+
829 _In_ int flags = match_default)
+
830 {
+
831 _Assume_(text || start >= end);
+
832 size_t
+
833 m = m_str.size(),
+
834 n = std::min<size_t>(end - start, m);
+
835 bool r = ((flags & match_case_insensitive) ?
+
836 stdex::strnicmp(text + start, n, m_str.data(), m, this->m_locale) :
+
837 stdex::strncmp(text + start, n, m_str.data(), m)) == 0;
+
838 if (r) {
+
839 this->interval.end = (this->interval.start = start) + n;
+
840 return true;
+
841 }
+
842 this->interval.invalidate();
+
843 return false;
+
844 }
+
845
+
846 std::basic_string<T> m_str;
+
847 };
-
869
- - -
872#ifdef _UNICODE
-
873 using tstring = wstring;
-
874#else
-
875 using tstring = string;
-
876#endif
-
877
-
- -
882 {
-
883 public:
-
884 sgml_string(const char* str, size_t count = SIZE_MAX, _In_ const std::locale& locale = std::locale()) :
- -
886 m_str(sgml2str(str, count))
-
887 {}
-
888
-
889 protected:
-
890 virtual bool do_match(
-
891 _In_reads_or_z_(end) const char* text,
-
892 _In_ size_t start = 0,
-
893 _In_ size_t end = SIZE_MAX,
-
894 _In_ int flags = match_default)
-
895 {
-
896 _Assume_(text || start >= end);
-
897 const wchar_t* str = m_str.data();
-
898 const bool case_insensitive = flags & match_case_insensitive ? true : false;
-
899 const auto& ctype = std::use_facet<std::ctype<wchar_t>>(m_locale);
-
900 for (this->interval.end = start;;) {
-
901 if (!*str) {
-
902 this->interval.start = start;
-
903 return true;
-
904 }
-
905 if (this->interval.end >= end || !text[this->interval.end]) {
-
906 this->interval.invalidate();
-
907 return false;
-
908 }
-
909 wchar_t buf[3];
-
910 const wchar_t* chr = next_sgml_cp(text, this->interval.end, end, this->interval.end, buf);
-
911 for (; *chr; ++str, ++chr) {
-
912 if (!*str ||
-
913 (case_insensitive ? ctype.tolower(*str) != ctype.tolower(*chr) : *str != *chr))
-
914 {
-
915 this->interval.invalidate();
-
916 return false;
-
917 }
-
918 }
-
919 }
-
920 }
-
921
-
922 std::wstring m_str;
-
923 };
+
848
+ + +
851#ifdef _UNICODE
+
852 using tstring = wstring;
+
853#else
+
854 using tstring = string;
+
855#endif
+
856
+
+ +
861 {
+
862 public:
+
863 sgml_string(const char* str, size_t count = SIZE_MAX, _In_ const std::locale& locale = std::locale()) :
+ +
865 m_str(sgml2str(str, count))
+
866 {}
+
867
+
868 protected:
+
869 virtual bool do_match(
+
870 _In_reads_or_z_(end) const char* text,
+
871 _In_ size_t start = 0,
+
872 _In_ size_t end = SIZE_MAX,
+
873 _In_ int flags = match_default)
+
874 {
+
875 _Assume_(text || start >= end);
+
876 const wchar_t* str = m_str.data();
+
877 const bool case_insensitive = flags & match_case_insensitive ? true : false;
+
878 const auto& ctype = std::use_facet<std::ctype<wchar_t>>(m_locale);
+
879 for (this->interval.end = start;;) {
+
880 if (!*str) {
+
881 this->interval.start = start;
+
882 return true;
+
883 }
+
884 if (this->interval.end >= end || !text[this->interval.end]) {
+
885 this->interval.invalidate();
+
886 return false;
+
887 }
+
888 wchar_t buf[5];
+
889 const wchar_t* chr = next_sgml_cp(text, this->interval.end, end, this->interval.end, buf);
+
890 for (; *chr; ++str, ++chr) {
+
891 if (!*str ||
+
892 (case_insensitive ? ctype.tolower(*str) != ctype.tolower(*chr) : *str != *chr))
+
893 {
+
894 this->interval.invalidate();
+
895 return false;
+
896 }
+
897 }
+
898 }
+
899 }
+
900
+
901 std::wstring m_str;
+
902 };
-
924
-
928 template <class T>
-
- -
930 {
-
931 public:
-
932 basic_iterations(const std::shared_ptr<basic_parser<T>>& el, size_t min_iterations = 0, size_t max_iterations = SIZE_MAX, bool greedy = true) :
-
933 m_el(el),
- - - -
937 {}
-
938
-
939 protected:
-
940 virtual bool do_match(
-
941 _In_reads_or_z_opt_(end) const T* text,
-
942 _In_ size_t start = 0,
-
943 _In_ size_t end = SIZE_MAX,
-
944 _In_ int flags = match_default)
-
945 {
-
946 _Assume_(text || start >= end);
-
947 this->interval.start = this->interval.end = start;
-
948 for (size_t i = 0; ; i++) {
-
949 if ((!m_greedy && i >= m_min_iterations) || i >= m_max_iterations)
-
950 return true;
-
951 if (!m_el->match(text, this->interval.end, end, flags)) {
-
952 if (i >= m_min_iterations)
-
953 return true;
-
954 break;
-
955 }
-
956 if (m_el->interval.end == this->interval.end) {
-
957 // Element did match, but the matching interval was empty. Quit instead of spinning.
-
958 return true;
-
959 }
-
960 this->interval.end = m_el->interval.end;
-
961 }
-
962 this->interval.invalidate();
-
963 return false;
-
964 }
-
965
-
966 std::shared_ptr<basic_parser<T>> m_el;
- - -
969 bool m_greedy;
-
970 };
+
903
+
907 template <class T>
+
+ +
909 {
+
910 public:
+
911 basic_iterations(const std::shared_ptr<basic_parser<T>>& el, size_t min_iterations = 0, size_t max_iterations = SIZE_MAX, bool greedy = true) :
+
912 m_el(el),
+ + + +
916 {}
+
917
+
918 protected:
+
919 virtual bool do_match(
+
920 _In_reads_or_z_opt_(end) const T* text,
+
921 _In_ size_t start = 0,
+
922 _In_ size_t end = SIZE_MAX,
+
923 _In_ int flags = match_default)
+
924 {
+
925 _Assume_(text || start >= end);
+
926 this->interval.start = this->interval.end = start;
+
927 for (size_t i = 0; ; i++) {
+
928 if ((!m_greedy && i >= m_min_iterations) || i >= m_max_iterations)
+
929 return true;
+
930 if (!m_el->match(text, this->interval.end, end, flags)) {
+
931 if (i >= m_min_iterations)
+
932 return true;
+
933 break;
+
934 }
+
935 if (m_el->interval.end == this->interval.end) {
+
936 // Element did match, but the matching interval was empty. Quit instead of spinning.
+
937 return true;
+
938 }
+
939 this->interval.end = m_el->interval.end;
+
940 }
+
941 this->interval.invalidate();
+
942 return false;
+
943 }
+
944
+
945 std::shared_ptr<basic_parser<T>> m_el;
+ + +
948 bool m_greedy;
+
949 };
-
971
- - -
974#ifdef _UNICODE
-
975 using titerations = witerations;
-
976#else
-
977 using titerations = iterations;
-
978#endif
- -
980
-
984 template <class T>
-
- -
986 {
-
987 protected:
-
988 parser_collection(_In_ const std::locale& locale) : basic_parser<T>(locale) {}
-
989
-
990 public:
- -
992 _In_count_(count) const std::shared_ptr<basic_parser<T>>* el,
-
993 _In_ size_t count,
-
994 _In_ const std::locale& locale = std::locale()) :
- -
996 {
-
997 _Assume_(el || !count);
-
998 m_collection.reserve(count);
-
999 for (size_t i = 0; i < count; i++)
-
1000 m_collection.push_back(el[i]);
-
1001 }
-
1002
- -
1004 _Inout_ std::vector<std::shared_ptr<basic_parser<T>>>&& collection,
-
1005 _In_ const std::locale& locale = std::locale()) :
- -
1007 m_collection(std::move(collection))
-
1008 {}
-
1009
-
1010 virtual void invalidate()
-
1011 {
-
1012 for (auto& el : m_collection)
-
1013 el->invalidate();
- -
1015 }
-
1016
-
1017 protected:
-
1018 std::vector<std::shared_ptr<basic_parser<T>>> m_collection;
-
1019 };
+
950
+ + +
953#ifdef _UNICODE
+
954 using titerations = witerations;
+
955#else
+
956 using titerations = iterations;
+
957#endif
+ +
959
+
963 template <class T>
+
+ +
965 {
+
966 protected:
+
967 parser_collection(_In_ const std::locale& locale) : basic_parser<T>(locale) {}
+
968
+
969 public:
+ +
971 _In_count_(count) const std::shared_ptr<basic_parser<T>>* el,
+
972 _In_ size_t count,
+
973 _In_ const std::locale& locale = std::locale()) :
+ +
975 {
+
976 _Assume_(el || !count);
+
977 m_collection.reserve(count);
+
978 for (size_t i = 0; i < count; i++)
+
979 m_collection.push_back(el[i]);
+
980 }
+
981
+ +
983 _Inout_ std::vector<std::shared_ptr<basic_parser<T>>>&& collection,
+
984 _In_ const std::locale& locale = std::locale()) :
+ +
986 m_collection(std::move(collection))
+
987 {}
+
988
+
989 virtual void invalidate()
+
990 {
+
991 for (auto& el : m_collection)
+
992 el->invalidate();
+ +
994 }
+
995
+
996 protected:
+
997 std::vector<std::shared_ptr<basic_parser<T>>> m_collection;
+
998 };
-
1020
-
1024 template <class T>
-
- -
1026 {
-
1027 public:
- -
1029 _In_count_(count) const std::shared_ptr<basic_parser<T>>* el = nullptr,
-
1030 _In_ size_t count = 0,
-
1031 _In_ const std::locale& locale = std::locale()) :
- -
1033 {}
-
1034
- -
1036 _Inout_ std::vector<std::shared_ptr<basic_parser<T>>>&& collection,
-
1037 _In_ const std::locale& locale = std::locale()) :
- -
1039 {}
-
1040
-
1041 protected:
-
1042 virtual bool do_match(
-
1043 _In_reads_or_z_opt_(end) const T* text,
-
1044 _In_ size_t start = 0,
-
1045 _In_ size_t end = SIZE_MAX,
-
1046 _In_ int flags = match_default)
-
1047 {
-
1048 _Assume_(text || start >= end);
-
1049 this->interval.end = start;
-
1050 for (auto i = this->m_collection.begin(); i != this->m_collection.end(); ++i) {
-
1051 if (!(*i)->match(text, this->interval.end, end, flags)) {
-
1052 for (++i; i != this->m_collection.end(); ++i)
-
1053 (*i)->invalidate();
-
1054 this->interval.invalidate();
-
1055 return false;
-
1056 }
-
1057 this->interval.end = (*i)->interval.end;
-
1058 }
-
1059 this->interval.start = start;
-
1060 return true;
-
1061 }
-
1062 };
+
999
+
1003 template <class T>
+
+ +
1005 {
+
1006 public:
+ +
1008 _In_count_(count) const std::shared_ptr<basic_parser<T>>* el = nullptr,
+
1009 _In_ size_t count = 0,
+
1010 _In_ const std::locale& locale = std::locale()) :
+ +
1012 {}
+
1013
+ +
1015 _Inout_ std::vector<std::shared_ptr<basic_parser<T>>>&& collection,
+
1016 _In_ const std::locale& locale = std::locale()) :
+ +
1018 {}
+
1019
+
1020 protected:
+
1021 virtual bool do_match(
+
1022 _In_reads_or_z_opt_(end) const T* text,
+
1023 _In_ size_t start = 0,
+
1024 _In_ size_t end = SIZE_MAX,
+
1025 _In_ int flags = match_default)
+
1026 {
+
1027 _Assume_(text || start >= end);
+
1028 this->interval.end = start;
+
1029 for (auto i = this->m_collection.begin(); i != this->m_collection.end(); ++i) {
+
1030 if (!(*i)->match(text, this->interval.end, end, flags)) {
+
1031 for (++i; i != this->m_collection.end(); ++i)
+
1032 (*i)->invalidate();
+
1033 this->interval.invalidate();
+
1034 return false;
+
1035 }
+
1036 this->interval.end = (*i)->interval.end;
+
1037 }
+
1038 this->interval.start = start;
+
1039 return true;
+
1040 }
+
1041 };
+
1042
+ + +
1045#ifdef _UNICODE
+
1046 using tsequence = wsequence;
+
1047#else
+
1048 using tsequence = sequence;
+
1049#endif
+ +
1051
+
1055 template <class T>
+
+ +
1057 {
+
1058 protected:
+
1059 basic_branch(_In_ const std::locale& locale) :
+ +
1061 hit_offset(SIZE_MAX)
+
1062 {}
1063
- - -
1066#ifdef _UNICODE
-
1067 using tsequence = wsequence;
-
1068#else
-
1069 using tsequence = sequence;
-
1070#endif
- +
1064 public:
+ +
1066 _In_count_(count) const std::shared_ptr<basic_parser<T>>* el = nullptr,
+
1067 _In_ size_t count = 0,
+
1068 _In_ const std::locale& locale = std::locale()) :
+ +
1070 hit_offset(SIZE_MAX)
+
1071 {}
1072
-
1076 template <class T>
-
- -
1078 {
-
1079 protected:
-
1080 basic_branch(_In_ const std::locale& locale) :
- -
1082 hit_offset(SIZE_MAX)
-
1083 {}
-
1084
-
1085 public:
- -
1087 _In_count_(count) const std::shared_ptr<basic_parser<T>>* el = nullptr,
-
1088 _In_ size_t count = 0,
-
1089 _In_ const std::locale& locale = std::locale()) :
- -
1091 hit_offset(SIZE_MAX)
-
1092 {}
-
1093
- -
1095 _Inout_ std::vector<std::shared_ptr<basic_parser<T>>>&& collection,
-
1096 _In_ const std::locale& locale = std::locale()) :
- -
1098 hit_offset(SIZE_MAX)
-
1099 {}
-
1100
-
1101 virtual void invalidate()
-
1102 {
-
1103 hit_offset = SIZE_MAX;
- -
1105 }
-
1106
-
1107 size_t hit_offset;
-
1108
-
1109 protected:
-
1110 virtual bool do_match(
-
1111 _In_reads_or_z_opt_(end) const T* text,
-
1112 _In_ size_t start = 0,
-
1113 _In_ size_t end = SIZE_MAX,
-
1114 _In_ int flags = match_default)
-
1115 {
-
1116 _Assume_(text || start >= end);
-
1117 hit_offset = 0;
-
1118 for (auto i = this->m_collection.begin(); i != this->m_collection.end(); ++i, ++hit_offset) {
-
1119 if ((*i)->match(text, start, end, flags)) {
-
1120 this->interval = (*i)->interval;
-
1121 for (++i; i != this->m_collection.end(); ++i)
-
1122 (*i)->invalidate();
-
1123 return true;
-
1124 }
-
1125 }
-
1126 hit_offset = SIZE_MAX;
-
1127 this->interval.invalidate();
-
1128 return false;
-
1129 }
-
1130 };
+ +
1074 _Inout_ std::vector<std::shared_ptr<basic_parser<T>>>&& collection,
+
1075 _In_ const std::locale& locale = std::locale()) :
+ +
1077 hit_offset(SIZE_MAX)
+
1078 {}
+
1079
+
1080 virtual void invalidate()
+
1081 {
+
1082 hit_offset = SIZE_MAX;
+ +
1084 }
+
1085
+
1086 size_t hit_offset;
+
1087
+
1088 protected:
+
1089 virtual bool do_match(
+
1090 _In_reads_or_z_opt_(end) const T* text,
+
1091 _In_ size_t start = 0,
+
1092 _In_ size_t end = SIZE_MAX,
+
1093 _In_ int flags = match_default)
+
1094 {
+
1095 _Assume_(text || start >= end);
+
1096 hit_offset = 0;
+
1097 for (auto i = this->m_collection.begin(); i != this->m_collection.end(); ++i, ++hit_offset) {
+
1098 if ((*i)->match(text, start, end, flags)) {
+
1099 this->interval = (*i)->interval;
+
1100 for (++i; i != this->m_collection.end(); ++i)
+
1101 (*i)->invalidate();
+
1102 return true;
+
1103 }
+
1104 }
+
1105 hit_offset = SIZE_MAX;
+
1106 this->interval.invalidate();
+
1107 return false;
+
1108 }
+
1109 };
-
1131
-
1132 using branch = basic_branch<char>;
- -
1134#ifdef _UNICODE
-
1135 using tbranch = wbranch;
-
1136#else
-
1137 using tbranch = branch;
-
1138#endif
- -
1140
-
1144 template <class T, class T_parser = basic_string<T>>
-
- -
1146 {
-
1147 public:
- -
1149 _In_reads_(count) const T* str_z = nullptr,
-
1150 _In_ size_t count = 0,
-
1151 _In_ const std::locale& locale = std::locale()) :
- -
1153 {
-
1154 build(str_z, count);
-
1155 }
-
1156
-
1157 basic_string_branch(_In_z_ const T* str, ...) :
-
1158 basic_branch<T>(std::locale())
-
1159 {
-
1160 va_list params;
-
1161 va_start(params, str);
-
1162 build(str, params);
-
1163 va_end(params);
-
1164 }
-
1165
-
1166 basic_string_branch(_In_ const std::locale& locale, _In_z_ const T* str, ...) :
- -
1168 {
-
1169 va_list params;
-
1170 va_start(params, str);
-
1171 build(str, params);
-
1172 va_end(params);
-
1173 }
-
1174
-
1175 protected:
-
1176 void build(_In_reads_(count) const T* str_z, _In_ size_t count)
-
1177 {
-
1178 _Assume_(str_z || !count);
-
1179 if (count) {
-
1180 size_t offset, n;
-
1181 for (
-
1182 offset = n = 0;
-
1183 offset < count && str_z[offset];
-
1184 offset += stdex::strnlen(str_z + offset, count - offset) + 1, ++n);
-
1185 this->m_collection.reserve(n);
-
1186 for (
-
1187 offset = 0;
-
1188 offset < count && str_z[offset];
-
1189 offset += stdex::strnlen(str_z + offset, count - offset) + 1)
-
1190 this->m_collection.push_back(std::move(std::make_shared<T_parser>(str_z + offset, count - offset, this->m_locale)));
-
1191 }
-
1192 }
-
1193
-
1194 void build(_In_z_ const T* str, _In_ va_list params)
-
1195 {
-
1196 const T* p;
-
1197 for (
-
1198 this->m_collection.push_back(std::move(std::make_shared<T_parser>(str, SIZE_MAX, this->m_locale)));
-
1199 (p = va_arg(params, const T*)) != nullptr;
-
1200 this->m_collection.push_back(std::move(std::make_shared<T_parser>(p, SIZE_MAX, this->m_locale))));
-
1201 }
-
1202 };
+
1110
+
1111 using branch = basic_branch<char>;
+ +
1113#ifdef _UNICODE
+
1114 using tbranch = wbranch;
+
1115#else
+
1116 using tbranch = branch;
+
1117#endif
+ +
1119
+
1123 template <class T, class T_parser = basic_string<T>>
+
+ +
1125 {
+
1126 public:
+ +
1128 _In_reads_(count) const T* str_z = nullptr,
+
1129 _In_ size_t count = 0,
+
1130 _In_ const std::locale& locale = std::locale()) :
+ +
1132 {
+
1133 build(str_z, count);
+
1134 }
+
1135
+
1136 basic_string_branch(_In_z_ const T* str, ...) :
+
1137 basic_branch<T>(std::locale())
+
1138 {
+
1139 va_list params;
+
1140 va_start(params, str);
+
1141 build(str, params);
+
1142 va_end(params);
+
1143 }
+
1144
+
1145 basic_string_branch(_In_ const std::locale& locale, _In_z_ const T* str, ...) :
+ +
1147 {
+
1148 va_list params;
+
1149 va_start(params, str);
+
1150 build(str, params);
+
1151 va_end(params);
+
1152 }
+
1153
+
1154 protected:
+
1155 void build(_In_reads_(count) const T* str_z, _In_ size_t count)
+
1156 {
+
1157 _Assume_(str_z || !count);
+
1158 if (count) {
+
1159 size_t offset, n;
+
1160 for (
+
1161 offset = n = 0;
+
1162 offset < count && str_z[offset];
+
1163 offset += stdex::strnlen(str_z + offset, count - offset) + 1, ++n);
+
1164 this->m_collection.reserve(n);
+
1165 for (
+
1166 offset = 0;
+
1167 offset < count && str_z[offset];
+
1168 offset += stdex::strnlen(str_z + offset, count - offset) + 1)
+
1169 this->m_collection.push_back(std::move(std::make_shared<T_parser>(str_z + offset, count - offset, this->m_locale)));
+
1170 }
+
1171 }
+
1172
+
1173 void build(_In_z_ const T* str, _In_ va_list params)
+
1174 {
+
1175 const T* p;
+
1176 for (
+
1177 this->m_collection.push_back(std::move(std::make_shared<T_parser>(str, SIZE_MAX, this->m_locale)));
+
1178 (p = va_arg(params, const T*)) != nullptr;
+
1179 this->m_collection.push_back(std::move(std::make_shared<T_parser>(p, SIZE_MAX, this->m_locale))));
+
1180 }
+
1181 };
-
1203
- - -
1206#ifdef _UNICODE
- -
1208#else
- -
1210#endif
- -
1212
-
1216 template <class T>
-
- -
1218 {
-
1219 public:
- -
1221 _In_count_(count) const std::shared_ptr<basic_parser<T>>* el = nullptr,
-
1222 _In_ size_t count = 0,
-
1223 _In_ const std::locale& locale = std::locale()) :
- -
1225 {}
-
1226
- -
1228 _Inout_ std::vector<std::shared_ptr<basic_parser<T>>>&& collection,
-
1229 _In_ const std::locale& locale = std::locale()) :
- -
1231 {}
-
1232
-
1233 protected:
-
1234 virtual bool do_match(
-
1235 _In_reads_or_z_opt_(end) const T* text,
-
1236 _In_ size_t start = 0,
-
1237 _In_ size_t end = SIZE_MAX,
-
1238 _In_ int flags = match_default)
-
1239 {
-
1240 _Assume_(text || start >= end);
-
1241 for (auto& el : this->m_collection)
-
1242 el->invalidate();
-
1243 if (match_recursively(text, start, end, flags)) {
-
1244 this->interval.start = start;
-
1245 return true;
-
1246 }
-
1247 this->interval.invalidate();
-
1248 return false;
-
1249 }
-
1250
-
1251 bool match_recursively(
-
1252 _In_reads_or_z_opt_(end) const T* text,
-
1253 _In_ size_t start = 0,
-
1254 _In_ size_t end = SIZE_MAX,
-
1255 _In_ int flags = match_default)
-
1256 {
-
1257 bool all_matched = true;
-
1258 for (auto& el : this->m_collection) {
-
1259 if (!el->interval) {
-
1260 // Element was not matched in permutatuion yet.
-
1261 all_matched = false;
-
1262 if (el->match(text, start, end, flags)) {
-
1263 // Element matched for the first time.
-
1264 if (match_recursively(text, el->interval.end, end, flags)) {
-
1265 // Rest of the elements matched too.
-
1266 return true;
-
1267 }
-
1268 el->invalidate();
-
1269 }
-
1270 }
-
1271 }
-
1272 if (all_matched) {
-
1273 this->interval.end = start;
-
1274 return true;
-
1275 }
-
1276 return false;
-
1277 }
-
1278 };
+
1182
+ + +
1185#ifdef _UNICODE
+ +
1187#else
+ +
1189#endif
+ +
1191
+
1195 template <class T>
+
+ +
1197 {
+
1198 public:
+ +
1200 _In_count_(count) const std::shared_ptr<basic_parser<T>>* el = nullptr,
+
1201 _In_ size_t count = 0,
+
1202 _In_ const std::locale& locale = std::locale()) :
+ +
1204 {}
+
1205
+ +
1207 _Inout_ std::vector<std::shared_ptr<basic_parser<T>>>&& collection,
+
1208 _In_ const std::locale& locale = std::locale()) :
+ +
1210 {}
+
1211
+
1212 protected:
+
1213 virtual bool do_match(
+
1214 _In_reads_or_z_opt_(end) const T* text,
+
1215 _In_ size_t start = 0,
+
1216 _In_ size_t end = SIZE_MAX,
+
1217 _In_ int flags = match_default)
+
1218 {
+
1219 _Assume_(text || start >= end);
+
1220 for (auto& el : this->m_collection)
+
1221 el->invalidate();
+
1222 if (match_recursively(text, start, end, flags)) {
+
1223 this->interval.start = start;
+
1224 return true;
+
1225 }
+
1226 this->interval.invalidate();
+
1227 return false;
+
1228 }
+
1229
+
1230 bool match_recursively(
+
1231 _In_reads_or_z_opt_(end) const T* text,
+
1232 _In_ size_t start = 0,
+
1233 _In_ size_t end = SIZE_MAX,
+
1234 _In_ int flags = match_default)
+
1235 {
+
1236 bool all_matched = true;
+
1237 for (auto& el : this->m_collection) {
+
1238 if (!el->interval) {
+
1239 // Element was not matched in permutatuion yet.
+
1240 all_matched = false;
+
1241 if (el->match(text, start, end, flags)) {
+
1242 // Element matched for the first time.
+
1243 if (match_recursively(text, el->interval.end, end, flags)) {
+
1244 // Rest of the elements matched too.
+
1245 return true;
+
1246 }
+
1247 el->invalidate();
+
1248 }
+
1249 }
+
1250 }
+
1251 if (all_matched) {
+
1252 this->interval.end = start;
+
1253 return true;
+
1254 }
+
1255 return false;
+
1256 }
+
1257 };
+
1258
+ + +
1261#ifdef _UNICODE
+
1262 using tpermutation = wpermutation;
+
1263#else
+
1264 using tpermutation = permutation;
+
1265#endif
+ +
1267
+
1271 template <class T>
+
+
1272 class basic_integer : public basic_parser<T>
+
1273 {
+
1274 public:
+
1275 basic_integer(_In_ const std::locale& locale = std::locale()) :
+ +
1277 value(0)
+
1278 {}
1279
- - -
1282#ifdef _UNICODE
-
1283 using tpermutation = wpermutation;
-
1284#else
-
1285 using tpermutation = permutation;
-
1286#endif
- -
1288
-
1292 template <class T>
-
-
1293 class basic_integer : public basic_parser<T>
-
1294 {
-
1295 public:
-
1296 basic_integer(_In_ const std::locale& locale = std::locale()) :
- -
1298 value(0)
-
1299 {}
-
1300
-
1301 virtual void invalidate()
-
1302 {
-
1303 value = 0;
- -
1305 }
-
1306
-
1307 public:
-
1308 size_t value;
-
1309 };
+
1280 virtual void invalidate()
+
1281 {
+
1282 value = 0;
+ +
1284 }
+
1285
+
1286 public:
+
1287 size_t value;
+
1288 };
-
1310
-
1314 template <class T>
-
- -
1316 {
-
1317 public:
- -
1319 _In_ const std::shared_ptr<basic_parser<T>>& digit_0,
-
1320 _In_ const std::shared_ptr<basic_parser<T>>& digit_1,
-
1321 _In_ const std::shared_ptr<basic_parser<T>>& digit_2,
-
1322 _In_ const std::shared_ptr<basic_parser<T>>& digit_3,
-
1323 _In_ const std::shared_ptr<basic_parser<T>>& digit_4,
-
1324 _In_ const std::shared_ptr<basic_parser<T>>& digit_5,
-
1325 _In_ const std::shared_ptr<basic_parser<T>>& digit_6,
-
1326 _In_ const std::shared_ptr<basic_parser<T>>& digit_7,
-
1327 _In_ const std::shared_ptr<basic_parser<T>>& digit_8,
-
1328 _In_ const std::shared_ptr<basic_parser<T>>& digit_9,
-
1329 _In_ const std::locale& locale = std::locale()) :
- -
1331 m_digit_0(digit_0),
-
1332 m_digit_1(digit_1),
-
1333 m_digit_2(digit_2),
-
1334 m_digit_3(digit_3),
-
1335 m_digit_4(digit_4),
-
1336 m_digit_5(digit_5),
-
1337 m_digit_6(digit_6),
-
1338 m_digit_7(digit_7),
-
1339 m_digit_8(digit_8),
-
1340 m_digit_9(digit_9)
-
1341 {}
-
1342
-
1343 protected:
-
1344 virtual bool do_match(
-
1345 _In_reads_or_z_opt_(end) const T* text,
-
1346 _In_ size_t start = 0,
-
1347 _In_ size_t end = SIZE_MAX,
-
1348 _In_ int flags = match_default)
-
1349 {
-
1350 _Assume_(text || start >= end);
-
1351 for (this->interval.end = start, this->value = 0; this->interval.end < end && text[this->interval.end];) {
-
1352 size_t dig;
-
1353 if (m_digit_0->match(text, this->interval.end, end, flags)) { dig = 0; this->interval.end = m_digit_0->interval.end; }
-
1354 else if (m_digit_1->match(text, this->interval.end, end, flags)) { dig = 1; this->interval.end = m_digit_1->interval.end; }
-
1355 else if (m_digit_2->match(text, this->interval.end, end, flags)) { dig = 2; this->interval.end = m_digit_2->interval.end; }
-
1356 else if (m_digit_3->match(text, this->interval.end, end, flags)) { dig = 3; this->interval.end = m_digit_3->interval.end; }
-
1357 else if (m_digit_4->match(text, this->interval.end, end, flags)) { dig = 4; this->interval.end = m_digit_4->interval.end; }
-
1358 else if (m_digit_5->match(text, this->interval.end, end, flags)) { dig = 5; this->interval.end = m_digit_5->interval.end; }
-
1359 else if (m_digit_6->match(text, this->interval.end, end, flags)) { dig = 6; this->interval.end = m_digit_6->interval.end; }
-
1360 else if (m_digit_7->match(text, this->interval.end, end, flags)) { dig = 7; this->interval.end = m_digit_7->interval.end; }
-
1361 else if (m_digit_8->match(text, this->interval.end, end, flags)) { dig = 8; this->interval.end = m_digit_8->interval.end; }
-
1362 else if (m_digit_9->match(text, this->interval.end, end, flags)) { dig = 9; this->interval.end = m_digit_9->interval.end; }
-
1363 else break;
-
1364 this->value = this->value * 10 + dig;
-
1365 }
- -
1367 this->interval.start = start;
-
1368 return true;
-
1369 }
-
1370 this->interval.invalidate();
-
1371 return false;
-
1372 }
-
1373
-
1374 std::shared_ptr<basic_parser<T>>
-
1375 m_digit_0,
-
1376 m_digit_1,
-
1377 m_digit_2,
-
1378 m_digit_3,
-
1379 m_digit_4,
-
1380 m_digit_5,
-
1381 m_digit_6,
-
1382 m_digit_7,
-
1383 m_digit_8,
-
1384 m_digit_9;
-
1385 };
+
1289
+
1293 template <class T>
+
+ +
1295 {
+
1296 public:
+ +
1298 _In_ const std::shared_ptr<basic_parser<T>>& digit_0,
+
1299 _In_ const std::shared_ptr<basic_parser<T>>& digit_1,
+
1300 _In_ const std::shared_ptr<basic_parser<T>>& digit_2,
+
1301 _In_ const std::shared_ptr<basic_parser<T>>& digit_3,
+
1302 _In_ const std::shared_ptr<basic_parser<T>>& digit_4,
+
1303 _In_ const std::shared_ptr<basic_parser<T>>& digit_5,
+
1304 _In_ const std::shared_ptr<basic_parser<T>>& digit_6,
+
1305 _In_ const std::shared_ptr<basic_parser<T>>& digit_7,
+
1306 _In_ const std::shared_ptr<basic_parser<T>>& digit_8,
+
1307 _In_ const std::shared_ptr<basic_parser<T>>& digit_9,
+
1308 _In_ const std::locale& locale = std::locale()) :
+ +
1310 m_digit_0(digit_0),
+
1311 m_digit_1(digit_1),
+
1312 m_digit_2(digit_2),
+
1313 m_digit_3(digit_3),
+
1314 m_digit_4(digit_4),
+
1315 m_digit_5(digit_5),
+
1316 m_digit_6(digit_6),
+
1317 m_digit_7(digit_7),
+
1318 m_digit_8(digit_8),
+
1319 m_digit_9(digit_9)
+
1320 {}
+
1321
+
1322 protected:
+
1323 virtual bool do_match(
+
1324 _In_reads_or_z_opt_(end) const T* text,
+
1325 _In_ size_t start = 0,
+
1326 _In_ size_t end = SIZE_MAX,
+
1327 _In_ int flags = match_default)
+
1328 {
+
1329 _Assume_(text || start >= end);
+
1330 for (this->interval.end = start, this->value = 0; this->interval.end < end && text[this->interval.end];) {
+
1331 size_t dig;
+
1332 if (m_digit_0->match(text, this->interval.end, end, flags)) { dig = 0; this->interval.end = m_digit_0->interval.end; }
+
1333 else if (m_digit_1->match(text, this->interval.end, end, flags)) { dig = 1; this->interval.end = m_digit_1->interval.end; }
+
1334 else if (m_digit_2->match(text, this->interval.end, end, flags)) { dig = 2; this->interval.end = m_digit_2->interval.end; }
+
1335 else if (m_digit_3->match(text, this->interval.end, end, flags)) { dig = 3; this->interval.end = m_digit_3->interval.end; }
+
1336 else if (m_digit_4->match(text, this->interval.end, end, flags)) { dig = 4; this->interval.end = m_digit_4->interval.end; }
+
1337 else if (m_digit_5->match(text, this->interval.end, end, flags)) { dig = 5; this->interval.end = m_digit_5->interval.end; }
+
1338 else if (m_digit_6->match(text, this->interval.end, end, flags)) { dig = 6; this->interval.end = m_digit_6->interval.end; }
+
1339 else if (m_digit_7->match(text, this->interval.end, end, flags)) { dig = 7; this->interval.end = m_digit_7->interval.end; }
+
1340 else if (m_digit_8->match(text, this->interval.end, end, flags)) { dig = 8; this->interval.end = m_digit_8->interval.end; }
+
1341 else if (m_digit_9->match(text, this->interval.end, end, flags)) { dig = 9; this->interval.end = m_digit_9->interval.end; }
+
1342 else break;
+
1343 this->value = this->value * 10 + dig;
+
1344 }
+ +
1346 this->interval.start = start;
+
1347 return true;
+
1348 }
+
1349 this->interval.invalidate();
+
1350 return false;
+
1351 }
+
1352
+
1353 std::shared_ptr<basic_parser<T>>
+
1354 m_digit_0,
+
1355 m_digit_1,
+
1356 m_digit_2,
+
1357 m_digit_3,
+
1358 m_digit_4,
+
1359 m_digit_5,
+
1360 m_digit_6,
+
1361 m_digit_7,
+
1362 m_digit_8,
+
1363 m_digit_9;
+
1364 };
-
1386
- - -
1389#ifdef _UNICODE
-
1390 using tinteger10 = winteger10;
-
1391#else
-
1392 using tinteger10 = integer10;
-
1393#endif
- -
1395
-
1399 template <class T>
-
- -
1401 {
-
1402 public:
- -
1404 _In_ const std::shared_ptr<basic_integer10<T>>& digits,
-
1405 _In_ const std::shared_ptr<basic_set<T>>& separator,
-
1406 _In_ const std::locale& locale = std::locale()) :
- -
1408 digit_count(0),
-
1409 has_separators(false),
-
1410 m_digits(digits),
-
1411 m_separator(separator)
-
1412 {}
-
1413
-
1414 virtual void invalidate()
-
1415 {
-
1416 digit_count = 0;
-
1417 has_separators = false;
- -
1419 }
-
1420
- - -
1423
-
1424 protected:
-
1425 virtual bool do_match(
-
1426 _In_reads_or_z_opt_(end) const T* text,
-
1427 _In_ size_t start = 0,
-
1428 _In_ size_t end = SIZE_MAX,
-
1429 _In_ int flags = match_default)
-
1430 {
-
1431 _Assume_(text || start >= end);
-
1432 if (m_digits->match(text, start, end, flags)) {
-
1433 // Leading part match.
-
1434 this->value = m_digits->value;
-
1435 digit_count = m_digits->interval.size();
-
1436 has_separators = false;
-
1437 this->interval.start = start;
-
1438 this->interval.end = m_digits->interval.end;
-
1439 if (m_digits->interval.size() <= 3) {
-
1440 // Maybe separated with thousand separators?
-
1441 size_t hit_offset = SIZE_MAX;
-
1442 while (m_separator->match(text, this->interval.end, end, flags) &&
-
1443 (hit_offset == SIZE_MAX || hit_offset == m_separator->hit_offset) && // All separators must be the same, no mixing.
-
1444 m_digits->match(text, m_separator->interval.end, end, flags) &&
-
1445 m_digits->interval.size() == 3)
-
1446 {
-
1447 // Thousand separator and three-digit integer followed.
-
1448 this->value = this->value * 1000 + m_digits->value;
-
1449 digit_count += 3;
-
1450 has_separators = true;
-
1451 this->interval.end = m_digits->interval.end;
-
1452 hit_offset = m_separator->hit_offset;
-
1453 }
-
1454 }
-
1455
-
1456 return true;
-
1457 }
-
1458 this->value = 0;
-
1459 this->interval.invalidate();
-
1460 return false;
-
1461 }
-
1462
-
1463 std::shared_ptr<basic_integer10<T>> m_digits;
-
1464 std::shared_ptr<basic_set<T>> m_separator;
-
1465 };
+
1365
+ + +
1368#ifdef _UNICODE
+
1369 using tinteger10 = winteger10;
+
1370#else
+
1371 using tinteger10 = integer10;
+
1372#endif
+ +
1374
+
1378 template <class T>
+
+ +
1380 {
+
1381 public:
+ +
1383 _In_ const std::shared_ptr<basic_integer10<T>>& digits,
+
1384 _In_ const std::shared_ptr<basic_set<T>>& separator,
+
1385 _In_ const std::locale& locale = std::locale()) :
+ +
1387 digit_count(0),
+
1388 has_separators(false),
+
1389 m_digits(digits),
+
1390 m_separator(separator)
+
1391 {}
+
1392
+
1393 virtual void invalidate()
+
1394 {
+
1395 digit_count = 0;
+
1396 has_separators = false;
+ +
1398 }
+
1399
+ + +
1402
+
1403 protected:
+
1404 virtual bool do_match(
+
1405 _In_reads_or_z_opt_(end) const T* text,
+
1406 _In_ size_t start = 0,
+
1407 _In_ size_t end = SIZE_MAX,
+
1408 _In_ int flags = match_default)
+
1409 {
+
1410 _Assume_(text || start >= end);
+
1411 if (m_digits->match(text, start, end, flags)) {
+
1412 // Leading part match.
+
1413 this->value = m_digits->value;
+
1414 digit_count = m_digits->interval.size();
+
1415 has_separators = false;
+
1416 this->interval.start = start;
+
1417 this->interval.end = m_digits->interval.end;
+
1418 if (m_digits->interval.size() <= 3) {
+
1419 // Maybe separated with thousand separators?
+
1420 size_t hit_offset = SIZE_MAX;
+
1421 while (m_separator->match(text, this->interval.end, end, flags) &&
+
1422 (hit_offset == SIZE_MAX || hit_offset == m_separator->hit_offset) && // All separators must be the same, no mixing.
+
1423 m_digits->match(text, m_separator->interval.end, end, flags) &&
+
1424 m_digits->interval.size() == 3)
+
1425 {
+
1426 // Thousand separator and three-digit integer followed.
+
1427 this->value = this->value * 1000 + m_digits->value;
+
1428 digit_count += 3;
+
1429 has_separators = true;
+
1430 this->interval.end = m_digits->interval.end;
+
1431 hit_offset = m_separator->hit_offset;
+
1432 }
+
1433 }
+
1434
+
1435 return true;
+
1436 }
+
1437 this->value = 0;
+
1438 this->interval.invalidate();
+
1439 return false;
+
1440 }
+
1441
+
1442 std::shared_ptr<basic_integer10<T>> m_digits;
+
1443 std::shared_ptr<basic_set<T>> m_separator;
+
1444 };
-
1466
-
1467 using integer10ts = basic_integer10ts<char>;
-
1468 using winteger10ts = basic_integer10ts<wchar_t>;
-
1469#ifdef _UNICODE
-
1470 using tinteger10ts = winteger10ts;
-
1471#else
-
1472 using tinteger10ts = integer10ts;
-
1473#endif
-
1474 using sgml_integer10ts = basic_integer10ts<char>;
-
1475
-
1479 template <class T>
-
- -
1481 {
-
1482 public:
- -
1484 _In_ const std::shared_ptr<basic_parser<T>>& digit_0,
-
1485 _In_ const std::shared_ptr<basic_parser<T>>& digit_1,
-
1486 _In_ const std::shared_ptr<basic_parser<T>>& digit_2,
-
1487 _In_ const std::shared_ptr<basic_parser<T>>& digit_3,
-
1488 _In_ const std::shared_ptr<basic_parser<T>>& digit_4,
-
1489 _In_ const std::shared_ptr<basic_parser<T>>& digit_5,
-
1490 _In_ const std::shared_ptr<basic_parser<T>>& digit_6,
-
1491 _In_ const std::shared_ptr<basic_parser<T>>& digit_7,
-
1492 _In_ const std::shared_ptr<basic_parser<T>>& digit_8,
-
1493 _In_ const std::shared_ptr<basic_parser<T>>& digit_9,
-
1494 _In_ const std::shared_ptr<basic_parser<T>>& digit_10,
-
1495 _In_ const std::shared_ptr<basic_parser<T>>& digit_11,
-
1496 _In_ const std::shared_ptr<basic_parser<T>>& digit_12,
-
1497 _In_ const std::shared_ptr<basic_parser<T>>& digit_13,
-
1498 _In_ const std::shared_ptr<basic_parser<T>>& digit_14,
-
1499 _In_ const std::shared_ptr<basic_parser<T>>& digit_15,
-
1500 _In_ const std::locale& locale = std::locale()) :
- -
1502 m_digit_0(digit_0),
-
1503 m_digit_1(digit_1),
-
1504 m_digit_2(digit_2),
-
1505 m_digit_3(digit_3),
-
1506 m_digit_4(digit_4),
-
1507 m_digit_5(digit_5),
-
1508 m_digit_6(digit_6),
-
1509 m_digit_7(digit_7),
-
1510 m_digit_8(digit_8),
-
1511 m_digit_9(digit_9),
-
1512 m_digit_10(digit_10),
-
1513 m_digit_11(digit_11),
-
1514 m_digit_12(digit_12),
-
1515 m_digit_13(digit_13),
-
1516 m_digit_14(digit_14),
-
1517 m_digit_15(digit_15)
-
1518 {}
-
1519
-
1520 protected:
-
1521 virtual bool do_match(
-
1522 _In_reads_or_z_opt_(end) const T* text,
-
1523 _In_ size_t start = 0,
-
1524 _In_ size_t end = SIZE_MAX,
-
1525 _In_ int flags = match_default)
-
1526 {
-
1527 _Assume_(text || start >= end);
-
1528 for (this->interval.end = start, this->value = 0; this->interval.end < end && text[this->interval.end];) {
-
1529 size_t dig;
-
1530 if (m_digit_0->match(text, this->interval.end, end, flags)) { dig = 0; this->interval.end = m_digit_0->interval.end; }
-
1531 else if (m_digit_1->match(text, this->interval.end, end, flags)) { dig = 1; this->interval.end = m_digit_1->interval.end; }
-
1532 else if (m_digit_2->match(text, this->interval.end, end, flags)) { dig = 2; this->interval.end = m_digit_2->interval.end; }
-
1533 else if (m_digit_3->match(text, this->interval.end, end, flags)) { dig = 3; this->interval.end = m_digit_3->interval.end; }
-
1534 else if (m_digit_4->match(text, this->interval.end, end, flags)) { dig = 4; this->interval.end = m_digit_4->interval.end; }
-
1535 else if (m_digit_5->match(text, this->interval.end, end, flags)) { dig = 5; this->interval.end = m_digit_5->interval.end; }
-
1536 else if (m_digit_6->match(text, this->interval.end, end, flags)) { dig = 6; this->interval.end = m_digit_6->interval.end; }
-
1537 else if (m_digit_7->match(text, this->interval.end, end, flags)) { dig = 7; this->interval.end = m_digit_7->interval.end; }
-
1538 else if (m_digit_8->match(text, this->interval.end, end, flags)) { dig = 8; this->interval.end = m_digit_8->interval.end; }
-
1539 else if (m_digit_9->match(text, this->interval.end, end, flags)) { dig = 9; this->interval.end = m_digit_9->interval.end; }
-
1540 else if (m_digit_10->match(text, this->interval.end, end, flags)) { dig = 10; this->interval.end = m_digit_10->interval.end; }
-
1541 else if (m_digit_11->match(text, this->interval.end, end, flags)) { dig = 11; this->interval.end = m_digit_11->interval.end; }
-
1542 else if (m_digit_12->match(text, this->interval.end, end, flags)) { dig = 12; this->interval.end = m_digit_12->interval.end; }
-
1543 else if (m_digit_13->match(text, this->interval.end, end, flags)) { dig = 13; this->interval.end = m_digit_13->interval.end; }
-
1544 else if (m_digit_14->match(text, this->interval.end, end, flags)) { dig = 14; this->interval.end = m_digit_14->interval.end; }
-
1545 else if (m_digit_15->match(text, this->interval.end, end, flags)) { dig = 15; this->interval.end = m_digit_15->interval.end; }
-
1546 else break;
-
1547 this->value = this->value * 16 + dig;
-
1548 }
- -
1550 this->interval.start = start;
-
1551 return true;
-
1552 }
-
1553 this->interval.invalidate();
-
1554 return false;
-
1555 }
-
1556
-
1557 std::shared_ptr<basic_parser<T>>
-
1558 m_digit_0,
-
1559 m_digit_1,
-
1560 m_digit_2,
-
1561 m_digit_3,
-
1562 m_digit_4,
-
1563 m_digit_5,
-
1564 m_digit_6,
-
1565 m_digit_7,
-
1566 m_digit_8,
-
1567 m_digit_9,
-
1568 m_digit_10,
-
1569 m_digit_11,
-
1570 m_digit_12,
-
1571 m_digit_13,
-
1572 m_digit_14,
-
1573 m_digit_15;
-
1574 };
+
1445
+
1446 using integer10ts = basic_integer10ts<char>;
+
1447 using winteger10ts = basic_integer10ts<wchar_t>;
+
1448#ifdef _UNICODE
+
1449 using tinteger10ts = winteger10ts;
+
1450#else
+
1451 using tinteger10ts = integer10ts;
+
1452#endif
+
1453 using sgml_integer10ts = basic_integer10ts<char>;
+
1454
+
1458 template <class T>
+
+ +
1460 {
+
1461 public:
+ +
1463 _In_ const std::shared_ptr<basic_parser<T>>& digit_0,
+
1464 _In_ const std::shared_ptr<basic_parser<T>>& digit_1,
+
1465 _In_ const std::shared_ptr<basic_parser<T>>& digit_2,
+
1466 _In_ const std::shared_ptr<basic_parser<T>>& digit_3,
+
1467 _In_ const std::shared_ptr<basic_parser<T>>& digit_4,
+
1468 _In_ const std::shared_ptr<basic_parser<T>>& digit_5,
+
1469 _In_ const std::shared_ptr<basic_parser<T>>& digit_6,
+
1470 _In_ const std::shared_ptr<basic_parser<T>>& digit_7,
+
1471 _In_ const std::shared_ptr<basic_parser<T>>& digit_8,
+
1472 _In_ const std::shared_ptr<basic_parser<T>>& digit_9,
+
1473 _In_ const std::shared_ptr<basic_parser<T>>& digit_10,
+
1474 _In_ const std::shared_ptr<basic_parser<T>>& digit_11,
+
1475 _In_ const std::shared_ptr<basic_parser<T>>& digit_12,
+
1476 _In_ const std::shared_ptr<basic_parser<T>>& digit_13,
+
1477 _In_ const std::shared_ptr<basic_parser<T>>& digit_14,
+
1478 _In_ const std::shared_ptr<basic_parser<T>>& digit_15,
+
1479 _In_ const std::locale& locale = std::locale()) :
+ +
1481 m_digit_0(digit_0),
+
1482 m_digit_1(digit_1),
+
1483 m_digit_2(digit_2),
+
1484 m_digit_3(digit_3),
+
1485 m_digit_4(digit_4),
+
1486 m_digit_5(digit_5),
+
1487 m_digit_6(digit_6),
+
1488 m_digit_7(digit_7),
+
1489 m_digit_8(digit_8),
+
1490 m_digit_9(digit_9),
+
1491 m_digit_10(digit_10),
+
1492 m_digit_11(digit_11),
+
1493 m_digit_12(digit_12),
+
1494 m_digit_13(digit_13),
+
1495 m_digit_14(digit_14),
+
1496 m_digit_15(digit_15)
+
1497 {}
+
1498
+
1499 protected:
+
1500 virtual bool do_match(
+
1501 _In_reads_or_z_opt_(end) const T* text,
+
1502 _In_ size_t start = 0,
+
1503 _In_ size_t end = SIZE_MAX,
+
1504 _In_ int flags = match_default)
+
1505 {
+
1506 _Assume_(text || start >= end);
+
1507 for (this->interval.end = start, this->value = 0; this->interval.end < end && text[this->interval.end];) {
+
1508 size_t dig;
+
1509 if (m_digit_0->match(text, this->interval.end, end, flags)) { dig = 0; this->interval.end = m_digit_0->interval.end; }
+
1510 else if (m_digit_1->match(text, this->interval.end, end, flags)) { dig = 1; this->interval.end = m_digit_1->interval.end; }
+
1511 else if (m_digit_2->match(text, this->interval.end, end, flags)) { dig = 2; this->interval.end = m_digit_2->interval.end; }
+
1512 else if (m_digit_3->match(text, this->interval.end, end, flags)) { dig = 3; this->interval.end = m_digit_3->interval.end; }
+
1513 else if (m_digit_4->match(text, this->interval.end, end, flags)) { dig = 4; this->interval.end = m_digit_4->interval.end; }
+
1514 else if (m_digit_5->match(text, this->interval.end, end, flags)) { dig = 5; this->interval.end = m_digit_5->interval.end; }
+
1515 else if (m_digit_6->match(text, this->interval.end, end, flags)) { dig = 6; this->interval.end = m_digit_6->interval.end; }
+
1516 else if (m_digit_7->match(text, this->interval.end, end, flags)) { dig = 7; this->interval.end = m_digit_7->interval.end; }
+
1517 else if (m_digit_8->match(text, this->interval.end, end, flags)) { dig = 8; this->interval.end = m_digit_8->interval.end; }
+
1518 else if (m_digit_9->match(text, this->interval.end, end, flags)) { dig = 9; this->interval.end = m_digit_9->interval.end; }
+
1519 else if (m_digit_10->match(text, this->interval.end, end, flags)) { dig = 10; this->interval.end = m_digit_10->interval.end; }
+
1520 else if (m_digit_11->match(text, this->interval.end, end, flags)) { dig = 11; this->interval.end = m_digit_11->interval.end; }
+
1521 else if (m_digit_12->match(text, this->interval.end, end, flags)) { dig = 12; this->interval.end = m_digit_12->interval.end; }
+
1522 else if (m_digit_13->match(text, this->interval.end, end, flags)) { dig = 13; this->interval.end = m_digit_13->interval.end; }
+
1523 else if (m_digit_14->match(text, this->interval.end, end, flags)) { dig = 14; this->interval.end = m_digit_14->interval.end; }
+
1524 else if (m_digit_15->match(text, this->interval.end, end, flags)) { dig = 15; this->interval.end = m_digit_15->interval.end; }
+
1525 else break;
+
1526 this->value = this->value * 16 + dig;
+
1527 }
+ +
1529 this->interval.start = start;
+
1530 return true;
+
1531 }
+
1532 this->interval.invalidate();
+
1533 return false;
+
1534 }
+
1535
+
1536 std::shared_ptr<basic_parser<T>>
+
1537 m_digit_0,
+
1538 m_digit_1,
+
1539 m_digit_2,
+
1540 m_digit_3,
+
1541 m_digit_4,
+
1542 m_digit_5,
+
1543 m_digit_6,
+
1544 m_digit_7,
+
1545 m_digit_8,
+
1546 m_digit_9,
+
1547 m_digit_10,
+
1548 m_digit_11,
+
1549 m_digit_12,
+
1550 m_digit_13,
+
1551 m_digit_14,
+
1552 m_digit_15;
+
1553 };
-
1575
- - -
1578#ifdef _UNICODE
-
1579 using tinteger16 = winteger16;
-
1580#else
-
1581 using tinteger16 = integer16;
-
1582#endif
- -
1584
-
1588 template <class T>
-
- -
1590 {
-
1591 public:
- -
1593 _In_ const std::shared_ptr<basic_parser<T>>& digit_1,
-
1594 _In_ const std::shared_ptr<basic_parser<T>>& digit_5,
-
1595 _In_ const std::shared_ptr<basic_parser<T>>& digit_10,
-
1596 _In_ const std::shared_ptr<basic_parser<T>>& digit_50,
-
1597 _In_ const std::shared_ptr<basic_parser<T>>& digit_100,
-
1598 _In_ const std::shared_ptr<basic_parser<T>>& digit_500,
-
1599 _In_ const std::shared_ptr<basic_parser<T>>& digit_1000,
-
1600 _In_ const std::shared_ptr<basic_parser<T>>& digit_5000,
-
1601 _In_ const std::shared_ptr<basic_parser<T>>& digit_10000,
-
1602 _In_ const std::locale& locale = std::locale()) :
- -
1604 m_digit_1(digit_1),
-
1605 m_digit_5(digit_5),
-
1606 m_digit_10(digit_10),
-
1607 m_digit_50(digit_50),
-
1608 m_digit_100(digit_100),
-
1609 m_digit_500(digit_500),
-
1610 m_digit_1000(digit_1000),
-
1611 m_digit_5000(digit_5000),
-
1612 m_digit_10000(digit_10000)
-
1613 {}
-
1614
-
1615 protected:
-
1616 virtual bool do_match(
-
1617 _In_reads_or_z_opt_(end) const T* text,
-
1618 _In_ size_t start = 0,
-
1619 _In_ size_t end = SIZE_MAX,
-
1620 _In_ int flags = match_default)
-
1621 {
-
1622 _Assume_(text || start >= end);
-
1623 size_t
- -
1625 end2;
-
1626
-
1627 for (this->interval.end = start, this->value = 0; this->interval.end < end && text[this->interval.end]; dig[3] = dig[2], dig[2] = dig[1], dig[1] = dig[0], this->interval.end = end2) {
-
1628 if (m_digit_1 && m_digit_1->match(text, this->interval.end, end, flags)) { dig[0] = 1; end2 = m_digit_1->interval.end; }
-
1629 else if (m_digit_5 && m_digit_5->match(text, this->interval.end, end, flags)) { dig[0] = 5; end2 = m_digit_5->interval.end; }
-
1630 else if (m_digit_10 && m_digit_10->match(text, this->interval.end, end, flags)) { dig[0] = 10; end2 = m_digit_10->interval.end; }
-
1631 else if (m_digit_50 && m_digit_50->match(text, this->interval.end, end, flags)) { dig[0] = 50; end2 = m_digit_50->interval.end; }
-
1632 else if (m_digit_100 && m_digit_100->match(text, this->interval.end, end, flags)) { dig[0] = 100; end2 = m_digit_100->interval.end; }
-
1633 else if (m_digit_500 && m_digit_500->match(text, this->interval.end, end, flags)) { dig[0] = 500; end2 = m_digit_500->interval.end; }
-
1634 else if (m_digit_1000 && m_digit_1000->match(text, this->interval.end, end, flags)) { dig[0] = 1000; end2 = m_digit_1000->interval.end; }
-
1635 else if (m_digit_5000 && m_digit_5000->match(text, this->interval.end, end, flags)) { dig[0] = 5000; end2 = m_digit_5000->interval.end; }
-
1636 else if (m_digit_10000 && m_digit_10000->match(text, this->interval.end, end, flags)) { dig[0] = 10000; end2 = m_digit_10000->interval.end; }
-
1637 else break;
-
1638
-
1639 // Store first digit.
-
1640 if (dig[4] == SIZE_MAX) dig[4] = dig[0];
-
1641
-
1642 if (dig[3] == dig[2] && dig[2] == dig[1] && dig[1] == dig[0] && dig[0] != dig[4]) {
-
1643 // Same digit repeated four times. No-go, unless first digit. E.g. XIIII vs. XIV. MMMMMCD allowed, IIII also...
-
1644 break;
+
1554
+ + +
1557#ifdef _UNICODE
+
1558 using tinteger16 = winteger16;
+
1559#else
+
1560 using tinteger16 = integer16;
+
1561#endif
+ +
1563
+
1567 template <class T>
+
+ +
1569 {
+
1570 public:
+ +
1572 _In_ const std::shared_ptr<basic_parser<T>>& digit_1,
+
1573 _In_ const std::shared_ptr<basic_parser<T>>& digit_5,
+
1574 _In_ const std::shared_ptr<basic_parser<T>>& digit_10,
+
1575 _In_ const std::shared_ptr<basic_parser<T>>& digit_50,
+
1576 _In_ const std::shared_ptr<basic_parser<T>>& digit_100,
+
1577 _In_ const std::shared_ptr<basic_parser<T>>& digit_500,
+
1578 _In_ const std::shared_ptr<basic_parser<T>>& digit_1000,
+
1579 _In_ const std::shared_ptr<basic_parser<T>>& digit_5000,
+
1580 _In_ const std::shared_ptr<basic_parser<T>>& digit_10000,
+
1581 _In_ const std::locale& locale = std::locale()) :
+ +
1583 m_digit_1(digit_1),
+
1584 m_digit_5(digit_5),
+
1585 m_digit_10(digit_10),
+
1586 m_digit_50(digit_50),
+
1587 m_digit_100(digit_100),
+
1588 m_digit_500(digit_500),
+
1589 m_digit_1000(digit_1000),
+
1590 m_digit_5000(digit_5000),
+
1591 m_digit_10000(digit_10000)
+
1592 {}
+
1593
+
1594 protected:
+
1595 virtual bool do_match(
+
1596 _In_reads_or_z_opt_(end) const T* text,
+
1597 _In_ size_t start = 0,
+
1598 _In_ size_t end = SIZE_MAX,
+
1599 _In_ int flags = match_default)
+
1600 {
+
1601 _Assume_(text || start >= end);
+
1602 size_t
+ +
1604 end2;
+
1605
+
1606 for (this->interval.end = start, this->value = 0; this->interval.end < end && text[this->interval.end]; dig[3] = dig[2], dig[2] = dig[1], dig[1] = dig[0], this->interval.end = end2) {
+
1607 if (m_digit_1 && m_digit_1->match(text, this->interval.end, end, flags)) { dig[0] = 1; end2 = m_digit_1->interval.end; }
+
1608 else if (m_digit_5 && m_digit_5->match(text, this->interval.end, end, flags)) { dig[0] = 5; end2 = m_digit_5->interval.end; }
+
1609 else if (m_digit_10 && m_digit_10->match(text, this->interval.end, end, flags)) { dig[0] = 10; end2 = m_digit_10->interval.end; }
+
1610 else if (m_digit_50 && m_digit_50->match(text, this->interval.end, end, flags)) { dig[0] = 50; end2 = m_digit_50->interval.end; }
+
1611 else if (m_digit_100 && m_digit_100->match(text, this->interval.end, end, flags)) { dig[0] = 100; end2 = m_digit_100->interval.end; }
+
1612 else if (m_digit_500 && m_digit_500->match(text, this->interval.end, end, flags)) { dig[0] = 500; end2 = m_digit_500->interval.end; }
+
1613 else if (m_digit_1000 && m_digit_1000->match(text, this->interval.end, end, flags)) { dig[0] = 1000; end2 = m_digit_1000->interval.end; }
+
1614 else if (m_digit_5000 && m_digit_5000->match(text, this->interval.end, end, flags)) { dig[0] = 5000; end2 = m_digit_5000->interval.end; }
+
1615 else if (m_digit_10000 && m_digit_10000->match(text, this->interval.end, end, flags)) { dig[0] = 10000; end2 = m_digit_10000->interval.end; }
+
1616 else break;
+
1617
+
1618 // Store first digit.
+
1619 if (dig[4] == SIZE_MAX) dig[4] = dig[0];
+
1620
+
1621 if (dig[3] == dig[2] && dig[2] == dig[1] && dig[1] == dig[0] && dig[0] != dig[4]) {
+
1622 // Same digit repeated four times. No-go, unless first digit. E.g. XIIII vs. XIV. MMMMMCD allowed, IIII also...
+
1623 break;
+
1624 }
+
1625 if (dig[0] <= dig[1]) {
+
1626 // Digit is less or equal previous one: add.
+
1627 this->value += dig[0];
+
1628 }
+
1629 else if (
+
1630 (dig[1] == 1 && (dig[0] == 5 || dig[0] == 10)) ||
+
1631 (dig[1] == 10 && (dig[0] == 50 || dig[0] == 100)) ||
+
1632 (dig[1] == 100 && (dig[0] == 500 || dig[0] == 1000)) ||
+
1633 (dig[1] == 1000 && (dig[0] == 5000 || dig[0] == 10000)))
+
1634 {
+
1635 // Digit is up to two orders bigger than previous one: subtract. But...
+
1636 if (dig[2] < dig[0]) {
+
1637 // Digit is also bigger than pre-previous one. E.g. VIX (V < X => invalid)
+
1638 break;
+
1639 }
+
1640 this->value -= dig[1]; // Cancel addition in the previous step.
+
1641 dig[0] -= dig[1]; // Combine last two digits.
+
1642 dig[1] = dig[2]; // The true previous digit is now pre-previous one. :)
+
1643 dig[2] = dig[3]; // The true pre-previous digit is now pre-pre-previous one. :)
+
1644 this->value += dig[0]; // Add combined value.
1645 }
-
1646 if (dig[0] <= dig[1]) {
-
1647 // Digit is less or equal previous one: add.
-
1648 this->value += dig[0];
+
1646 else {
+
1647 // New digit is too big than the previous one. E.g. VX (V < X => invalid)
+
1648 break;
1649 }
-
1650 else if (
-
1651 (dig[1] == 1 && (dig[0] == 5 || dig[0] == 10)) ||
-
1652 (dig[1] == 10 && (dig[0] == 50 || dig[0] == 100)) ||
-
1653 (dig[1] == 100 && (dig[0] == 500 || dig[0] == 1000)) ||
-
1654 (dig[1] == 1000 && (dig[0] == 5000 || dig[0] == 10000)))
-
1655 {
-
1656 // Digit is up to two orders bigger than previous one: subtract. But...
-
1657 if (dig[2] < dig[0]) {
-
1658 // Digit is also bigger than pre-previous one. E.g. VIX (V < X => invalid)
-
1659 break;
-
1660 }
-
1661 this->value -= dig[1]; // Cancel addition in the previous step.
-
1662 dig[0] -= dig[1]; // Combine last two digits.
-
1663 dig[1] = dig[2]; // The true previous digit is now pre-previous one. :)
-
1664 dig[2] = dig[3]; // The true pre-previous digit is now pre-pre-previous one. :)
-
1665 this->value += dig[0]; // Add combined value.
-
1666 }
-
1667 else {
-
1668 // New digit is too big than the previous one. E.g. VX (V < X => invalid)
-
1669 break;
-
1670 }
-
1671 }
-
1672 if (this->value) {
-
1673 this->interval.start = start;
-
1674 return true;
-
1675 }
-
1676 this->interval.invalidate();
-
1677 return false;
-
1678 }
+
1650 }
+
1651 if (this->value) {
+
1652 this->interval.start = start;
+
1653 return true;
+
1654 }
+
1655 this->interval.invalidate();
+
1656 return false;
+
1657 }
+
1658
+
1659 std::shared_ptr<basic_parser<T>>
+
1660 m_digit_1,
+
1661 m_digit_5,
+
1662 m_digit_10,
+
1663 m_digit_50,
+
1664 m_digit_100,
+
1665 m_digit_500,
+
1666 m_digit_1000,
+
1667 m_digit_5000,
+
1668 m_digit_10000;
+
1669 };
+
+
1670
+ + +
1673#ifdef _UNICODE
+ +
1675#else
+ +
1677#endif
+
1679
-
1680 std::shared_ptr<basic_parser<T>>
-
1681 m_digit_1,
-
1682 m_digit_5,
-
1683 m_digit_10,
-
1684 m_digit_50,
-
1685 m_digit_100,
-
1686 m_digit_500,
-
1687 m_digit_1000,
-
1688 m_digit_5000,
-
1689 m_digit_10000;
-
1690 };
+
1683 template <class T>
+
+ +
1685 {
+
1686 public:
+ +
1688 _In_ const std::shared_ptr<basic_parser<T>>& _numerator,
+
1689 _In_ const std::shared_ptr<basic_parser<T>>& _fraction_line,
+
1690 _In_ const std::shared_ptr<basic_parser<T>>& _denominator,
+
1691 _In_ const std::locale& locale = std::locale()) :
+ +
1693 numerator(_numerator),
+
1694 fraction_line(_fraction_line),
+
1695 denominator(_denominator)
+
1696 {}
+
1697
+
1698 virtual void invalidate()
+
1699 {
+
1700 numerator->invalidate();
+
1701 fraction_line->invalidate();
+
1702 denominator->invalidate();
+ +
1704 }
+
1705
+
1706 std::shared_ptr<basic_parser<T>> numerator;
+
1707 std::shared_ptr<basic_parser<T>> fraction_line;
+
1708 std::shared_ptr<basic_parser<T>> denominator;
+
1709
+
1710 protected:
+
1711 virtual bool do_match(
+
1712 _In_reads_or_z_opt_(end) const T* text,
+
1713 _In_ size_t start = 0,
+
1714 _In_ size_t end = SIZE_MAX,
+
1715 _In_ int flags = match_default)
+
1716 {
+
1717 _Assume_(text || start >= end);
+
1718 if (numerator->match(text, start, end, flags) &&
+
1719 fraction_line->match(text, numerator->interval.end, end, flags) &&
+
1720 denominator->match(text, fraction_line->interval.end, end, flags))
+
1721 {
+
1722 this->interval.start = start;
+
1723 this->interval.end = denominator->interval.end;
+
1724 return true;
+
1725 }
+
1726 numerator->invalidate();
+
1727 fraction_line->invalidate();
+
1728 denominator->invalidate();
+
1729 this->interval.invalidate();
+
1730 return false;
+
1731 }
+
1732 };
-
1691
- - -
1694#ifdef _UNICODE
- -
1696#else
- -
1698#endif
- -
1700
-
1704 template <class T>
-
- -
1706 {
-
1707 public:
- -
1709 _In_ const std::shared_ptr<basic_parser<T>>& _numerator,
-
1710 _In_ const std::shared_ptr<basic_parser<T>>& _fraction_line,
-
1711 _In_ const std::shared_ptr<basic_parser<T>>& _denominator,
-
1712 _In_ const std::locale& locale = std::locale()) :
- -
1714 numerator(_numerator),
-
1715 fraction_line(_fraction_line),
-
1716 denominator(_denominator)
-
1717 {}
-
1718
-
1719 virtual void invalidate()
-
1720 {
-
1721 numerator->invalidate();
-
1722 fraction_line->invalidate();
-
1723 denominator->invalidate();
- -
1725 }
-
1726
-
1727 std::shared_ptr<basic_parser<T>> numerator;
-
1728 std::shared_ptr<basic_parser<T>> fraction_line;
-
1729 std::shared_ptr<basic_parser<T>> denominator;
-
1730
-
1731 protected:
-
1732 virtual bool do_match(
-
1733 _In_reads_or_z_opt_(end) const T* text,
-
1734 _In_ size_t start = 0,
-
1735 _In_ size_t end = SIZE_MAX,
-
1736 _In_ int flags = match_default)
-
1737 {
-
1738 _Assume_(text || start >= end);
-
1739 if (numerator->match(text, start, end, flags) &&
-
1740 fraction_line->match(text, numerator->interval.end, end, flags) &&
-
1741 denominator->match(text, fraction_line->interval.end, end, flags))
-
1742 {
-
1743 this->interval.start = start;
-
1744 this->interval.end = denominator->interval.end;
-
1745 return true;
-
1746 }
-
1747 numerator->invalidate();
-
1748 fraction_line->invalidate();
-
1749 denominator->invalidate();
-
1750 this->interval.invalidate();
-
1751 return false;
-
1752 }
-
1753 };
-
-
1754
- - -
1757#ifdef _UNICODE
-
1758 using tfraction = wfraction;
-
1759#else
-
1760 using tfraction = fraction;
-
1761#endif
- -
1763
-
1767 template <class T>
-
-
1768 class basic_score : public basic_parser<T>
-
1769 {
-
1770 public:
- -
1772 _In_ const std::shared_ptr<basic_parser<T>>& _home,
-
1773 _In_ const std::shared_ptr<basic_parser<T>>& _separator,
-
1774 _In_ const std::shared_ptr<basic_parser<T>>& _guest,
-
1775 _In_ const std::shared_ptr<basic_parser<T>>& space,
-
1776 _In_ const std::locale& locale = std::locale()) :
- -
1778 home(_home),
-
1779 separator(_separator),
-
1780 guest(_guest),
-
1781 m_space(space)
-
1782 {}
-
1783
-
1784 virtual void invalidate()
-
1785 {
-
1786 home->invalidate();
-
1787 separator->invalidate();
-
1788 guest->invalidate();
- -
1790 }
+
1733
+ + +
1736#ifdef _UNICODE
+
1737 using tfraction = wfraction;
+
1738#else
+
1739 using tfraction = fraction;
+
1740#endif
+ +
1742
+
1746 template <class T>
+
+
1747 class basic_score : public basic_parser<T>
+
1748 {
+
1749 public:
+ +
1751 _In_ const std::shared_ptr<basic_parser<T>>& _home,
+
1752 _In_ const std::shared_ptr<basic_parser<T>>& _separator,
+
1753 _In_ const std::shared_ptr<basic_parser<T>>& _guest,
+
1754 _In_ const std::shared_ptr<basic_parser<T>>& space,
+
1755 _In_ const std::locale& locale = std::locale()) :
+ +
1757 home(_home),
+
1758 separator(_separator),
+
1759 guest(_guest),
+
1760 m_space(space)
+
1761 {}
+
1762
+
1763 virtual void invalidate()
+
1764 {
+
1765 home->invalidate();
+
1766 separator->invalidate();
+
1767 guest->invalidate();
+ +
1769 }
+
1770
+
1771 std::shared_ptr<basic_parser<T>> home;
+
1772 std::shared_ptr<basic_parser<T>> separator;
+
1773 std::shared_ptr<basic_parser<T>> guest;
+
1774
+
1775 protected:
+
1776 virtual bool do_match(
+
1777 _In_reads_or_z_opt_(end) const T* text,
+
1778 _In_ size_t start = 0,
+
1779 _In_ size_t end = SIZE_MAX,
+
1780 _In_ int flags = match_default)
+
1781 {
+
1782 _Assume_(text || start >= end);
+
1783 this->interval.end = start;
+
1784
+
1785 const int space_match_flags = flags & ~match_multiline; // Spaces in score must never be broken in new line.
+
1786
+
1787 if (home->match(text, this->interval.end, end, flags))
+
1788 this->interval.end = home->interval.end;
+
1789 else
+
1790 goto end;
1791
-
1792 std::shared_ptr<basic_parser<T>> home;
-
1793 std::shared_ptr<basic_parser<T>> separator;
-
1794 std::shared_ptr<basic_parser<T>> guest;
-
1795
-
1796 protected:
-
1797 virtual bool do_match(
-
1798 _In_reads_or_z_opt_(end) const T* text,
-
1799 _In_ size_t start = 0,
-
1800 _In_ size_t end = SIZE_MAX,
-
1801 _In_ int flags = match_default)
-
1802 {
-
1803 _Assume_(text || start >= end);
-
1804 this->interval.end = start;
+
1792 for (; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
1793
+
1794 if (separator->match(text, this->interval.end, end, flags))
+
1795 this->interval.end = separator->interval.end;
+
1796 else
+
1797 goto end;
+
1798
+
1799 for (; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
1800
+
1801 if (guest->match(text, this->interval.end, end, flags))
+
1802 this->interval.end = guest->interval.end;
+
1803 else
+
1804 goto end;
1805
-
1806 const int space_match_flags = flags & ~match_multiline; // Spaces in score must never be broken in new line.
-
1807
-
1808 if (home->match(text, this->interval.end, end, flags))
-
1809 this->interval.end = home->interval.end;
-
1810 else
-
1811 goto end;
-
1812
-
1813 for (; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
1814
-
1815 if (separator->match(text, this->interval.end, end, flags))
-
1816 this->interval.end = separator->interval.end;
-
1817 else
-
1818 goto end;
+
1806 this->interval.start = start;
+
1807 return true;
+
1808
+
1809 end:
+
1810 home->invalidate();
+
1811 separator->invalidate();
+
1812 guest->invalidate();
+
1813 this->interval.invalidate();
+
1814 return false;
+
1815 }
+
1816
+
1817 std::shared_ptr<basic_parser<T>> m_space;
+
1818 };
+
1819
-
1820 for (; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
1821
-
1822 if (guest->match(text, this->interval.end, end, flags))
-
1823 this->interval.end = guest->interval.end;
-
1824 else
-
1825 goto end;
-
1826
-
1827 this->interval.start = start;
-
1828 return true;
-
1829
-
1830 end:
-
1831 home->invalidate();
-
1832 separator->invalidate();
-
1833 guest->invalidate();
-
1834 this->interval.invalidate();
-
1835 return false;
-
1836 }
-
1837
-
1838 std::shared_ptr<basic_parser<T>> m_space;
-
1839 };
+
1820 using score = basic_score<char>;
+ +
1822#ifdef _UNICODE
+
1823 using tscore = wscore;
+
1824#else
+
1825 using tscore = score;
+
1826#endif
+ +
1828
+
1832 template <class T>
+
+ +
1834 {
+
1835 public:
+ +
1837 _In_ const std::shared_ptr<basic_parser<T>>& _positive_sign,
+
1838 _In_ const std::shared_ptr<basic_parser<T>>& _negative_sign,
+
1839 _In_ const std::shared_ptr<basic_parser<T>>& _special_sign,
+
1840 _In_ const std::shared_ptr<basic_parser<T>>& _number,
+
1841 _In_ const std::locale& locale = std::locale()) :
+ + + + + +
1847 {}
+
1848
+
1849 virtual void invalidate()
+
1850 {
+
1851 if (positive_sign) positive_sign->invalidate();
+
1852 if (negative_sign) negative_sign->invalidate();
+
1853 if (special_sign) special_sign->invalidate();
+
1854 number->invalidate();
+ +
1856 }
+
1857
+
1858 std::shared_ptr<basic_parser<T>> positive_sign;
+
1859 std::shared_ptr<basic_parser<T>> negative_sign;
+
1860 std::shared_ptr<basic_parser<T>> special_sign;
+
1861 std::shared_ptr<basic_parser<T>> number;
+
1862
+
1863 protected:
+
1864 virtual bool do_match(
+
1865 _In_reads_or_z_opt_(end) const T* text,
+
1866 _In_ size_t start = 0,
+
1867 _In_ size_t end = SIZE_MAX,
+
1868 _In_ int flags = match_default)
+
1869 {
+
1870 _Assume_(text || start >= end);
+
1871 this->interval.end = start;
+
1872 if (positive_sign && positive_sign->match(text, this->interval.end, end, flags)) {
+
1873 this->interval.end = positive_sign->interval.end;
+
1874 if (negative_sign) negative_sign->invalidate();
+
1875 if (special_sign) special_sign->invalidate();
+
1876 }
+
1877 else if (negative_sign && negative_sign->match(text, this->interval.end, end, flags)) {
+
1878 this->interval.end = negative_sign->interval.end;
+
1879 if (positive_sign) positive_sign->invalidate();
+
1880 if (special_sign) special_sign->invalidate();
+
1881 }
+
1882 else if (special_sign && special_sign->match(text, this->interval.end, end, flags)) {
+
1883 this->interval.end = special_sign->interval.end;
+
1884 if (positive_sign) positive_sign->invalidate();
+
1885 if (negative_sign) negative_sign->invalidate();
+
1886 }
+
1887 else {
+
1888 if (positive_sign) positive_sign->invalidate();
+
1889 if (negative_sign) negative_sign->invalidate();
+
1890 if (special_sign) special_sign->invalidate();
+
1891 }
+
1892 if (number->match(text, this->interval.end, end, flags)) {
+
1893 this->interval.start = start;
+
1894 this->interval.end = number->interval.end;
+
1895 return true;
+
1896 }
+
1897 if (positive_sign) positive_sign->invalidate();
+
1898 if (negative_sign) negative_sign->invalidate();
+
1899 if (special_sign) special_sign->invalidate();
+
1900 number->invalidate();
+
1901 this->interval.invalidate();
+
1902 return false;
+
1903 }
+
1904 };
-
1840
-
1841 using score = basic_score<char>;
- -
1843#ifdef _UNICODE
-
1844 using tscore = wscore;
-
1845#else
-
1846 using tscore = score;
-
1847#endif
- -
1849
-
1853 template <class T>
-
- -
1855 {
-
1856 public:
- -
1858 _In_ const std::shared_ptr<basic_parser<T>>& _positive_sign,
-
1859 _In_ const std::shared_ptr<basic_parser<T>>& _negative_sign,
-
1860 _In_ const std::shared_ptr<basic_parser<T>>& _special_sign,
-
1861 _In_ const std::shared_ptr<basic_parser<T>>& _number,
-
1862 _In_ const std::locale& locale = std::locale()) :
- - - - - -
1868 {}
-
1869
-
1870 virtual void invalidate()
-
1871 {
-
1872 if (positive_sign) positive_sign->invalidate();
-
1873 if (negative_sign) negative_sign->invalidate();
-
1874 if (special_sign) special_sign->invalidate();
-
1875 number->invalidate();
- -
1877 }
-
1878
-
1879 std::shared_ptr<basic_parser<T>> positive_sign;
-
1880 std::shared_ptr<basic_parser<T>> negative_sign;
-
1881 std::shared_ptr<basic_parser<T>> special_sign;
-
1882 std::shared_ptr<basic_parser<T>> number;
-
1883
-
1884 protected:
-
1885 virtual bool do_match(
-
1886 _In_reads_or_z_opt_(end) const T* text,
-
1887 _In_ size_t start = 0,
-
1888 _In_ size_t end = SIZE_MAX,
-
1889 _In_ int flags = match_default)
-
1890 {
-
1891 _Assume_(text || start >= end);
-
1892 this->interval.end = start;
-
1893 if (positive_sign && positive_sign->match(text, this->interval.end, end, flags)) {
-
1894 this->interval.end = positive_sign->interval.end;
-
1895 if (negative_sign) negative_sign->invalidate();
-
1896 if (special_sign) special_sign->invalidate();
-
1897 }
-
1898 else if (negative_sign && negative_sign->match(text, this->interval.end, end, flags)) {
-
1899 this->interval.end = negative_sign->interval.end;
-
1900 if (positive_sign) positive_sign->invalidate();
-
1901 if (special_sign) special_sign->invalidate();
-
1902 }
-
1903 else if (special_sign && special_sign->match(text, this->interval.end, end, flags)) {
-
1904 this->interval.end = special_sign->interval.end;
-
1905 if (positive_sign) positive_sign->invalidate();
-
1906 if (negative_sign) negative_sign->invalidate();
-
1907 }
-
1908 else {
-
1909 if (positive_sign) positive_sign->invalidate();
-
1910 if (negative_sign) negative_sign->invalidate();
-
1911 if (special_sign) special_sign->invalidate();
-
1912 }
-
1913 if (number->match(text, this->interval.end, end, flags)) {
-
1914 this->interval.start = start;
-
1915 this->interval.end = number->interval.end;
-
1916 return true;
-
1917 }
-
1918 if (positive_sign) positive_sign->invalidate();
-
1919 if (negative_sign) negative_sign->invalidate();
-
1920 if (special_sign) special_sign->invalidate();
-
1921 number->invalidate();
-
1922 this->interval.invalidate();
-
1923 return false;
-
1924 }
-
1925 };
-
-
1926
-
1927 using signed_numeral = basic_signed_numeral<char>;
-
1928 using wsigned_numeral = basic_signed_numeral<wchar_t>;
-
1929#ifdef _UNICODE
-
1930 using tsigned_numeral = wsigned_numeral;
-
1931#else
-
1932 using tsigned_numeral = signed_numeral;
-
1933#endif
-
1934 using sgml_signed_numeral = basic_signed_numeral<char>;
-
1935
-
1939 template <class T>
-
- -
1941 {
-
1942 public:
- -
1944 _In_ const std::shared_ptr<basic_parser<T>>& _positive_sign,
-
1945 _In_ const std::shared_ptr<basic_parser<T>>& _negative_sign,
-
1946 _In_ const std::shared_ptr<basic_parser<T>>& _special_sign,
-
1947 _In_ const std::shared_ptr<basic_parser<T>>& _integer,
-
1948 _In_ const std::shared_ptr<basic_parser<T>>& space,
-
1949 _In_ const std::shared_ptr<basic_parser<T>>& _fraction,
-
1950 _In_ const std::locale& locale = std::locale()) :
- - - - - - -
1957 m_space(space)
-
1958 {}
-
1959
-
1960 virtual void invalidate()
+
1905
+
1906 using signed_numeral = basic_signed_numeral<char>;
+
1907 using wsigned_numeral = basic_signed_numeral<wchar_t>;
+
1908#ifdef _UNICODE
+
1909 using tsigned_numeral = wsigned_numeral;
+
1910#else
+
1911 using tsigned_numeral = signed_numeral;
+
1912#endif
+
1913 using sgml_signed_numeral = basic_signed_numeral<char>;
+
1914
+
1918 template <class T>
+
+ +
1920 {
+
1921 public:
+ +
1923 _In_ const std::shared_ptr<basic_parser<T>>& _positive_sign,
+
1924 _In_ const std::shared_ptr<basic_parser<T>>& _negative_sign,
+
1925 _In_ const std::shared_ptr<basic_parser<T>>& _special_sign,
+
1926 _In_ const std::shared_ptr<basic_parser<T>>& _integer,
+
1927 _In_ const std::shared_ptr<basic_parser<T>>& space,
+
1928 _In_ const std::shared_ptr<basic_parser<T>>& _fraction,
+
1929 _In_ const std::locale& locale = std::locale()) :
+ + + + + + +
1936 m_space(space)
+
1937 {}
+
1938
+
1939 virtual void invalidate()
+
1940 {
+
1941 if (positive_sign) positive_sign->invalidate();
+
1942 if (negative_sign) negative_sign->invalidate();
+
1943 if (special_sign) special_sign->invalidate();
+
1944 integer->invalidate();
+
1945 fraction->invalidate();
+ +
1947 }
+
1948
+
1949 std::shared_ptr<basic_parser<T>> positive_sign;
+
1950 std::shared_ptr<basic_parser<T>> negative_sign;
+
1951 std::shared_ptr<basic_parser<T>> special_sign;
+
1952 std::shared_ptr<basic_parser<T>> integer;
+
1953 std::shared_ptr<basic_parser<T>> fraction;
+
1954
+
1955 protected:
+
1956 virtual bool do_match(
+
1957 _In_reads_or_z_opt_(end) const T* text,
+
1958 _In_ size_t start = 0,
+
1959 _In_ size_t end = SIZE_MAX,
+
1960 _In_ int flags = match_default)
1961 {
-
1962 if (positive_sign) positive_sign->invalidate();
-
1963 if (negative_sign) negative_sign->invalidate();
-
1964 if (special_sign) special_sign->invalidate();
-
1965 integer->invalidate();
-
1966 fraction->invalidate();
- -
1968 }
-
1969
-
1970 std::shared_ptr<basic_parser<T>> positive_sign;
-
1971 std::shared_ptr<basic_parser<T>> negative_sign;
-
1972 std::shared_ptr<basic_parser<T>> special_sign;
-
1973 std::shared_ptr<basic_parser<T>> integer;
-
1974 std::shared_ptr<basic_parser<T>> fraction;
-
1975
-
1976 protected:
-
1977 virtual bool do_match(
-
1978 _In_reads_or_z_opt_(end) const T* text,
-
1979 _In_ size_t start = 0,
-
1980 _In_ size_t end = SIZE_MAX,
-
1981 _In_ int flags = match_default)
-
1982 {
-
1983 _Assume_(text || start >= end);
-
1984 this->interval.end = start;
+
1962 _Assume_(text || start >= end);
+
1963 this->interval.end = start;
+
1964
+
1965 if (positive_sign && positive_sign->match(text, this->interval.end, end, flags)) {
+
1966 this->interval.end = positive_sign->interval.end;
+
1967 if (negative_sign) negative_sign->invalidate();
+
1968 if (special_sign) special_sign->invalidate();
+
1969 }
+
1970 else if (negative_sign && negative_sign->match(text, this->interval.end, end, flags)) {
+
1971 this->interval.end = negative_sign->interval.end;
+
1972 if (positive_sign) positive_sign->invalidate();
+
1973 if (special_sign) special_sign->invalidate();
+
1974 }
+
1975 else if (special_sign && special_sign->match(text, this->interval.end, end, flags)) {
+
1976 this->interval.end = special_sign->interval.end;
+
1977 if (positive_sign) positive_sign->invalidate();
+
1978 if (negative_sign) negative_sign->invalidate();
+
1979 }
+
1980 else {
+
1981 if (positive_sign) positive_sign->invalidate();
+
1982 if (negative_sign) negative_sign->invalidate();
+
1983 if (special_sign) special_sign->invalidate();
+
1984 }
1985
-
1986 if (positive_sign && positive_sign->match(text, this->interval.end, end, flags)) {
-
1987 this->interval.end = positive_sign->interval.end;
-
1988 if (negative_sign) negative_sign->invalidate();
-
1989 if (special_sign) special_sign->invalidate();
-
1990 }
-
1991 else if (negative_sign && negative_sign->match(text, this->interval.end, end, flags)) {
-
1992 this->interval.end = negative_sign->interval.end;
-
1993 if (positive_sign) positive_sign->invalidate();
-
1994 if (special_sign) special_sign->invalidate();
-
1995 }
-
1996 else if (special_sign && special_sign->match(text, this->interval.end, end, flags)) {
-
1997 this->interval.end = special_sign->interval.end;
-
1998 if (positive_sign) positive_sign->invalidate();
-
1999 if (negative_sign) negative_sign->invalidate();
-
2000 }
-
2001 else {
-
2002 if (positive_sign) positive_sign->invalidate();
-
2003 if (negative_sign) negative_sign->invalidate();
-
2004 if (special_sign) special_sign->invalidate();
-
2005 }
-
2006
-
2007 // Check for <integer> <fraction>
-
2008 const int space_match_flags = flags & ~match_multiline; // Spaces in fractions must never be broken in new line.
-
2009 if (integer->match(text, this->interval.end, end, flags) &&
-
2010 m_space->match(text, integer->interval.end, end, space_match_flags))
-
2011 {
-
2012 for (this->interval.end = m_space->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
2013 if (fraction->match(text, this->interval.end, end, flags)) {
-
2014 this->interval.start = start;
-
2015 this->interval.end = fraction->interval.end;
-
2016 return true;
-
2017 }
-
2018 fraction->invalidate();
-
2019 this->interval.start = start;
-
2020 this->interval.end = integer->interval.end;
-
2021 return true;
-
2022 }
-
2023
-
2024 // Check for <fraction>
-
2025 if (fraction->match(text, this->interval.end, end, flags)) {
-
2026 integer->invalidate();
-
2027 this->interval.start = start;
-
2028 this->interval.end = fraction->interval.end;
-
2029 return true;
-
2030 }
-
2031
-
2032 // Check for <integer>
-
2033 if (integer->match(text, this->interval.end, end, flags)) {
-
2034 fraction->invalidate();
-
2035 this->interval.start = start;
-
2036 this->interval.end = integer->interval.end;
-
2037 return true;
-
2038 }
+
1986 // Check for <integer> <fraction>
+
1987 const int space_match_flags = flags & ~match_multiline; // Spaces in fractions must never be broken in new line.
+
1988 if (integer->match(text, this->interval.end, end, flags) &&
+
1989 m_space->match(text, integer->interval.end, end, space_match_flags))
+
1990 {
+
1991 for (this->interval.end = m_space->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
1992 if (fraction->match(text, this->interval.end, end, flags)) {
+
1993 this->interval.start = start;
+
1994 this->interval.end = fraction->interval.end;
+
1995 return true;
+
1996 }
+
1997 fraction->invalidate();
+
1998 this->interval.start = start;
+
1999 this->interval.end = integer->interval.end;
+
2000 return true;
+
2001 }
+
2002
+
2003 // Check for <fraction>
+
2004 if (fraction->match(text, this->interval.end, end, flags)) {
+
2005 integer->invalidate();
+
2006 this->interval.start = start;
+
2007 this->interval.end = fraction->interval.end;
+
2008 return true;
+
2009 }
+
2010
+
2011 // Check for <integer>
+
2012 if (integer->match(text, this->interval.end, end, flags)) {
+
2013 fraction->invalidate();
+
2014 this->interval.start = start;
+
2015 this->interval.end = integer->interval.end;
+
2016 return true;
+
2017 }
+
2018
+
2019 if (positive_sign) positive_sign->invalidate();
+
2020 if (negative_sign) negative_sign->invalidate();
+
2021 if (special_sign) special_sign->invalidate();
+
2022 integer->invalidate();
+
2023 fraction->invalidate();
+
2024 this->interval.invalidate();
+
2025 return false;
+
2026 }
+
2027
+
2028 std::shared_ptr<basic_parser<T>> m_space;
+
2029 };
+
+
2030
+
2031 using mixed_numeral = basic_mixed_numeral<char>;
+
2032 using wmixed_numeral = basic_mixed_numeral<wchar_t>;
+
2033#ifdef _UNICODE
+
2034 using tmixed_numeral = wmixed_numeral;
+
2035#else
+
2036 using tmixed_numeral = mixed_numeral;
+
2037#endif
+
2038 using sgml_mixed_numeral = basic_mixed_numeral<char>;
2039
-
2040 if (positive_sign) positive_sign->invalidate();
-
2041 if (negative_sign) negative_sign->invalidate();
-
2042 if (special_sign) special_sign->invalidate();
-
2043 integer->invalidate();
-
2044 fraction->invalidate();
-
2045 this->interval.invalidate();
-
2046 return false;
-
2047 }
-
2048
-
2049 std::shared_ptr<basic_parser<T>> m_space;
-
2050 };
-
-
2051
-
2052 using mixed_numeral = basic_mixed_numeral<char>;
-
2053 using wmixed_numeral = basic_mixed_numeral<wchar_t>;
-
2054#ifdef _UNICODE
-
2055 using tmixed_numeral = wmixed_numeral;
-
2056#else
-
2057 using tmixed_numeral = mixed_numeral;
-
2058#endif
-
2059 using sgml_mixed_numeral = basic_mixed_numeral<char>;
-
2060
-
2064 template <class T>
-
- -
2066 {
-
2067 public:
- -
2069 _In_ const std::shared_ptr<basic_parser<T>>& _positive_sign,
-
2070 _In_ const std::shared_ptr<basic_parser<T>>& _negative_sign,
-
2071 _In_ const std::shared_ptr<basic_parser<T>>& _special_sign,
-
2072 _In_ const std::shared_ptr<basic_integer<T>>& _integer,
-
2073 _In_ const std::shared_ptr<basic_parser<T>>& _decimal_separator,
-
2074 _In_ const std::shared_ptr<basic_integer<T>>& _decimal,
-
2075 _In_ const std::shared_ptr<basic_parser<T>>& _exponent_symbol,
-
2076 _In_ const std::shared_ptr<basic_parser<T>>& _positive_exp_sign,
-
2077 _In_ const std::shared_ptr<basic_parser<T>>& _negative_exp_sign,
-
2078 _In_ const std::shared_ptr<basic_integer<T>>& _exponent,
-
2079 _In_ const std::locale& locale = std::locale()) :
- - - - - - - - - - - -
2091 value(std::numeric_limits<double>::quiet_NaN())
-
2092 {}
-
2093
-
2094 virtual void invalidate()
-
2095 {
-
2096 if (positive_sign) positive_sign->invalidate();
-
2097 if (negative_sign) negative_sign->invalidate();
-
2098 if (special_sign) special_sign->invalidate();
-
2099 integer->invalidate();
-
2100 decimal_separator->invalidate();
-
2101 decimal->invalidate();
-
2102 if (exponent_symbol) exponent_symbol->invalidate();
-
2103 if (positive_exp_sign) positive_exp_sign->invalidate();
-
2104 if (negative_exp_sign) negative_exp_sign->invalidate();
-
2105 if (exponent) exponent->invalidate();
-
2106 value = std::numeric_limits<double>::quiet_NaN();
- -
2108 }
-
2109
-
2110 std::shared_ptr<basic_parser<T>> positive_sign;
-
2111 std::shared_ptr<basic_parser<T>> negative_sign;
-
2112 std::shared_ptr<basic_parser<T>> special_sign;
-
2113 std::shared_ptr<basic_integer<T>> integer;
-
2114 std::shared_ptr<basic_parser<T>> decimal_separator;
-
2115 std::shared_ptr<basic_integer<T>> decimal;
-
2116 std::shared_ptr<basic_parser<T>> exponent_symbol;
-
2117 std::shared_ptr<basic_parser<T>> positive_exp_sign;
-
2118 std::shared_ptr<basic_parser<T>> negative_exp_sign;
-
2119 std::shared_ptr<basic_integer<T>> exponent;
-
2120 double value;
-
2121
-
2122 protected:
-
2123 virtual bool do_match(
-
2124 _In_reads_or_z_opt_(end) const T* text,
-
2125 _In_ size_t start = 0,
-
2126 _In_ size_t end = SIZE_MAX,
-
2127 _In_ int flags = match_default)
-
2128 {
-
2129 _Assume_(text || start >= end);
-
2130 this->interval.end = start;
+
2043 template <class T>
+
+ +
2045 {
+
2046 public:
+ +
2048 _In_ const std::shared_ptr<basic_parser<T>>& _positive_sign,
+
2049 _In_ const std::shared_ptr<basic_parser<T>>& _negative_sign,
+
2050 _In_ const std::shared_ptr<basic_parser<T>>& _special_sign,
+
2051 _In_ const std::shared_ptr<basic_integer<T>>& _integer,
+
2052 _In_ const std::shared_ptr<basic_parser<T>>& _decimal_separator,
+
2053 _In_ const std::shared_ptr<basic_integer<T>>& _decimal,
+
2054 _In_ const std::shared_ptr<basic_parser<T>>& _exponent_symbol,
+
2055 _In_ const std::shared_ptr<basic_parser<T>>& _positive_exp_sign,
+
2056 _In_ const std::shared_ptr<basic_parser<T>>& _negative_exp_sign,
+
2057 _In_ const std::shared_ptr<basic_integer<T>>& _exponent,
+
2058 _In_ const std::locale& locale = std::locale()) :
+ + + + + + + + + + + +
2070 value(std::numeric_limits<double>::quiet_NaN())
+
2071 {}
+
2072
+
2073 virtual void invalidate()
+
2074 {
+
2075 if (positive_sign) positive_sign->invalidate();
+
2076 if (negative_sign) negative_sign->invalidate();
+
2077 if (special_sign) special_sign->invalidate();
+
2078 integer->invalidate();
+
2079 decimal_separator->invalidate();
+
2080 decimal->invalidate();
+
2081 if (exponent_symbol) exponent_symbol->invalidate();
+
2082 if (positive_exp_sign) positive_exp_sign->invalidate();
+
2083 if (negative_exp_sign) negative_exp_sign->invalidate();
+
2084 if (exponent) exponent->invalidate();
+
2085 value = std::numeric_limits<double>::quiet_NaN();
+ +
2087 }
+
2088
+
2089 std::shared_ptr<basic_parser<T>> positive_sign;
+
2090 std::shared_ptr<basic_parser<T>> negative_sign;
+
2091 std::shared_ptr<basic_parser<T>> special_sign;
+
2092 std::shared_ptr<basic_integer<T>> integer;
+
2093 std::shared_ptr<basic_parser<T>> decimal_separator;
+
2094 std::shared_ptr<basic_integer<T>> decimal;
+
2095 std::shared_ptr<basic_parser<T>> exponent_symbol;
+
2096 std::shared_ptr<basic_parser<T>> positive_exp_sign;
+
2097 std::shared_ptr<basic_parser<T>> negative_exp_sign;
+
2098 std::shared_ptr<basic_integer<T>> exponent;
+
2099 double value;
+
2100
+
2101 protected:
+
2102 virtual bool do_match(
+
2103 _In_reads_or_z_opt_(end) const T* text,
+
2104 _In_ size_t start = 0,
+
2105 _In_ size_t end = SIZE_MAX,
+
2106 _In_ int flags = match_default)
+
2107 {
+
2108 _Assume_(text || start >= end);
+
2109 this->interval.end = start;
+
2110
+
2111 if (positive_sign && positive_sign->match(text, this->interval.end, end, flags)) {
+
2112 this->interval.end = positive_sign->interval.end;
+
2113 if (negative_sign) negative_sign->invalidate();
+
2114 if (special_sign) special_sign->invalidate();
+
2115 }
+
2116 else if (negative_sign && negative_sign->match(text, this->interval.end, end, flags)) {
+
2117 this->interval.end = negative_sign->interval.end;
+
2118 if (positive_sign) positive_sign->invalidate();
+
2119 if (special_sign) special_sign->invalidate();
+
2120 }
+
2121 else if (special_sign && special_sign->match(text, this->interval.end, end, flags)) {
+
2122 this->interval.end = special_sign->interval.end;
+
2123 if (positive_sign) positive_sign->invalidate();
+
2124 if (negative_sign) negative_sign->invalidate();
+
2125 }
+
2126 else {
+
2127 if (positive_sign) positive_sign->invalidate();
+
2128 if (negative_sign) negative_sign->invalidate();
+
2129 if (special_sign) special_sign->invalidate();
+
2130 }
2131
-
2132 if (positive_sign && positive_sign->match(text, this->interval.end, end, flags)) {
-
2133 this->interval.end = positive_sign->interval.end;
-
2134 if (negative_sign) negative_sign->invalidate();
-
2135 if (special_sign) special_sign->invalidate();
-
2136 }
-
2137 else if (negative_sign && negative_sign->match(text, this->interval.end, end, flags)) {
-
2138 this->interval.end = negative_sign->interval.end;
-
2139 if (positive_sign) positive_sign->invalidate();
-
2140 if (special_sign) special_sign->invalidate();
+
2132 if (integer->match(text, this->interval.end, end, flags))
+
2133 this->interval.end = integer->interval.end;
+
2134
+
2135 if (decimal_separator->match(text, this->interval.end, end, flags) &&
+
2136 decimal->match(text, decimal_separator->interval.end, end, flags))
+
2137 this->interval.end = decimal->interval.end;
+
2138 else {
+
2139 decimal_separator->invalidate();
+
2140 decimal->invalidate();
2141 }
-
2142 else if (special_sign && special_sign->match(text, this->interval.end, end, flags)) {
-
2143 this->interval.end = special_sign->interval.end;
-
2144 if (positive_sign) positive_sign->invalidate();
-
2145 if (negative_sign) negative_sign->invalidate();
-
2146 }
-
2147 else {
-
2148 if (positive_sign) positive_sign->invalidate();
-
2149 if (negative_sign) negative_sign->invalidate();
-
2150 if (special_sign) special_sign->invalidate();
-
2151 }
-
2152
-
2153 if (integer->match(text, this->interval.end, end, flags))
-
2154 this->interval.end = integer->interval.end;
-
2155
-
2156 if (decimal_separator->match(text, this->interval.end, end, flags) &&
-
2157 decimal->match(text, decimal_separator->interval.end, end, flags))
-
2158 this->interval.end = decimal->interval.end;
-
2159 else {
-
2160 decimal_separator->invalidate();
-
2161 decimal->invalidate();
-
2162 }
-
2163
-
2164 if (integer->interval.empty() &&
-
2165 decimal->interval.empty())
-
2166 {
-
2167 // No integer part, no decimal part.
-
2168 if (positive_sign) positive_sign->invalidate();
-
2169 if (negative_sign) negative_sign->invalidate();
-
2170 if (special_sign) special_sign->invalidate();
-
2171 integer->invalidate();
-
2172 decimal_separator->invalidate();
-
2173 decimal->invalidate();
-
2174 if (exponent_symbol) exponent_symbol->invalidate();
-
2175 if (positive_exp_sign) positive_exp_sign->invalidate();
-
2176 if (negative_exp_sign) negative_exp_sign->invalidate();
-
2177 if (exponent) exponent->invalidate();
-
2178 this->interval.invalidate();
-
2179 return false;
-
2180 }
-
2181
-
2182 if (exponent_symbol && exponent_symbol->match(text, this->interval.end, end, flags) &&
-
2183 ((positive_exp_sign && positive_exp_sign->match(text, exponent_symbol->interval.end, end, flags) &&
-
2184 exponent && exponent->match(text, positive_exp_sign->interval.end, end, flags)) ||
-
2185 (exponent && exponent->match(text, exponent_symbol->interval.end, end, flags))))
-
2186 {
-
2187 this->interval.end = exponent->interval.end;
-
2188 if (negative_exp_sign) negative_exp_sign->invalidate();
-
2189 }
-
2190 else if (exponent_symbol && exponent_symbol->match(text, this->interval.end, end, flags) &&
-
2191 negative_exp_sign && negative_exp_sign->match(text, exponent_symbol->interval.end, end, flags) &&
-
2192 exponent && exponent->match(text, negative_exp_sign->interval.end, end, flags))
-
2193 {
-
2194 this->interval.end = exponent->interval.end;
-
2195 if (positive_exp_sign) positive_exp_sign->invalidate();
-
2196 }
-
2197 else {
-
2198 if (exponent_symbol) exponent_symbol->invalidate();
-
2199 if (positive_exp_sign) positive_exp_sign->invalidate();
-
2200 if (negative_exp_sign) negative_exp_sign->invalidate();
-
2201 if (exponent) exponent->invalidate();
-
2202 }
-
2203
-
2204 value = (double)integer->value;
-
2205 if (decimal->interval)
-
2206 value += (double)decimal->value * pow(10.0, -(double)decimal->interval.size());
-
2207 if (negative_sign && negative_sign->interval)
-
2208 value = -value;
-
2209 if (exponent && exponent->interval) {
-
2210 double e = (double)exponent->value;
-
2211 if (negative_exp_sign && negative_exp_sign->interval)
-
2212 e = -e;
-
2213 value *= pow(10.0, e);
-
2214 }
-
2215
-
2216 this->interval.start = start;
-
2217 return true;
-
2218 }
-
2219 };
+
2142
+
2143 if (integer->interval.empty() &&
+
2144 decimal->interval.empty())
+
2145 {
+
2146 // No integer part, no decimal part.
+
2147 if (positive_sign) positive_sign->invalidate();
+
2148 if (negative_sign) negative_sign->invalidate();
+
2149 if (special_sign) special_sign->invalidate();
+
2150 integer->invalidate();
+
2151 decimal_separator->invalidate();
+
2152 decimal->invalidate();
+
2153 if (exponent_symbol) exponent_symbol->invalidate();
+
2154 if (positive_exp_sign) positive_exp_sign->invalidate();
+
2155 if (negative_exp_sign) negative_exp_sign->invalidate();
+
2156 if (exponent) exponent->invalidate();
+
2157 this->interval.invalidate();
+
2158 return false;
+
2159 }
+
2160
+
2161 if (exponent_symbol && exponent_symbol->match(text, this->interval.end, end, flags) &&
+
2162 ((positive_exp_sign && positive_exp_sign->match(text, exponent_symbol->interval.end, end, flags) &&
+
2163 exponent && exponent->match(text, positive_exp_sign->interval.end, end, flags)) ||
+
2164 (exponent && exponent->match(text, exponent_symbol->interval.end, end, flags))))
+
2165 {
+
2166 this->interval.end = exponent->interval.end;
+
2167 if (negative_exp_sign) negative_exp_sign->invalidate();
+
2168 }
+
2169 else if (exponent_symbol && exponent_symbol->match(text, this->interval.end, end, flags) &&
+
2170 negative_exp_sign && negative_exp_sign->match(text, exponent_symbol->interval.end, end, flags) &&
+
2171 exponent && exponent->match(text, negative_exp_sign->interval.end, end, flags))
+
2172 {
+
2173 this->interval.end = exponent->interval.end;
+
2174 if (positive_exp_sign) positive_exp_sign->invalidate();
+
2175 }
+
2176 else {
+
2177 if (exponent_symbol) exponent_symbol->invalidate();
+
2178 if (positive_exp_sign) positive_exp_sign->invalidate();
+
2179 if (negative_exp_sign) negative_exp_sign->invalidate();
+
2180 if (exponent) exponent->invalidate();
+
2181 }
+
2182
+
2183 value = (double)integer->value;
+
2184 if (decimal->interval)
+
2185 value += (double)decimal->value * pow(10.0, -(double)decimal->interval.size());
+
2186 if (negative_sign && negative_sign->interval)
+
2187 value = -value;
+
2188 if (exponent && exponent->interval) {
+
2189 double e = (double)exponent->value;
+
2190 if (negative_exp_sign && negative_exp_sign->interval)
+
2191 e = -e;
+
2192 value *= pow(10.0, e);
+
2193 }
+
2194
+
2195 this->interval.start = start;
+
2196 return true;
+
2197 }
+
2198 };
-
2220
-
2221 using scientific_numeral = basic_scientific_numeral<char>;
-
2222 using wscientific_numeral = basic_scientific_numeral<wchar_t>;
-
2223#ifdef _UNICODE
-
2224 using tscientific_numeral = wscientific_numeral;
-
2225#else
-
2226 using tscientific_numeral = scientific_numeral;
-
2227#endif
-
2228 using sgml_scientific_numeral = basic_scientific_numeral<char>;
-
2229
-
2233 template <class T>
-
- -
2235 {
-
2236 public:
- -
2238 _In_ const std::shared_ptr<basic_parser<T>>& _positive_sign,
-
2239 _In_ const std::shared_ptr<basic_parser<T>>& _negative_sign,
-
2240 _In_ const std::shared_ptr<basic_parser<T>>& _special_sign,
-
2241 _In_ const std::shared_ptr<basic_parser<T>>& _currency,
-
2242 _In_ const std::shared_ptr<basic_parser<T>>& _integer,
-
2243 _In_ const std::shared_ptr<basic_parser<T>>& _decimal_separator,
-
2244 _In_ const std::shared_ptr<basic_parser<T>>& _decimal,
-
2245 _In_ const std::locale& locale = std::locale()) :
- - - - - - - - -
2254 {}
-
2255
-
2256 virtual void invalidate()
-
2257 {
-
2258 if (positive_sign) positive_sign->invalidate();
-
2259 if (negative_sign) negative_sign->invalidate();
-
2260 if (special_sign) special_sign->invalidate();
-
2261 currency->invalidate();
-
2262 integer->invalidate();
-
2263 decimal_separator->invalidate();
-
2264 decimal->invalidate();
- -
2266 }
-
2267
-
2268 std::shared_ptr<basic_parser<T>> positive_sign;
-
2269 std::shared_ptr<basic_parser<T>> negative_sign;
-
2270 std::shared_ptr<basic_parser<T>> special_sign;
-
2271 std::shared_ptr<basic_parser<T>> currency;
-
2272 std::shared_ptr<basic_parser<T>> integer;
-
2273 std::shared_ptr<basic_parser<T>> decimal_separator;
-
2274 std::shared_ptr<basic_parser<T>> decimal;
-
2275
-
2276 protected:
-
2277 virtual bool do_match(
-
2278 _In_reads_or_z_opt_(end) const T* text,
-
2279 _In_ size_t start = 0,
-
2280 _In_ size_t end = SIZE_MAX,
-
2281 _In_ int flags = match_default)
-
2282 {
-
2283 _Assume_(text || start >= end);
-
2284 this->interval.end = start;
+
2199
+
2200 using scientific_numeral = basic_scientific_numeral<char>;
+
2201 using wscientific_numeral = basic_scientific_numeral<wchar_t>;
+
2202#ifdef _UNICODE
+
2203 using tscientific_numeral = wscientific_numeral;
+
2204#else
+
2205 using tscientific_numeral = scientific_numeral;
+
2206#endif
+
2207 using sgml_scientific_numeral = basic_scientific_numeral<char>;
+
2208
+
2212 template <class T>
+
+ +
2214 {
+
2215 public:
+ +
2217 _In_ const std::shared_ptr<basic_parser<T>>& _positive_sign,
+
2218 _In_ const std::shared_ptr<basic_parser<T>>& _negative_sign,
+
2219 _In_ const std::shared_ptr<basic_parser<T>>& _special_sign,
+
2220 _In_ const std::shared_ptr<basic_parser<T>>& _currency,
+
2221 _In_ const std::shared_ptr<basic_parser<T>>& _integer,
+
2222 _In_ const std::shared_ptr<basic_parser<T>>& _decimal_separator,
+
2223 _In_ const std::shared_ptr<basic_parser<T>>& _decimal,
+
2224 _In_ const std::locale& locale = std::locale()) :
+ + + + + + + + +
2233 {}
+
2234
+
2235 virtual void invalidate()
+
2236 {
+
2237 if (positive_sign) positive_sign->invalidate();
+
2238 if (negative_sign) negative_sign->invalidate();
+
2239 if (special_sign) special_sign->invalidate();
+
2240 currency->invalidate();
+
2241 integer->invalidate();
+
2242 decimal_separator->invalidate();
+
2243 decimal->invalidate();
+ +
2245 }
+
2246
+
2247 std::shared_ptr<basic_parser<T>> positive_sign;
+
2248 std::shared_ptr<basic_parser<T>> negative_sign;
+
2249 std::shared_ptr<basic_parser<T>> special_sign;
+
2250 std::shared_ptr<basic_parser<T>> currency;
+
2251 std::shared_ptr<basic_parser<T>> integer;
+
2252 std::shared_ptr<basic_parser<T>> decimal_separator;
+
2253 std::shared_ptr<basic_parser<T>> decimal;
+
2254
+
2255 protected:
+
2256 virtual bool do_match(
+
2257 _In_reads_or_z_opt_(end) const T* text,
+
2258 _In_ size_t start = 0,
+
2259 _In_ size_t end = SIZE_MAX,
+
2260 _In_ int flags = match_default)
+
2261 {
+
2262 _Assume_(text || start >= end);
+
2263 this->interval.end = start;
+
2264
+
2265 if (positive_sign->match(text, this->interval.end, end, flags)) {
+
2266 this->interval.end = positive_sign->interval.end;
+
2267 if (negative_sign) negative_sign->invalidate();
+
2268 if (special_sign) special_sign->invalidate();
+
2269 }
+
2270 else if (negative_sign->match(text, this->interval.end, end, flags)) {
+
2271 this->interval.end = negative_sign->interval.end;
+
2272 if (positive_sign) positive_sign->invalidate();
+
2273 if (special_sign) special_sign->invalidate();
+
2274 }
+
2275 else if (special_sign->match(text, this->interval.end, end, flags)) {
+
2276 this->interval.end = special_sign->interval.end;
+
2277 if (positive_sign) positive_sign->invalidate();
+
2278 if (negative_sign) negative_sign->invalidate();
+
2279 }
+
2280 else {
+
2281 if (positive_sign) positive_sign->invalidate();
+
2282 if (negative_sign) negative_sign->invalidate();
+
2283 if (special_sign) special_sign->invalidate();
+
2284 }
2285
-
2286 if (positive_sign->match(text, this->interval.end, end, flags)) {
-
2287 this->interval.end = positive_sign->interval.end;
-
2288 if (negative_sign) negative_sign->invalidate();
-
2289 if (special_sign) special_sign->invalidate();
-
2290 }
-
2291 else if (negative_sign->match(text, this->interval.end, end, flags)) {
-
2292 this->interval.end = negative_sign->interval.end;
-
2293 if (positive_sign) positive_sign->invalidate();
-
2294 if (special_sign) special_sign->invalidate();
-
2295 }
-
2296 else if (special_sign->match(text, this->interval.end, end, flags)) {
-
2297 this->interval.end = special_sign->interval.end;
-
2298 if (positive_sign) positive_sign->invalidate();
-
2299 if (negative_sign) negative_sign->invalidate();
-
2300 }
-
2301 else {
-
2302 if (positive_sign) positive_sign->invalidate();
-
2303 if (negative_sign) negative_sign->invalidate();
-
2304 if (special_sign) special_sign->invalidate();
-
2305 }
-
2306
-
2307 if (currency->match(text, this->interval.end, end, flags))
-
2308 this->interval.end = currency->interval.end;
-
2309 else {
-
2310 if (positive_sign) positive_sign->invalidate();
-
2311 if (negative_sign) negative_sign->invalidate();
-
2312 if (special_sign) special_sign->invalidate();
-
2313 integer->invalidate();
-
2314 decimal_separator->invalidate();
-
2315 decimal->invalidate();
-
2316 this->interval.invalidate();
-
2317 return false;
-
2318 }
-
2319
-
2320 if (integer->match(text, this->interval.end, end, flags))
-
2321 this->interval.end = integer->interval.end;
-
2322 if (decimal_separator->match(text, this->interval.end, end, flags) &&
-
2323 decimal->match(text, decimal_separator->interval.end, end, flags))
-
2324 this->interval.end = decimal->interval.end;
-
2325 else {
-
2326 decimal_separator->invalidate();
-
2327 decimal->invalidate();
-
2328 }
-
2329
-
2330 if (integer->interval.empty() &&
-
2331 decimal->interval.empty())
-
2332 {
-
2333 // No integer part, no decimal part.
-
2334 if (positive_sign) positive_sign->invalidate();
-
2335 if (negative_sign) negative_sign->invalidate();
-
2336 if (special_sign) special_sign->invalidate();
-
2337 currency->invalidate();
-
2338 integer->invalidate();
-
2339 decimal_separator->invalidate();
-
2340 decimal->invalidate();
-
2341 this->interval.invalidate();
-
2342 return false;
-
2343 }
-
2344
-
2345 this->interval.start = start;
-
2346 return true;
-
2347 }
-
2348 };
+
2286 if (currency->match(text, this->interval.end, end, flags))
+
2287 this->interval.end = currency->interval.end;
+
2288 else {
+
2289 if (positive_sign) positive_sign->invalidate();
+
2290 if (negative_sign) negative_sign->invalidate();
+
2291 if (special_sign) special_sign->invalidate();
+
2292 integer->invalidate();
+
2293 decimal_separator->invalidate();
+
2294 decimal->invalidate();
+
2295 this->interval.invalidate();
+
2296 return false;
+
2297 }
+
2298
+
2299 if (integer->match(text, this->interval.end, end, flags))
+
2300 this->interval.end = integer->interval.end;
+
2301 if (decimal_separator->match(text, this->interval.end, end, flags) &&
+
2302 decimal->match(text, decimal_separator->interval.end, end, flags))
+
2303 this->interval.end = decimal->interval.end;
+
2304 else {
+
2305 decimal_separator->invalidate();
+
2306 decimal->invalidate();
+
2307 }
+
2308
+
2309 if (integer->interval.empty() &&
+
2310 decimal->interval.empty())
+
2311 {
+
2312 // No integer part, no decimal part.
+
2313 if (positive_sign) positive_sign->invalidate();
+
2314 if (negative_sign) negative_sign->invalidate();
+
2315 if (special_sign) special_sign->invalidate();
+
2316 currency->invalidate();
+
2317 integer->invalidate();
+
2318 decimal_separator->invalidate();
+
2319 decimal->invalidate();
+
2320 this->interval.invalidate();
+
2321 return false;
+
2322 }
+
2323
+
2324 this->interval.start = start;
+
2325 return true;
+
2326 }
+
2327 };
-
2349
-
2350 using monetary_numeral = basic_monetary_numeral<char>;
-
2351 using wmonetary_numeral = basic_monetary_numeral<wchar_t>;
-
2352#ifdef _UNICODE
-
2353 using tmonetary_numeral = wmonetary_numeral;
-
2354#else
-
2355 using tmonetary_numeral = monetary_numeral;
-
2356#endif
-
2357 using sgml_monetary_numeral = basic_monetary_numeral<char>;
-
2358
-
2362 template <class T>
-
- -
2364 {
-
2365 public:
- -
2367 _In_ const std::shared_ptr<basic_parser<T>>& digit_0,
-
2368 _In_ const std::shared_ptr<basic_parser<T>>& digit_1,
-
2369 _In_ const std::shared_ptr<basic_parser<T>>& digit_2,
-
2370 _In_ const std::shared_ptr<basic_parser<T>>& digit_3,
-
2371 _In_ const std::shared_ptr<basic_parser<T>>& digit_4,
-
2372 _In_ const std::shared_ptr<basic_parser<T>>& digit_5,
-
2373 _In_ const std::shared_ptr<basic_parser<T>>& digit_6,
-
2374 _In_ const std::shared_ptr<basic_parser<T>>& digit_7,
-
2375 _In_ const std::shared_ptr<basic_parser<T>>& digit_8,
-
2376 _In_ const std::shared_ptr<basic_parser<T>>& digit_9,
-
2377 _In_ const std::shared_ptr<basic_parser<T>>& separator,
-
2378 _In_ const std::locale& locale = std::locale()) :
- -
2380 m_digit_0(digit_0),
-
2381 m_digit_1(digit_1),
-
2382 m_digit_2(digit_2),
-
2383 m_digit_3(digit_3),
-
2384 m_digit_4(digit_4),
-
2385 m_digit_5(digit_5),
-
2386 m_digit_6(digit_6),
-
2387 m_digit_7(digit_7),
-
2388 m_digit_8(digit_8),
-
2389 m_digit_9(digit_9),
-
2390 m_separator(separator)
-
2391 {
-
2392 value.s_addr = 0;
-
2393 }
-
2394
-
2395 virtual void invalidate()
-
2396 {
-
2397 components[0].start = 1;
-
2398 components[0].end = 0;
-
2399 components[1].start = 1;
-
2400 components[1].end = 0;
-
2401 components[2].start = 1;
-
2402 components[2].end = 0;
-
2403 components[3].start = 1;
-
2404 components[3].end = 0;
-
2405 value.s_addr = 0;
- -
2407 }
-
2408
- - -
2411
-
2412 protected:
-
2413 virtual bool do_match(
-
2414 _In_reads_or_z_opt_(end) const T* text,
-
2415 _In_ size_t start = 0,
-
2416 _In_ size_t end = SIZE_MAX,
-
2417 _In_ int flags = match_default)
-
2418 {
-
2419 _Assume_(text || start >= end);
-
2420 this->interval.end = start;
-
2421 value.s_addr = 0;
-
2422
-
2423 size_t i;
-
2424 for (i = 0; i < 4; i++) {
-
2425 if (i) {
-
2426 if (m_separator->match(text, this->interval.end, end, flags))
-
2427 this->interval.end = m_separator->interval.end;
-
2428 else
-
2429 goto error;
-
2430 }
-
2431
-
2432 components[i].start = this->interval.end;
-
2433 bool is_empty = true;
-
2434 size_t x;
-
2435 for (x = 0; this->interval.end < end && text[this->interval.end];) {
-
2436 size_t dig, digit_end;
-
2437 if (m_digit_0->match(text, this->interval.end, end, flags)) { dig = 0; digit_end = m_digit_0->interval.end; }
-
2438 else if (m_digit_1->match(text, this->interval.end, end, flags)) { dig = 1; digit_end = m_digit_1->interval.end; }
-
2439 else if (m_digit_2->match(text, this->interval.end, end, flags)) { dig = 2; digit_end = m_digit_2->interval.end; }
-
2440 else if (m_digit_3->match(text, this->interval.end, end, flags)) { dig = 3; digit_end = m_digit_3->interval.end; }
-
2441 else if (m_digit_4->match(text, this->interval.end, end, flags)) { dig = 4; digit_end = m_digit_4->interval.end; }
-
2442 else if (m_digit_5->match(text, this->interval.end, end, flags)) { dig = 5; digit_end = m_digit_5->interval.end; }
-
2443 else if (m_digit_6->match(text, this->interval.end, end, flags)) { dig = 6; digit_end = m_digit_6->interval.end; }
-
2444 else if (m_digit_7->match(text, this->interval.end, end, flags)) { dig = 7; digit_end = m_digit_7->interval.end; }
-
2445 else if (m_digit_8->match(text, this->interval.end, end, flags)) { dig = 8; digit_end = m_digit_8->interval.end; }
-
2446 else if (m_digit_9->match(text, this->interval.end, end, flags)) { dig = 9; digit_end = m_digit_9->interval.end; }
-
2447 else break;
-
2448 size_t x_n = x * 10 + dig;
-
2449 if (x_n <= 255) {
-
2450 x = x_n;
-
2451 this->interval.end = digit_end;
-
2452 is_empty = false;
-
2453 }
-
2454 else
-
2455 break;
-
2456 }
-
2457 if (is_empty)
-
2458 goto error;
-
2459 components[i].end = this->interval.end;
-
2460 value.s_addr = (value.s_addr << 8) | (uint8_t)x;
-
2461 }
-
2462 if (i < 4)
-
2463 goto error;
-
2464
-
2465 HE2BE(reinterpret_cast<uint32_t&>(value.s_addr));
-
2466 this->interval.start = start;
-
2467 return true;
-
2468
-
2469 error:
-
2470 invalidate();
-
2471 return false;
-
2472 }
-
2473
-
2474 std::shared_ptr<basic_parser<T>>
-
2475 m_digit_0,
-
2476 m_digit_1,
-
2477 m_digit_2,
-
2478 m_digit_3,
-
2479 m_digit_4,
-
2480 m_digit_5,
-
2481 m_digit_6,
-
2482 m_digit_7,
-
2483 m_digit_8,
-
2484 m_digit_9;
-
2485 std::shared_ptr<basic_parser<T>> m_separator;
-
2486 };
+
2328
+
2329 using monetary_numeral = basic_monetary_numeral<char>;
+
2330 using wmonetary_numeral = basic_monetary_numeral<wchar_t>;
+
2331#ifdef _UNICODE
+
2332 using tmonetary_numeral = wmonetary_numeral;
+
2333#else
+
2334 using tmonetary_numeral = monetary_numeral;
+
2335#endif
+
2336 using sgml_monetary_numeral = basic_monetary_numeral<char>;
+
2337
+
2341 template <class T>
+
+ +
2343 {
+
2344 public:
+ +
2346 _In_ const std::shared_ptr<basic_parser<T>>& digit_0,
+
2347 _In_ const std::shared_ptr<basic_parser<T>>& digit_1,
+
2348 _In_ const std::shared_ptr<basic_parser<T>>& digit_2,
+
2349 _In_ const std::shared_ptr<basic_parser<T>>& digit_3,
+
2350 _In_ const std::shared_ptr<basic_parser<T>>& digit_4,
+
2351 _In_ const std::shared_ptr<basic_parser<T>>& digit_5,
+
2352 _In_ const std::shared_ptr<basic_parser<T>>& digit_6,
+
2353 _In_ const std::shared_ptr<basic_parser<T>>& digit_7,
+
2354 _In_ const std::shared_ptr<basic_parser<T>>& digit_8,
+
2355 _In_ const std::shared_ptr<basic_parser<T>>& digit_9,
+
2356 _In_ const std::shared_ptr<basic_parser<T>>& separator,
+
2357 _In_ const std::locale& locale = std::locale()) :
+ +
2359 m_digit_0(digit_0),
+
2360 m_digit_1(digit_1),
+
2361 m_digit_2(digit_2),
+
2362 m_digit_3(digit_3),
+
2363 m_digit_4(digit_4),
+
2364 m_digit_5(digit_5),
+
2365 m_digit_6(digit_6),
+
2366 m_digit_7(digit_7),
+
2367 m_digit_8(digit_8),
+
2368 m_digit_9(digit_9),
+
2369 m_separator(separator)
+
2370 {
+
2371 value.s_addr = 0;
+
2372 }
+
2373
+
2374 virtual void invalidate()
+
2375 {
+
2376 components[0].start = 1;
+
2377 components[0].end = 0;
+
2378 components[1].start = 1;
+
2379 components[1].end = 0;
+
2380 components[2].start = 1;
+
2381 components[2].end = 0;
+
2382 components[3].start = 1;
+
2383 components[3].end = 0;
+
2384 value.s_addr = 0;
+ +
2386 }
+
2387
+ + +
2390
+
2391 protected:
+
2392 virtual bool do_match(
+
2393 _In_reads_or_z_opt_(end) const T* text,
+
2394 _In_ size_t start = 0,
+
2395 _In_ size_t end = SIZE_MAX,
+
2396 _In_ int flags = match_default)
+
2397 {
+
2398 _Assume_(text || start >= end);
+
2399 this->interval.end = start;
+
2400 value.s_addr = 0;
+
2401
+
2402 size_t i;
+
2403 for (i = 0; i < 4; i++) {
+
2404 if (i) {
+
2405 if (m_separator->match(text, this->interval.end, end, flags))
+
2406 this->interval.end = m_separator->interval.end;
+
2407 else
+
2408 goto error;
+
2409 }
+
2410
+
2411 components[i].start = this->interval.end;
+
2412 bool is_empty = true;
+
2413 size_t x;
+
2414 for (x = 0; this->interval.end < end && text[this->interval.end];) {
+
2415 size_t dig, digit_end;
+
2416 if (m_digit_0->match(text, this->interval.end, end, flags)) { dig = 0; digit_end = m_digit_0->interval.end; }
+
2417 else if (m_digit_1->match(text, this->interval.end, end, flags)) { dig = 1; digit_end = m_digit_1->interval.end; }
+
2418 else if (m_digit_2->match(text, this->interval.end, end, flags)) { dig = 2; digit_end = m_digit_2->interval.end; }
+
2419 else if (m_digit_3->match(text, this->interval.end, end, flags)) { dig = 3; digit_end = m_digit_3->interval.end; }
+
2420 else if (m_digit_4->match(text, this->interval.end, end, flags)) { dig = 4; digit_end = m_digit_4->interval.end; }
+
2421 else if (m_digit_5->match(text, this->interval.end, end, flags)) { dig = 5; digit_end = m_digit_5->interval.end; }
+
2422 else if (m_digit_6->match(text, this->interval.end, end, flags)) { dig = 6; digit_end = m_digit_6->interval.end; }
+
2423 else if (m_digit_7->match(text, this->interval.end, end, flags)) { dig = 7; digit_end = m_digit_7->interval.end; }
+
2424 else if (m_digit_8->match(text, this->interval.end, end, flags)) { dig = 8; digit_end = m_digit_8->interval.end; }
+
2425 else if (m_digit_9->match(text, this->interval.end, end, flags)) { dig = 9; digit_end = m_digit_9->interval.end; }
+
2426 else break;
+
2427 size_t x_n = x * 10 + dig;
+
2428 if (x_n <= 255) {
+
2429 x = x_n;
+
2430 this->interval.end = digit_end;
+
2431 is_empty = false;
+
2432 }
+
2433 else
+
2434 break;
+
2435 }
+
2436 if (is_empty)
+
2437 goto error;
+
2438 components[i].end = this->interval.end;
+
2439 value.s_addr = (value.s_addr << 8) | (uint8_t)x;
+
2440 }
+
2441 if (i < 4)
+
2442 goto error;
+
2443
+
2444 HE2BE(reinterpret_cast<uint32_t&>(value.s_addr));
+
2445 this->interval.start = start;
+
2446 return true;
+
2447
+
2448 error:
+
2449 invalidate();
+
2450 return false;
+
2451 }
+
2452
+
2453 std::shared_ptr<basic_parser<T>>
+
2454 m_digit_0,
+
2455 m_digit_1,
+
2456 m_digit_2,
+
2457 m_digit_3,
+
2458 m_digit_4,
+
2459 m_digit_5,
+
2460 m_digit_6,
+
2461 m_digit_7,
+
2462 m_digit_8,
+
2463 m_digit_9;
+
2464 std::shared_ptr<basic_parser<T>> m_separator;
+
2465 };
-
2487
-
2488 using ipv4_address = basic_ipv4_address<char>;
-
2489 using wipv4_address = basic_ipv4_address<wchar_t>;
-
2490#ifdef _UNICODE
-
2491 using tipv4_address = wipv4_address;
-
2492#else
-
2493 using tipv4_address = ipv4_address;
-
2494#endif
-
2495 using sgml_ipv4_address = basic_ipv4_address<char>;
-
2496
-
2500 template <class T>
-
- -
2502 {
-
2503 public:
-
2504 basic_ipv6_scope_id_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
-
2505
-
2506 protected:
-
2507 virtual bool do_match(
-
2508 _In_reads_or_z_opt_(end) const T* text,
-
2509 _In_ size_t start = 0,
-
2510 _In_ size_t end = SIZE_MAX,
-
2511 _In_ int flags = match_default)
-
2512 {
-
2513 _Assume_(text || start >= end);
-
2514 if (start < end && text[start]) {
-
2515 if (text[start] == '-' ||
-
2516 text[start] == '_' ||
-
2517 text[start] == ':' ||
-
2518 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
-
2519 {
-
2520 this->interval.end = (this->interval.start = start) + 1;
-
2521 return true;
-
2522 }
-
2523 }
-
2524 this->interval.invalidate();
-
2525 return false;
-
2526 }
-
2527 };
+
2466
+
2467 using ipv4_address = basic_ipv4_address<char>;
+
2468 using wipv4_address = basic_ipv4_address<wchar_t>;
+
2469#ifdef _UNICODE
+
2470 using tipv4_address = wipv4_address;
+
2471#else
+
2472 using tipv4_address = ipv4_address;
+
2473#endif
+
2474 using sgml_ipv4_address = basic_ipv4_address<char>;
+
2475
+
2479 template <class T>
+
+ +
2481 {
+
2482 public:
+
2483 basic_ipv6_scope_id_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
+
2484
+
2485 protected:
+
2486 virtual bool do_match(
+
2487 _In_reads_or_z_opt_(end) const T* text,
+
2488 _In_ size_t start = 0,
+
2489 _In_ size_t end = SIZE_MAX,
+
2490 _In_ int flags = match_default)
+
2491 {
+
2492 _Assume_(text || start >= end);
+
2493 if (start < end && text[start]) {
+
2494 if (text[start] == '-' ||
+
2495 text[start] == '_' ||
+
2496 text[start] == ':' ||
+
2497 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
+
2498 {
+
2499 this->interval.end = (this->interval.start = start) + 1;
+
2500 return true;
+
2501 }
+
2502 }
+
2503 this->interval.invalidate();
+
2504 return false;
+
2505 }
+
2506 };
-
2528
- - -
2531#ifdef _UNICODE
- -
2533#else
- -
2535#endif
-
2536
-
- -
2541 {
-
2542 public:
-
2543 sgml_ipv6_scope_id_char(_In_ const std::locale& locale = std::locale()) : sgml_parser(locale) {}
-
2544
-
2545 protected:
-
2546 virtual bool do_match(
-
2547 _In_reads_or_z_(end) const char* text,
-
2548 _In_ size_t start = 0,
-
2549 _In_ size_t end = SIZE_MAX,
-
2550 _In_ int flags = match_default)
-
2551 {
-
2552 _Assume_(text || start >= end);
-
2553 if (start < end && text[start]) {
-
2554 wchar_t buf[3];
-
2555 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
-
2556 const wchar_t* chr_end = chr + stdex::strlen(chr);
-
2557 if (((chr[0] == L'-' ||
-
2558 chr[0] == L'_' ||
-
2559 chr[0] == L':') && chr[1] == 0) ||
-
2560 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
-
2561 {
-
2562 this->interval.start = start;
-
2563 return true;
-
2564 }
-
2565 }
-
2566 this->interval.invalidate();
-
2567 return false;
-
2568 }
-
2569 };
+
2507
+ + +
2510#ifdef _UNICODE
+ +
2512#else
+ +
2514#endif
+
2515
+
+ +
2520 {
+
2521 public:
+
2522 sgml_ipv6_scope_id_char(_In_ const std::locale& locale = std::locale()) : sgml_parser(locale) {}
+
2523
+
2524 protected:
+
2525 virtual bool do_match(
+
2526 _In_reads_or_z_(end) const char* text,
+
2527 _In_ size_t start = 0,
+
2528 _In_ size_t end = SIZE_MAX,
+
2529 _In_ int flags = match_default)
+
2530 {
+
2531 _Assume_(text || start >= end);
+
2532 if (start < end && text[start]) {
+
2533 wchar_t buf[5];
+
2534 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
+
2535 const wchar_t* chr_end = chr + stdex::strlen(chr);
+
2536 if (((chr[0] == L'-' ||
+
2537 chr[0] == L'_' ||
+
2538 chr[0] == L':') && chr[1] == 0) ||
+
2539 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
+
2540 {
+
2541 this->interval.start = start;
+
2542 return true;
+
2543 }
+
2544 }
+
2545 this->interval.invalidate();
+
2546 return false;
+
2547 }
+
2548 };
-
2570
-
2574 template <class T>
-
- -
2576 {
-
2577 public:
- -
2579 _In_ const std::shared_ptr<basic_parser<T>>& digit_0,
-
2580 _In_ const std::shared_ptr<basic_parser<T>>& digit_1,
-
2581 _In_ const std::shared_ptr<basic_parser<T>>& digit_2,
-
2582 _In_ const std::shared_ptr<basic_parser<T>>& digit_3,
-
2583 _In_ const std::shared_ptr<basic_parser<T>>& digit_4,
-
2584 _In_ const std::shared_ptr<basic_parser<T>>& digit_5,
-
2585 _In_ const std::shared_ptr<basic_parser<T>>& digit_6,
-
2586 _In_ const std::shared_ptr<basic_parser<T>>& digit_7,
-
2587 _In_ const std::shared_ptr<basic_parser<T>>& digit_8,
-
2588 _In_ const std::shared_ptr<basic_parser<T>>& digit_9,
-
2589 _In_ const std::shared_ptr<basic_parser<T>>& digit_10,
-
2590 _In_ const std::shared_ptr<basic_parser<T>>& digit_11,
-
2591 _In_ const std::shared_ptr<basic_parser<T>>& digit_12,
-
2592 _In_ const std::shared_ptr<basic_parser<T>>& digit_13,
-
2593 _In_ const std::shared_ptr<basic_parser<T>>& digit_14,
-
2594 _In_ const std::shared_ptr<basic_parser<T>>& digit_15,
-
2595 _In_ const std::shared_ptr<basic_parser<T>>& separator,
-
2596 _In_ const std::shared_ptr<basic_parser<T>>& scope_id_separator = nullptr,
-
2597 _In_ const std::shared_ptr<basic_parser<T>>& _scope_id = nullptr,
-
2598 _In_ const std::locale& locale = std::locale()) :
- -
2600 m_digit_0(digit_0),
-
2601 m_digit_1(digit_1),
-
2602 m_digit_2(digit_2),
-
2603 m_digit_3(digit_3),
-
2604 m_digit_4(digit_4),
-
2605 m_digit_5(digit_5),
-
2606 m_digit_6(digit_6),
-
2607 m_digit_7(digit_7),
-
2608 m_digit_8(digit_8),
-
2609 m_digit_9(digit_9),
-
2610 m_digit_10(digit_10),
-
2611 m_digit_11(digit_11),
-
2612 m_digit_12(digit_12),
-
2613 m_digit_13(digit_13),
-
2614 m_digit_14(digit_14),
-
2615 m_digit_15(digit_15),
-
2616 m_separator(separator),
-
2617 m_scope_id_separator(scope_id_separator),
- -
2619 {
+
2549
+
2553 template <class T>
+
+ +
2555 {
+
2556 public:
+ +
2558 _In_ const std::shared_ptr<basic_parser<T>>& digit_0,
+
2559 _In_ const std::shared_ptr<basic_parser<T>>& digit_1,
+
2560 _In_ const std::shared_ptr<basic_parser<T>>& digit_2,
+
2561 _In_ const std::shared_ptr<basic_parser<T>>& digit_3,
+
2562 _In_ const std::shared_ptr<basic_parser<T>>& digit_4,
+
2563 _In_ const std::shared_ptr<basic_parser<T>>& digit_5,
+
2564 _In_ const std::shared_ptr<basic_parser<T>>& digit_6,
+
2565 _In_ const std::shared_ptr<basic_parser<T>>& digit_7,
+
2566 _In_ const std::shared_ptr<basic_parser<T>>& digit_8,
+
2567 _In_ const std::shared_ptr<basic_parser<T>>& digit_9,
+
2568 _In_ const std::shared_ptr<basic_parser<T>>& digit_10,
+
2569 _In_ const std::shared_ptr<basic_parser<T>>& digit_11,
+
2570 _In_ const std::shared_ptr<basic_parser<T>>& digit_12,
+
2571 _In_ const std::shared_ptr<basic_parser<T>>& digit_13,
+
2572 _In_ const std::shared_ptr<basic_parser<T>>& digit_14,
+
2573 _In_ const std::shared_ptr<basic_parser<T>>& digit_15,
+
2574 _In_ const std::shared_ptr<basic_parser<T>>& separator,
+
2575 _In_ const std::shared_ptr<basic_parser<T>>& scope_id_separator = nullptr,
+
2576 _In_ const std::shared_ptr<basic_parser<T>>& _scope_id = nullptr,
+
2577 _In_ const std::locale& locale = std::locale()) :
+ +
2579 m_digit_0(digit_0),
+
2580 m_digit_1(digit_1),
+
2581 m_digit_2(digit_2),
+
2582 m_digit_3(digit_3),
+
2583 m_digit_4(digit_4),
+
2584 m_digit_5(digit_5),
+
2585 m_digit_6(digit_6),
+
2586 m_digit_7(digit_7),
+
2587 m_digit_8(digit_8),
+
2588 m_digit_9(digit_9),
+
2589 m_digit_10(digit_10),
+
2590 m_digit_11(digit_11),
+
2591 m_digit_12(digit_12),
+
2592 m_digit_13(digit_13),
+
2593 m_digit_14(digit_14),
+
2594 m_digit_15(digit_15),
+
2595 m_separator(separator),
+
2596 m_scope_id_separator(scope_id_separator),
+ +
2598 {
+
2599 memset(&value, 0, sizeof(value));
+
2600 }
+
2601
+
2602 virtual void invalidate()
+
2603 {
+
2604 components[0].start = 1;
+
2605 components[0].end = 0;
+
2606 components[1].start = 1;
+
2607 components[1].end = 0;
+
2608 components[2].start = 1;
+
2609 components[2].end = 0;
+
2610 components[3].start = 1;
+
2611 components[3].end = 0;
+
2612 components[4].start = 1;
+
2613 components[4].end = 0;
+
2614 components[5].start = 1;
+
2615 components[5].end = 0;
+
2616 components[6].start = 1;
+
2617 components[6].end = 0;
+
2618 components[7].start = 1;
+
2619 components[7].end = 0;
2620 memset(&value, 0, sizeof(value));
-
2621 }
-
2622
-
2623 virtual void invalidate()
-
2624 {
-
2625 components[0].start = 1;
-
2626 components[0].end = 0;
-
2627 components[1].start = 1;
-
2628 components[1].end = 0;
-
2629 components[2].start = 1;
-
2630 components[2].end = 0;
-
2631 components[3].start = 1;
-
2632 components[3].end = 0;
-
2633 components[4].start = 1;
-
2634 components[4].end = 0;
-
2635 components[5].start = 1;
-
2636 components[5].end = 0;
-
2637 components[6].start = 1;
-
2638 components[6].end = 0;
-
2639 components[7].start = 1;
-
2640 components[7].end = 0;
-
2641 memset(&value, 0, sizeof(value));
-
2642 if (scope_id) scope_id->invalidate();
- -
2644 }
-
2645
- - -
2648 std::shared_ptr<basic_parser<T>> scope_id;
-
2649
-
2650 protected:
-
2651 virtual bool do_match(
-
2652 _In_reads_or_z_opt_(end) const T* text,
-
2653 _In_ size_t start = 0,
-
2654 _In_ size_t end = SIZE_MAX,
-
2655 _In_ int flags = match_default)
-
2656 {
-
2657 _Assume_(text || start >= end);
-
2658 this->interval.end = start;
-
2659 memset(&value, 0, sizeof(value));
-
2660
-
2661 size_t i, compaction_i = SIZE_MAX, compaction_start = start;
-
2662 for (i = 0; i < 8; i++) {
-
2663 bool is_empty = true;
-
2664
-
2665 if (m_separator->match(text, this->interval.end, end, flags)) {
-
2666 // : found
-
2667 this->interval.end = m_separator->interval.end;
-
2668 if (m_separator->match(text, this->interval.end, end, flags)) {
-
2669 // :: found
-
2670 if (compaction_i == SIZE_MAX) {
-
2671 // Zero compaction start
-
2672 compaction_i = i;
-
2673 compaction_start = m_separator->interval.start;
-
2674 this->interval.end = m_separator->interval.end;
-
2675 }
-
2676 else {
-
2677 // More than one zero compaction
-
2678 break;
-
2679 }
-
2680 }
-
2681 else if (!i) {
-
2682 // Leading : found
-
2683 goto error;
-
2684 }
-
2685 }
-
2686 else if (i) {
-
2687 // : missing
-
2688 break;
-
2689 }
-
2690
-
2691 components[i].start = this->interval.end;
-
2692 size_t x;
-
2693 for (x = 0; this->interval.end < end && text[this->interval.end];) {
-
2694 size_t dig, digit_end;
-
2695 if (m_digit_0->match(text, this->interval.end, end, flags)) { dig = 0; digit_end = m_digit_0->interval.end; }
-
2696 else if (m_digit_1->match(text, this->interval.end, end, flags)) { dig = 1; digit_end = m_digit_1->interval.end; }
-
2697 else if (m_digit_2->match(text, this->interval.end, end, flags)) { dig = 2; digit_end = m_digit_2->interval.end; }
-
2698 else if (m_digit_3->match(text, this->interval.end, end, flags)) { dig = 3; digit_end = m_digit_3->interval.end; }
-
2699 else if (m_digit_4->match(text, this->interval.end, end, flags)) { dig = 4; digit_end = m_digit_4->interval.end; }
-
2700 else if (m_digit_5->match(text, this->interval.end, end, flags)) { dig = 5; digit_end = m_digit_5->interval.end; }
-
2701 else if (m_digit_6->match(text, this->interval.end, end, flags)) { dig = 6; digit_end = m_digit_6->interval.end; }
-
2702 else if (m_digit_7->match(text, this->interval.end, end, flags)) { dig = 7; digit_end = m_digit_7->interval.end; }
-
2703 else if (m_digit_8->match(text, this->interval.end, end, flags)) { dig = 8; digit_end = m_digit_8->interval.end; }
-
2704 else if (m_digit_9->match(text, this->interval.end, end, flags)) { dig = 9; digit_end = m_digit_9->interval.end; }
-
2705 else if (m_digit_10->match(text, this->interval.end, end, flags)) { dig = 10; digit_end = m_digit_10->interval.end; }
-
2706 else if (m_digit_11->match(text, this->interval.end, end, flags)) { dig = 11; digit_end = m_digit_11->interval.end; }
-
2707 else if (m_digit_12->match(text, this->interval.end, end, flags)) { dig = 12; digit_end = m_digit_12->interval.end; }
-
2708 else if (m_digit_13->match(text, this->interval.end, end, flags)) { dig = 13; digit_end = m_digit_13->interval.end; }
-
2709 else if (m_digit_14->match(text, this->interval.end, end, flags)) { dig = 14; digit_end = m_digit_14->interval.end; }
-
2710 else if (m_digit_15->match(text, this->interval.end, end, flags)) { dig = 15; digit_end = m_digit_15->interval.end; }
-
2711 else break;
-
2712 size_t x_n = x * 16 + dig;
-
2713 if (x_n <= 0xffff) {
-
2714 x = x_n;
-
2715 this->interval.end = digit_end;
-
2716 is_empty = false;
-
2717 }
-
2718 else
-
2719 break;
-
2720 }
-
2721 if (is_empty) {
-
2722 if (compaction_i != SIZE_MAX) {
-
2723 // Zero compaction active: no sweat.
-
2724 break;
-
2725 }
-
2726 goto error;
-
2727 }
-
2728 components[i].end = this->interval.end;
-
2729 HE2BE(reinterpret_cast<uint16_t&>(this->value.s6_words[i]));
-
2730 }
-
2731
-
2732 if (compaction_i != SIZE_MAX) {
-
2733 // Align components right due to zero compaction.
-
2734 size_t j, k;
-
2735 for (j = 8, k = i; k > compaction_i;) {
-
2736 this->value.s6_words[--j] = this->value.s6_words[--k];
- -
2738 }
-
2739 for (; j > compaction_i;) {
-
2740 this->value.s6_words[--j] = 0;
-
2741 components[j].start =
- -
2743 }
-
2744 }
-
2745 else if (i < 8)
-
2746 goto error;
-
2747
-
2748 if (m_scope_id_separator && m_scope_id_separator->match(text, this->interval.end, end, flags) &&
-
2749 scope_id && scope_id->match(text, m_scope_id_separator->interval.end, end, flags))
-
2750 this->interval.end = scope_id->interval.end;
-
2751 else if (scope_id)
-
2752 scope_id->invalidate();
-
2753
-
2754 this->interval.start = start;
-
2755 return true;
-
2756
-
2757 error:
-
2758 invalidate();
-
2759 return false;
-
2760 }
-
2761
-
2762 std::shared_ptr<basic_parser<T>>
-
2763 m_digit_0,
-
2764 m_digit_1,
-
2765 m_digit_2,
-
2766 m_digit_3,
-
2767 m_digit_4,
-
2768 m_digit_5,
-
2769 m_digit_6,
-
2770 m_digit_7,
-
2771 m_digit_8,
-
2772 m_digit_9,
-
2773 m_digit_10,
-
2774 m_digit_11,
-
2775 m_digit_12,
-
2776 m_digit_13,
-
2777 m_digit_14,
-
2778 m_digit_15;
-
2779 std::shared_ptr<basic_parser<T>> m_separator, m_scope_id_separator;
-
2780 };
+
2621 if (scope_id) scope_id->invalidate();
+ +
2623 }
+
2624
+ + +
2627 std::shared_ptr<basic_parser<T>> scope_id;
+
2628
+
2629 protected:
+
2630 virtual bool do_match(
+
2631 _In_reads_or_z_opt_(end) const T* text,
+
2632 _In_ size_t start = 0,
+
2633 _In_ size_t end = SIZE_MAX,
+
2634 _In_ int flags = match_default)
+
2635 {
+
2636 _Assume_(text || start >= end);
+
2637 this->interval.end = start;
+
2638 memset(&value, 0, sizeof(value));
+
2639
+
2640 size_t i, compaction_i = SIZE_MAX, compaction_start = start;
+
2641 for (i = 0; i < 8; i++) {
+
2642 bool is_empty = true;
+
2643
+
2644 if (m_separator->match(text, this->interval.end, end, flags)) {
+
2645 // : found
+
2646 this->interval.end = m_separator->interval.end;
+
2647 if (m_separator->match(text, this->interval.end, end, flags)) {
+
2648 // :: found
+
2649 if (compaction_i == SIZE_MAX) {
+
2650 // Zero compaction start
+
2651 compaction_i = i;
+
2652 compaction_start = m_separator->interval.start;
+
2653 this->interval.end = m_separator->interval.end;
+
2654 }
+
2655 else {
+
2656 // More than one zero compaction
+
2657 break;
+
2658 }
+
2659 }
+
2660 else if (!i) {
+
2661 // Leading : found
+
2662 goto error;
+
2663 }
+
2664 }
+
2665 else if (i) {
+
2666 // : missing
+
2667 break;
+
2668 }
+
2669
+
2670 components[i].start = this->interval.end;
+
2671 size_t x;
+
2672 for (x = 0; this->interval.end < end && text[this->interval.end];) {
+
2673 size_t dig, digit_end;
+
2674 if (m_digit_0->match(text, this->interval.end, end, flags)) { dig = 0; digit_end = m_digit_0->interval.end; }
+
2675 else if (m_digit_1->match(text, this->interval.end, end, flags)) { dig = 1; digit_end = m_digit_1->interval.end; }
+
2676 else if (m_digit_2->match(text, this->interval.end, end, flags)) { dig = 2; digit_end = m_digit_2->interval.end; }
+
2677 else if (m_digit_3->match(text, this->interval.end, end, flags)) { dig = 3; digit_end = m_digit_3->interval.end; }
+
2678 else if (m_digit_4->match(text, this->interval.end, end, flags)) { dig = 4; digit_end = m_digit_4->interval.end; }
+
2679 else if (m_digit_5->match(text, this->interval.end, end, flags)) { dig = 5; digit_end = m_digit_5->interval.end; }
+
2680 else if (m_digit_6->match(text, this->interval.end, end, flags)) { dig = 6; digit_end = m_digit_6->interval.end; }
+
2681 else if (m_digit_7->match(text, this->interval.end, end, flags)) { dig = 7; digit_end = m_digit_7->interval.end; }
+
2682 else if (m_digit_8->match(text, this->interval.end, end, flags)) { dig = 8; digit_end = m_digit_8->interval.end; }
+
2683 else if (m_digit_9->match(text, this->interval.end, end, flags)) { dig = 9; digit_end = m_digit_9->interval.end; }
+
2684 else if (m_digit_10->match(text, this->interval.end, end, flags)) { dig = 10; digit_end = m_digit_10->interval.end; }
+
2685 else if (m_digit_11->match(text, this->interval.end, end, flags)) { dig = 11; digit_end = m_digit_11->interval.end; }
+
2686 else if (m_digit_12->match(text, this->interval.end, end, flags)) { dig = 12; digit_end = m_digit_12->interval.end; }
+
2687 else if (m_digit_13->match(text, this->interval.end, end, flags)) { dig = 13; digit_end = m_digit_13->interval.end; }
+
2688 else if (m_digit_14->match(text, this->interval.end, end, flags)) { dig = 14; digit_end = m_digit_14->interval.end; }
+
2689 else if (m_digit_15->match(text, this->interval.end, end, flags)) { dig = 15; digit_end = m_digit_15->interval.end; }
+
2690 else break;
+
2691 size_t x_n = x * 16 + dig;
+
2692 if (x_n <= 0xffff) {
+
2693 x = x_n;
+
2694 this->interval.end = digit_end;
+
2695 is_empty = false;
+
2696 }
+
2697 else
+
2698 break;
+
2699 }
+
2700 if (is_empty) {
+
2701 if (compaction_i != SIZE_MAX) {
+
2702 // Zero compaction active: no sweat.
+
2703 break;
+
2704 }
+
2705 goto error;
+
2706 }
+
2707 components[i].end = this->interval.end;
+
2708 HE2BE(reinterpret_cast<uint16_t&>(this->value.s6_words[i]));
+
2709 }
+
2710
+
2711 if (compaction_i != SIZE_MAX) {
+
2712 // Align components right due to zero compaction.
+
2713 size_t j, k;
+
2714 for (j = 8, k = i; k > compaction_i;) {
+
2715 this->value.s6_words[--j] = this->value.s6_words[--k];
+ +
2717 }
+
2718 for (; j > compaction_i;) {
+
2719 this->value.s6_words[--j] = 0;
+
2720 components[j].start =
+ +
2722 }
+
2723 }
+
2724 else if (i < 8)
+
2725 goto error;
+
2726
+
2727 if (m_scope_id_separator && m_scope_id_separator->match(text, this->interval.end, end, flags) &&
+
2728 scope_id && scope_id->match(text, m_scope_id_separator->interval.end, end, flags))
+
2729 this->interval.end = scope_id->interval.end;
+
2730 else if (scope_id)
+
2731 scope_id->invalidate();
+
2732
+
2733 this->interval.start = start;
+
2734 return true;
+
2735
+
2736 error:
+
2737 invalidate();
+
2738 return false;
+
2739 }
+
2740
+
2741 std::shared_ptr<basic_parser<T>>
+
2742 m_digit_0,
+
2743 m_digit_1,
+
2744 m_digit_2,
+
2745 m_digit_3,
+
2746 m_digit_4,
+
2747 m_digit_5,
+
2748 m_digit_6,
+
2749 m_digit_7,
+
2750 m_digit_8,
+
2751 m_digit_9,
+
2752 m_digit_10,
+
2753 m_digit_11,
+
2754 m_digit_12,
+
2755 m_digit_13,
+
2756 m_digit_14,
+
2757 m_digit_15;
+
2758 std::shared_ptr<basic_parser<T>> m_separator, m_scope_id_separator;
+
2759 };
-
2781
-
2782 using ipv6_address = basic_ipv6_address<char>;
-
2783 using wipv6_address = basic_ipv6_address<wchar_t>;
-
2784#ifdef _UNICODE
-
2785 using tipv6_address = wipv6_address;
-
2786#else
-
2787 using tipv6_address = ipv6_address;
-
2788#endif
-
2789 using sgml_ipv6_address = basic_ipv6_address<char>;
-
2790
-
2794 template <class T>
-
- -
2796 {
-
2797 public:
- -
2799 _In_ bool allow_idn,
-
2800 _In_ const std::locale& locale = std::locale()) :
- -
2802 m_allow_idn(allow_idn),
-
2803 allow_on_edge(true)
-
2804 {}
-
2805
- -
2807
-
2808 protected:
-
2809 virtual bool do_match(
-
2810 _In_reads_or_z_opt_(end) const T* text,
-
2811 _In_ size_t start = 0,
-
2812 _In_ size_t end = SIZE_MAX,
-
2813 _In_ int flags = match_default)
-
2814 {
-
2815 _Assume_(text || start >= end);
-
2816 if (start < end && text[start]) {
-
2817 if (('A' <= text[start] && text[start] <= 'Z') ||
-
2818 ('a' <= text[start] && text[start] <= 'z') ||
-
2819 ('0' <= text[start] && text[start] <= '9'))
-
2820 allow_on_edge = true;
-
2821 else if (text[start] == '-')
-
2822 allow_on_edge = false;
-
2823 else if (m_allow_idn && std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
-
2824 allow_on_edge = true;
-
2825 else {
-
2826 this->interval.invalidate();
-
2827 return false;
-
2828 }
-
2829 this->interval.end = (this->interval.start = start) + 1;
-
2830 return true;
-
2831 }
-
2832 this->interval.invalidate();
-
2833 return false;
-
2834 }
-
2835
-
2836 bool m_allow_idn;
-
2837 };
+
2760
+
2761 using ipv6_address = basic_ipv6_address<char>;
+
2762 using wipv6_address = basic_ipv6_address<wchar_t>;
+
2763#ifdef _UNICODE
+
2764 using tipv6_address = wipv6_address;
+
2765#else
+
2766 using tipv6_address = ipv6_address;
+
2767#endif
+
2768 using sgml_ipv6_address = basic_ipv6_address<char>;
+
2769
+
2773 template <class T>
+
+ +
2775 {
+
2776 public:
+ +
2778 _In_ bool allow_idn,
+
2779 _In_ const std::locale& locale = std::locale()) :
+ +
2781 m_allow_idn(allow_idn),
+
2782 allow_on_edge(true)
+
2783 {}
+
2784
+ +
2786
+
2787 protected:
+
2788 virtual bool do_match(
+
2789 _In_reads_or_z_opt_(end) const T* text,
+
2790 _In_ size_t start = 0,
+
2791 _In_ size_t end = SIZE_MAX,
+
2792 _In_ int flags = match_default)
+
2793 {
+
2794 _Assume_(text || start >= end);
+
2795 if (start < end && text[start]) {
+
2796 if (('A' <= text[start] && text[start] <= 'Z') ||
+
2797 ('a' <= text[start] && text[start] <= 'z') ||
+
2798 ('0' <= text[start] && text[start] <= '9'))
+
2799 allow_on_edge = true;
+
2800 else if (text[start] == '-')
+
2801 allow_on_edge = false;
+
2802 else if (m_allow_idn && std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
+
2803 allow_on_edge = true;
+
2804 else {
+
2805 this->interval.invalidate();
+
2806 return false;
+
2807 }
+
2808 this->interval.end = (this->interval.start = start) + 1;
+
2809 return true;
+
2810 }
+
2811 this->interval.invalidate();
+
2812 return false;
+
2813 }
+
2814
+
2815 bool m_allow_idn;
+
2816 };
-
2838
-
2839 using dns_domain_char = basic_dns_domain_char<char>;
-
2840 using wdns_domain_char = basic_dns_domain_char<wchar_t>;
-
2841#ifdef _UNICODE
-
2842 using tdns_domain_char = wdns_domain_char;
-
2843#else
-
2844 using tdns_domain_char = dns_domain_char;
-
2845#endif
-
2846
-
- -
2851 {
-
2852 public:
- -
2854 _In_ bool allow_idn,
-
2855 _In_ const std::locale& locale = std::locale()) :
- -
2857 {}
-
2858
-
2859 protected:
-
2860 virtual bool do_match(
-
2861 _In_reads_or_z_(end) const char* text,
-
2862 _In_ size_t start = 0,
-
2863 _In_ size_t end = SIZE_MAX,
-
2864 _In_ int flags = match_default)
-
2865 {
-
2866 _Assume_(text || start >= end);
-
2867 if (start < end && text[start]) {
-
2868 wchar_t buf[3];
-
2869 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
-
2870 const wchar_t* chr_end = chr + stdex::strlen(chr);
-
2871 if ((('A' <= chr[0] && chr[0] <= 'Z') ||
-
2872 ('a' <= chr[0] && chr[0] <= 'z') ||
-
2873 ('0' <= chr[0] && chr[0] <= '9')) && chr[1] == 0)
-
2874 allow_on_edge = true;
-
2875 else if (chr[0] == '-' && chr[1] == 0)
-
2876 allow_on_edge = false;
-
2877 else if (m_allow_idn && std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
-
2878 allow_on_edge = true;
-
2879 else {
-
2880 this->interval.invalidate();
-
2881 return false;
-
2882 }
-
2883 this->interval.start = start;
-
2884 return true;
-
2885 }
-
2886 this->interval.invalidate();
-
2887 return false;
-
2888 }
-
2889 };
+
2817
+
2818 using dns_domain_char = basic_dns_domain_char<char>;
+
2819 using wdns_domain_char = basic_dns_domain_char<wchar_t>;
+
2820#ifdef _UNICODE
+
2821 using tdns_domain_char = wdns_domain_char;
+
2822#else
+
2823 using tdns_domain_char = dns_domain_char;
+
2824#endif
+
2825
+
+ +
2830 {
+
2831 public:
+ +
2833 _In_ bool allow_idn,
+
2834 _In_ const std::locale& locale = std::locale()) :
+ +
2836 {}
+
2837
+
2838 protected:
+
2839 virtual bool do_match(
+
2840 _In_reads_or_z_(end) const char* text,
+
2841 _In_ size_t start = 0,
+
2842 _In_ size_t end = SIZE_MAX,
+
2843 _In_ int flags = match_default)
+
2844 {
+
2845 _Assume_(text || start >= end);
+
2846 if (start < end && text[start]) {
+
2847 wchar_t buf[5];
+
2848 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
+
2849 const wchar_t* chr_end = chr + stdex::strlen(chr);
+
2850 if ((('A' <= chr[0] && chr[0] <= 'Z') ||
+
2851 ('a' <= chr[0] && chr[0] <= 'z') ||
+
2852 ('0' <= chr[0] && chr[0] <= '9')) && chr[1] == 0)
+
2853 allow_on_edge = true;
+
2854 else if (chr[0] == '-' && chr[1] == 0)
+
2855 allow_on_edge = false;
+
2856 else if (m_allow_idn && std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
+
2857 allow_on_edge = true;
+
2858 else {
+
2859 this->interval.invalidate();
+
2860 return false;
+
2861 }
+
2862 this->interval.start = start;
+
2863 return true;
+
2864 }
+
2865 this->interval.invalidate();
+
2866 return false;
+
2867 }
+
2868 };
-
2890
-
2894 template <class T>
-
- -
2896 {
-
2897 public:
- -
2899 _In_ bool allow_absolute,
-
2900 _In_ const std::shared_ptr<basic_dns_domain_char<T>>& domain_char,
-
2901 _In_ const std::shared_ptr<basic_parser<T>>& separator,
-
2902 _In_ const std::locale& locale = std::locale()) :
- - -
2905 m_domain_char(domain_char),
-
2906 m_separator(separator)
-
2907 {}
-
2908
-
2909 protected:
-
2910 virtual bool do_match(
-
2911 _In_reads_or_z_opt_(end) const T* text,
-
2912 _In_ size_t start = 0,
-
2913 _In_ size_t end = SIZE_MAX,
-
2914 _In_ int flags = match_default)
-
2915 {
-
2916 _Assume_(text || start >= end);
-
2917 size_t i = start, count;
-
2918 for (count = 0; i < end && text[i] && count < 127; count++) {
-
2919 if (m_domain_char->match(text, i, end, flags) &&
-
2920 m_domain_char->allow_on_edge)
-
2921 {
-
2922 // Domain start
-
2923 this->interval.end = i = m_domain_char->interval.end;
-
2924 while (i < end && text[i]) {
-
2925 if (m_domain_char->allow_on_edge &&
-
2926 m_separator->match(text, i, end, flags))
-
2927 {
-
2928 // Domain end
-
2929 if (m_allow_absolute)
-
2930 this->interval.end = i = m_separator->interval.end;
-
2931 else {
-
2932 this->interval.end = i;
-
2933 i = m_separator->interval.end;
-
2934 }
-
2935 break;
-
2936 }
-
2937 if (m_domain_char->match(text, i, end, flags)) {
-
2938 if (m_domain_char->allow_on_edge)
-
2939 this->interval.end = i = m_domain_char->interval.end;
-
2940 else
-
2941 i = m_domain_char->interval.end;
-
2942 }
-
2943 else {
-
2944 this->interval.start = start;
-
2945 return true;
-
2946 }
-
2947 }
-
2948 }
-
2949 else
-
2950 break;
-
2951 }
-
2952 if (count) {
-
2953 this->interval.start = start;
-
2954 return true;
-
2955 }
-
2956 this->interval.invalidate();
-
2957 return false;
-
2958 }
-
2959
- -
2961 std::shared_ptr<basic_dns_domain_char<T>> m_domain_char;
-
2962 std::shared_ptr<basic_parser<T>> m_separator;
-
2963 };
+
2869
+
2873 template <class T>
+
+ +
2875 {
+
2876 public:
+ +
2878 _In_ bool allow_absolute,
+
2879 _In_ const std::shared_ptr<basic_dns_domain_char<T>>& domain_char,
+
2880 _In_ const std::shared_ptr<basic_parser<T>>& separator,
+
2881 _In_ const std::locale& locale = std::locale()) :
+ + +
2884 m_domain_char(domain_char),
+
2885 m_separator(separator)
+
2886 {}
+
2887
+
2888 protected:
+
2889 virtual bool do_match(
+
2890 _In_reads_or_z_opt_(end) const T* text,
+
2891 _In_ size_t start = 0,
+
2892 _In_ size_t end = SIZE_MAX,
+
2893 _In_ int flags = match_default)
+
2894 {
+
2895 _Assume_(text || start >= end);
+
2896 size_t i = start, count;
+
2897 for (count = 0; i < end && text[i] && count < 127; count++) {
+
2898 if (m_domain_char->match(text, i, end, flags) &&
+
2899 m_domain_char->allow_on_edge)
+
2900 {
+
2901 // Domain start
+
2902 this->interval.end = i = m_domain_char->interval.end;
+
2903 while (i < end && text[i]) {
+
2904 if (m_domain_char->allow_on_edge &&
+
2905 m_separator->match(text, i, end, flags))
+
2906 {
+
2907 // Domain end
+
2908 if (m_allow_absolute)
+
2909 this->interval.end = i = m_separator->interval.end;
+
2910 else {
+
2911 this->interval.end = i;
+
2912 i = m_separator->interval.end;
+
2913 }
+
2914 break;
+
2915 }
+
2916 if (m_domain_char->match(text, i, end, flags)) {
+
2917 if (m_domain_char->allow_on_edge)
+
2918 this->interval.end = i = m_domain_char->interval.end;
+
2919 else
+
2920 i = m_domain_char->interval.end;
+
2921 }
+
2922 else {
+
2923 this->interval.start = start;
+
2924 return true;
+
2925 }
+
2926 }
+
2927 }
+
2928 else
+
2929 break;
+
2930 }
+
2931 if (count) {
+
2932 this->interval.start = start;
+
2933 return true;
+
2934 }
+
2935 this->interval.invalidate();
+
2936 return false;
+
2937 }
+
2938
+ +
2940 std::shared_ptr<basic_dns_domain_char<T>> m_domain_char;
+
2941 std::shared_ptr<basic_parser<T>> m_separator;
+
2942 };
-
2964
- - -
2967#ifdef _UNICODE
-
2968 using tdns_name = wdns_name;
-
2969#else
-
2970 using tdns_name = dns_name;
-
2971#endif
- -
2973
-
2977 template <class T>
-
- -
2979 {
-
2980 public:
-
2981 basic_url_username_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
-
2982
-
2983 protected:
-
2984 virtual bool do_match(
-
2985 _In_reads_or_z_opt_(end) const T* text,
-
2986 _In_ size_t start = 0,
-
2987 _In_ size_t end = SIZE_MAX,
-
2988 _In_ int flags = match_default)
-
2989 {
-
2990 _Assume_(text || start >= end);
-
2991 if (start < end && text[start]) {
-
2992 if (text[start] == '-' ||
-
2993 text[start] == '.' ||
-
2994 text[start] == '_' ||
-
2995 text[start] == '~' ||
-
2996 text[start] == '%' ||
-
2997 text[start] == '!' ||
-
2998 text[start] == '$' ||
-
2999 text[start] == '&' ||
-
3000 text[start] == '\'' ||
-
3001 //text[start] == '(' ||
-
3002 //text[start] == ')' ||
-
3003 text[start] == '*' ||
-
3004 text[start] == '+' ||
-
3005 text[start] == ',' ||
-
3006 text[start] == ';' ||
-
3007 text[start] == '=' ||
-
3008 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
-
3009 {
-
3010 this->interval.end = (this->interval.start = start) + 1;
-
3011 return true;
-
3012 }
-
3013 }
-
3014 this->interval.invalidate();
-
3015 return false;
-
3016 }
-
3017 };
+
2943
+ + +
2946#ifdef _UNICODE
+
2947 using tdns_name = wdns_name;
+
2948#else
+
2949 using tdns_name = dns_name;
+
2950#endif
+ +
2952
+
2956 template <class T>
+
+ +
2958 {
+
2959 public:
+
2960 basic_url_username_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
+
2961
+
2962 protected:
+
2963 virtual bool do_match(
+
2964 _In_reads_or_z_opt_(end) const T* text,
+
2965 _In_ size_t start = 0,
+
2966 _In_ size_t end = SIZE_MAX,
+
2967 _In_ int flags = match_default)
+
2968 {
+
2969 _Assume_(text || start >= end);
+
2970 if (start < end && text[start]) {
+
2971 if (text[start] == '-' ||
+
2972 text[start] == '.' ||
+
2973 text[start] == '_' ||
+
2974 text[start] == '~' ||
+
2975 text[start] == '%' ||
+
2976 text[start] == '!' ||
+
2977 text[start] == '$' ||
+
2978 text[start] == '&' ||
+
2979 text[start] == '\'' ||
+
2980 //text[start] == '(' ||
+
2981 //text[start] == ')' ||
+
2982 text[start] == '*' ||
+
2983 text[start] == '+' ||
+
2984 text[start] == ',' ||
+
2985 text[start] == ';' ||
+
2986 text[start] == '=' ||
+
2987 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
+
2988 {
+
2989 this->interval.end = (this->interval.start = start) + 1;
+
2990 return true;
+
2991 }
+
2992 }
+
2993 this->interval.invalidate();
+
2994 return false;
+
2995 }
+
2996 };
-
3018
- - -
3021#ifdef _UNICODE
- -
3023#else
- -
3025#endif
-
3026
-
- -
3031 {
-
3032 public:
-
3033 sgml_url_username_char(_In_ const std::locale& locale = std::locale()) : basic_url_username_char<char>(locale) {}
-
3034
-
3035 protected:
-
3036 virtual bool do_match(
-
3037 _In_reads_or_z_(end) const char* text,
-
3038 _In_ size_t start = 0,
-
3039 _In_ size_t end = SIZE_MAX,
-
3040 _In_ int flags = match_default)
-
3041 {
-
3042 _Assume_(text || start >= end);
-
3043 if (start < end && text[start]) {
-
3044 wchar_t buf[3];
-
3045 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
-
3046 const wchar_t* chr_end = chr + stdex::strlen(chr);
-
3047 if (((chr[0] == L'-' ||
-
3048 chr[0] == L'.' ||
-
3049 chr[0] == L'_' ||
-
3050 chr[0] == L'~' ||
-
3051 chr[0] == L'%' ||
-
3052 chr[0] == L'!' ||
-
3053 chr[0] == L'$' ||
-
3054 chr[0] == L'&' ||
-
3055 chr[0] == L'\'' ||
-
3056 //chr[0] == L'(' ||
-
3057 //chr[0] == L')' ||
-
3058 chr[0] == L'*' ||
-
3059 chr[0] == L'+' ||
-
3060 chr[0] == L',' ||
-
3061 chr[0] == L';' ||
-
3062 chr[0] == L'=') && chr[1] == 0) ||
-
3063 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
-
3064 {
-
3065 this->interval.start = start;
-
3066 return true;
-
3067 }
-
3068 }
-
3069
-
3070 this->interval.invalidate();
-
3071 return false;
-
3072 }
-
3073 };
+
2997
+ + +
3000#ifdef _UNICODE
+ +
3002#else
+ +
3004#endif
+
3005
+
+ +
3010 {
+
3011 public:
+
3012 sgml_url_username_char(_In_ const std::locale& locale = std::locale()) : basic_url_username_char<char>(locale) {}
+
3013
+
3014 protected:
+
3015 virtual bool do_match(
+
3016 _In_reads_or_z_(end) const char* text,
+
3017 _In_ size_t start = 0,
+
3018 _In_ size_t end = SIZE_MAX,
+
3019 _In_ int flags = match_default)
+
3020 {
+
3021 _Assume_(text || start >= end);
+
3022 if (start < end && text[start]) {
+
3023 wchar_t buf[5];
+
3024 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
+
3025 const wchar_t* chr_end = chr + stdex::strlen(chr);
+
3026 if (((chr[0] == L'-' ||
+
3027 chr[0] == L'.' ||
+
3028 chr[0] == L'_' ||
+
3029 chr[0] == L'~' ||
+
3030 chr[0] == L'%' ||
+
3031 chr[0] == L'!' ||
+
3032 chr[0] == L'$' ||
+
3033 chr[0] == L'&' ||
+
3034 chr[0] == L'\'' ||
+
3035 //chr[0] == L'(' ||
+
3036 //chr[0] == L')' ||
+
3037 chr[0] == L'*' ||
+
3038 chr[0] == L'+' ||
+
3039 chr[0] == L',' ||
+
3040 chr[0] == L';' ||
+
3041 chr[0] == L'=') && chr[1] == 0) ||
+
3042 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
+
3043 {
+
3044 this->interval.start = start;
+
3045 return true;
+
3046 }
+
3047 }
+
3048
+
3049 this->interval.invalidate();
+
3050 return false;
+
3051 }
+
3052 };
-
3074
-
3078 template <class T>
-
- -
3080 {
-
3081 public:
-
3082 basic_url_password_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
-
3083
-
3084 protected:
-
3085 virtual bool do_match(
-
3086 _In_reads_or_z_opt_(end) const T* text,
-
3087 _In_ size_t start = 0,
-
3088 _In_ size_t end = SIZE_MAX,
-
3089 _In_ int flags = match_default)
-
3090 {
-
3091 _Assume_(text || start >= end);
-
3092 if (start < end && text[start]) {
-
3093 if (text[start] == '-' ||
-
3094 text[start] == '.' ||
-
3095 text[start] == '_' ||
-
3096 text[start] == '~' ||
-
3097 text[start] == '%' ||
-
3098 text[start] == '!' ||
-
3099 text[start] == '$' ||
-
3100 text[start] == '&' ||
-
3101 text[start] == '\'' ||
-
3102 text[start] == '(' ||
-
3103 text[start] == ')' ||
-
3104 text[start] == '*' ||
-
3105 text[start] == '+' ||
-
3106 text[start] == ',' ||
-
3107 text[start] == ';' ||
-
3108 text[start] == '=' ||
-
3109 text[start] == ':' ||
-
3110 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
-
3111 {
-
3112 this->interval.end = (this->interval.start = start) + 1;
-
3113 return true;
-
3114 }
-
3115 }
-
3116 this->interval.invalidate();
-
3117 return false;
-
3118 }
-
3119 };
+
3053
+
3057 template <class T>
+
+ +
3059 {
+
3060 public:
+
3061 basic_url_password_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
+
3062
+
3063 protected:
+
3064 virtual bool do_match(
+
3065 _In_reads_or_z_opt_(end) const T* text,
+
3066 _In_ size_t start = 0,
+
3067 _In_ size_t end = SIZE_MAX,
+
3068 _In_ int flags = match_default)
+
3069 {
+
3070 _Assume_(text || start >= end);
+
3071 if (start < end && text[start]) {
+
3072 if (text[start] == '-' ||
+
3073 text[start] == '.' ||
+
3074 text[start] == '_' ||
+
3075 text[start] == '~' ||
+
3076 text[start] == '%' ||
+
3077 text[start] == '!' ||
+
3078 text[start] == '$' ||
+
3079 text[start] == '&' ||
+
3080 text[start] == '\'' ||
+
3081 text[start] == '(' ||
+
3082 text[start] == ')' ||
+
3083 text[start] == '*' ||
+
3084 text[start] == '+' ||
+
3085 text[start] == ',' ||
+
3086 text[start] == ';' ||
+
3087 text[start] == '=' ||
+
3088 text[start] == ':' ||
+
3089 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
+
3090 {
+
3091 this->interval.end = (this->interval.start = start) + 1;
+
3092 return true;
+
3093 }
+
3094 }
+
3095 this->interval.invalidate();
+
3096 return false;
+
3097 }
+
3098 };
-
3120
- - -
3123#ifdef _UNICODE
- -
3125#else
- -
3127#endif
-
3128
-
- -
3133 {
-
3134 public:
-
3135 sgml_url_password_char(_In_ const std::locale& locale = std::locale()) : basic_url_password_char<char>(locale) {}
-
3136
-
3137 protected:
-
3138 virtual bool do_match(
-
3139 _In_reads_or_z_(end) const char* text,
-
3140 _In_ size_t start = 0,
-
3141 _In_ size_t end = SIZE_MAX,
-
3142 _In_ int flags = match_default)
-
3143 {
-
3144 _Assume_(text || start >= end);
-
3145 if (start < end && text[start]) {
-
3146 wchar_t buf[3];
-
3147 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
-
3148 const wchar_t* chr_end = chr + stdex::strlen(chr);
-
3149 if (((chr[0] == L'-' ||
-
3150 chr[0] == L'.' ||
-
3151 chr[0] == L'_' ||
-
3152 chr[0] == L'~' ||
-
3153 chr[0] == L'%' ||
-
3154 chr[0] == L'!' ||
-
3155 chr[0] == L'$' ||
-
3156 chr[0] == L'&' ||
-
3157 chr[0] == L'\'' ||
-
3158 chr[0] == L'(' ||
-
3159 chr[0] == L')' ||
-
3160 chr[0] == L'*' ||
-
3161 chr[0] == L'+' ||
-
3162 chr[0] == L',' ||
-
3163 chr[0] == L';' ||
-
3164 chr[0] == L'=' ||
-
3165 chr[0] == L':') && chr[1] == 0) ||
-
3166 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
-
3167 {
-
3168 this->interval.start = start;
-
3169 return true;
-
3170 }
-
3171 }
-
3172 this->interval.invalidate();
-
3173 return false;
-
3174 }
-
3175 };
+
3099
+ + +
3102#ifdef _UNICODE
+ +
3104#else
+ +
3106#endif
+
3107
+
+ +
3112 {
+
3113 public:
+
3114 sgml_url_password_char(_In_ const std::locale& locale = std::locale()) : basic_url_password_char<char>(locale) {}
+
3115
+
3116 protected:
+
3117 virtual bool do_match(
+
3118 _In_reads_or_z_(end) const char* text,
+
3119 _In_ size_t start = 0,
+
3120 _In_ size_t end = SIZE_MAX,
+
3121 _In_ int flags = match_default)
+
3122 {
+
3123 _Assume_(text || start >= end);
+
3124 if (start < end && text[start]) {
+
3125 wchar_t buf[5];
+
3126 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
+
3127 const wchar_t* chr_end = chr + stdex::strlen(chr);
+
3128 if (((chr[0] == L'-' ||
+
3129 chr[0] == L'.' ||
+
3130 chr[0] == L'_' ||
+
3131 chr[0] == L'~' ||
+
3132 chr[0] == L'%' ||
+
3133 chr[0] == L'!' ||
+
3134 chr[0] == L'$' ||
+
3135 chr[0] == L'&' ||
+
3136 chr[0] == L'\'' ||
+
3137 chr[0] == L'(' ||
+
3138 chr[0] == L')' ||
+
3139 chr[0] == L'*' ||
+
3140 chr[0] == L'+' ||
+
3141 chr[0] == L',' ||
+
3142 chr[0] == L';' ||
+
3143 chr[0] == L'=' ||
+
3144 chr[0] == L':') && chr[1] == 0) ||
+
3145 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
+
3146 {
+
3147 this->interval.start = start;
+
3148 return true;
+
3149 }
+
3150 }
+
3151 this->interval.invalidate();
+
3152 return false;
+
3153 }
+
3154 };
-
3176
-
3180 template <class T>
-
- -
3182 {
-
3183 public:
-
3184 basic_url_path_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
-
3185
-
3186 protected:
-
3187 virtual bool do_match(
-
3188 _In_reads_or_z_opt_(end) const T* text,
-
3189 _In_ size_t start = 0,
-
3190 _In_ size_t end = SIZE_MAX,
-
3191 _In_ int flags = match_default)
-
3192 {
-
3193 _Assume_(text || start >= end);
-
3194 if (start < end && text[start]) {
-
3195 if (text[start] == '/' ||
-
3196 text[start] == '-' ||
-
3197 text[start] == '.' ||
-
3198 text[start] == '_' ||
-
3199 text[start] == '~' ||
-
3200 text[start] == '%' ||
-
3201 text[start] == '!' ||
-
3202 text[start] == '$' ||
-
3203 text[start] == '&' ||
-
3204 text[start] == '\'' ||
-
3205 text[start] == '(' ||
-
3206 text[start] == ')' ||
-
3207 text[start] == '*' ||
-
3208 text[start] == '+' ||
-
3209 text[start] == ',' ||
-
3210 text[start] == ';' ||
-
3211 text[start] == '=' ||
-
3212 text[start] == ':' ||
-
3213 text[start] == '@' ||
-
3214 text[start] == '?' ||
-
3215 text[start] == '#' ||
-
3216 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
-
3217 {
-
3218 this->interval.end = (this->interval.start = start) + 1;
-
3219 return true;
-
3220 }
-
3221 }
-
3222 this->interval.invalidate();
-
3223 return false;
-
3224 }
-
3225 };
+
3155
+
3159 template <class T>
+
+ +
3161 {
+
3162 public:
+
3163 basic_url_path_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
+
3164
+
3165 protected:
+
3166 virtual bool do_match(
+
3167 _In_reads_or_z_opt_(end) const T* text,
+
3168 _In_ size_t start = 0,
+
3169 _In_ size_t end = SIZE_MAX,
+
3170 _In_ int flags = match_default)
+
3171 {
+
3172 _Assume_(text || start >= end);
+
3173 if (start < end && text[start]) {
+
3174 if (text[start] == '/' ||
+
3175 text[start] == '-' ||
+
3176 text[start] == '.' ||
+
3177 text[start] == '_' ||
+
3178 text[start] == '~' ||
+
3179 text[start] == '%' ||
+
3180 text[start] == '!' ||
+
3181 text[start] == '$' ||
+
3182 text[start] == '&' ||
+
3183 text[start] == '\'' ||
+
3184 text[start] == '(' ||
+
3185 text[start] == ')' ||
+
3186 text[start] == '*' ||
+
3187 text[start] == '+' ||
+
3188 text[start] == ',' ||
+
3189 text[start] == ';' ||
+
3190 text[start] == '=' ||
+
3191 text[start] == ':' ||
+
3192 text[start] == '@' ||
+
3193 text[start] == '?' ||
+
3194 text[start] == '#' ||
+
3195 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
+
3196 {
+
3197 this->interval.end = (this->interval.start = start) + 1;
+
3198 return true;
+
3199 }
+
3200 }
+
3201 this->interval.invalidate();
+
3202 return false;
+
3203 }
+
3204 };
-
3226
- - -
3229#ifdef _UNICODE
- -
3231#else
- -
3233#endif
-
3234
-
- -
3239 {
-
3240 public:
-
3241 sgml_url_path_char(_In_ const std::locale& locale = std::locale()) : basic_url_path_char<char>(locale) {}
-
3242
-
3243 protected:
-
3244 virtual bool do_match(
-
3245 _In_reads_or_z_(end) const char* text,
-
3246 _In_ size_t start = 0,
-
3247 _In_ size_t end = SIZE_MAX,
-
3248 _In_ int flags = match_default)
-
3249 {
-
3250 _Assume_(text || start >= end);
-
3251 if (start < end && text[start]) {
-
3252 wchar_t buf[3];
-
3253 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
-
3254 const wchar_t* chr_end = chr + stdex::strlen(chr);
-
3255 if (((chr[0] == L'/' ||
-
3256 chr[0] == L'-' ||
-
3257 chr[0] == L'.' ||
-
3258 chr[0] == L'_' ||
-
3259 chr[0] == L'~' ||
-
3260 chr[0] == L'%' ||
-
3261 chr[0] == L'!' ||
-
3262 chr[0] == L'$' ||
-
3263 chr[0] == L'&' ||
-
3264 chr[0] == L'\'' ||
-
3265 chr[0] == L'(' ||
-
3266 chr[0] == L')' ||
-
3267 chr[0] == L'*' ||
-
3268 chr[0] == L'+' ||
-
3269 chr[0] == L',' ||
-
3270 chr[0] == L';' ||
-
3271 chr[0] == L'=' ||
-
3272 chr[0] == L':' ||
-
3273 chr[0] == L'@' ||
-
3274 chr[0] == L'?' ||
-
3275 chr[0] == L'#') && chr[1] == 0) ||
-
3276 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
-
3277 {
-
3278 this->interval.start = start;
-
3279 return true;
-
3280 }
-
3281 }
-
3282 this->interval.invalidate();
-
3283 return false;
-
3284 }
-
3285 };
+
3205
+ + +
3208#ifdef _UNICODE
+ +
3210#else
+ +
3212#endif
+
3213
+
+ +
3218 {
+
3219 public:
+
3220 sgml_url_path_char(_In_ const std::locale& locale = std::locale()) : basic_url_path_char<char>(locale) {}
+
3221
+
3222 protected:
+
3223 virtual bool do_match(
+
3224 _In_reads_or_z_(end) const char* text,
+
3225 _In_ size_t start = 0,
+
3226 _In_ size_t end = SIZE_MAX,
+
3227 _In_ int flags = match_default)
+
3228 {
+
3229 _Assume_(text || start >= end);
+
3230 if (start < end && text[start]) {
+
3231 wchar_t buf[5];
+
3232 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
+
3233 const wchar_t* chr_end = chr + stdex::strlen(chr);
+
3234 if (((chr[0] == L'/' ||
+
3235 chr[0] == L'-' ||
+
3236 chr[0] == L'.' ||
+
3237 chr[0] == L'_' ||
+
3238 chr[0] == L'~' ||
+
3239 chr[0] == L'%' ||
+
3240 chr[0] == L'!' ||
+
3241 chr[0] == L'$' ||
+
3242 chr[0] == L'&' ||
+
3243 chr[0] == L'\'' ||
+
3244 chr[0] == L'(' ||
+
3245 chr[0] == L')' ||
+
3246 chr[0] == L'*' ||
+
3247 chr[0] == L'+' ||
+
3248 chr[0] == L',' ||
+
3249 chr[0] == L';' ||
+
3250 chr[0] == L'=' ||
+
3251 chr[0] == L':' ||
+
3252 chr[0] == L'@' ||
+
3253 chr[0] == L'?' ||
+
3254 chr[0] == L'#') && chr[1] == 0) ||
+
3255 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
+
3256 {
+
3257 this->interval.start = start;
+
3258 return true;
+
3259 }
+
3260 }
+
3261 this->interval.invalidate();
+
3262 return false;
+
3263 }
+
3264 };
-
3286
-
3290 template <class T>
-
- -
3292 {
-
3293 public:
- -
3295 _In_ const std::shared_ptr<basic_parser<T>>& path_char,
-
3296 _In_ const std::shared_ptr<basic_parser<T>>& query_start,
-
3297 _In_ const std::shared_ptr<basic_parser<T>>& bookmark_start,
-
3298 _In_ const std::locale& locale = std::locale()) :
- -
3300 m_path_char(path_char),
-
3301 m_query_start(query_start),
-
3302 m_bookmark_start(bookmark_start)
-
3303 {}
-
3304
-
3305 virtual void invalidate()
-
3306 {
-
3307 path.start = 1;
-
3308 path.end = 0;
-
3309 query.start = 1;
-
3310 query.end = 0;
-
3311 bookmark.start = 1;
-
3312 bookmark.end = 0;
- -
3314 }
-
3315
- - -
3318 stdex::interval<size_t> bookmark;
-
3319
-
3320 protected:
-
3321 virtual bool do_match(
-
3322 _In_reads_or_z_opt_(end) const T* text,
-
3323 _In_ size_t start = 0,
-
3324 _In_ size_t end = SIZE_MAX,
-
3325 _In_ int flags = match_default)
-
3326 {
-
3327 _Assume_(text || start >= end);
-
3328
-
3329 this->interval.end = start;
-
3330 path.start = start;
-
3331 query.start = 1;
-
3332 query.end = 0;
-
3333 bookmark.start = 1;
-
3334 bookmark.end = 0;
-
3335
-
3336 for (;;) {
-
3337 if (this->interval.end >= end || !text[this->interval.end])
-
3338 break;
-
3339 if (m_query_start->match(text, this->interval.end, end, flags)) {
-
3340 path.end = this->interval.end;
-
3341 query.start = this->interval.end = m_query_start->interval.end;
-
3342 for (;;) {
-
3343 if (this->interval.end >= end || !text[this->interval.end]) {
-
3344 query.end = this->interval.end;
-
3345 break;
-
3346 }
-
3347 if (m_bookmark_start->match(text, this->interval.end, end, flags)) {
-
3348 query.end = this->interval.end;
-
3349 bookmark.start = this->interval.end = m_bookmark_start->interval.end;
-
3350 for (;;) {
-
3351 if (this->interval.end >= end || !text[this->interval.end]) {
-
3352 bookmark.end = this->interval.end;
-
3353 break;
-
3354 }
-
3355 if (m_path_char->match(text, this->interval.end, end, flags))
-
3356 this->interval.end = m_path_char->interval.end;
-
3357 else {
-
3358 bookmark.end = this->interval.end;
-
3359 break;
-
3360 }
-
3361 }
-
3362 this->interval.start = start;
-
3363 return true;
-
3364 }
-
3365 if (m_path_char->match(text, this->interval.end, end, flags))
-
3366 this->interval.end = m_path_char->interval.end;
-
3367 else {
-
3368 query.end = this->interval.end;
-
3369 break;
-
3370 }
-
3371 }
-
3372 this->interval.start = start;
-
3373 return true;
-
3374 }
-
3375 if (m_bookmark_start->match(text, this->interval.end, end, flags)) {
-
3376 path.end = this->interval.end;
-
3377 bookmark.start = this->interval.end = m_bookmark_start->interval.end;
-
3378 for (;;) {
-
3379 if (this->interval.end >= end || !text[this->interval.end]) {
-
3380 bookmark.end = this->interval.end;
-
3381 break;
-
3382 }
-
3383 if (m_path_char->match(text, this->interval.end, end, flags))
-
3384 this->interval.end = m_path_char->interval.end;
-
3385 else {
-
3386 bookmark.end = this->interval.end;
-
3387 break;
-
3388 }
-
3389 }
-
3390 this->interval.start = start;
-
3391 return true;
-
3392 }
-
3393 if (m_path_char->match(text, this->interval.end, end, flags))
-
3394 this->interval.end = m_path_char->interval.end;
-
3395 else
-
3396 break;
-
3397 }
-
3398
- -
3400 path.end = this->interval.end;
-
3401 this->interval.start = start;
-
3402 return true;
-
3403 }
-
3404
-
3405 path.start = 1;
-
3406 path.end = 0;
-
3407 bookmark.start = 1;
-
3408 bookmark.end = 0;
-
3409 this->interval.invalidate();
-
3410 return false;
-
3411 }
-
3412
-
3413 std::shared_ptr<basic_parser<T>> m_path_char;
-
3414 std::shared_ptr<basic_parser<T>> m_query_start;
-
3415 std::shared_ptr<basic_parser<T>> m_bookmark_start;
-
3416 };
+
3265
+
3269 template <class T>
+
+ +
3271 {
+
3272 public:
+ +
3274 _In_ const std::shared_ptr<basic_parser<T>>& path_char,
+
3275 _In_ const std::shared_ptr<basic_parser<T>>& query_start,
+
3276 _In_ const std::shared_ptr<basic_parser<T>>& bookmark_start,
+
3277 _In_ const std::locale& locale = std::locale()) :
+ +
3279 m_path_char(path_char),
+
3280 m_query_start(query_start),
+
3281 m_bookmark_start(bookmark_start)
+
3282 {}
+
3283
+
3284 virtual void invalidate()
+
3285 {
+
3286 path.start = 1;
+
3287 path.end = 0;
+
3288 query.start = 1;
+
3289 query.end = 0;
+
3290 bookmark.start = 1;
+
3291 bookmark.end = 0;
+ +
3293 }
+
3294
+ + +
3297 stdex::interval<size_t> bookmark;
+
3298
+
3299 protected:
+
3300 virtual bool do_match(
+
3301 _In_reads_or_z_opt_(end) const T* text,
+
3302 _In_ size_t start = 0,
+
3303 _In_ size_t end = SIZE_MAX,
+
3304 _In_ int flags = match_default)
+
3305 {
+
3306 _Assume_(text || start >= end);
+
3307
+
3308 this->interval.end = start;
+
3309 path.start = start;
+
3310 query.start = 1;
+
3311 query.end = 0;
+
3312 bookmark.start = 1;
+
3313 bookmark.end = 0;
+
3314
+
3315 for (;;) {
+
3316 if (this->interval.end >= end || !text[this->interval.end])
+
3317 break;
+
3318 if (m_query_start->match(text, this->interval.end, end, flags)) {
+
3319 path.end = this->interval.end;
+
3320 query.start = this->interval.end = m_query_start->interval.end;
+
3321 for (;;) {
+
3322 if (this->interval.end >= end || !text[this->interval.end]) {
+
3323 query.end = this->interval.end;
+
3324 break;
+
3325 }
+
3326 if (m_bookmark_start->match(text, this->interval.end, end, flags)) {
+
3327 query.end = this->interval.end;
+
3328 bookmark.start = this->interval.end = m_bookmark_start->interval.end;
+
3329 for (;;) {
+
3330 if (this->interval.end >= end || !text[this->interval.end]) {
+
3331 bookmark.end = this->interval.end;
+
3332 break;
+
3333 }
+
3334 if (m_path_char->match(text, this->interval.end, end, flags))
+
3335 this->interval.end = m_path_char->interval.end;
+
3336 else {
+
3337 bookmark.end = this->interval.end;
+
3338 break;
+
3339 }
+
3340 }
+
3341 this->interval.start = start;
+
3342 return true;
+
3343 }
+
3344 if (m_path_char->match(text, this->interval.end, end, flags))
+
3345 this->interval.end = m_path_char->interval.end;
+
3346 else {
+
3347 query.end = this->interval.end;
+
3348 break;
+
3349 }
+
3350 }
+
3351 this->interval.start = start;
+
3352 return true;
+
3353 }
+
3354 if (m_bookmark_start->match(text, this->interval.end, end, flags)) {
+
3355 path.end = this->interval.end;
+
3356 bookmark.start = this->interval.end = m_bookmark_start->interval.end;
+
3357 for (;;) {
+
3358 if (this->interval.end >= end || !text[this->interval.end]) {
+
3359 bookmark.end = this->interval.end;
+
3360 break;
+
3361 }
+
3362 if (m_path_char->match(text, this->interval.end, end, flags))
+
3363 this->interval.end = m_path_char->interval.end;
+
3364 else {
+
3365 bookmark.end = this->interval.end;
+
3366 break;
+
3367 }
+
3368 }
+
3369 this->interval.start = start;
+
3370 return true;
+
3371 }
+
3372 if (m_path_char->match(text, this->interval.end, end, flags))
+
3373 this->interval.end = m_path_char->interval.end;
+
3374 else
+
3375 break;
+
3376 }
+
3377
+ +
3379 path.end = this->interval.end;
+
3380 this->interval.start = start;
+
3381 return true;
+
3382 }
+
3383
+
3384 path.start = 1;
+
3385 path.end = 0;
+
3386 bookmark.start = 1;
+
3387 bookmark.end = 0;
+
3388 this->interval.invalidate();
+
3389 return false;
+
3390 }
+
3391
+
3392 std::shared_ptr<basic_parser<T>> m_path_char;
+
3393 std::shared_ptr<basic_parser<T>> m_query_start;
+
3394 std::shared_ptr<basic_parser<T>> m_bookmark_start;
+
3395 };
-
3417
- - -
3420#ifdef _UNICODE
-
3421 using turl_path = wurl_path;
-
3422#else
-
3423 using turl_path = url_path;
-
3424#endif
- -
3426
-
3430 template <class T>
-
-
3431 class basic_url : public basic_parser<T>
-
3432 {
-
3433 public:
-
3434 basic_url(
-
3435 _In_ const std::shared_ptr<basic_parser<T>>& _http_scheme,
-
3436 _In_ const std::shared_ptr<basic_parser<T>>& _ftp_scheme,
-
3437 _In_ const std::shared_ptr<basic_parser<T>>& _mailto_scheme,
-
3438 _In_ const std::shared_ptr<basic_parser<T>>& _file_scheme,
-
3439 _In_ const std::shared_ptr<basic_parser<T>>& colon,
-
3440 _In_ const std::shared_ptr<basic_parser<T>>& slash,
-
3441 _In_ const std::shared_ptr<basic_parser<T>>& _username,
-
3442 _In_ const std::shared_ptr<basic_parser<T>>& _password,
-
3443 _In_ const std::shared_ptr<basic_parser<T>>& at,
-
3444 _In_ const std::shared_ptr<basic_parser<T>>& ip_lbracket,
-
3445 _In_ const std::shared_ptr<basic_parser<T>>& ip_rbracket,
-
3446 _In_ const std::shared_ptr<basic_parser<T>>& _ipv4_host,
-
3447 _In_ const std::shared_ptr<basic_parser<T>>& _ipv6_host,
-
3448 _In_ const std::shared_ptr<basic_parser<T>>& _dns_host,
-
3449 _In_ const std::shared_ptr<basic_parser<T>>& _port,
-
3450 _In_ const std::shared_ptr<basic_parser<T>>& _path,
-
3451 _In_ const std::locale& locale = std::locale()) :
- -
3453 http_scheme(_http_scheme),
-
3454 ftp_scheme(_ftp_scheme),
-
3455 mailto_scheme(_mailto_scheme),
-
3456 file_scheme(_file_scheme),
-
3457 m_colon(colon),
-
3458 m_slash(slash),
-
3459 username(_username),
-
3460 password(_password),
-
3461 m_at(at),
-
3462 m_ip_lbracket(ip_lbracket),
-
3463 m_ip_rbracket(ip_rbracket),
-
3464 ipv4_host(_ipv4_host),
-
3465 ipv6_host(_ipv6_host),
-
3466 dns_host(_dns_host),
-
3467 port(_port),
-
3468 path(_path)
-
3469 {}
-
3470
-
3471 virtual void invalidate()
-
3472 {
-
3473 http_scheme->invalidate();
-
3474 ftp_scheme->invalidate();
-
3475 mailto_scheme->invalidate();
-
3476 file_scheme->invalidate();
-
3477 username->invalidate();
-
3478 password->invalidate();
-
3479 ipv4_host->invalidate();
-
3480 ipv6_host->invalidate();
-
3481 dns_host->invalidate();
-
3482 port->invalidate();
-
3483 path->invalidate();
- -
3485 }
+
3396
+ + +
3399#ifdef _UNICODE
+
3400 using turl_path = wurl_path;
+
3401#else
+
3402 using turl_path = url_path;
+
3403#endif
+ +
3405
+
3409 template <class T>
+
+
3410 class basic_url : public basic_parser<T>
+
3411 {
+
3412 public:
+
3413 basic_url(
+
3414 _In_ const std::shared_ptr<basic_parser<T>>& _http_scheme,
+
3415 _In_ const std::shared_ptr<basic_parser<T>>& _ftp_scheme,
+
3416 _In_ const std::shared_ptr<basic_parser<T>>& _mailto_scheme,
+
3417 _In_ const std::shared_ptr<basic_parser<T>>& _file_scheme,
+
3418 _In_ const std::shared_ptr<basic_parser<T>>& colon,
+
3419 _In_ const std::shared_ptr<basic_parser<T>>& slash,
+
3420 _In_ const std::shared_ptr<basic_parser<T>>& _username,
+
3421 _In_ const std::shared_ptr<basic_parser<T>>& _password,
+
3422 _In_ const std::shared_ptr<basic_parser<T>>& at,
+
3423 _In_ const std::shared_ptr<basic_parser<T>>& ip_lbracket,
+
3424 _In_ const std::shared_ptr<basic_parser<T>>& ip_rbracket,
+
3425 _In_ const std::shared_ptr<basic_parser<T>>& _ipv4_host,
+
3426 _In_ const std::shared_ptr<basic_parser<T>>& _ipv6_host,
+
3427 _In_ const std::shared_ptr<basic_parser<T>>& _dns_host,
+
3428 _In_ const std::shared_ptr<basic_parser<T>>& _port,
+
3429 _In_ const std::shared_ptr<basic_parser<T>>& _path,
+
3430 _In_ const std::locale& locale = std::locale()) :
+ +
3432 http_scheme(_http_scheme),
+
3433 ftp_scheme(_ftp_scheme),
+
3434 mailto_scheme(_mailto_scheme),
+
3435 file_scheme(_file_scheme),
+
3436 m_colon(colon),
+
3437 m_slash(slash),
+
3438 username(_username),
+
3439 password(_password),
+
3440 m_at(at),
+
3441 m_ip_lbracket(ip_lbracket),
+
3442 m_ip_rbracket(ip_rbracket),
+
3443 ipv4_host(_ipv4_host),
+
3444 ipv6_host(_ipv6_host),
+
3445 dns_host(_dns_host),
+
3446 port(_port),
+
3447 path(_path)
+
3448 {}
+
3449
+
3450 virtual void invalidate()
+
3451 {
+
3452 http_scheme->invalidate();
+
3453 ftp_scheme->invalidate();
+
3454 mailto_scheme->invalidate();
+
3455 file_scheme->invalidate();
+
3456 username->invalidate();
+
3457 password->invalidate();
+
3458 ipv4_host->invalidate();
+
3459 ipv6_host->invalidate();
+
3460 dns_host->invalidate();
+
3461 port->invalidate();
+
3462 path->invalidate();
+ +
3464 }
+
3465
+
3466 std::shared_ptr<basic_parser<T>> http_scheme;
+
3467 std::shared_ptr<basic_parser<T>> ftp_scheme;
+
3468 std::shared_ptr<basic_parser<T>> mailto_scheme;
+
3469 std::shared_ptr<basic_parser<T>> file_scheme;
+
3470 std::shared_ptr<basic_parser<T>> username;
+
3471 std::shared_ptr<basic_parser<T>> password;
+
3472 std::shared_ptr<basic_parser<T>> ipv4_host;
+
3473 std::shared_ptr<basic_parser<T>> ipv6_host;
+
3474 std::shared_ptr<basic_parser<T>> dns_host;
+
3475 std::shared_ptr<basic_parser<T>> port;
+
3476 std::shared_ptr<basic_parser<T>> path;
+
3477
+
3478 protected:
+
3479 virtual bool do_match(
+
3480 _In_reads_or_z_opt_(end) const T* text,
+
3481 _In_ size_t start = 0,
+
3482 _In_ size_t end = SIZE_MAX,
+
3483 _In_ int flags = match_default)
+
3484 {
+
3485 _Assume_(text || start >= end);
3486
-
3487 std::shared_ptr<basic_parser<T>> http_scheme;
-
3488 std::shared_ptr<basic_parser<T>> ftp_scheme;
-
3489 std::shared_ptr<basic_parser<T>> mailto_scheme;
-
3490 std::shared_ptr<basic_parser<T>> file_scheme;
-
3491 std::shared_ptr<basic_parser<T>> username;
-
3492 std::shared_ptr<basic_parser<T>> password;
-
3493 std::shared_ptr<basic_parser<T>> ipv4_host;
-
3494 std::shared_ptr<basic_parser<T>> ipv6_host;
-
3495 std::shared_ptr<basic_parser<T>> dns_host;
-
3496 std::shared_ptr<basic_parser<T>> port;
-
3497 std::shared_ptr<basic_parser<T>> path;
-
3498
-
3499 protected:
-
3500 virtual bool do_match(
-
3501 _In_reads_or_z_opt_(end) const T* text,
-
3502 _In_ size_t start = 0,
-
3503 _In_ size_t end = SIZE_MAX,
-
3504 _In_ int flags = match_default)
-
3505 {
-
3506 _Assume_(text || start >= end);
-
3507
-
3508 this->interval.end = start;
-
3509
-
3510 if (http_scheme->match(text, this->interval.end, end, flags) &&
-
3511 m_colon->match(text, http_scheme->interval.end, end, flags) &&
-
3512 m_slash->match(text, m_colon->interval.end, end, flags) &&
-
3513 m_slash->match(text, m_slash->interval.end, end, flags))
-
3514 {
-
3515 // http://
-
3516 this->interval.end = m_slash->interval.end;
+
3487 this->interval.end = start;
+
3488
+
3489 if (http_scheme->match(text, this->interval.end, end, flags) &&
+
3490 m_colon->match(text, http_scheme->interval.end, end, flags) &&
+
3491 m_slash->match(text, m_colon->interval.end, end, flags) &&
+
3492 m_slash->match(text, m_slash->interval.end, end, flags))
+
3493 {
+
3494 // http://
+
3495 this->interval.end = m_slash->interval.end;
+
3496 ftp_scheme->invalidate();
+
3497 mailto_scheme->invalidate();
+
3498 file_scheme->invalidate();
+
3499 }
+
3500 else if (ftp_scheme->match(text, this->interval.end, end, flags) &&
+
3501 m_colon->match(text, ftp_scheme->interval.end, end, flags) &&
+
3502 m_slash->match(text, m_colon->interval.end, end, flags) &&
+
3503 m_slash->match(text, m_slash->interval.end, end, flags))
+
3504 {
+
3505 // ftp://
+
3506 this->interval.end = m_slash->interval.end;
+
3507 http_scheme->invalidate();
+
3508 mailto_scheme->invalidate();
+
3509 file_scheme->invalidate();
+
3510 }
+
3511 else if (mailto_scheme->match(text, this->interval.end, end, flags) &&
+
3512 m_colon->match(text, mailto_scheme->interval.end, end, flags))
+
3513 {
+
3514 // mailto:
+
3515 this->interval.end = m_colon->interval.end;
+
3516 http_scheme->invalidate();
3517 ftp_scheme->invalidate();
-
3518 mailto_scheme->invalidate();
-
3519 file_scheme->invalidate();
-
3520 }
-
3521 else if (ftp_scheme->match(text, this->interval.end, end, flags) &&
-
3522 m_colon->match(text, ftp_scheme->interval.end, end, flags) &&
-
3523 m_slash->match(text, m_colon->interval.end, end, flags) &&
-
3524 m_slash->match(text, m_slash->interval.end, end, flags))
-
3525 {
-
3526 // ftp://
-
3527 this->interval.end = m_slash->interval.end;
-
3528 http_scheme->invalidate();
+
3518 file_scheme->invalidate();
+
3519 }
+
3520 else if (file_scheme->match(text, this->interval.end, end, flags) &&
+
3521 m_colon->match(text, file_scheme->interval.end, end, flags) &&
+
3522 m_slash->match(text, m_colon->interval.end, end, flags) &&
+
3523 m_slash->match(text, m_slash->interval.end, end, flags))
+
3524 {
+
3525 // file://
+
3526 this->interval.end = m_slash->interval.end;
+
3527 http_scheme->invalidate();
+
3528 ftp_scheme->invalidate();
3529 mailto_scheme->invalidate();
-
3530 file_scheme->invalidate();
-
3531 }
-
3532 else if (mailto_scheme->match(text, this->interval.end, end, flags) &&
-
3533 m_colon->match(text, mailto_scheme->interval.end, end, flags))
-
3534 {
-
3535 // mailto:
-
3536 this->interval.end = m_colon->interval.end;
-
3537 http_scheme->invalidate();
-
3538 ftp_scheme->invalidate();
-
3539 file_scheme->invalidate();
-
3540 }
-
3541 else if (file_scheme->match(text, this->interval.end, end, flags) &&
-
3542 m_colon->match(text, file_scheme->interval.end, end, flags) &&
-
3543 m_slash->match(text, m_colon->interval.end, end, flags) &&
-
3544 m_slash->match(text, m_slash->interval.end, end, flags))
-
3545 {
-
3546 // file://
-
3547 this->interval.end = m_slash->interval.end;
-
3548 http_scheme->invalidate();
-
3549 ftp_scheme->invalidate();
-
3550 mailto_scheme->invalidate();
-
3551 }
-
3552 else {
-
3553 // Default to http:
-
3554 http_scheme->invalidate();
-
3555 ftp_scheme->invalidate();
-
3556 mailto_scheme->invalidate();
-
3557 file_scheme->invalidate();
-
3558 }
-
3559
-
3560 if (ftp_scheme->interval) {
-
3561 if (username->match(text, this->interval.end, end, flags)) {
-
3562 if (m_colon->match(text, username->interval.end, end, flags) &&
-
3563 password->match(text, m_colon->interval.end, end, flags) &&
-
3564 m_at->match(text, password->interval.end, end, flags))
-
3565 {
-
3566 // Username and password
-
3567 this->interval.end = m_at->interval.end;
-
3568 }
-
3569 else if (m_at->match(text, this->interval.end, end, flags)) {
-
3570 // Username only
-
3571 this->interval.end = m_at->interval.end;
-
3572 password->invalidate();
-
3573 }
-
3574 else {
-
3575 username->invalidate();
-
3576 password->invalidate();
-
3577 }
+
3530 }
+
3531 else {
+
3532 // Default to http:
+
3533 http_scheme->invalidate();
+
3534 ftp_scheme->invalidate();
+
3535 mailto_scheme->invalidate();
+
3536 file_scheme->invalidate();
+
3537 }
+
3538
+
3539 if (ftp_scheme->interval) {
+
3540 if (username->match(text, this->interval.end, end, flags)) {
+
3541 if (m_colon->match(text, username->interval.end, end, flags) &&
+
3542 password->match(text, m_colon->interval.end, end, flags) &&
+
3543 m_at->match(text, password->interval.end, end, flags))
+
3544 {
+
3545 // Username and password
+
3546 this->interval.end = m_at->interval.end;
+
3547 }
+
3548 else if (m_at->match(text, this->interval.end, end, flags)) {
+
3549 // Username only
+
3550 this->interval.end = m_at->interval.end;
+
3551 password->invalidate();
+
3552 }
+
3553 else {
+
3554 username->invalidate();
+
3555 password->invalidate();
+
3556 }
+
3557 }
+
3558 else {
+
3559 username->invalidate();
+
3560 password->invalidate();
+
3561 }
+
3562
+
3563 if (ipv4_host->match(text, this->interval.end, end, flags)) {
+
3564 // Host is IPv4
+
3565 this->interval.end = ipv4_host->interval.end;
+
3566 ipv6_host->invalidate();
+
3567 dns_host->invalidate();
+
3568 }
+
3569 else if (
+
3570 m_ip_lbracket->match(text, this->interval.end, end, flags) &&
+
3571 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
+
3572 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
+
3573 {
+
3574 // Host is IPv6
+
3575 this->interval.end = m_ip_rbracket->interval.end;
+
3576 ipv4_host->invalidate();
+
3577 dns_host->invalidate();
3578 }
-
3579 else {
-
3580 username->invalidate();
-
3581 password->invalidate();
-
3582 }
-
3583
-
3584 if (ipv4_host->match(text, this->interval.end, end, flags)) {
-
3585 // Host is IPv4
-
3586 this->interval.end = ipv4_host->interval.end;
-
3587 ipv6_host->invalidate();
-
3588 dns_host->invalidate();
-
3589 }
-
3590 else if (
-
3591 m_ip_lbracket->match(text, this->interval.end, end, flags) &&
-
3592 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
-
3593 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
-
3594 {
-
3595 // Host is IPv6
-
3596 this->interval.end = m_ip_rbracket->interval.end;
-
3597 ipv4_host->invalidate();
-
3598 dns_host->invalidate();
-
3599 }
-
3600 else if (dns_host->match(text, this->interval.end, end, flags)) {
-
3601 // Host is hostname
-
3602 this->interval.end = dns_host->interval.end;
-
3603 ipv4_host->invalidate();
-
3604 ipv6_host->invalidate();
-
3605 }
-
3606 else {
-
3607 invalidate();
-
3608 return false;
-
3609 }
-
3610
-
3611 if (m_colon->match(text, this->interval.end, end, flags) &&
-
3612 port->match(text, m_colon->interval.end, end, flags))
-
3613 {
-
3614 // Port
-
3615 this->interval.end = port->interval.end;
-
3616 }
-
3617 else
-
3618 port->invalidate();
+
3579 else if (dns_host->match(text, this->interval.end, end, flags)) {
+
3580 // Host is hostname
+
3581 this->interval.end = dns_host->interval.end;
+
3582 ipv4_host->invalidate();
+
3583 ipv6_host->invalidate();
+
3584 }
+
3585 else {
+
3586 invalidate();
+
3587 return false;
+
3588 }
+
3589
+
3590 if (m_colon->match(text, this->interval.end, end, flags) &&
+
3591 port->match(text, m_colon->interval.end, end, flags))
+
3592 {
+
3593 // Port
+
3594 this->interval.end = port->interval.end;
+
3595 }
+
3596 else
+
3597 port->invalidate();
+
3598
+
3599 if (path->match(text, this->interval.end, end, flags)) {
+
3600 // Path
+
3601 this->interval.end = path->interval.end;
+
3602 }
+
3603
+
3604 this->interval.start = start;
+
3605 return true;
+
3606 }
+
3607
+
3608 if (mailto_scheme->interval) {
+
3609 if (username->match(text, this->interval.end, end, flags) &&
+
3610 m_at->match(text, username->interval.end, end, flags))
+
3611 {
+
3612 // Username
+
3613 this->interval.end = m_at->interval.end;
+
3614 }
+
3615 else {
+
3616 invalidate();
+
3617 return false;
+
3618 }
3619
-
3620 if (path->match(text, this->interval.end, end, flags)) {
-
3621 // Path
-
3622 this->interval.end = path->interval.end;
-
3623 }
-
3624
-
3625 this->interval.start = start;
-
3626 return true;
-
3627 }
-
3628
-
3629 if (mailto_scheme->interval) {
-
3630 if (username->match(text, this->interval.end, end, flags) &&
-
3631 m_at->match(text, username->interval.end, end, flags))
-
3632 {
-
3633 // Username
-
3634 this->interval.end = m_at->interval.end;
-
3635 }
-
3636 else {
-
3637 invalidate();
-
3638 return false;
-
3639 }
-
3640
-
3641 if (m_ip_lbracket->match(text, this->interval.end, end, flags) &&
-
3642 ipv4_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
-
3643 m_ip_rbracket->match(text, ipv4_host->interval.end, end, flags))
-
3644 {
-
3645 // Host is IPv4
-
3646 this->interval.end = m_ip_rbracket->interval.end;
-
3647 ipv6_host->invalidate();
-
3648 dns_host->invalidate();
-
3649 }
-
3650 else if (
-
3651 m_ip_lbracket->match(text, this->interval.end, end, flags) &&
-
3652 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
-
3653 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
-
3654 {
-
3655 // Host is IPv6
-
3656 this->interval.end = m_ip_rbracket->interval.end;
-
3657 ipv4_host->invalidate();
-
3658 dns_host->invalidate();
-
3659 }
-
3660 else if (dns_host->match(text, this->interval.end, end, flags)) {
-
3661 // Host is hostname
-
3662 this->interval.end = dns_host->interval.end;
-
3663 ipv4_host->invalidate();
-
3664 ipv6_host->invalidate();
-
3665 }
-
3666 else {
-
3667 invalidate();
-
3668 return false;
-
3669 }
-
3670
-
3671 password->invalidate();
-
3672 port->invalidate();
-
3673 path->invalidate();
-
3674 this->interval.start = start;
-
3675 return true;
-
3676 }
-
3677
-
3678 if (file_scheme->interval) {
-
3679 if (path->match(text, this->interval.end, end, flags)) {
-
3680 // Path
-
3681 this->interval.end = path->interval.end;
-
3682 }
-
3683
-
3684 username->invalidate();
-
3685 password->invalidate();
-
3686 ipv4_host->invalidate();
-
3687 ipv6_host->invalidate();
-
3688 dns_host->invalidate();
-
3689 port->invalidate();
-
3690 this->interval.start = start;
-
3691 return true;
-
3692 }
-
3693
-
3694 // "http://" found or defaulted to
-
3695
-
3696 // If "http://" explicit, test for username&password.
-
3697 if (http_scheme->interval &&
-
3698 username->match(text, this->interval.end, end, flags))
-
3699 {
-
3700 if (m_colon->match(text, username->interval.end, end, flags) &&
-
3701 password->match(text, m_colon->interval.end, end, flags) &&
-
3702 m_at->match(text, password->interval.end, end, flags))
-
3703 {
-
3704 // Username and password
-
3705 this->interval.end = m_at->interval.end;
-
3706 }
-
3707 else if (m_at->match(text, username->interval.end, end, flags)) {
-
3708 // Username only
-
3709 this->interval.end = m_at->interval.end;
-
3710 password->invalidate();
-
3711 }
-
3712 else {
-
3713 username->invalidate();
-
3714 password->invalidate();
-
3715 }
+
3620 if (m_ip_lbracket->match(text, this->interval.end, end, flags) &&
+
3621 ipv4_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
+
3622 m_ip_rbracket->match(text, ipv4_host->interval.end, end, flags))
+
3623 {
+
3624 // Host is IPv4
+
3625 this->interval.end = m_ip_rbracket->interval.end;
+
3626 ipv6_host->invalidate();
+
3627 dns_host->invalidate();
+
3628 }
+
3629 else if (
+
3630 m_ip_lbracket->match(text, this->interval.end, end, flags) &&
+
3631 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
+
3632 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
+
3633 {
+
3634 // Host is IPv6
+
3635 this->interval.end = m_ip_rbracket->interval.end;
+
3636 ipv4_host->invalidate();
+
3637 dns_host->invalidate();
+
3638 }
+
3639 else if (dns_host->match(text, this->interval.end, end, flags)) {
+
3640 // Host is hostname
+
3641 this->interval.end = dns_host->interval.end;
+
3642 ipv4_host->invalidate();
+
3643 ipv6_host->invalidate();
+
3644 }
+
3645 else {
+
3646 invalidate();
+
3647 return false;
+
3648 }
+
3649
+
3650 password->invalidate();
+
3651 port->invalidate();
+
3652 path->invalidate();
+
3653 this->interval.start = start;
+
3654 return true;
+
3655 }
+
3656
+
3657 if (file_scheme->interval) {
+
3658 if (path->match(text, this->interval.end, end, flags)) {
+
3659 // Path
+
3660 this->interval.end = path->interval.end;
+
3661 }
+
3662
+
3663 username->invalidate();
+
3664 password->invalidate();
+
3665 ipv4_host->invalidate();
+
3666 ipv6_host->invalidate();
+
3667 dns_host->invalidate();
+
3668 port->invalidate();
+
3669 this->interval.start = start;
+
3670 return true;
+
3671 }
+
3672
+
3673 // "http://" found or defaulted to
+
3674
+
3675 // If "http://" explicit, test for username&password.
+
3676 if (http_scheme->interval &&
+
3677 username->match(text, this->interval.end, end, flags))
+
3678 {
+
3679 if (m_colon->match(text, username->interval.end, end, flags) &&
+
3680 password->match(text, m_colon->interval.end, end, flags) &&
+
3681 m_at->match(text, password->interval.end, end, flags))
+
3682 {
+
3683 // Username and password
+
3684 this->interval.end = m_at->interval.end;
+
3685 }
+
3686 else if (m_at->match(text, username->interval.end, end, flags)) {
+
3687 // Username only
+
3688 this->interval.end = m_at->interval.end;
+
3689 password->invalidate();
+
3690 }
+
3691 else {
+
3692 username->invalidate();
+
3693 password->invalidate();
+
3694 }
+
3695 }
+
3696 else {
+
3697 username->invalidate();
+
3698 password->invalidate();
+
3699 }
+
3700
+
3701 if (ipv4_host->match(text, this->interval.end, end, flags)) {
+
3702 // Host is IPv4
+
3703 this->interval.end = ipv4_host->interval.end;
+
3704 ipv6_host->invalidate();
+
3705 dns_host->invalidate();
+
3706 }
+
3707 else if (
+
3708 m_ip_lbracket->match(text, this->interval.end, end, flags) &&
+
3709 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
+
3710 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
+
3711 {
+
3712 // Host is IPv6
+
3713 this->interval.end = m_ip_rbracket->interval.end;
+
3714 ipv4_host->invalidate();
+
3715 dns_host->invalidate();
3716 }
-
3717 else {
-
3718 username->invalidate();
-
3719 password->invalidate();
-
3720 }
-
3721
-
3722 if (ipv4_host->match(text, this->interval.end, end, flags)) {
-
3723 // Host is IPv4
-
3724 this->interval.end = ipv4_host->interval.end;
-
3725 ipv6_host->invalidate();
-
3726 dns_host->invalidate();
-
3727 }
-
3728 else if (
-
3729 m_ip_lbracket->match(text, this->interval.end, end, flags) &&
-
3730 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
-
3731 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
-
3732 {
-
3733 // Host is IPv6
-
3734 this->interval.end = m_ip_rbracket->interval.end;
-
3735 ipv4_host->invalidate();
-
3736 dns_host->invalidate();
-
3737 }
-
3738 else if (dns_host->match(text, this->interval.end, end, flags)) {
-
3739 // Host is hostname
-
3740 this->interval.end = dns_host->interval.end;
-
3741 ipv4_host->invalidate();
-
3742 ipv6_host->invalidate();
-
3743 }
-
3744 else {
-
3745 invalidate();
-
3746 return false;
-
3747 }
-
3748
-
3749 if (m_colon->match(text, this->interval.end, end, flags) &&
-
3750 port->match(text, m_colon->interval.end, end, flags))
-
3751 {
-
3752 // Port
-
3753 this->interval.end = port->interval.end;
-
3754 }
-
3755 else
-
3756 port->invalidate();
-
3757
-
3758 if (path->match(text, this->interval.end, end, flags)) {
-
3759 // Path
-
3760 this->interval.end = path->interval.end;
-
3761 }
-
3762
-
3763 this->interval.start = start;
-
3764 return true;
-
3765 }
-
3766
-
3767 std::shared_ptr<basic_parser<T>> m_colon;
-
3768 std::shared_ptr<basic_parser<T>> m_slash;
-
3769 std::shared_ptr<basic_parser<T>> m_at;
-
3770 std::shared_ptr<basic_parser<T>> m_ip_lbracket;
-
3771 std::shared_ptr<basic_parser<T>> m_ip_rbracket;
-
3772 };
+
3717 else if (dns_host->match(text, this->interval.end, end, flags)) {
+
3718 // Host is hostname
+
3719 this->interval.end = dns_host->interval.end;
+
3720 ipv4_host->invalidate();
+
3721 ipv6_host->invalidate();
+
3722 }
+
3723 else {
+
3724 invalidate();
+
3725 return false;
+
3726 }
+
3727
+
3728 if (m_colon->match(text, this->interval.end, end, flags) &&
+
3729 port->match(text, m_colon->interval.end, end, flags))
+
3730 {
+
3731 // Port
+
3732 this->interval.end = port->interval.end;
+
3733 }
+
3734 else
+
3735 port->invalidate();
+
3736
+
3737 if (path->match(text, this->interval.end, end, flags)) {
+
3738 // Path
+
3739 this->interval.end = path->interval.end;
+
3740 }
+
3741
+
3742 this->interval.start = start;
+
3743 return true;
+
3744 }
+
3745
+
3746 std::shared_ptr<basic_parser<T>> m_colon;
+
3747 std::shared_ptr<basic_parser<T>> m_slash;
+
3748 std::shared_ptr<basic_parser<T>> m_at;
+
3749 std::shared_ptr<basic_parser<T>> m_ip_lbracket;
+
3750 std::shared_ptr<basic_parser<T>> m_ip_rbracket;
+
3751 };
-
3773
-
3774 using url = basic_url<char>;
-
3775 using wurl = basic_url<wchar_t>;
-
3776#ifdef _UNICODE
-
3777 using turl = wurl;
-
3778#else
-
3779 using turl = url;
-
3780#endif
-
3781 using sgml_url = basic_url<char>;
-
3782
-
3786 template <class T>
-
- -
3788 {
-
3789 public:
- -
3791 _In_ const std::shared_ptr<basic_parser<T>>& _username,
-
3792 _In_ const std::shared_ptr<basic_parser<T>>& at,
-
3793 _In_ const std::shared_ptr<basic_parser<T>>& ip_lbracket,
-
3794 _In_ const std::shared_ptr<basic_parser<T>>& ip_rbracket,
-
3795 _In_ const std::shared_ptr<basic_parser<T>>& _ipv4_host,
-
3796 _In_ const std::shared_ptr<basic_parser<T>>& _ipv6_host,
-
3797 _In_ const std::shared_ptr<basic_parser<T>>& _dns_host,
-
3798 _In_ const std::locale& locale = std::locale()) :
- -
3800 username(_username),
-
3801 m_at(at),
-
3802 m_ip_lbracket(ip_lbracket),
-
3803 m_ip_rbracket(ip_rbracket),
-
3804 ipv4_host(_ipv4_host),
-
3805 ipv6_host(_ipv6_host),
-
3806 dns_host(_dns_host)
-
3807 {}
-
3808
-
3809 virtual void invalidate()
-
3810 {
-
3811 username->invalidate();
-
3812 ipv4_host->invalidate();
-
3813 ipv6_host->invalidate();
-
3814 dns_host->invalidate();
- -
3816 }
-
3817
-
3818 std::shared_ptr<basic_parser<T>> username;
-
3819 std::shared_ptr<basic_parser<T>> ipv4_host;
-
3820 std::shared_ptr<basic_parser<T>> ipv6_host;
-
3821 std::shared_ptr<basic_parser<T>> dns_host;
-
3822
-
3823 protected:
-
3824 virtual bool do_match(
-
3825 _In_reads_or_z_opt_(end) const T* text,
-
3826 _In_ size_t start = 0,
-
3827 _In_ size_t end = SIZE_MAX,
-
3828 _In_ int flags = match_default)
-
3829 {
-
3830 _Assume_(text || start >= end);
-
3831
-
3832 if (username->match(text, start, end, flags) &&
-
3833 m_at->match(text, username->interval.end, end, flags))
-
3834 {
-
3835 // Username@
-
3836 if (m_ip_lbracket->match(text, m_at->interval.end, end, flags) &&
-
3837 ipv4_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
-
3838 m_ip_rbracket->match(text, ipv4_host->interval.end, end, flags))
-
3839 {
-
3840 // Host is IPv4
-
3841 this->interval.end = m_ip_rbracket->interval.end;
-
3842 ipv6_host->invalidate();
-
3843 dns_host->invalidate();
-
3844 }
-
3845 else if (
-
3846 m_ip_lbracket->match(text, m_at->interval.end, end, flags) &&
-
3847 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
-
3848 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
-
3849 {
-
3850 // Host is IPv6
-
3851 this->interval.end = m_ip_rbracket->interval.end;
-
3852 ipv4_host->invalidate();
-
3853 dns_host->invalidate();
-
3854 }
-
3855 else if (dns_host->match(text, m_at->interval.end, end, flags)) {
-
3856 // Host is hostname
-
3857 this->interval.end = dns_host->interval.end;
-
3858 ipv4_host->invalidate();
-
3859 ipv6_host->invalidate();
-
3860 }
-
3861 else
-
3862 goto error;
-
3863 this->interval.start = start;
-
3864 return true;
-
3865 }
-
3866
-
3867 error:
-
3868 invalidate();
-
3869 return false;
-
3870 }
-
3871
-
3872 std::shared_ptr<basic_parser<T>> m_at;
-
3873 std::shared_ptr<basic_parser<T>> m_ip_lbracket;
-
3874 std::shared_ptr<basic_parser<T>> m_ip_rbracket;
-
3875 };
+
3752
+
3753 using url = basic_url<char>;
+
3754 using wurl = basic_url<wchar_t>;
+
3755#ifdef _UNICODE
+
3756 using turl = wurl;
+
3757#else
+
3758 using turl = url;
+
3759#endif
+
3760 using sgml_url = basic_url<char>;
+
3761
+
3765 template <class T>
+
+ +
3767 {
+
3768 public:
+ +
3770 _In_ const std::shared_ptr<basic_parser<T>>& _username,
+
3771 _In_ const std::shared_ptr<basic_parser<T>>& at,
+
3772 _In_ const std::shared_ptr<basic_parser<T>>& ip_lbracket,
+
3773 _In_ const std::shared_ptr<basic_parser<T>>& ip_rbracket,
+
3774 _In_ const std::shared_ptr<basic_parser<T>>& _ipv4_host,
+
3775 _In_ const std::shared_ptr<basic_parser<T>>& _ipv6_host,
+
3776 _In_ const std::shared_ptr<basic_parser<T>>& _dns_host,
+
3777 _In_ const std::locale& locale = std::locale()) :
+ +
3779 username(_username),
+
3780 m_at(at),
+
3781 m_ip_lbracket(ip_lbracket),
+
3782 m_ip_rbracket(ip_rbracket),
+
3783 ipv4_host(_ipv4_host),
+
3784 ipv6_host(_ipv6_host),
+
3785 dns_host(_dns_host)
+
3786 {}
+
3787
+
3788 virtual void invalidate()
+
3789 {
+
3790 username->invalidate();
+
3791 ipv4_host->invalidate();
+
3792 ipv6_host->invalidate();
+
3793 dns_host->invalidate();
+ +
3795 }
+
3796
+
3797 std::shared_ptr<basic_parser<T>> username;
+
3798 std::shared_ptr<basic_parser<T>> ipv4_host;
+
3799 std::shared_ptr<basic_parser<T>> ipv6_host;
+
3800 std::shared_ptr<basic_parser<T>> dns_host;
+
3801
+
3802 protected:
+
3803 virtual bool do_match(
+
3804 _In_reads_or_z_opt_(end) const T* text,
+
3805 _In_ size_t start = 0,
+
3806 _In_ size_t end = SIZE_MAX,
+
3807 _In_ int flags = match_default)
+
3808 {
+
3809 _Assume_(text || start >= end);
+
3810
+
3811 if (username->match(text, start, end, flags) &&
+
3812 m_at->match(text, username->interval.end, end, flags))
+
3813 {
+
3814 // Username@
+
3815 if (m_ip_lbracket->match(text, m_at->interval.end, end, flags) &&
+
3816 ipv4_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
+
3817 m_ip_rbracket->match(text, ipv4_host->interval.end, end, flags))
+
3818 {
+
3819 // Host is IPv4
+
3820 this->interval.end = m_ip_rbracket->interval.end;
+
3821 ipv6_host->invalidate();
+
3822 dns_host->invalidate();
+
3823 }
+
3824 else if (
+
3825 m_ip_lbracket->match(text, m_at->interval.end, end, flags) &&
+
3826 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
+
3827 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
+
3828 {
+
3829 // Host is IPv6
+
3830 this->interval.end = m_ip_rbracket->interval.end;
+
3831 ipv4_host->invalidate();
+
3832 dns_host->invalidate();
+
3833 }
+
3834 else if (dns_host->match(text, m_at->interval.end, end, flags)) {
+
3835 // Host is hostname
+
3836 this->interval.end = dns_host->interval.end;
+
3837 ipv4_host->invalidate();
+
3838 ipv6_host->invalidate();
+
3839 }
+
3840 else
+
3841 goto error;
+
3842 this->interval.start = start;
+
3843 return true;
+
3844 }
+
3845
+
3846 error:
+
3847 invalidate();
+
3848 return false;
+
3849 }
+
3850
+
3851 std::shared_ptr<basic_parser<T>> m_at;
+
3852 std::shared_ptr<basic_parser<T>> m_ip_lbracket;
+
3853 std::shared_ptr<basic_parser<T>> m_ip_rbracket;
+
3854 };
-
3876
- - -
3879#ifdef _UNICODE
- -
3881#else
- -
3883#endif
- -
3885
-
3889 template <class T>
-
- -
3891 {
-
3892 public:
- -
3894 _In_ const std::shared_ptr<basic_parser<T>>& _emoticon,
-
3895 _In_ const std::shared_ptr<basic_parser<T>>& _apex,
-
3896 _In_ const std::shared_ptr<basic_parser<T>>& _eyes,
-
3897 _In_ const std::shared_ptr<basic_parser<T>>& _nose,
-
3898 _In_ const std::shared_ptr<basic_set<T>>& _mouth,
-
3899 _In_ const std::locale& locale = std::locale()) :
- - -
3902 apex(_apex),
-
3903 eyes(_eyes),
-
3904 nose(_nose),
-
3905 mouth(_mouth)
-
3906 {}
-
3907
-
3908 virtual void invalidate()
+
3855
+ + +
3858#ifdef _UNICODE
+ +
3860#else
+ +
3862#endif
+ +
3864
+
3868 template <class T>
+
+ +
3870 {
+
3871 public:
+ +
3873 _In_ const std::shared_ptr<basic_parser<T>>& _emoticon,
+
3874 _In_ const std::shared_ptr<basic_parser<T>>& _apex,
+
3875 _In_ const std::shared_ptr<basic_parser<T>>& _eyes,
+
3876 _In_ const std::shared_ptr<basic_parser<T>>& _nose,
+
3877 _In_ const std::shared_ptr<basic_set<T>>& _mouth,
+
3878 _In_ const std::locale& locale = std::locale()) :
+ + +
3881 apex(_apex),
+
3882 eyes(_eyes),
+
3883 nose(_nose),
+
3884 mouth(_mouth)
+
3885 {}
+
3886
+
3887 virtual void invalidate()
+
3888 {
+
3889 if (emoticon) emoticon->invalidate();
+
3890 if (apex) apex->invalidate();
+
3891 eyes->invalidate();
+
3892 if (nose) nose->invalidate();
+
3893 mouth->invalidate();
+ +
3895 }
+
3896
+
3897 std::shared_ptr<basic_parser<T>> emoticon;
+
3898 std::shared_ptr<basic_parser<T>> apex;
+
3899 std::shared_ptr<basic_parser<T>> eyes;
+
3900 std::shared_ptr<basic_parser<T>> nose;
+
3901 std::shared_ptr<basic_set<T>> mouth;
+
3902
+
3903 protected:
+
3904 virtual bool do_match(
+
3905 _In_reads_or_z_opt_(end) const T* text,
+
3906 _In_ size_t start = 0,
+
3907 _In_ size_t end = SIZE_MAX,
+
3908 _In_ int flags = match_default)
3909 {
-
3910 if (emoticon) emoticon->invalidate();
-
3911 if (apex) apex->invalidate();
-
3912 eyes->invalidate();
-
3913 if (nose) nose->invalidate();
-
3914 mouth->invalidate();
- -
3916 }
-
3917
-
3918 std::shared_ptr<basic_parser<T>> emoticon;
-
3919 std::shared_ptr<basic_parser<T>> apex;
-
3920 std::shared_ptr<basic_parser<T>> eyes;
-
3921 std::shared_ptr<basic_parser<T>> nose;
-
3922 std::shared_ptr<basic_set<T>> mouth;
+
3910 _Assume_(text || start >= end);
+
3911
+
3912 if (emoticon && emoticon->match(text, start, end, flags)) {
+
3913 if (apex) apex->invalidate();
+
3914 eyes->invalidate();
+
3915 if (nose) nose->invalidate();
+
3916 mouth->invalidate();
+
3917 this->interval.start = start;
+
3918 this->interval.end = emoticon->interval.end;
+
3919 return true;
+
3920 }
+
3921
+
3922 this->interval.end = start;
3923
-
3924 protected:
-
3925 virtual bool do_match(
-
3926 _In_reads_or_z_opt_(end) const T* text,
-
3927 _In_ size_t start = 0,
-
3928 _In_ size_t end = SIZE_MAX,
-
3929 _In_ int flags = match_default)
-
3930 {
-
3931 _Assume_(text || start >= end);
-
3932
-
3933 if (emoticon && emoticon->match(text, start, end, flags)) {
-
3934 if (apex) apex->invalidate();
-
3935 eyes->invalidate();
-
3936 if (nose) nose->invalidate();
-
3937 mouth->invalidate();
-
3938 this->interval.start = start;
-
3939 this->interval.end = emoticon->interval.end;
-
3940 return true;
-
3941 }
-
3942
-
3943 this->interval.end = start;
-
3944
-
3945 if (apex && apex->match(text, this->interval.end, end, flags))
-
3946 this->interval.end = apex->interval.end;
-
3947
-
3948 if (eyes->match(text, this->interval.end, end, flags)) {
-
3949 if (nose && nose->match(text, eyes->interval.end, end, flags) &&
-
3950 mouth->match(text, nose->interval.end, end, flags))
-
3951 {
-
3952 size_t
- -
3954 hit_offset = mouth->hit_offset;
-
3955 // Mouth may repeat :-)))))))
-
3956 for (this->interval.end = mouth->interval.end; mouth->match(text, this->interval.end, end, flags) && mouth->hit_offset == hit_offset; this->interval.end = mouth->interval.end);
-
3957 mouth->interval.start = start_mouth;
-
3958 mouth->interval.end = this->interval.end;
-
3959 this->interval.start = start;
-
3960 return true;
-
3961 }
-
3962 if (mouth->match(text, eyes->interval.end, end, flags)) {
-
3963 size_t
- -
3965 hit_offset = mouth->hit_offset;
-
3966 // Mouth may repeat :-)))))))
-
3967 for (this->interval.end = mouth->interval.end; mouth->match(text, this->interval.end, end, flags) && mouth->hit_offset == hit_offset; this->interval.end = mouth->interval.end);
-
3968 if (nose) nose->invalidate();
-
3969 mouth->interval.start = start_mouth;
-
3970 mouth->interval.end = this->interval.end;
-
3971 this->interval.start = start;
-
3972 return true;
-
3973 }
-
3974 }
-
3975
-
3976 if (emoticon) emoticon->invalidate();
-
3977 if (apex) apex->invalidate();
-
3978 eyes->invalidate();
-
3979 if (nose) nose->invalidate();
-
3980 mouth->invalidate();
-
3981 this->interval.invalidate();
-
3982 return false;
-
3983 }
-
3984 };
+
3924 if (apex && apex->match(text, this->interval.end, end, flags))
+
3925 this->interval.end = apex->interval.end;
+
3926
+
3927 if (eyes->match(text, this->interval.end, end, flags)) {
+
3928 if (nose && nose->match(text, eyes->interval.end, end, flags) &&
+
3929 mouth->match(text, nose->interval.end, end, flags))
+
3930 {
+
3931 size_t
+ +
3933 hit_offset = mouth->hit_offset;
+
3934 // Mouth may repeat :-)))))))
+
3935 for (this->interval.end = mouth->interval.end; mouth->match(text, this->interval.end, end, flags) && mouth->hit_offset == hit_offset; this->interval.end = mouth->interval.end);
+
3936 mouth->interval.start = start_mouth;
+
3937 mouth->interval.end = this->interval.end;
+
3938 this->interval.start = start;
+
3939 return true;
+
3940 }
+
3941 if (mouth->match(text, eyes->interval.end, end, flags)) {
+
3942 size_t
+ +
3944 hit_offset = mouth->hit_offset;
+
3945 // Mouth may repeat :-)))))))
+
3946 for (this->interval.end = mouth->interval.end; mouth->match(text, this->interval.end, end, flags) && mouth->hit_offset == hit_offset; this->interval.end = mouth->interval.end);
+
3947 if (nose) nose->invalidate();
+
3948 mouth->interval.start = start_mouth;
+
3949 mouth->interval.end = this->interval.end;
+
3950 this->interval.start = start;
+
3951 return true;
+
3952 }
+
3953 }
+
3954
+
3955 if (emoticon) emoticon->invalidate();
+
3956 if (apex) apex->invalidate();
+
3957 eyes->invalidate();
+
3958 if (nose) nose->invalidate();
+
3959 mouth->invalidate();
+
3960 this->interval.invalidate();
+
3961 return false;
+
3962 }
+
3963 };
-
3985
-
3986 using emoticon = basic_emoticon<char>;
-
3987 using wemoticon = basic_emoticon<wchar_t>;
-
3988#ifdef _UNICODE
-
3989 using temoticon = wemoticon;
-
3990#else
-
3991 using temoticon = emoticon;
-
3992#endif
-
3993 using sgml_emoticon = basic_emoticon<char>;
-
3994
-
3998 enum date_format_t {
-
3999 date_format_none = 0,
-
4000 date_format_dmy = 0x1,
-
4001 date_format_mdy = 0x2,
-
4002 date_format_ymd = 0x4,
-
4003 date_format_ym = 0x8,
-
4004 date_format_my = 0x10,
-
4005 date_format_dm = 0x20,
-
4006 date_format_md = 0x40,
-
4007 };
-
4008
-
4012 template <class T>
-
-
4013 class basic_date : public basic_parser<T>
-
4014 {
-
4015 public:
-
4016 basic_date(
-
4017 _In_ int format_mask,
-
4018 _In_ const std::shared_ptr<basic_integer<T>>& _day,
-
4019 _In_ const std::shared_ptr<basic_integer<T>>& _month,
-
4020 _In_ const std::shared_ptr<basic_integer<T>>& _year,
-
4021 _In_ const std::shared_ptr<basic_set<T>>& separator,
-
4022 _In_ const std::shared_ptr<basic_parser<T>>& space,
-
4023 _In_ const std::locale& locale = std::locale()) :
- -
4025 format(date_format_none),
-
4026 m_format_mask(format_mask),
-
4027 day(_day),
-
4028 month(_month),
-
4029 year(_year),
-
4030 m_separator(separator),
-
4031 m_space(space)
-
4032 {}
-
4033
-
4034 virtual void invalidate()
-
4035 {
-
4036 if (day) day->invalidate();
-
4037 if (month) month->invalidate();
-
4038 if (year) year->invalidate();
-
4039 format = date_format_none;
- -
4041 }
-
4042
-
4043 date_format_t format;
-
4044 std::shared_ptr<basic_integer<T>> day;
-
4045 std::shared_ptr<basic_integer<T>> month;
-
4046 std::shared_ptr<basic_integer<T>> year;
-
4047
-
4048 protected:
-
4049 virtual bool do_match(
-
4050 _In_reads_or_z_opt_(end) const T* text,
-
4051 _In_ size_t start = 0,
-
4052 _In_ size_t end = SIZE_MAX,
-
4053 _In_ int flags = match_default)
-
4054 {
-
4055 _Assume_(text || start >= end);
-
4056
-
4057 const int space_match_flags = flags & ~match_multiline; // Spaces in dates must never be broken in new line.
-
4058 if ((m_format_mask & date_format_dmy) == date_format_dmy) {
-
4059 if (day->match(text, start, end, flags)) {
-
4060 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4061 if (m_separator->match(text, this->interval.end, end, flags)) {
-
4062 size_t hit_offset = m_separator->hit_offset;
-
4063 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4064 if (month->match(text, this->interval.end, end, flags)) {
-
4065 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4066 if (m_separator->match(text, this->interval.end, end, flags) &&
-
4067 m_separator->hit_offset == hit_offset) // Both separators must match.
-
4068 {
-
4069 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4070 if (year->match(text, this->interval.end, end, flags) &&
-
4071 is_valid(day->value, month->value))
-
4072 {
-
4073 this->interval.start = start;
-
4074 this->interval.end = year->interval.end;
-
4075 format = date_format_dmy;
-
4076 return true;
-
4077 }
-
4078 }
-
4079 }
-
4080 }
-
4081 }
-
4082 }
-
4083
-
4084 if ((m_format_mask & date_format_mdy) == date_format_mdy) {
-
4085 if (month->match(text, start, end, flags)) {
-
4086 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4087 if (m_separator->match(text, this->interval.end, end, flags)) {
-
4088 size_t hit_offset = m_separator->hit_offset;
-
4089 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4090 if (day->match(text, this->interval.end, end, flags)) {
-
4091 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4092 if (m_separator->match(text, this->interval.end, end, flags) &&
-
4093 m_separator->hit_offset == hit_offset) // Both separators must match.
-
4094 {
-
4095 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4096 if (year->match(text, this->interval.end, end, flags) &&
-
4097 is_valid(day->value, month->value))
-
4098 {
-
4099 this->interval.start = start;
-
4100 this->interval.end = year->interval.end;
-
4101 format = date_format_mdy;
-
4102 return true;
-
4103 }
-
4104 }
-
4105 }
-
4106 }
-
4107 }
-
4108 }
-
4109
-
4110 if ((m_format_mask & date_format_ymd) == date_format_ymd) {
-
4111 if (year->match(text, start, end, flags)) {
-
4112 for (this->interval.end = year->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4113 if (m_separator->match(text, this->interval.end, end, flags)) {
-
4114 size_t hit_offset = m_separator->hit_offset;
-
4115 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4116 if (month->match(text, this->interval.end, end, flags)) {
-
4117 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4118 if (m_separator->match(text, this->interval.end, end, flags) &&
-
4119 m_separator->hit_offset == hit_offset) // Both separators must match.
-
4120 {
-
4121 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4122 if (day->match(text, this->interval.end, end, flags) &&
-
4123 is_valid(day->value, month->value))
-
4124 {
-
4125 this->interval.start = start;
-
4126 this->interval.end = day->interval.end;
-
4127 format = date_format_ymd;
-
4128 return true;
-
4129 }
-
4130 }
-
4131 }
-
4132 }
-
4133 }
-
4134 }
-
4135
-
4136 if ((m_format_mask & date_format_ym) == date_format_ym) {
-
4137 if (year->match(text, start, end, flags)) {
-
4138 for (this->interval.end = year->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4139 if (m_separator->match(text, this->interval.end, end, flags)) {
-
4140 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4141 if (month->match(text, this->interval.end, end, flags) &&
-
4142 is_valid(SIZE_MAX, month->value))
-
4143 {
-
4144 if (day) day->invalidate();
-
4145 this->interval.start = start;
-
4146 this->interval.end = month->interval.end;
-
4147 format = date_format_ym;
-
4148 return true;
-
4149 }
-
4150 }
-
4151 }
-
4152 }
-
4153
-
4154 if ((m_format_mask & date_format_my) == date_format_my) {
-
4155 if (month->match(text, start, end, flags)) {
-
4156 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4157 if (m_separator->match(text, this->interval.end, end, flags)) {
-
4158 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4159 if (year->match(text, this->interval.end, end, flags) &&
-
4160 is_valid(SIZE_MAX, month->value))
-
4161 {
-
4162 if (day) day->invalidate();
-
4163 this->interval.start = start;
-
4164 this->interval.end = year->interval.end;
-
4165 format = date_format_my;
-
4166 return true;
-
4167 }
-
4168 }
-
4169 }
-
4170 }
-
4171
-
4172 if ((m_format_mask & date_format_dm) == date_format_dm) {
-
4173 if (day->match(text, start, end, flags)) {
-
4174 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4175 if (m_separator->match(text, this->interval.end, end, flags)) {
-
4176 size_t hit_offset = m_separator->hit_offset;
-
4177 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4178 if (month->match(text, this->interval.end, end, flags) &&
-
4179 is_valid(day->value, month->value))
-
4180 {
-
4181 if (year) year->invalidate();
-
4182 this->interval.start = start;
-
4183 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4184 if (m_separator->match(text, this->interval.end, end, flags) &&
-
4185 m_separator->hit_offset == hit_offset) // Both separators must match.
-
4186 this->interval.end = m_separator->interval.end;
-
4187 else
-
4188 this->interval.end = month->interval.end;
-
4189 format = date_format_dm;
-
4190 return true;
-
4191 }
-
4192 }
-
4193 }
-
4194 }
-
4195
-
4196 if ((m_format_mask & date_format_md) == date_format_md) {
-
4197 if (month->match(text, start, end, flags)) {
-
4198 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4199 if (m_separator->match(text, this->interval.end, end, flags)) {
-
4200 size_t hit_offset = m_separator->hit_offset;
-
4201 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4202 if (day->match(text, this->interval.end, end, flags) &&
-
4203 is_valid(day->value, month->value))
-
4204 {
-
4205 if (year) year->invalidate();
-
4206 this->interval.start = start;
-
4207 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
-
4208 if (m_separator->match(text, this->interval.end, end, flags) &&
-
4209 m_separator->hit_offset == hit_offset) // Both separators must match.
-
4210 this->interval.end = m_separator->interval.end;
-
4211 else
-
4212 this->interval.end = day->interval.end;
-
4213 format = date_format_md;
-
4214 return true;
-
4215 }
-
4216 }
-
4217 }
-
4218 }
-
4219
-
4220 if (day) day->invalidate();
-
4221 if (month) month->invalidate();
-
4222 if (year) year->invalidate();
-
4223 format = date_format_none;
-
4224 this->interval.invalidate();
-
4225 return false;
-
4226 }
-
4227
-
4228 static bool is_valid(size_t day, size_t month)
-
4229 {
-
4230 if (month == SIZE_MAX) {
-
4231 // Default to January. This allows validating day only, as January has all 31 days.
-
4232 month = 1;
-
4233 }
-
4234 if (day == SIZE_MAX) {
-
4235 // Default to 1st day in month. This allows validating month only, as each month has 1st day.
-
4236 day = 1;
-
4237 }
+
3964
+
3965 using emoticon = basic_emoticon<char>;
+
3966 using wemoticon = basic_emoticon<wchar_t>;
+
3967#ifdef _UNICODE
+
3968 using temoticon = wemoticon;
+
3969#else
+
3970 using temoticon = emoticon;
+
3971#endif
+
3972 using sgml_emoticon = basic_emoticon<char>;
+
3973
+
3977 enum date_format_t {
+
3978 date_format_none = 0,
+
3979 date_format_dmy = 0x1,
+
3980 date_format_mdy = 0x2,
+
3981 date_format_ymd = 0x4,
+
3982 date_format_ym = 0x8,
+
3983 date_format_my = 0x10,
+
3984 date_format_dm = 0x20,
+
3985 date_format_md = 0x40,
+
3986 };
+
3987
+
3991 template <class T>
+
+
3992 class basic_date : public basic_parser<T>
+
3993 {
+
3994 public:
+
3995 basic_date(
+
3996 _In_ int format_mask,
+
3997 _In_ const std::shared_ptr<basic_integer<T>>& _day,
+
3998 _In_ const std::shared_ptr<basic_integer<T>>& _month,
+
3999 _In_ const std::shared_ptr<basic_integer<T>>& _year,
+
4000 _In_ const std::shared_ptr<basic_set<T>>& separator,
+
4001 _In_ const std::shared_ptr<basic_parser<T>>& space,
+
4002 _In_ const std::locale& locale = std::locale()) :
+ +
4004 format(date_format_none),
+
4005 m_format_mask(format_mask),
+
4006 day(_day),
+
4007 month(_month),
+
4008 year(_year),
+
4009 m_separator(separator),
+
4010 m_space(space)
+
4011 {}
+
4012
+
4013 virtual void invalidate()
+
4014 {
+
4015 if (day) day->invalidate();
+
4016 if (month) month->invalidate();
+
4017 if (year) year->invalidate();
+
4018 format = date_format_none;
+ +
4020 }
+
4021
+
4022 date_format_t format;
+
4023 std::shared_ptr<basic_integer<T>> day;
+
4024 std::shared_ptr<basic_integer<T>> month;
+
4025 std::shared_ptr<basic_integer<T>> year;
+
4026
+
4027 protected:
+
4028 virtual bool do_match(
+
4029 _In_reads_or_z_opt_(end) const T* text,
+
4030 _In_ size_t start = 0,
+
4031 _In_ size_t end = SIZE_MAX,
+
4032 _In_ int flags = match_default)
+
4033 {
+
4034 _Assume_(text || start >= end);
+
4035
+
4036 const int space_match_flags = flags & ~match_multiline; // Spaces in dates must never be broken in new line.
+
4037 if ((m_format_mask & date_format_dmy) == date_format_dmy) {
+
4038 if (day->match(text, start, end, flags)) {
+
4039 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4040 if (m_separator->match(text, this->interval.end, end, flags)) {
+
4041 size_t hit_offset = m_separator->hit_offset;
+
4042 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4043 if (month->match(text, this->interval.end, end, flags)) {
+
4044 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4045 if (m_separator->match(text, this->interval.end, end, flags) &&
+
4046 m_separator->hit_offset == hit_offset) // Both separators must match.
+
4047 {
+
4048 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4049 if (year->match(text, this->interval.end, end, flags) &&
+
4050 is_valid(day->value, month->value))
+
4051 {
+
4052 this->interval.start = start;
+
4053 this->interval.end = year->interval.end;
+
4054 format = date_format_dmy;
+
4055 return true;
+
4056 }
+
4057 }
+
4058 }
+
4059 }
+
4060 }
+
4061 }
+
4062
+
4063 if ((m_format_mask & date_format_mdy) == date_format_mdy) {
+
4064 if (month->match(text, start, end, flags)) {
+
4065 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4066 if (m_separator->match(text, this->interval.end, end, flags)) {
+
4067 size_t hit_offset = m_separator->hit_offset;
+
4068 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4069 if (day->match(text, this->interval.end, end, flags)) {
+
4070 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4071 if (m_separator->match(text, this->interval.end, end, flags) &&
+
4072 m_separator->hit_offset == hit_offset) // Both separators must match.
+
4073 {
+
4074 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4075 if (year->match(text, this->interval.end, end, flags) &&
+
4076 is_valid(day->value, month->value))
+
4077 {
+
4078 this->interval.start = start;
+
4079 this->interval.end = year->interval.end;
+
4080 format = date_format_mdy;
+
4081 return true;
+
4082 }
+
4083 }
+
4084 }
+
4085 }
+
4086 }
+
4087 }
+
4088
+
4089 if ((m_format_mask & date_format_ymd) == date_format_ymd) {
+
4090 if (year->match(text, start, end, flags)) {
+
4091 for (this->interval.end = year->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4092 if (m_separator->match(text, this->interval.end, end, flags)) {
+
4093 size_t hit_offset = m_separator->hit_offset;
+
4094 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4095 if (month->match(text, this->interval.end, end, flags)) {
+
4096 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4097 if (m_separator->match(text, this->interval.end, end, flags) &&
+
4098 m_separator->hit_offset == hit_offset) // Both separators must match.
+
4099 {
+
4100 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4101 if (day->match(text, this->interval.end, end, flags) &&
+
4102 is_valid(day->value, month->value))
+
4103 {
+
4104 this->interval.start = start;
+
4105 this->interval.end = day->interval.end;
+
4106 format = date_format_ymd;
+
4107 return true;
+
4108 }
+
4109 }
+
4110 }
+
4111 }
+
4112 }
+
4113 }
+
4114
+
4115 if ((m_format_mask & date_format_ym) == date_format_ym) {
+
4116 if (year->match(text, start, end, flags)) {
+
4117 for (this->interval.end = year->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4118 if (m_separator->match(text, this->interval.end, end, flags)) {
+
4119 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4120 if (month->match(text, this->interval.end, end, flags) &&
+
4121 is_valid(SIZE_MAX, month->value))
+
4122 {
+
4123 if (day) day->invalidate();
+
4124 this->interval.start = start;
+
4125 this->interval.end = month->interval.end;
+
4126 format = date_format_ym;
+
4127 return true;
+
4128 }
+
4129 }
+
4130 }
+
4131 }
+
4132
+
4133 if ((m_format_mask & date_format_my) == date_format_my) {
+
4134 if (month->match(text, start, end, flags)) {
+
4135 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4136 if (m_separator->match(text, this->interval.end, end, flags)) {
+
4137 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4138 if (year->match(text, this->interval.end, end, flags) &&
+
4139 is_valid(SIZE_MAX, month->value))
+
4140 {
+
4141 if (day) day->invalidate();
+
4142 this->interval.start = start;
+
4143 this->interval.end = year->interval.end;
+
4144 format = date_format_my;
+
4145 return true;
+
4146 }
+
4147 }
+
4148 }
+
4149 }
+
4150
+
4151 if ((m_format_mask & date_format_dm) == date_format_dm) {
+
4152 if (day->match(text, start, end, flags)) {
+
4153 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4154 if (m_separator->match(text, this->interval.end, end, flags)) {
+
4155 size_t hit_offset = m_separator->hit_offset;
+
4156 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4157 if (month->match(text, this->interval.end, end, flags) &&
+
4158 is_valid(day->value, month->value))
+
4159 {
+
4160 if (year) year->invalidate();
+
4161 this->interval.start = start;
+
4162 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4163 if (m_separator->match(text, this->interval.end, end, flags) &&
+
4164 m_separator->hit_offset == hit_offset) // Both separators must match.
+
4165 this->interval.end = m_separator->interval.end;
+
4166 else
+
4167 this->interval.end = month->interval.end;
+
4168 format = date_format_dm;
+
4169 return true;
+
4170 }
+
4171 }
+
4172 }
+
4173 }
+
4174
+
4175 if ((m_format_mask & date_format_md) == date_format_md) {
+
4176 if (month->match(text, start, end, flags)) {
+
4177 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4178 if (m_separator->match(text, this->interval.end, end, flags)) {
+
4179 size_t hit_offset = m_separator->hit_offset;
+
4180 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4181 if (day->match(text, this->interval.end, end, flags) &&
+
4182 is_valid(day->value, month->value))
+
4183 {
+
4184 if (year) year->invalidate();
+
4185 this->interval.start = start;
+
4186 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
+
4187 if (m_separator->match(text, this->interval.end, end, flags) &&
+
4188 m_separator->hit_offset == hit_offset) // Both separators must match.
+
4189 this->interval.end = m_separator->interval.end;
+
4190 else
+
4191 this->interval.end = day->interval.end;
+
4192 format = date_format_md;
+
4193 return true;
+
4194 }
+
4195 }
+
4196 }
+
4197 }
+
4198
+
4199 if (day) day->invalidate();
+
4200 if (month) month->invalidate();
+
4201 if (year) year->invalidate();
+
4202 format = date_format_none;
+
4203 this->interval.invalidate();
+
4204 return false;
+
4205 }
+
4206
+
4207 static bool is_valid(size_t day, size_t month)
+
4208 {
+
4209 if (month == SIZE_MAX) {
+
4210 // Default to January. This allows validating day only, as January has all 31 days.
+
4211 month = 1;
+
4212 }
+
4213 if (day == SIZE_MAX) {
+
4214 // Default to 1st day in month. This allows validating month only, as each month has 1st day.
+
4215 day = 1;
+
4216 }
+
4217
+
4218 switch (month) {
+
4219 case 1:
+
4220 case 3:
+
4221 case 5:
+
4222 case 7:
+
4223 case 8:
+
4224 case 10:
+
4225 case 12:
+
4226 return 1 <= day && day <= 31;
+
4227 case 2:
+
4228 return 1 <= day && day <= 29;
+
4229 case 4:
+
4230 case 6:
+
4231 case 9:
+
4232 case 11:
+
4233 return 1 <= day && day <= 30;
+
4234 default:
+
4235 return false;
+
4236 }
+
4237 }
4238
-
4239 switch (month) {
-
4240 case 1:
-
4241 case 3:
-
4242 case 5:
-
4243 case 7:
-
4244 case 8:
-
4245 case 10:
-
4246 case 12:
-
4247 return 1 <= day && day <= 31;
-
4248 case 2:
-
4249 return 1 <= day && day <= 29;
-
4250 case 4:
-
4251 case 6:
-
4252 case 9:
-
4253 case 11:
-
4254 return 1 <= day && day <= 30;
-
4255 default:
-
4256 return false;
-
4257 }
-
4258 }
-
4259
-
4260 int m_format_mask;
-
4261 std::shared_ptr<basic_set<T>> m_separator;
-
4262 std::shared_ptr<basic_parser<T>> m_space;
-
4263 };
+
4239 int m_format_mask;
+
4240 std::shared_ptr<basic_set<T>> m_separator;
+
4241 std::shared_ptr<basic_parser<T>> m_space;
+
4242 };
-
4264
-
4265 using date = basic_date<char>;
-
4266 using wdate = basic_date<wchar_t>;
-
4267#ifdef _UNICODE
-
4268 using tdate = wdate;
-
4269#else
-
4270 using tdate = date;
-
4271#endif
- -
4273
-
4277 template <class T>
-
-
4278 class basic_time : public basic_parser<T>
-
4279 {
-
4280 public:
-
4281 basic_time(
-
4282 _In_ const std::shared_ptr<basic_integer10<T>>& _hour,
-
4283 _In_ const std::shared_ptr<basic_integer10<T>>& _minute,
-
4284 _In_ const std::shared_ptr<basic_integer10<T>>& _second,
-
4285 _In_ const std::shared_ptr<basic_integer10<T>>& _millisecond,
-
4286 _In_ const std::shared_ptr<basic_set<T>>& separator,
-
4287 _In_ const std::shared_ptr<basic_parser<T>>& millisecond_separator,
-
4288 _In_ const std::locale& locale = std::locale()) :
- -
4290 hour(_hour),
-
4291 minute(_minute),
-
4292 second(_second),
-
4293 millisecond(_millisecond),
-
4294 m_separator(separator),
-
4295 m_millisecond_separator(millisecond_separator)
-
4296 {}
-
4297
-
4298 virtual void invalidate()
-
4299 {
-
4300 hour->invalidate();
-
4301 minute->invalidate();
-
4302 if (second) second->invalidate();
-
4303 if (millisecond) millisecond->invalidate();
- -
4305 }
-
4306
-
4307 std::shared_ptr<basic_integer10<T>> hour;
-
4308 std::shared_ptr<basic_integer10<T>> minute;
-
4309 std::shared_ptr<basic_integer10<T>> second;
-
4310 std::shared_ptr<basic_integer10<T>> millisecond;
-
4311
-
4312 protected:
-
4313 virtual bool do_match(
-
4314 _In_reads_or_z_opt_(end) const T* text,
-
4315 _In_ size_t start = 0,
-
4316 _In_ size_t end = SIZE_MAX,
-
4317 _In_ int flags = match_default)
-
4318 {
-
4319 _Assume_(text || start >= end);
-
4320
-
4321 if (hour->match(text, start, end, flags) &&
-
4322 m_separator->match(text, hour->interval.end, end, flags) &&
-
4323 minute->match(text, m_separator->interval.end, end, flags) &&
-
4324 minute->value < 60)
-
4325 {
-
4326 // hh::mm
-
4327 size_t hit_offset = m_separator->hit_offset;
-
4328 if (m_separator->match(text, minute->interval.end, end, flags) &&
-
4329 m_separator->hit_offset == hit_offset && // Both separators must match.
-
4330 second && second->match(text, m_separator->interval.end, end, flags) &&
-
4331 second->value < 60)
-
4332 {
-
4333 // hh::mm:ss
-
4334 if (m_millisecond_separator && m_millisecond_separator->match(text, second->interval.end, end, flags) &&
-
4335 millisecond && millisecond->match(text, m_millisecond_separator->interval.end, end, flags) &&
-
4336 millisecond->value < 1000)
-
4337 {
-
4338 // hh::mm:ss.mmmm
-
4339 this->interval.end = millisecond->interval.end;
-
4340 }
-
4341 else {
-
4342 if (millisecond) millisecond->invalidate();
-
4343 this->interval.end = second->interval.end;
-
4344 }
-
4345 }
-
4346 else {
-
4347 if (second) second->invalidate();
-
4348 if (millisecond) millisecond->invalidate();
-
4349 this->interval.end = minute->interval.end;
-
4350 }
-
4351 this->interval.start = start;
-
4352 return true;
-
4353 }
+
4243
+
4244 using date = basic_date<char>;
+
4245 using wdate = basic_date<wchar_t>;
+
4246#ifdef _UNICODE
+
4247 using tdate = wdate;
+
4248#else
+
4249 using tdate = date;
+
4250#endif
+ +
4252
+
4256 template <class T>
+
+
4257 class basic_time : public basic_parser<T>
+
4258 {
+
4259 public:
+
4260 basic_time(
+
4261 _In_ const std::shared_ptr<basic_integer10<T>>& _hour,
+
4262 _In_ const std::shared_ptr<basic_integer10<T>>& _minute,
+
4263 _In_ const std::shared_ptr<basic_integer10<T>>& _second,
+
4264 _In_ const std::shared_ptr<basic_integer10<T>>& _millisecond,
+
4265 _In_ const std::shared_ptr<basic_set<T>>& separator,
+
4266 _In_ const std::shared_ptr<basic_parser<T>>& millisecond_separator,
+
4267 _In_ const std::locale& locale = std::locale()) :
+ +
4269 hour(_hour),
+
4270 minute(_minute),
+
4271 second(_second),
+
4272 millisecond(_millisecond),
+
4273 m_separator(separator),
+
4274 m_millisecond_separator(millisecond_separator)
+
4275 {}
+
4276
+
4277 virtual void invalidate()
+
4278 {
+
4279 hour->invalidate();
+
4280 minute->invalidate();
+
4281 if (second) second->invalidate();
+
4282 if (millisecond) millisecond->invalidate();
+ +
4284 }
+
4285
+
4286 std::shared_ptr<basic_integer10<T>> hour;
+
4287 std::shared_ptr<basic_integer10<T>> minute;
+
4288 std::shared_ptr<basic_integer10<T>> second;
+
4289 std::shared_ptr<basic_integer10<T>> millisecond;
+
4290
+
4291 protected:
+
4292 virtual bool do_match(
+
4293 _In_reads_or_z_opt_(end) const T* text,
+
4294 _In_ size_t start = 0,
+
4295 _In_ size_t end = SIZE_MAX,
+
4296 _In_ int flags = match_default)
+
4297 {
+
4298 _Assume_(text || start >= end);
+
4299
+
4300 if (hour->match(text, start, end, flags) &&
+
4301 m_separator->match(text, hour->interval.end, end, flags) &&
+
4302 minute->match(text, m_separator->interval.end, end, flags) &&
+
4303 minute->value < 60)
+
4304 {
+
4305 // hh::mm
+
4306 size_t hit_offset = m_separator->hit_offset;
+
4307 if (m_separator->match(text, minute->interval.end, end, flags) &&
+
4308 m_separator->hit_offset == hit_offset && // Both separators must match.
+
4309 second && second->match(text, m_separator->interval.end, end, flags) &&
+
4310 second->value < 60)
+
4311 {
+
4312 // hh::mm:ss
+
4313 if (m_millisecond_separator && m_millisecond_separator->match(text, second->interval.end, end, flags) &&
+
4314 millisecond && millisecond->match(text, m_millisecond_separator->interval.end, end, flags) &&
+
4315 millisecond->value < 1000)
+
4316 {
+
4317 // hh::mm:ss.mmmm
+
4318 this->interval.end = millisecond->interval.end;
+
4319 }
+
4320 else {
+
4321 if (millisecond) millisecond->invalidate();
+
4322 this->interval.end = second->interval.end;
+
4323 }
+
4324 }
+
4325 else {
+
4326 if (second) second->invalidate();
+
4327 if (millisecond) millisecond->invalidate();
+
4328 this->interval.end = minute->interval.end;
+
4329 }
+
4330 this->interval.start = start;
+
4331 return true;
+
4332 }
+
4333
+
4334 hour->invalidate();
+
4335 minute->invalidate();
+
4336 if (second) second->invalidate();
+
4337 if (millisecond) millisecond->invalidate();
+
4338 this->interval.invalidate();
+
4339 return false;
+
4340 }
+
4341
+
4342 std::shared_ptr<basic_set<T>> m_separator;
+
4343 std::shared_ptr<basic_parser<T>> m_millisecond_separator;
+
4344 };
+
+
4345
+
4346 using time = basic_time<char>;
+
4347 using wtime = basic_time<wchar_t>;
+
4348#ifdef _UNICODE
+
4349 using ttime = wtime;
+
4350#else
+
4351 using ttime = time;
+
4352#endif
+
4354
-
4355 hour->invalidate();
-
4356 minute->invalidate();
-
4357 if (second) second->invalidate();
-
4358 if (millisecond) millisecond->invalidate();
-
4359 this->interval.invalidate();
-
4360 return false;
-
4361 }
-
4362
-
4363 std::shared_ptr<basic_set<T>> m_separator;
-
4364 std::shared_ptr<basic_parser<T>> m_millisecond_separator;
-
4365 };
+
4358 template <class T>
+
+
4359 class basic_angle : public basic_parser<T>
+
4360 {
+
4361 public:
+ +
4363 _In_ const std::shared_ptr<basic_integer10<T>>& _degree,
+
4364 _In_ const std::shared_ptr<basic_parser<T>>& _degree_separator,
+
4365 _In_ const std::shared_ptr<basic_integer10<T>>& _minute,
+
4366 _In_ const std::shared_ptr<basic_parser<T>>& _minute_separator,
+
4367 _In_ const std::shared_ptr<basic_integer10<T>>& _second,
+
4368 _In_ const std::shared_ptr<basic_parser<T>>& _second_separator,
+
4369 _In_ const std::shared_ptr<basic_parser<T>>& _decimal,
+
4370 _In_ const std::locale& locale = std::locale()) :
+ +
4372 degree(_degree),
+
4373 degree_separator(_degree_separator),
+
4374 minute(_minute),
+
4375 minute_separator(_minute_separator),
+
4376 second(_second),
+
4377 second_separator(_second_separator),
+
4378 decimal(_decimal)
+
4379 {}
+
4380
+
4381 virtual void invalidate()
+
4382 {
+
4383 degree->invalidate();
+
4384 degree_separator->invalidate();
+
4385 minute->invalidate();
+
4386 minute_separator->invalidate();
+
4387 if (second) second->invalidate();
+
4388 if (second_separator) second_separator->invalidate();
+
4389 if (decimal) decimal->invalidate();
+ +
4391 }
+
4392
+
4393 std::shared_ptr<basic_integer10<T>> degree;
+
4394 std::shared_ptr<basic_parser<T>> degree_separator;
+
4395 std::shared_ptr<basic_integer10<T>> minute;
+
4396 std::shared_ptr<basic_parser<T>> minute_separator;
+
4397 std::shared_ptr<basic_integer10<T>> second;
+
4398 std::shared_ptr<basic_parser<T>> second_separator;
+
4399 std::shared_ptr<basic_parser<T>> decimal;
+
4400
+
4401 protected:
+
4402 virtual bool do_match(
+
4403 _In_reads_or_z_opt_(end) const T* text,
+
4404 _In_ size_t start = 0,
+
4405 _In_ size_t end = SIZE_MAX,
+
4406 _In_ int flags = match_default)
+
4407 {
+
4408 _Assume_(text || start >= end);
+
4409
+
4410 this->interval.end = start;
+
4411
+
4412 if (degree->match(text, this->interval.end, end, flags) &&
+
4413 degree_separator->match(text, degree->interval.end, end, flags))
+
4414 {
+
4415 // Degrees
+
4416 this->interval.end = degree_separator->interval.end;
+
4417 }
+
4418 else {
+
4419 degree->invalidate();
+
4420 degree_separator->invalidate();
+
4421 }
+
4422
+
4423 if (minute->match(text, this->interval.end, end, flags) &&
+
4424 minute->value < 60 &&
+
4425 minute_separator->match(text, minute->interval.end, end, flags))
+
4426 {
+
4427 // Minutes
+
4428 this->interval.end = minute_separator->interval.end;
+
4429 }
+
4430 else {
+
4431 minute->invalidate();
+
4432 minute_separator->invalidate();
+
4433 }
+
4434
+
4435 if (second && second->match(text, this->interval.end, end, flags) &&
+
4436 second->value < 60)
+
4437 {
+
4438 // Seconds
+
4439 this->interval.end = second->interval.end;
+
4440 if (second_separator && second_separator->match(text, this->interval.end, end, flags))
+
4441 this->interval.end = second_separator->interval.end;
+
4442 else
+
4443 if (second_separator) second_separator->invalidate();
+
4444 }
+
4445 else {
+
4446 if (second) second->invalidate();
+
4447 if (second_separator) second_separator->invalidate();
+
4448 }
+
4449
+
4450 if (degree->interval.start < degree->interval.end ||
+
4451 minute->interval.start < minute->interval.end ||
+
4452 (second && second->interval.start < second->interval.end))
+
4453 {
+
4454 if (decimal && decimal->match(text, this->interval.end, end, flags)) {
+
4455 // Decimals
+
4456 this->interval.end = decimal->interval.end;
+
4457 }
+
4458 else if (decimal)
+
4459 decimal->invalidate();
+
4460 this->interval.start = start;
+
4461 return true;
+
4462 }
+
4463 if (decimal) decimal->invalidate();
+
4464 this->interval.invalidate();
+
4465 return false;
+
4466 }
+
4467 };
-
4366
-
4367 using time = basic_time<char>;
-
4368 using wtime = basic_time<wchar_t>;
-
4369#ifdef _UNICODE
-
4370 using ttime = wtime;
-
4371#else
-
4372 using ttime = time;
-
4373#endif
- -
4375
-
4379 template <class T>
-
-
4380 class basic_angle : public basic_parser<T>
-
4381 {
-
4382 public:
- -
4384 _In_ const std::shared_ptr<basic_integer10<T>>& _degree,
-
4385 _In_ const std::shared_ptr<basic_parser<T>>& _degree_separator,
-
4386 _In_ const std::shared_ptr<basic_integer10<T>>& _minute,
-
4387 _In_ const std::shared_ptr<basic_parser<T>>& _minute_separator,
-
4388 _In_ const std::shared_ptr<basic_integer10<T>>& _second,
-
4389 _In_ const std::shared_ptr<basic_parser<T>>& _second_separator,
-
4390 _In_ const std::shared_ptr<basic_parser<T>>& _decimal,
-
4391 _In_ const std::locale& locale = std::locale()) :
- -
4393 degree(_degree),
-
4394 degree_separator(_degree_separator),
-
4395 minute(_minute),
-
4396 minute_separator(_minute_separator),
-
4397 second(_second),
-
4398 second_separator(_second_separator),
-
4399 decimal(_decimal)
-
4400 {}
-
4401
-
4402 virtual void invalidate()
-
4403 {
-
4404 degree->invalidate();
-
4405 degree_separator->invalidate();
-
4406 minute->invalidate();
-
4407 minute_separator->invalidate();
-
4408 if (second) second->invalidate();
-
4409 if (second_separator) second_separator->invalidate();
-
4410 if (decimal) decimal->invalidate();
- -
4412 }
-
4413
-
4414 std::shared_ptr<basic_integer10<T>> degree;
-
4415 std::shared_ptr<basic_parser<T>> degree_separator;
-
4416 std::shared_ptr<basic_integer10<T>> minute;
-
4417 std::shared_ptr<basic_parser<T>> minute_separator;
-
4418 std::shared_ptr<basic_integer10<T>> second;
-
4419 std::shared_ptr<basic_parser<T>> second_separator;
-
4420 std::shared_ptr<basic_parser<T>> decimal;
-
4421
-
4422 protected:
-
4423 virtual bool do_match(
-
4424 _In_reads_or_z_opt_(end) const T* text,
-
4425 _In_ size_t start = 0,
-
4426 _In_ size_t end = SIZE_MAX,
-
4427 _In_ int flags = match_default)
-
4428 {
-
4429 _Assume_(text || start >= end);
-
4430
-
4431 this->interval.end = start;
-
4432
-
4433 if (degree->match(text, this->interval.end, end, flags) &&
-
4434 degree_separator->match(text, degree->interval.end, end, flags))
-
4435 {
-
4436 // Degrees
-
4437 this->interval.end = degree_separator->interval.end;
-
4438 }
-
4439 else {
-
4440 degree->invalidate();
-
4441 degree_separator->invalidate();
-
4442 }
-
4443
-
4444 if (minute->match(text, this->interval.end, end, flags) &&
-
4445 minute->value < 60 &&
-
4446 minute_separator->match(text, minute->interval.end, end, flags))
-
4447 {
-
4448 // Minutes
-
4449 this->interval.end = minute_separator->interval.end;
-
4450 }
-
4451 else {
-
4452 minute->invalidate();
-
4453 minute_separator->invalidate();
-
4454 }
-
4455
-
4456 if (second && second->match(text, this->interval.end, end, flags) &&
-
4457 second->value < 60)
-
4458 {
-
4459 // Seconds
-
4460 this->interval.end = second->interval.end;
-
4461 if (second_separator && second_separator->match(text, this->interval.end, end, flags))
-
4462 this->interval.end = second_separator->interval.end;
-
4463 else
-
4464 if (second_separator) second_separator->invalidate();
-
4465 }
-
4466 else {
-
4467 if (second) second->invalidate();
-
4468 if (second_separator) second_separator->invalidate();
-
4469 }
-
4470
-
4471 if (degree->interval.start < degree->interval.end ||
-
4472 minute->interval.start < minute->interval.end ||
-
4473 (second && second->interval.start < second->interval.end))
-
4474 {
-
4475 if (decimal && decimal->match(text, this->interval.end, end, flags)) {
-
4476 // Decimals
-
4477 this->interval.end = decimal->interval.end;
-
4478 }
-
4479 else if (decimal)
-
4480 decimal->invalidate();
-
4481 this->interval.start = start;
-
4482 return true;
-
4483 }
-
4484 if (decimal) decimal->invalidate();
-
4485 this->interval.invalidate();
-
4486 return false;
-
4487 }
-
4488 };
-
-
4489
-
4490 using angle = basic_angle<char>;
- -
4492#ifdef _UNICODE
-
4493 using RRegElKot = wangle;
-
4494#else
-
4495 using RRegElKot = angle;
-
4496#endif
- -
4498
-
4502 template <class T>
-
- -
4504 {
-
4505 public:
- -
4507 _In_ const std::shared_ptr<basic_parser<T>>& digit,
-
4508 _In_ const std::shared_ptr<basic_parser<T>>& plus_sign,
-
4509 _In_ const std::shared_ptr<basic_set<T>>& lparenthesis,
-
4510 _In_ const std::shared_ptr<basic_set<T>>& rparenthesis,
-
4511 _In_ const std::shared_ptr<basic_parser<T>>& separator,
-
4512 _In_ const std::shared_ptr<basic_parser<T>>& space,
-
4513 _In_ const std::locale& locale = std::locale()) :
- -
4515 m_digit(digit),
-
4516 m_plus_sign(plus_sign),
-
4517 m_lparenthesis(lparenthesis),
-
4518 m_rparenthesis(rparenthesis),
-
4519 m_separator(separator),
-
4520 m_space(space)
-
4521 {}
+
4468
+
4469 using angle = basic_angle<char>;
+ +
4471#ifdef _UNICODE
+
4472 using RRegElKot = wangle;
+
4473#else
+
4474 using RRegElKot = angle;
+
4475#endif
+ +
4477
+
4481 template <class T>
+
+ +
4483 {
+
4484 public:
+ +
4486 _In_ const std::shared_ptr<basic_parser<T>>& digit,
+
4487 _In_ const std::shared_ptr<basic_parser<T>>& plus_sign,
+
4488 _In_ const std::shared_ptr<basic_set<T>>& lparenthesis,
+
4489 _In_ const std::shared_ptr<basic_set<T>>& rparenthesis,
+
4490 _In_ const std::shared_ptr<basic_parser<T>>& separator,
+
4491 _In_ const std::shared_ptr<basic_parser<T>>& space,
+
4492 _In_ const std::locale& locale = std::locale()) :
+ +
4494 m_digit(digit),
+
4495 m_plus_sign(plus_sign),
+
4496 m_lparenthesis(lparenthesis),
+
4497 m_rparenthesis(rparenthesis),
+
4498 m_separator(separator),
+
4499 m_space(space)
+
4500 {}
+
4501
+
4502 virtual void invalidate()
+
4503 {
+
4504 value.clear();
+ +
4506 }
+
4507
+
4508 std::basic_string<T> value;
+
4509
+
4510 protected:
+
4511 virtual bool do_match(
+
4512 _In_reads_or_z_opt_(end) const T* text,
+
4513 _In_ size_t start = 0,
+
4514 _In_ size_t end = SIZE_MAX,
+
4515 _In_ int flags = match_default)
+
4516 {
+
4517 _Assume_(text || start >= end);
+
4518
+
4519 size_t safe_digit_end = start, safe_value_size = 0;
+
4520 bool has_digits = false, after_digit = false, in_parentheses = false, after_parentheses = false;
+
4521 const int space_match_flags = flags & ~match_multiline; // Spaces in phone numbers must never be broken in new line.
4522
-
4523 virtual void invalidate()
-
4524 {
-
4525 value.clear();
- -
4527 }
-
4528
-
4529 std::basic_string<T> value;
-
4530
-
4531 protected:
-
4532 virtual bool do_match(
-
4533 _In_reads_or_z_opt_(end) const T* text,
-
4534 _In_ size_t start = 0,
-
4535 _In_ size_t end = SIZE_MAX,
-
4536 _In_ int flags = match_default)
-
4537 {
-
4538 _Assume_(text || start >= end);
-
4539
-
4540 size_t safe_digit_end = start, safe_value_size = 0;
-
4541 bool has_digits = false, after_digit = false, in_parentheses = false, after_parentheses = false;
-
4542 const int space_match_flags = flags & ~match_multiline; // Spaces in phone numbers must never be broken in new line.
-
4543
-
4544 this->interval.end = start;
-
4545 value.clear();
-
4546 m_lparenthesis->invalidate();
-
4547 m_rparenthesis->invalidate();
-
4548
-
4549 if (m_plus_sign && m_plus_sign->match(text, this->interval.end, end, flags)) {
-
4550 value.append(text + m_plus_sign->interval.start, text + m_plus_sign->interval.end);
-
4551 safe_value_size = value.size();
-
4552 this->interval.end = m_plus_sign->interval.end;
-
4553 }
-
4554
-
4555 for (;;) {
-
4556 _Assume_(text || this->interval.end >= end);
-
4557 if (this->interval.end >= end || !text[this->interval.end])
-
4558 break;
-
4559 if (m_digit->match(text, this->interval.end, end, flags)) {
-
4560 // Digit
-
4561 value.append(text + m_digit->interval.start, text + m_digit->interval.end);
-
4562 this->interval.end = m_digit->interval.end;
-
4563 if (!in_parentheses) {
-
4564 safe_digit_end = this->interval.end;
-
4565 safe_value_size = value.size();
-
4566 has_digits = true;
-
4567 }
-
4568 after_digit = true;
-
4569 after_parentheses = false;
-
4570 }
-
4571 else if (
-
4572 m_lparenthesis && !m_lparenthesis->interval && // No left parenthesis yet
-
4573 m_rparenthesis && !m_rparenthesis->interval && // Right parenthesis after left
-
4574 m_lparenthesis->match(text, this->interval.end, end, flags))
-
4575 {
-
4576 // Left parenthesis
-
4577 value.append(text + m_lparenthesis->interval.start, m_lparenthesis->interval.size());
-
4578 this->interval.end = m_lparenthesis->interval.end;
-
4579 in_parentheses = true;
-
4580 after_digit = false;
-
4581 after_parentheses = false;
-
4582 }
-
4583 else if (
-
4584 in_parentheses && // After left parenthesis
-
4585 m_rparenthesis && !m_rparenthesis->interval && // No right parenthesis yet
-
4586 m_rparenthesis->match(text, this->interval.end, end, flags) &&
-
4587 m_lparenthesis->hit_offset == m_rparenthesis->hit_offset) // Left and right parentheses must match
-
4588 {
-
4589 // Right parenthesis
-
4590 value.append(text + m_rparenthesis->interval.start, text + m_rparenthesis->interval.end);
-
4591 this->interval.end = m_rparenthesis->interval.end;
-
4592 safe_digit_end = this->interval.end;
-
4593 safe_value_size = value.size();
-
4594 in_parentheses = false;
-
4595 after_digit = false;
-
4596 after_parentheses = true;
-
4597 }
-
4598 else if (
-
4599 after_digit &&
-
4600 !in_parentheses && // No separators inside parentheses
-
4601 !after_parentheses && // No separators following right parenthesis
-
4602 m_separator && m_separator->match(text, this->interval.end, end, flags))
-
4603 {
-
4604 // Separator
-
4605 this->interval.end = m_separator->interval.end;
-
4606 after_digit = false;
-
4607 after_parentheses = false;
-
4608 }
-
4609 else if (
- -
4611 m_space && m_space->match(text, this->interval.end, end, space_match_flags))
-
4612 {
-
4613 // Space
-
4614 this->interval.end = m_space->interval.end;
-
4615 after_digit = false;
-
4616 after_parentheses = false;
-
4617 }
-
4618 else
-
4619 break;
-
4620 }
-
4621 if (has_digits) {
-
4622 value.erase(safe_value_size);
-
4623 this->interval.start = start;
-
4624 this->interval.end = safe_digit_end;
-
4625 return true;
-
4626 }
-
4627 value.clear();
-
4628 this->interval.invalidate();
-
4629 return false;
-
4630 }
-
4631
-
4632 std::shared_ptr<basic_parser<T>> m_digit;
-
4633 std::shared_ptr<basic_parser<T>> m_plus_sign;
-
4634 std::shared_ptr<basic_set<T>> m_lparenthesis;
-
4635 std::shared_ptr<basic_set<T>> m_rparenthesis;
-
4636 std::shared_ptr<basic_parser<T>> m_separator;
-
4637 std::shared_ptr<basic_parser<T>> m_space;
-
4638 };
+
4523 this->interval.end = start;
+
4524 value.clear();
+
4525 m_lparenthesis->invalidate();
+
4526 m_rparenthesis->invalidate();
+
4527
+
4528 if (m_plus_sign && m_plus_sign->match(text, this->interval.end, end, flags)) {
+
4529 value.append(text + m_plus_sign->interval.start, text + m_plus_sign->interval.end);
+
4530 safe_value_size = value.size();
+
4531 this->interval.end = m_plus_sign->interval.end;
+
4532 }
+
4533
+
4534 for (;;) {
+
4535 _Assume_(text || this->interval.end >= end);
+
4536 if (this->interval.end >= end || !text[this->interval.end])
+
4537 break;
+
4538 if (m_digit->match(text, this->interval.end, end, flags)) {
+
4539 // Digit
+
4540 value.append(text + m_digit->interval.start, text + m_digit->interval.end);
+
4541 this->interval.end = m_digit->interval.end;
+
4542 if (!in_parentheses) {
+
4543 safe_digit_end = this->interval.end;
+
4544 safe_value_size = value.size();
+
4545 has_digits = true;
+
4546 }
+
4547 after_digit = true;
+
4548 after_parentheses = false;
+
4549 }
+
4550 else if (
+
4551 m_lparenthesis && !m_lparenthesis->interval && // No left parenthesis yet
+
4552 m_rparenthesis && !m_rparenthesis->interval && // Right parenthesis after left
+
4553 m_lparenthesis->match(text, this->interval.end, end, flags))
+
4554 {
+
4555 // Left parenthesis
+
4556 value.append(text + m_lparenthesis->interval.start, m_lparenthesis->interval.size());
+
4557 this->interval.end = m_lparenthesis->interval.end;
+
4558 in_parentheses = true;
+
4559 after_digit = false;
+
4560 after_parentheses = false;
+
4561 }
+
4562 else if (
+
4563 in_parentheses && // After left parenthesis
+
4564 m_rparenthesis && !m_rparenthesis->interval && // No right parenthesis yet
+
4565 m_rparenthesis->match(text, this->interval.end, end, flags) &&
+
4566 m_lparenthesis->hit_offset == m_rparenthesis->hit_offset) // Left and right parentheses must match
+
4567 {
+
4568 // Right parenthesis
+
4569 value.append(text + m_rparenthesis->interval.start, text + m_rparenthesis->interval.end);
+
4570 this->interval.end = m_rparenthesis->interval.end;
+
4571 safe_digit_end = this->interval.end;
+
4572 safe_value_size = value.size();
+
4573 in_parentheses = false;
+
4574 after_digit = false;
+
4575 after_parentheses = true;
+
4576 }
+
4577 else if (
+
4578 after_digit &&
+
4579 !in_parentheses && // No separators inside parentheses
+
4580 !after_parentheses && // No separators following right parenthesis
+
4581 m_separator && m_separator->match(text, this->interval.end, end, flags))
+
4582 {
+
4583 // Separator
+
4584 this->interval.end = m_separator->interval.end;
+
4585 after_digit = false;
+
4586 after_parentheses = false;
+
4587 }
+
4588 else if (
+ +
4590 m_space && m_space->match(text, this->interval.end, end, space_match_flags))
+
4591 {
+
4592 // Space
+
4593 this->interval.end = m_space->interval.end;
+
4594 after_digit = false;
+
4595 after_parentheses = false;
+
4596 }
+
4597 else
+
4598 break;
+
4599 }
+
4600 if (has_digits) {
+
4601 value.erase(safe_value_size);
+
4602 this->interval.start = start;
+
4603 this->interval.end = safe_digit_end;
+
4604 return true;
+
4605 }
+
4606 value.clear();
+
4607 this->interval.invalidate();
+
4608 return false;
+
4609 }
+
4610
+
4611 std::shared_ptr<basic_parser<T>> m_digit;
+
4612 std::shared_ptr<basic_parser<T>> m_plus_sign;
+
4613 std::shared_ptr<basic_set<T>> m_lparenthesis;
+
4614 std::shared_ptr<basic_set<T>> m_rparenthesis;
+
4615 std::shared_ptr<basic_parser<T>> m_separator;
+
4616 std::shared_ptr<basic_parser<T>> m_space;
+
4617 };
-
4639
-
4640 using phone_number = basic_phone_number<char>;
-
4641 using wphone_number = basic_phone_number<wchar_t>;
-
4642#ifdef _UNICODE
-
4643 using tphone_number = wphone_number;
-
4644#else
-
4645 using tphone_number = phone_number;
-
4646#endif
-
4647 using sgml_phone_number = basic_phone_number<char>;
+
4618
+
4619 using phone_number = basic_phone_number<char>;
+
4620 using wphone_number = basic_phone_number<wchar_t>;
+
4621#ifdef _UNICODE
+
4622 using tphone_number = wphone_number;
+
4623#else
+
4624 using tphone_number = phone_number;
+
4625#endif
+
4626 using sgml_phone_number = basic_phone_number<char>;
+
4627
+
4633 template <class T>
+
+
4634 class basic_iban : public basic_parser<T>
+
4635 {
+
4636 public:
+
4637 basic_iban(
+
4638 _In_ const std::shared_ptr<basic_parser<T>>& space,
+
4639 _In_ const std::locale& locale = std::locale()) :
+ +
4641 m_space(space)
+
4642 {
+
4643 this->country[0] = 0;
+
4644 this->check_digits[0] = 0;
+
4645 this->bban[0] = 0;
+
4646 this->is_valid = false;
+
4647 }
4648
-
4654 template <class T>
-
-
4655 class basic_iban : public basic_parser<T>
-
4656 {
-
4657 public:
-
4658 basic_iban(
-
4659 _In_ const std::shared_ptr<basic_parser<T>>& space,
-
4660 _In_ const std::locale& locale = std::locale()) :
- -
4662 m_space(space)
-
4663 {
-
4664 this->country[0] = 0;
-
4665 this->check_digits[0] = 0;
-
4666 this->bban[0] = 0;
-
4667 this->is_valid = false;
-
4668 }
-
4669
-
4670 virtual void invalidate()
-
4671 {
-
4672 this->country[0] = 0;
-
4673 this->check_digits[0] = 0;
-
4674 this->bban[0] = 0;
-
4675 this->is_valid = false;
- -
4677 }
-
4678
-
4679 T country[3];
- -
4681 T bban[31];
- -
4683
-
4684 protected:
-
4685 virtual bool do_match(
-
4686 _In_reads_or_z_opt_(end) const T* text,
-
4687 _In_ size_t start = 0,
-
4688 _In_ size_t end = SIZE_MAX,
-
4689 _In_ int flags = match_default)
-
4690 {
-
4691 _Assume_(text || start >= end);
-
4692 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
-
4693 const bool case_insensitive = flags & match_case_insensitive ? true : false;
-
4694 struct country_t {
-
4695 T country[2];
-
4696 T check_digits[2];
-
4697 size_t length;
-
4698 };
-
4699 static const country_t s_countries[] = {
-
4700 { { 'A', 'D' }, {}, 24 }, // Andorra
-
4701 { { 'A', 'E' }, {}, 23 }, // United Arab Emirates
-
4702 { { 'A', 'L' }, {}, 28 }, // Albania
-
4703 { { 'A', 'O' }, {}, 25 }, // Angola
-
4704 { { 'A', 'T' }, {}, 20 }, // Austria
-
4705 { { 'A', 'Z' }, {}, 28 }, // Azerbaijan
-
4706 { { 'B', 'A' }, { '3', '9' }, 20}, // Bosnia and Herzegovina
-
4707 { { 'B', 'E' }, {}, 16 }, // Belgium
-
4708 { { 'B', 'F' }, {}, 28 }, // Burkina Faso
-
4709 { { 'B', 'G' }, {}, 22 }, // Bulgaria
-
4710 { { 'B', 'H' }, {}, 22 }, // Bahrain
-
4711 { { 'B', 'I' }, {}, 27 }, // Burundi
-
4712 { { 'B', 'J' }, {}, 28 }, // Benin
-
4713 { { 'B', 'R' }, {}, 29 }, // Brazil
-
4714 { { 'B', 'Y' }, {}, 28 }, // Belarus
-
4715 { { 'C', 'F' }, {}, 27 }, // Central African Republic
-
4716 { { 'C', 'G' }, {}, 27 }, // Congo, Republic of the
-
4717 { { 'C', 'H' }, {}, 21 }, // Switzerland
-
4718 { { 'C', 'I' }, {}, 28 }, // Côte d'Ivoire
-
4719 { { 'C', 'M' }, {}, 27 }, // Cameroon
-
4720 { { 'C', 'R' }, {}, 22 }, // Costa Rica
-
4721 { { 'C', 'V' }, {}, 25 }, // Cabo Verde
-
4722 { { 'C', 'Y' }, {}, 28 }, // Cyprus
-
4723 { { 'C', 'Z' }, {}, 24 }, // Czech Republic
-
4724 { { 'D', 'E' }, {}, 22 }, // Germany
-
4725 { { 'D', 'J' }, {}, 27 }, // Djibouti
-
4726 { { 'D', 'K' }, {}, 18 }, // Denmark
-
4727 { { 'D', 'O' }, {}, 28 }, // Dominican Republic
-
4728 { { 'D', 'Z' }, {}, 26 }, // Algeria
-
4729 { { 'E', 'E' }, {}, 20 }, // Estonia
-
4730 { { 'E', 'G' }, {}, 29 }, // Egypt
-
4731 { { 'E', 'S' }, {}, 24 }, // Spain
-
4732 { { 'F', 'I' }, {}, 18 }, // Finland
-
4733 { { 'F', 'O' }, {}, 18 }, // Faroe Islands
-
4734 { { 'F', 'R' }, {}, 27 }, // France
-
4735 { { 'G', 'A' }, {}, 27 }, // Gabon
-
4736 { { 'G', 'B' }, {}, 22 }, // United Kingdom
-
4737 { { 'G', 'E' }, {}, 22 }, // Georgia
-
4738 { { 'G', 'I' }, {}, 23 }, // Gibraltar
-
4739 { { 'G', 'L' }, {}, 18 }, // Greenland
-
4740 { { 'G', 'Q' }, {}, 27 }, // Equatorial Guinea
-
4741 { { 'G', 'R' }, {}, 27 }, // Greece
-
4742 { { 'G', 'T' }, {}, 28 }, // Guatemala
-
4743 { { 'G', 'W' }, {}, 25 }, // Guinea-Bissau
-
4744 { { 'H', 'N' }, {}, 28 }, // Honduras
-
4745 { { 'H', 'R' }, {}, 21 }, // Croatia
-
4746 { { 'H', 'U' }, {}, 28 }, // Hungary
-
4747 { { 'I', 'E' }, {}, 22 }, // Ireland
-
4748 { { 'I', 'L' }, {}, 23 }, // Israel
-
4749 { { 'I', 'Q' }, {}, 23 }, // Iraq
-
4750 { { 'I', 'R' }, {}, 26 }, // Iran
-
4751 { { 'I', 'S' }, {}, 26 }, // Iceland
-
4752 { { 'I', 'T' }, {}, 27 }, // Italy
-
4753 { { 'J', 'O' }, {}, 30 }, // Jordan
-
4754 { { 'K', 'M' }, {}, 27 }, // Comoros
-
4755 { { 'K', 'W' }, {}, 30 }, // Kuwait
-
4756 { { 'K', 'Z' }, {}, 20 }, // Kazakhstan
-
4757 { { 'L', 'B' }, {}, 28 }, // Lebanon
-
4758 { { 'L', 'C' }, {}, 32 }, // Saint Lucia
-
4759 { { 'L', 'I' }, {}, 21 }, // Liechtenstein
-
4760 { { 'L', 'T' }, {}, 20 }, // Lithuania
-
4761 { { 'L', 'U' }, {}, 20 }, // Luxembourg
-
4762 { { 'L', 'V' }, {}, 21 }, // Latvia
-
4763 { { 'L', 'Y' }, {}, 25 }, // Libya
-
4764 { { 'M', 'A' }, {}, 28 }, // Morocco
-
4765 { { 'M', 'C' }, {}, 27 }, // Monaco
-
4766 { { 'M', 'D' }, {}, 24 }, // Moldova
-
4767 { { 'M', 'E' }, { '2', '5' }, 22 }, // Montenegro
-
4768 { { 'M', 'G' }, {}, 27 }, // Madagascar
-
4769 { { 'M', 'K' }, { '0', '7' }, 19 }, // North Macedonia
-
4770 { { 'M', 'L' }, {}, 28 }, // Mali
-
4771 { { 'M', 'R' }, { '1', '3' }, 27}, // Mauritania
-
4772 { { 'M', 'T' }, {}, 31 }, // Malta
-
4773 { { 'M', 'U' }, {}, 30 }, // Mauritius
-
4774 { { 'M', 'Z' }, {}, 25 }, // Mozambique
-
4775 { { 'N', 'E' }, {}, 28 }, // Niger
-
4776 { { 'N', 'I' }, {}, 32 }, // Nicaragua
-
4777 { { 'N', 'L' }, {}, 18 }, // Netherlands
-
4778 { { 'N', 'O' }, {}, 15 }, // Norway
-
4779 { { 'P', 'K' }, {}, 24 }, // Pakistan
-
4780 { { 'P', 'L' }, {}, 28 }, // Poland
-
4781 { { 'P', 'S' }, {}, 29 }, // Palestinian territories
-
4782 { { 'P', 'T' }, { '5', '0' }, 25 }, // Portugal
-
4783 { { 'Q', 'A' }, {}, 29 }, // Qatar
-
4784 { { 'R', 'O' }, {}, 24 }, // Romania
-
4785 { { 'R', 'S' }, { '3', '5' }, 22 }, // Serbia
-
4786 { { 'R', 'U' }, {}, 33 }, // Russia
-
4787 { { 'S', 'A' }, {}, 24 }, // Saudi Arabia
-
4788 { { 'S', 'C' }, {}, 31 }, // Seychelles
-
4789 { { 'S', 'D' }, {}, 18 }, // Sudan
-
4790 { { 'S', 'E' }, {}, 24 }, // Sweden
-
4791 { { 'S', 'I' }, { '5', '6' }, 19 }, // Slovenia
-
4792 { { 'S', 'K' }, {}, 24 }, // Slovakia
-
4793 { { 'S', 'M' }, {}, 27 }, // San Marino
-
4794 { { 'S', 'N' }, {}, 28 }, // Senegal
-
4795 { { 'S', 'T' }, {}, 25 }, // São Tomé and Príncipe
-
4796 { { 'S', 'V' }, {}, 28 }, // El Salvador
-
4797 { { 'T', 'D' }, {}, 27 }, // Chad
-
4798 { { 'T', 'G' }, {}, 28 }, // Togo
-
4799 { { 'T', 'L' }, { '3', '8' }, 23}, // East Timor
-
4800 { { 'T', 'N' }, { '5', '9' }, 24 }, // Tunisia
-
4801 { { 'T', 'R' }, {}, 26 }, // Turkey
-
4802 { { 'U', 'A' }, {}, 29 }, // Ukraine
-
4803 { { 'V', 'A' }, {}, 22 }, // Vatican City
-
4804 { { 'V', 'G' }, {}, 24 }, // Virgin Islands, British
-
4805 { { 'X', 'K' }, {}, 20 }, // Kosovo
-
4806 };
-
4807 const country_t* country_desc = nullptr;
-
4808 size_t n, available, next, bban_length;
- -
4810
-
4811 this->interval.end = start;
-
4812 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
-
4813 if (this->interval.end >= end || !text[this->interval.end])
-
4814 goto error; // incomplete country code
-
4815 T chr = case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end];
-
4816 if (chr < 'A' || 'Z' < chr)
-
4817 goto error; // invalid country code
-
4818 this->country[i] = chr;
+
4649 virtual void invalidate()
+
4650 {
+
4651 this->country[0] = 0;
+
4652 this->check_digits[0] = 0;
+
4653 this->bban[0] = 0;
+
4654 this->is_valid = false;
+ +
4656 }
+
4657
+
4658 T country[3];
+ +
4660 T bban[31];
+ +
4662
+
4663 protected:
+
4664 virtual bool do_match(
+
4665 _In_reads_or_z_opt_(end) const T* text,
+
4666 _In_ size_t start = 0,
+
4667 _In_ size_t end = SIZE_MAX,
+
4668 _In_ int flags = match_default)
+
4669 {
+
4670 _Assume_(text || start >= end);
+
4671 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
+
4672 const bool case_insensitive = flags & match_case_insensitive ? true : false;
+
4673 struct country_t {
+
4674 T country[2];
+
4675 T check_digits[2];
+
4676 size_t length;
+
4677 };
+
4678 static const country_t s_countries[] = {
+
4679 { { 'A', 'D' }, {}, 24 }, // Andorra
+
4680 { { 'A', 'E' }, {}, 23 }, // United Arab Emirates
+
4681 { { 'A', 'L' }, {}, 28 }, // Albania
+
4682 { { 'A', 'O' }, {}, 25 }, // Angola
+
4683 { { 'A', 'T' }, {}, 20 }, // Austria
+
4684 { { 'A', 'Z' }, {}, 28 }, // Azerbaijan
+
4685 { { 'B', 'A' }, { '3', '9' }, 20}, // Bosnia and Herzegovina
+
4686 { { 'B', 'E' }, {}, 16 }, // Belgium
+
4687 { { 'B', 'F' }, {}, 28 }, // Burkina Faso
+
4688 { { 'B', 'G' }, {}, 22 }, // Bulgaria
+
4689 { { 'B', 'H' }, {}, 22 }, // Bahrain
+
4690 { { 'B', 'I' }, {}, 27 }, // Burundi
+
4691 { { 'B', 'J' }, {}, 28 }, // Benin
+
4692 { { 'B', 'R' }, {}, 29 }, // Brazil
+
4693 { { 'B', 'Y' }, {}, 28 }, // Belarus
+
4694 { { 'C', 'F' }, {}, 27 }, // Central African Republic
+
4695 { { 'C', 'G' }, {}, 27 }, // Congo, Republic of the
+
4696 { { 'C', 'H' }, {}, 21 }, // Switzerland
+
4697 { { 'C', 'I' }, {}, 28 }, // Côte d'Ivoire
+
4698 { { 'C', 'M' }, {}, 27 }, // Cameroon
+
4699 { { 'C', 'R' }, {}, 22 }, // Costa Rica
+
4700 { { 'C', 'V' }, {}, 25 }, // Cabo Verde
+
4701 { { 'C', 'Y' }, {}, 28 }, // Cyprus
+
4702 { { 'C', 'Z' }, {}, 24 }, // Czech Republic
+
4703 { { 'D', 'E' }, {}, 22 }, // Germany
+
4704 { { 'D', 'J' }, {}, 27 }, // Djibouti
+
4705 { { 'D', 'K' }, {}, 18 }, // Denmark
+
4706 { { 'D', 'O' }, {}, 28 }, // Dominican Republic
+
4707 { { 'D', 'Z' }, {}, 26 }, // Algeria
+
4708 { { 'E', 'E' }, {}, 20 }, // Estonia
+
4709 { { 'E', 'G' }, {}, 29 }, // Egypt
+
4710 { { 'E', 'S' }, {}, 24 }, // Spain
+
4711 { { 'F', 'I' }, {}, 18 }, // Finland
+
4712 { { 'F', 'O' }, {}, 18 }, // Faroe Islands
+
4713 { { 'F', 'R' }, {}, 27 }, // France
+
4714 { { 'G', 'A' }, {}, 27 }, // Gabon
+
4715 { { 'G', 'B' }, {}, 22 }, // United Kingdom
+
4716 { { 'G', 'E' }, {}, 22 }, // Georgia
+
4717 { { 'G', 'I' }, {}, 23 }, // Gibraltar
+
4718 { { 'G', 'L' }, {}, 18 }, // Greenland
+
4719 { { 'G', 'Q' }, {}, 27 }, // Equatorial Guinea
+
4720 { { 'G', 'R' }, {}, 27 }, // Greece
+
4721 { { 'G', 'T' }, {}, 28 }, // Guatemala
+
4722 { { 'G', 'W' }, {}, 25 }, // Guinea-Bissau
+
4723 { { 'H', 'N' }, {}, 28 }, // Honduras
+
4724 { { 'H', 'R' }, {}, 21 }, // Croatia
+
4725 { { 'H', 'U' }, {}, 28 }, // Hungary
+
4726 { { 'I', 'E' }, {}, 22 }, // Ireland
+
4727 { { 'I', 'L' }, {}, 23 }, // Israel
+
4728 { { 'I', 'Q' }, {}, 23 }, // Iraq
+
4729 { { 'I', 'R' }, {}, 26 }, // Iran
+
4730 { { 'I', 'S' }, {}, 26 }, // Iceland
+
4731 { { 'I', 'T' }, {}, 27 }, // Italy
+
4732 { { 'J', 'O' }, {}, 30 }, // Jordan
+
4733 { { 'K', 'M' }, {}, 27 }, // Comoros
+
4734 { { 'K', 'W' }, {}, 30 }, // Kuwait
+
4735 { { 'K', 'Z' }, {}, 20 }, // Kazakhstan
+
4736 { { 'L', 'B' }, {}, 28 }, // Lebanon
+
4737 { { 'L', 'C' }, {}, 32 }, // Saint Lucia
+
4738 { { 'L', 'I' }, {}, 21 }, // Liechtenstein
+
4739 { { 'L', 'T' }, {}, 20 }, // Lithuania
+
4740 { { 'L', 'U' }, {}, 20 }, // Luxembourg
+
4741 { { 'L', 'V' }, {}, 21 }, // Latvia
+
4742 { { 'L', 'Y' }, {}, 25 }, // Libya
+
4743 { { 'M', 'A' }, {}, 28 }, // Morocco
+
4744 { { 'M', 'C' }, {}, 27 }, // Monaco
+
4745 { { 'M', 'D' }, {}, 24 }, // Moldova
+
4746 { { 'M', 'E' }, { '2', '5' }, 22 }, // Montenegro
+
4747 { { 'M', 'G' }, {}, 27 }, // Madagascar
+
4748 { { 'M', 'K' }, { '0', '7' }, 19 }, // North Macedonia
+
4749 { { 'M', 'L' }, {}, 28 }, // Mali
+
4750 { { 'M', 'R' }, { '1', '3' }, 27}, // Mauritania
+
4751 { { 'M', 'T' }, {}, 31 }, // Malta
+
4752 { { 'M', 'U' }, {}, 30 }, // Mauritius
+
4753 { { 'M', 'Z' }, {}, 25 }, // Mozambique
+
4754 { { 'N', 'E' }, {}, 28 }, // Niger
+
4755 { { 'N', 'I' }, {}, 32 }, // Nicaragua
+
4756 { { 'N', 'L' }, {}, 18 }, // Netherlands
+
4757 { { 'N', 'O' }, {}, 15 }, // Norway
+
4758 { { 'P', 'K' }, {}, 24 }, // Pakistan
+
4759 { { 'P', 'L' }, {}, 28 }, // Poland
+
4760 { { 'P', 'S' }, {}, 29 }, // Palestinian territories
+
4761 { { 'P', 'T' }, { '5', '0' }, 25 }, // Portugal
+
4762 { { 'Q', 'A' }, {}, 29 }, // Qatar
+
4763 { { 'R', 'O' }, {}, 24 }, // Romania
+
4764 { { 'R', 'S' }, { '3', '5' }, 22 }, // Serbia
+
4765 { { 'R', 'U' }, {}, 33 }, // Russia
+
4766 { { 'S', 'A' }, {}, 24 }, // Saudi Arabia
+
4767 { { 'S', 'C' }, {}, 31 }, // Seychelles
+
4768 { { 'S', 'D' }, {}, 18 }, // Sudan
+
4769 { { 'S', 'E' }, {}, 24 }, // Sweden
+
4770 { { 'S', 'I' }, { '5', '6' }, 19 }, // Slovenia
+
4771 { { 'S', 'K' }, {}, 24 }, // Slovakia
+
4772 { { 'S', 'M' }, {}, 27 }, // San Marino
+
4773 { { 'S', 'N' }, {}, 28 }, // Senegal
+
4774 { { 'S', 'T' }, {}, 25 }, // São Tomé and Príncipe
+
4775 { { 'S', 'V' }, {}, 28 }, // El Salvador
+
4776 { { 'T', 'D' }, {}, 27 }, // Chad
+
4777 { { 'T', 'G' }, {}, 28 }, // Togo
+
4778 { { 'T', 'L' }, { '3', '8' }, 23}, // East Timor
+
4779 { { 'T', 'N' }, { '5', '9' }, 24 }, // Tunisia
+
4780 { { 'T', 'R' }, {}, 26 }, // Turkey
+
4781 { { 'U', 'A' }, {}, 29 }, // Ukraine
+
4782 { { 'V', 'A' }, {}, 22 }, // Vatican City
+
4783 { { 'V', 'G' }, {}, 24 }, // Virgin Islands, British
+
4784 { { 'X', 'K' }, {}, 20 }, // Kosovo
+
4785 };
+
4786 const country_t* country_desc = nullptr;
+
4787 size_t n, available, next, bban_length;
+ +
4789
+
4790 this->interval.end = start;
+
4791 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
+
4792 if (this->interval.end >= end || !text[this->interval.end])
+
4793 goto error; // incomplete country code
+
4794 T chr = case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end];
+
4795 if (chr < 'A' || 'Z' < chr)
+
4796 goto error; // invalid country code
+
4797 this->country[i] = chr;
+
4798 }
+
4799 for (size_t l = 0, r = _countof(s_countries);;) {
+
4800 if (l >= r)
+
4801 goto error; // unknown country
+
4802 size_t m = (l + r) / 2;
+
4803 const country_t& c = s_countries[m];
+
4804 if (c.country[0] < this->country[0] || (c.country[0] == this->country[0] && c.country[1] < this->country[1]))
+
4805 l = m + 1;
+
4806 else if (this->country[0] < c.country[0] || (this->country[0] == c.country[0] && this->country[1] < c.country[1]))
+
4807 r = m;
+
4808 else {
+
4809 country_desc = &c;
+
4810 break;
+
4811 }
+
4812 }
+
4813 this->country[2] = 0;
+
4814
+
4815 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
+
4816 if (this->interval.end >= end || text[this->interval.end] < '0' || '9' < text[this->interval.end])
+
4817 goto error; // incomplete or invalid check digits
+
4818 this->check_digits[i] = text[this->interval.end];
4819 }
-
4820 for (size_t l = 0, r = _countof(s_countries);;) {
-
4821 if (l >= r)
-
4822 goto error; // unknown country
-
4823 size_t m = (l + r) / 2;
-
4824 const country_t& c = s_countries[m];
-
4825 if (c.country[0] < this->country[0] || (c.country[0] == this->country[0] && c.country[1] < this->country[1]))
-
4826 l = m + 1;
-
4827 else if (this->country[0] < c.country[0] || (this->country[0] == c.country[0] && this->country[1] < c.country[1]))
-
4828 r = m;
-
4829 else {
-
4830 country_desc = &c;
-
4831 break;
-
4832 }
-
4833 }
-
4834 this->country[2] = 0;
-
4835
-
4836 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
-
4837 if (this->interval.end >= end || text[this->interval.end] < '0' || '9' < text[this->interval.end])
-
4838 goto error; // incomplete or invalid check digits
-
4839 this->check_digits[i] = text[this->interval.end];
-
4840 }
-
4841 this->check_digits[2] = 0;
-
4842
-
4843 if ((country_desc->check_digits[0] && this->check_digits[0] != country_desc->check_digits[0]) ||
-
4844 (country_desc->check_digits[1] && this->check_digits[1] != country_desc->check_digits[1]))
-
4845 goto error; // unexpected check digits
-
4846
-
4847 bban_length = country_desc->length - 4;
-
4848 for (n = 0; n < bban_length;) {
-
4849 if (this->interval.end >= end || !text[this->interval.end])
-
4850 goto error; // bban too short
-
4851 if (m_space && m_space->match(text, this->interval.end, end, flags)) {
-
4852 this->interval.end = m_space->interval.end;
-
4853 continue;
-
4854 }
-
4855 T chr = case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end];
-
4856 if (('0' <= chr && chr <= '9') || ('A' <= chr && chr <= 'Z')) {
-
4857 this->bban[n++] = chr;
-
4858 this->interval.end++;
-
4859 }
-
4860 else
-
4861 goto error; // invalid bban
-
4862 }
-
4863 this->bban[n] = 0;
-
4864
-
4865 // Normalize IBAN.
-
4866 T normalized[69];
-
4867 available = 0;
-
4868 for (size_t i = 0; ; ++i) {
-
4869 if (!this->bban[i]) {
-
4870 for (i = 0; i < 2; ++i) {
-
4871 if ('A' <= this->country[i] && this->country[i] <= 'J') {
-
4872 normalized[available++] = '1';
-
4873 normalized[available++] = '0' + this->country[i] - 'A';
-
4874 }
-
4875 else if ('K' <= this->country[i] && this->country[i] <= 'T') {
-
4876 normalized[available++] = '2';
-
4877 normalized[available++] = '0' + this->country[i] - 'K';
-
4878 }
-
4879 else if ('U' <= this->country[i] && this->country[i] <= 'Z') {
-
4880 normalized[available++] = '3';
-
4881 normalized[available++] = '0' + this->country[i] - 'U';
-
4882 }
-
4883 }
-
4884 normalized[available++] = this->check_digits[0];
-
4885 normalized[available++] = this->check_digits[1];
-
4886 normalized[available] = 0;
-
4887 break;
-
4888 }
-
4889 if ('0' <= this->bban[i] && this->bban[i] <= '9')
-
4890 normalized[available++] = this->bban[i];
-
4891 else if ('A' <= this->bban[i] && this->bban[i] <= 'J') {
-
4892 normalized[available++] = '1';
-
4893 normalized[available++] = '0' + this->bban[i] - 'A';
-
4894 }
-
4895 else if ('K' <= this->bban[i] && this->bban[i] <= 'T') {
-
4896 normalized[available++] = '2';
-
4897 normalized[available++] = '0' + this->bban[i] - 'K';
-
4898 }
-
4899 else if ('U' <= this->bban[i] && this->bban[i] <= 'Z') {
-
4900 normalized[available++] = '3';
-
4901 normalized[available++] = '0' + this->bban[i] - 'U';
-
4902 }
-
4903 }
+
4820 this->check_digits[2] = 0;
+
4821
+
4822 if ((country_desc->check_digits[0] && this->check_digits[0] != country_desc->check_digits[0]) ||
+
4823 (country_desc->check_digits[1] && this->check_digits[1] != country_desc->check_digits[1]))
+
4824 goto error; // unexpected check digits
+
4825
+
4826 bban_length = country_desc->length - 4;
+
4827 for (n = 0; n < bban_length;) {
+
4828 if (this->interval.end >= end || !text[this->interval.end])
+
4829 goto error; // bban too short
+
4830 if (m_space && m_space->match(text, this->interval.end, end, flags)) {
+
4831 this->interval.end = m_space->interval.end;
+
4832 continue;
+
4833 }
+
4834 T chr = case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end];
+
4835 if (('0' <= chr && chr <= '9') || ('A' <= chr && chr <= 'Z')) {
+
4836 this->bban[n++] = chr;
+
4837 this->interval.end++;
+
4838 }
+
4839 else
+
4840 goto error; // invalid bban
+
4841 }
+
4842 this->bban[n] = 0;
+
4843
+
4844 // Normalize IBAN.
+
4845 T normalized[69];
+
4846 available = 0;
+
4847 for (size_t i = 0; ; ++i) {
+
4848 if (!this->bban[i]) {
+
4849 for (i = 0; i < 2; ++i) {
+
4850 if ('A' <= this->country[i] && this->country[i] <= 'J') {
+
4851 normalized[available++] = '1';
+
4852 normalized[available++] = '0' + this->country[i] - 'A';
+
4853 }
+
4854 else if ('K' <= this->country[i] && this->country[i] <= 'T') {
+
4855 normalized[available++] = '2';
+
4856 normalized[available++] = '0' + this->country[i] - 'K';
+
4857 }
+
4858 else if ('U' <= this->country[i] && this->country[i] <= 'Z') {
+
4859 normalized[available++] = '3';
+
4860 normalized[available++] = '0' + this->country[i] - 'U';
+
4861 }
+
4862 }
+
4863 normalized[available++] = this->check_digits[0];
+
4864 normalized[available++] = this->check_digits[1];
+
4865 normalized[available] = 0;
+
4866 break;
+
4867 }
+
4868 if ('0' <= this->bban[i] && this->bban[i] <= '9')
+
4869 normalized[available++] = this->bban[i];
+
4870 else if ('A' <= this->bban[i] && this->bban[i] <= 'J') {
+
4871 normalized[available++] = '1';
+
4872 normalized[available++] = '0' + this->bban[i] - 'A';
+
4873 }
+
4874 else if ('K' <= this->bban[i] && this->bban[i] <= 'T') {
+
4875 normalized[available++] = '2';
+
4876 normalized[available++] = '0' + this->bban[i] - 'K';
+
4877 }
+
4878 else if ('U' <= this->bban[i] && this->bban[i] <= 'Z') {
+
4879 normalized[available++] = '3';
+
4880 normalized[available++] = '0' + this->bban[i] - 'U';
+
4881 }
+
4882 }
+
4883
+
4884 // Calculate modulo 97.
+
4885 nominator = stdex::strtou32(normalized, 9, &next, 10);
+
4886 for (;;) {
+
4887 nominator %= 97;
+
4888 if (!normalized[next]) {
+
4889 this->is_valid = nominator == 1;
+
4890 break;
+
4891 }
+
4892 size_t digit_count = nominator == 0 ? 0 : nominator < 10 ? 1 : 2;
+
4893 for (; digit_count < 9 && normalized[next]; ++next, ++digit_count)
+
4894 nominator = nominator * 10 + static_cast<uint32_t>(normalized[next] - '0');
+
4895 }
+
4896
+
4897 this->interval.start = start;
+
4898 return true;
+
4899
+
4900 error:
+
4901 invalidate();
+
4902 return false;
+
4903 }
4904
-
4905 // Calculate modulo 97.
-
4906 nominator = stdex::strtou32(normalized, 9, &next, 10);
-
4907 for (;;) {
-
4908 nominator %= 97;
-
4909 if (!normalized[next]) {
-
4910 this->is_valid = nominator == 1;
-
4911 break;
-
4912 }
-
4913 size_t digit_count = nominator == 0 ? 0 : nominator < 10 ? 1 : 2;
-
4914 for (; digit_count < 9 && normalized[next]; ++next, ++digit_count)
-
4915 nominator = nominator * 10 + static_cast<uint32_t>(normalized[next] - '0');
-
4916 }
-
4917
-
4918 this->interval.start = start;
-
4919 return true;
-
4920
-
4921 error:
-
4922 invalidate();
-
4923 return false;
-
4924 }
-
4925
-
4926 std::shared_ptr<basic_parser<T>> m_space;
-
4927 };
+
4905 std::shared_ptr<basic_parser<T>> m_space;
+
4906 };
-
4928
-
4929 using iban = basic_iban<char>;
-
4930 using wiban = basic_iban<wchar_t>;
-
4931#ifdef _UNICODE
-
4932 using tiban = wiban;
-
4933#else
-
4934 using tiban = iban;
-
4935#endif
-
4936 using sgml_iban = basic_iban<char>;
-
4937
-
4943 template <class T>
-
- -
4945 {
-
4946 public:
- -
4948 _In_ const std::shared_ptr<basic_parser<T>>& space,
-
4949 _In_ const std::locale& locale = std::locale()) :
- -
4951 m_space(space)
-
4952 {
-
4953 this->check_digits[0] = 0;
-
4954 this->reference[0] = 0;
-
4955 this->is_valid = false;
-
4956 }
-
4957
-
4958 virtual void invalidate()
-
4959 {
-
4960 this->check_digits[0] = 0;
-
4961 this->reference[0] = 0;
-
4962 this->is_valid = false;
- -
4964 }
-
4965
- - - -
4969
-
4970 protected:
-
4971 virtual bool do_match(
-
4972 _In_reads_or_z_opt_(end) const T* text,
-
4973 _In_ size_t start = 0,
-
4974 _In_ size_t end = SIZE_MAX,
-
4975 _In_ int flags = match_default)
-
4976 {
-
4977 _Assume_(text || start >= end);
-
4978 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
-
4979 const bool case_insensitive = flags & match_case_insensitive ? true : false;
-
4980 size_t n, available, next;
- -
4982
-
4983 this->interval.end = start;
-
4984 if (this->interval.end + 1 >= end ||
-
4985 (case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end]) != 'R' ||
-
4986 (case_insensitive ? ctype.toupper(text[this->interval.end + 1]) : text[this->interval.end + 1]) != 'F')
-
4987 goto error; // incomplete or wrong reference ID
-
4988 this->interval.end += 2;
-
4989
-
4990 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
-
4991 if (this->interval.end >= end || text[this->interval.end] < '0' || '9' < text[this->interval.end])
-
4992 goto error; // incomplete or invalid check digits
-
4993 this->check_digits[i] = text[this->interval.end];
-
4994 }
-
4995 this->check_digits[2] = 0;
-
4996
-
4997 for (n = 0;;) {
-
4998 if (m_space && m_space->match(text, this->interval.end, end, flags))
-
4999 this->interval.end = m_space->interval.end;
-
5000 for (size_t j = 0; j < 4; ++j) {
-
5001 if (this->interval.end >= end || !text[this->interval.end])
-
5002 goto out;
-
5003 T chr = case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end];
-
5004 if (('0' <= chr && chr <= '9') || ('A' <= chr && chr <= 'Z')) {
-
5005 if (n >= _countof(reference) - 1)
-
5006 goto error; // reference overflow
-
5007 this->reference[n++] = chr;
-
5008 this->interval.end++;
-
5009 }
-
5010 else
-
5011 goto out;
-
5012 }
-
5013 }
-
5014 out:
-
5015 if (!n)
-
5016 goto error; // reference too short
-
5017 this->reference[_countof(this->reference) - 1] = 0;
-
5018 for (size_t i = n, j = _countof(this->reference) - 1; i;)
-
5019 this->reference[--j] = this->reference[--i];
-
5020 for (size_t j = _countof(this->reference) - 1 - n; j;)
-
5021 this->reference[--j] = '0';
-
5022
-
5023 // Normalize creditor reference.
-
5024 T normalized[47];
-
5025 available = 0;
-
5026 for (size_t i = 0; ; ++i) {
-
5027 if (!this->reference[i]) {
-
5028 normalized[available++] = '2'; // R
-
5029 normalized[available++] = '7';
-
5030 normalized[available++] = '1'; // F
-
5031 normalized[available++] = '5';
-
5032 normalized[available++] = this->check_digits[0];
-
5033 normalized[available++] = this->check_digits[1];
-
5034 normalized[available] = 0;
-
5035 break;
-
5036 }
-
5037 if ('0' <= this->reference[i] && this->reference[i] <= '9')
-
5038 normalized[available++] = this->reference[i];
-
5039 else if ('A' <= this->reference[i] && this->reference[i] <= 'J') {
-
5040 normalized[available++] = '1';
-
5041 normalized[available++] = '0' + this->reference[i] - 'A';
-
5042 }
-
5043 else if ('K' <= this->reference[i] && this->reference[i] <= 'T') {
-
5044 normalized[available++] = '2';
-
5045 normalized[available++] = '0' + this->reference[i] - 'K';
-
5046 }
-
5047 else if ('U' <= this->reference[i] && this->reference[i] <= 'Z') {
-
5048 normalized[available++] = '3';
-
5049 normalized[available++] = '0' + this->reference[i] - 'U';
-
5050 }
-
5051 }
+
4907
+
4908 using iban = basic_iban<char>;
+
4909 using wiban = basic_iban<wchar_t>;
+
4910#ifdef _UNICODE
+
4911 using tiban = wiban;
+
4912#else
+
4913 using tiban = iban;
+
4914#endif
+
4915 using sgml_iban = basic_iban<char>;
+
4916
+
4922 template <class T>
+
+ +
4924 {
+
4925 public:
+ +
4927 _In_ const std::shared_ptr<basic_parser<T>>& space,
+
4928 _In_ const std::locale& locale = std::locale()) :
+ +
4930 m_space(space)
+
4931 {
+
4932 this->check_digits[0] = 0;
+
4933 this->reference[0] = 0;
+
4934 this->is_valid = false;
+
4935 }
+
4936
+
4937 virtual void invalidate()
+
4938 {
+
4939 this->check_digits[0] = 0;
+
4940 this->reference[0] = 0;
+
4941 this->is_valid = false;
+ +
4943 }
+
4944
+ + + +
4948
+
4949 protected:
+
4950 virtual bool do_match(
+
4951 _In_reads_or_z_opt_(end) const T* text,
+
4952 _In_ size_t start = 0,
+
4953 _In_ size_t end = SIZE_MAX,
+
4954 _In_ int flags = match_default)
+
4955 {
+
4956 _Assume_(text || start >= end);
+
4957 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
+
4958 const bool case_insensitive = flags & match_case_insensitive ? true : false;
+
4959 size_t n, available, next;
+ +
4961
+
4962 this->interval.end = start;
+
4963 if (this->interval.end + 1 >= end ||
+
4964 (case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end]) != 'R' ||
+
4965 (case_insensitive ? ctype.toupper(text[this->interval.end + 1]) : text[this->interval.end + 1]) != 'F')
+
4966 goto error; // incomplete or wrong reference ID
+
4967 this->interval.end += 2;
+
4968
+
4969 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
+
4970 if (this->interval.end >= end || text[this->interval.end] < '0' || '9' < text[this->interval.end])
+
4971 goto error; // incomplete or invalid check digits
+
4972 this->check_digits[i] = text[this->interval.end];
+
4973 }
+
4974 this->check_digits[2] = 0;
+
4975
+
4976 for (n = 0;;) {
+
4977 if (m_space && m_space->match(text, this->interval.end, end, flags))
+
4978 this->interval.end = m_space->interval.end;
+
4979 for (size_t j = 0; j < 4; ++j) {
+
4980 if (this->interval.end >= end || !text[this->interval.end])
+
4981 goto out;
+
4982 T chr = case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end];
+
4983 if (('0' <= chr && chr <= '9') || ('A' <= chr && chr <= 'Z')) {
+
4984 if (n >= _countof(reference) - 1)
+
4985 goto error; // reference overflow
+
4986 this->reference[n++] = chr;
+
4987 this->interval.end++;
+
4988 }
+
4989 else
+
4990 goto out;
+
4991 }
+
4992 }
+
4993 out:
+
4994 if (!n)
+
4995 goto error; // reference too short
+
4996 this->reference[_countof(this->reference) - 1] = 0;
+
4997 for (size_t i = n, j = _countof(this->reference) - 1; i;)
+
4998 this->reference[--j] = this->reference[--i];
+
4999 for (size_t j = _countof(this->reference) - 1 - n; j;)
+
5000 this->reference[--j] = '0';
+
5001
+
5002 // Normalize creditor reference.
+
5003 T normalized[47];
+
5004 available = 0;
+
5005 for (size_t i = 0; ; ++i) {
+
5006 if (!this->reference[i]) {
+
5007 normalized[available++] = '2'; // R
+
5008 normalized[available++] = '7';
+
5009 normalized[available++] = '1'; // F
+
5010 normalized[available++] = '5';
+
5011 normalized[available++] = this->check_digits[0];
+
5012 normalized[available++] = this->check_digits[1];
+
5013 normalized[available] = 0;
+
5014 break;
+
5015 }
+
5016 if ('0' <= this->reference[i] && this->reference[i] <= '9')
+
5017 normalized[available++] = this->reference[i];
+
5018 else if ('A' <= this->reference[i] && this->reference[i] <= 'J') {
+
5019 normalized[available++] = '1';
+
5020 normalized[available++] = '0' + this->reference[i] - 'A';
+
5021 }
+
5022 else if ('K' <= this->reference[i] && this->reference[i] <= 'T') {
+
5023 normalized[available++] = '2';
+
5024 normalized[available++] = '0' + this->reference[i] - 'K';
+
5025 }
+
5026 else if ('U' <= this->reference[i] && this->reference[i] <= 'Z') {
+
5027 normalized[available++] = '3';
+
5028 normalized[available++] = '0' + this->reference[i] - 'U';
+
5029 }
+
5030 }
+
5031
+
5032 // Calculate modulo 97.
+
5033 nominator = stdex::strtou32(normalized, 9, &next, 10);
+
5034 for (;;) {
+
5035 nominator %= 97;
+
5036 if (!normalized[next]) {
+
5037 this->is_valid = nominator == 1;
+
5038 break;
+
5039 }
+
5040 size_t digit_count = nominator == 0 ? 0 : nominator < 10 ? 1 : 2;
+
5041 for (; digit_count < 9 && normalized[next]; ++next, ++digit_count)
+
5042 nominator = nominator * 10 + static_cast<uint32_t>(normalized[next] - '0');
+
5043 }
+
5044
+
5045 this->interval.start = start;
+
5046 return true;
+
5047
+
5048 error:
+
5049 invalidate();
+
5050 return false;
+
5051 }
5052
-
5053 // Calculate modulo 97.
-
5054 nominator = stdex::strtou32(normalized, 9, &next, 10);
-
5055 for (;;) {
-
5056 nominator %= 97;
-
5057 if (!normalized[next]) {
-
5058 this->is_valid = nominator == 1;
-
5059 break;
-
5060 }
-
5061 size_t digit_count = nominator == 0 ? 0 : nominator < 10 ? 1 : 2;
-
5062 for (; digit_count < 9 && normalized[next]; ++next, ++digit_count)
-
5063 nominator = nominator * 10 + static_cast<uint32_t>(normalized[next] - '0');
-
5064 }
-
5065
-
5066 this->interval.start = start;
-
5067 return true;
-
5068
-
5069 error:
-
5070 invalidate();
-
5071 return false;
-
5072 }
-
5073
-
5074 std::shared_ptr<basic_parser<T>> m_space;
-
5075 };
+
5053 std::shared_ptr<basic_parser<T>> m_space;
+
5054 };
-
5076
-
5077 using creditor_reference = basic_creditor_reference<char>;
-
5078 using wcreditor_reference = basic_creditor_reference<wchar_t>;
-
5079#ifdef _UNICODE
-
5080 using tcreditor_reference = wcreditor_reference;
-
5081#else
-
5082 using tcreditor_reference = creditor_reference;
-
5083#endif
-
5084 using sgml_creditor_reference = basic_creditor_reference<char>;
-
5085
-
5091 template <class T>
-
- -
5093 {
-
5094 public:
-
5095 basic_si_reference_part(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
-
5096
-
5097 protected:
-
5098 virtual bool do_match(
-
5099 _In_reads_or_z_opt_(end) const T* text,
-
5100 _In_ size_t start = 0,
-
5101 _In_ size_t end = SIZE_MAX,
-
5102 _In_ int flags = match_default)
-
5103 {
-
5104 _Assume_(text || start >= end);
-
5105 this->interval.end = start;
-
5106 for (;;) {
-
5107 if (this->interval.end >= end || !text[this->interval.end])
-
5108 break;
-
5109 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9')
-
5110 this->interval.end++;
-
5111 else
-
5112 break;
-
5113 }
- -
5115 this->interval.start = start;
-
5116 return true;
-
5117 }
-
5118 this->interval.invalidate();
-
5119 return false;
-
5120 }
-
5121 };
+
5055
+
5056 using creditor_reference = basic_creditor_reference<char>;
+
5057 using wcreditor_reference = basic_creditor_reference<wchar_t>;
+
5058#ifdef _UNICODE
+
5059 using tcreditor_reference = wcreditor_reference;
+
5060#else
+
5061 using tcreditor_reference = creditor_reference;
+
5062#endif
+
5063 using sgml_creditor_reference = basic_creditor_reference<char>;
+
5064
+
5070 template <class T>
+
+ +
5072 {
+
5073 public:
+
5074 basic_si_reference_part(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
+
5075
+
5076 protected:
+
5077 virtual bool do_match(
+
5078 _In_reads_or_z_opt_(end) const T* text,
+
5079 _In_ size_t start = 0,
+
5080 _In_ size_t end = SIZE_MAX,
+
5081 _In_ int flags = match_default)
+
5082 {
+
5083 _Assume_(text || start >= end);
+
5084 this->interval.end = start;
+
5085 for (;;) {
+
5086 if (this->interval.end >= end || !text[this->interval.end])
+
5087 break;
+
5088 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9')
+
5089 this->interval.end++;
+
5090 else
+
5091 break;
+
5092 }
+ +
5094 this->interval.start = start;
+
5095 return true;
+
5096 }
+
5097 this->interval.invalidate();
+
5098 return false;
+
5099 }
+
5100 };
-
5122
- - -
5125#ifdef _UNICODE
- -
5127#else
- -
5129#endif
- -
5131
-
5137 template <class T>
-
- -
5139 {
-
5140 public:
-
5141 basic_si_reference_delimiter(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
-
5142
-
5143 protected:
-
5144 virtual bool do_match(
-
5145 _In_reads_or_z_opt_(end) const T* text,
-
5146 _In_ size_t start = 0,
-
5147 _In_ size_t end = SIZE_MAX,
-
5148 _In_ int flags = match_default)
-
5149 {
-
5150 _Assume_(text || start >= end);
-
5151 if (start < end && text[start] == '-') {
-
5152 this->interval.end = (this->interval.start = start) + 1;
-
5153 return true;
-
5154 }
-
5155 this->interval.invalidate();
-
5156 return false;
-
5157 }
-
5158 };
+
5101
+ + +
5104#ifdef _UNICODE
+ +
5106#else
+ +
5108#endif
+ +
5110
+
5116 template <class T>
+
+ +
5118 {
+
5119 public:
+
5120 basic_si_reference_delimiter(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
+
5121
+
5122 protected:
+
5123 virtual bool do_match(
+
5124 _In_reads_or_z_opt_(end) const T* text,
+
5125 _In_ size_t start = 0,
+
5126 _In_ size_t end = SIZE_MAX,
+
5127 _In_ int flags = match_default)
+
5128 {
+
5129 _Assume_(text || start >= end);
+
5130 if (start < end && text[start] == '-') {
+
5131 this->interval.end = (this->interval.start = start) + 1;
+
5132 return true;
+
5133 }
+
5134 this->interval.invalidate();
+
5135 return false;
+
5136 }
+
5137 };
-
5159
- - -
5162#ifdef _UNICODE
- -
5164#else
- -
5166#endif
- -
5168
-
5176 template <class T>
-
- -
5178 {
-
5179 public:
- -
5181 _In_ const std::shared_ptr<basic_parser<T>>& space,
-
5182 _In_ const std::locale& locale = std::locale()) :
- -
5184 part1(locale),
-
5185 part2(locale),
-
5186 part3(locale),
-
5187 is_valid(false),
-
5188 m_space(space),
-
5189 m_delimiter(locale)
-
5190 {
-
5191 this->model[0] = 0;
-
5192 }
-
5193
-
5194 virtual void invalidate()
+
5138
+ + +
5141#ifdef _UNICODE
+ +
5143#else
+ +
5145#endif
+ +
5147
+
5155 template <class T>
+
+ +
5157 {
+
5158 public:
+ +
5160 _In_ const std::shared_ptr<basic_parser<T>>& space,
+
5161 _In_ const std::locale& locale = std::locale()) :
+ +
5163 part1(locale),
+
5164 part2(locale),
+
5165 part3(locale),
+
5166 is_valid(false),
+
5167 m_space(space),
+
5168 m_delimiter(locale)
+
5169 {
+
5170 this->model[0] = 0;
+
5171 }
+
5172
+
5173 virtual void invalidate()
+
5174 {
+
5175 this->model[0] = 0;
+
5176 this->part1.invalidate();
+
5177 this->part2.invalidate();
+
5178 this->part3.invalidate();
+
5179 this->is_valid = false;
+ +
5181 }
+
5182
+
5183 T model[3];
+ + + + +
5188
+
5189 protected:
+
5190 virtual bool do_match(
+
5191 _In_reads_or_z_opt_(end) const T* text,
+
5192 _In_ size_t start = 0,
+
5193 _In_ size_t end = SIZE_MAX,
+
5194 _In_ int flags = match_default)
5195 {
-
5196 this->model[0] = 0;
-
5197 this->part1.invalidate();
-
5198 this->part2.invalidate();
-
5199 this->part3.invalidate();
-
5200 this->is_valid = false;
- -
5202 }
-
5203
-
5204 T model[3];
- - - - -
5209
-
5210 protected:
-
5211 virtual bool do_match(
-
5212 _In_reads_or_z_opt_(end) const T* text,
-
5213 _In_ size_t start = 0,
-
5214 _In_ size_t end = SIZE_MAX,
-
5215 _In_ int flags = match_default)
-
5216 {
-
5217 _Assume_(text || start >= end);
-
5218 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
-
5219 const bool case_insensitive = flags & match_case_insensitive ? true : false;
-
5220
-
5221 this->interval.end = start;
-
5222 if (this->interval.end + 1 >= end ||
-
5223 (case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end]) != 'S' ||
-
5224 (case_insensitive ? ctype.toupper(text[this->interval.end + 1]) : text[this->interval.end + 1]) != 'I')
-
5225 goto error; // incomplete or wrong reference ID
-
5226 this->interval.end += 2;
-
5227
-
5228 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
-
5229 if (this->interval.end >= end || text[this->interval.end] < '0' || '9' < text[this->interval.end])
-
5230 goto error; // incomplete or invalid model
-
5231 this->model[i] = text[this->interval.end];
-
5232 }
-
5233 this->model[2] = 0;
-
5234
-
5235 this->part1.invalidate();
-
5236 this->part2.invalidate();
-
5237 this->part3.invalidate();
-
5238 if (this->model[0] == '9' && this->model[1] == '9') {
-
5239 is_valid = true;
-
5240 this->interval.start = start;
-
5241 return true;
-
5242 }
-
5243
-
5244 if (m_space && m_space->match(text, this->interval.end, end, flags))
-
5245 this->interval.end = m_space->interval.end;
-
5246
-
5247 this->part1.match(text, this->interval.end, end, flags) &&
-
5248 this->m_delimiter.match(text, this->part1.interval.end, end, flags) &&
-
5249 this->part2.match(text, this->m_delimiter.interval.end, end, flags) &&
-
5250 this->m_delimiter.match(text, this->part2.interval.end, end, flags) &&
-
5251 this->part3.match(text, this->m_delimiter.interval.end, end, flags);
-
5252
-
5253 this->interval.start = start;
-
5254 if (this->part3.interval)
-
5255 this->interval.end = this->part3.interval.end;
-
5256 else if (this->part2.interval)
-
5257 this->interval.end = this->part2.interval.end;
-
5258 else if (this->part1.interval)
-
5259 this->interval.end = this->part1.interval.end;
-
5260 else
-
5261 this->interval.end = start + 4;
-
5262
-
5263 if (this->model[0] == '0' && this->model[1] == '0')
-
5264 is_valid =
-
5265 this->part3.interval ?
-
5266 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
-
5267 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 :
-
5268 this->part2.interval ?
-
5269 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
-
5270 this->part1.interval.size() + this->part2.interval.size() <= 20 :
-
5271 this->part1.interval ?
-
5272 this->part1.interval.size() <= 12 :
-
5273 false;
-
5274 else if (this->model[0] == '0' && this->model[1] == '1')
-
5275 is_valid =
-
5276 this->part3.interval ?
-
5277 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
-
5278 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
-
5279 check11(
-
5280 text + this->part1.interval.start, this->part1.interval.size(),
-
5281 text + this->part2.interval.start, this->part2.interval.size(),
-
5282 text + this->part3.interval.start, this->part3.interval.size()) :
-
5283 this->part2.interval ?
-
5284 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
-
5285 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
-
5286 check11(
-
5287 text + this->part1.interval.start, this->part1.interval.size(),
-
5288 text + this->part2.interval.start, this->part2.interval.size()) :
-
5289 this->part1.interval ?
-
5290 this->part1.interval.size() <= 12 &&
-
5291 check11(text + this->part1.interval.start, this->part1.interval.size()) :
-
5292 false;
-
5293 else if (this->model[0] == '0' && this->model[1] == '2')
-
5294 is_valid =
-
5295 this->part3.interval ?
-
5296 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
-
5297 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
-
5298 check11(text + this->part2.interval.start, this->part2.interval.size()) &&
-
5299 check11(text + this->part3.interval.start, this->part3.interval.size()) :
-
5300 false;
-
5301 else if (this->model[0] == '0' && this->model[1] == '3')
-
5302 is_valid =
-
5303 this->part3.interval ?
-
5304 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
-
5305 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
-
5306 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
-
5307 check11(text + this->part2.interval.start, this->part2.interval.size()) &&
-
5308 check11(text + this->part3.interval.start, this->part3.interval.size()) :
-
5309 false;
-
5310 else if (this->model[0] == '0' && this->model[1] == '4')
-
5311 is_valid =
-
5312 this->part3.interval ?
-
5313 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
-
5314 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
-
5315 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
-
5316 check11(text + this->part3.interval.start, this->part3.interval.size()) :
-
5317 false;
-
5318 else if ((this->model[0] == '0' || this->model[0] == '5') && this->model[1] == '5')
-
5319 is_valid =
-
5320 this->part3.interval ?
-
5321 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
-
5322 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
-
5323 check11(text + this->part1.interval.start, this->part1.interval.size()) :
-
5324 this->part2.interval ?
-
5325 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
-
5326 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
-
5327 check11(text + this->part1.interval.start, this->part1.interval.size()) :
-
5328 this->part1.interval ?
-
5329 this->part1.interval.size() <= 12 &&
-
5330 check11(text + this->part1.interval.start, this->part1.interval.size()) :
-
5331 false;
-
5332 else if (this->model[0] == '0' && this->model[1] == '6')
-
5333 is_valid =
-
5334 this->part3.interval ?
-
5335 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
-
5336 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
-
5337 check11(
-
5338 text + this->part2.interval.start, this->part2.interval.size(),
-
5339 text + this->part3.interval.start, this->part3.interval.size()) :
-
5340 this->part2.interval ?
-
5341 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
-
5342 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
-
5343 check11(text + this->part2.interval.start, this->part2.interval.size()) :
+
5196 _Assume_(text || start >= end);
+
5197 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
+
5198 const bool case_insensitive = flags & match_case_insensitive ? true : false;
+
5199
+
5200 this->interval.end = start;
+
5201 if (this->interval.end + 1 >= end ||
+
5202 (case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end]) != 'S' ||
+
5203 (case_insensitive ? ctype.toupper(text[this->interval.end + 1]) : text[this->interval.end + 1]) != 'I')
+
5204 goto error; // incomplete or wrong reference ID
+
5205 this->interval.end += 2;
+
5206
+
5207 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
+
5208 if (this->interval.end >= end || text[this->interval.end] < '0' || '9' < text[this->interval.end])
+
5209 goto error; // incomplete or invalid model
+
5210 this->model[i] = text[this->interval.end];
+
5211 }
+
5212 this->model[2] = 0;
+
5213
+
5214 this->part1.invalidate();
+
5215 this->part2.invalidate();
+
5216 this->part3.invalidate();
+
5217 if (this->model[0] == '9' && this->model[1] == '9') {
+
5218 is_valid = true;
+
5219 this->interval.start = start;
+
5220 return true;
+
5221 }
+
5222
+
5223 if (m_space && m_space->match(text, this->interval.end, end, flags))
+
5224 this->interval.end = m_space->interval.end;
+
5225
+
5226 this->part1.match(text, this->interval.end, end, flags) &&
+
5227 this->m_delimiter.match(text, this->part1.interval.end, end, flags) &&
+
5228 this->part2.match(text, this->m_delimiter.interval.end, end, flags) &&
+
5229 this->m_delimiter.match(text, this->part2.interval.end, end, flags) &&
+
5230 this->part3.match(text, this->m_delimiter.interval.end, end, flags);
+
5231
+
5232 this->interval.start = start;
+
5233 if (this->part3.interval)
+
5234 this->interval.end = this->part3.interval.end;
+
5235 else if (this->part2.interval)
+
5236 this->interval.end = this->part2.interval.end;
+
5237 else if (this->part1.interval)
+
5238 this->interval.end = this->part1.interval.end;
+
5239 else
+
5240 this->interval.end = start + 4;
+
5241
+
5242 if (this->model[0] == '0' && this->model[1] == '0')
+
5243 is_valid =
+
5244 this->part3.interval ?
+
5245 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
+
5246 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 :
+
5247 this->part2.interval ?
+
5248 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
+
5249 this->part1.interval.size() + this->part2.interval.size() <= 20 :
+
5250 this->part1.interval ?
+
5251 this->part1.interval.size() <= 12 :
+
5252 false;
+
5253 else if (this->model[0] == '0' && this->model[1] == '1')
+
5254 is_valid =
+
5255 this->part3.interval ?
+
5256 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
+
5257 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
+
5258 check11(
+
5259 text + this->part1.interval.start, this->part1.interval.size(),
+
5260 text + this->part2.interval.start, this->part2.interval.size(),
+
5261 text + this->part3.interval.start, this->part3.interval.size()) :
+
5262 this->part2.interval ?
+
5263 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
+
5264 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
+
5265 check11(
+
5266 text + this->part1.interval.start, this->part1.interval.size(),
+
5267 text + this->part2.interval.start, this->part2.interval.size()) :
+
5268 this->part1.interval ?
+
5269 this->part1.interval.size() <= 12 &&
+
5270 check11(text + this->part1.interval.start, this->part1.interval.size()) :
+
5271 false;
+
5272 else if (this->model[0] == '0' && this->model[1] == '2')
+
5273 is_valid =
+
5274 this->part3.interval ?
+
5275 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
+
5276 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
+
5277 check11(text + this->part2.interval.start, this->part2.interval.size()) &&
+
5278 check11(text + this->part3.interval.start, this->part3.interval.size()) :
+
5279 false;
+
5280 else if (this->model[0] == '0' && this->model[1] == '3')
+
5281 is_valid =
+
5282 this->part3.interval ?
+
5283 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
+
5284 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
+
5285 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
+
5286 check11(text + this->part2.interval.start, this->part2.interval.size()) &&
+
5287 check11(text + this->part3.interval.start, this->part3.interval.size()) :
+
5288 false;
+
5289 else if (this->model[0] == '0' && this->model[1] == '4')
+
5290 is_valid =
+
5291 this->part3.interval ?
+
5292 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
+
5293 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
+
5294 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
+
5295 check11(text + this->part3.interval.start, this->part3.interval.size()) :
+
5296 false;
+
5297 else if ((this->model[0] == '0' || this->model[0] == '5') && this->model[1] == '5')
+
5298 is_valid =
+
5299 this->part3.interval ?
+
5300 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
+
5301 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
+
5302 check11(text + this->part1.interval.start, this->part1.interval.size()) :
+
5303 this->part2.interval ?
+
5304 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
+
5305 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
+
5306 check11(text + this->part1.interval.start, this->part1.interval.size()) :
+
5307 this->part1.interval ?
+
5308 this->part1.interval.size() <= 12 &&
+
5309 check11(text + this->part1.interval.start, this->part1.interval.size()) :
+
5310 false;
+
5311 else if (this->model[0] == '0' && this->model[1] == '6')
+
5312 is_valid =
+
5313 this->part3.interval ?
+
5314 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
+
5315 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
+
5316 check11(
+
5317 text + this->part2.interval.start, this->part2.interval.size(),
+
5318 text + this->part3.interval.start, this->part3.interval.size()) :
+
5319 this->part2.interval ?
+
5320 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
+
5321 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
+
5322 check11(text + this->part2.interval.start, this->part2.interval.size()) :
+
5323 false;
+
5324 else if (this->model[0] == '0' && this->model[1] == '7')
+
5325 is_valid =
+
5326 this->part3.interval ?
+
5327 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
+
5328 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
+
5329 check11(text + this->part2.interval.start, this->part2.interval.size()) :
+
5330 this->part2.interval ?
+
5331 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
+
5332 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
+
5333 check11(text + this->part2.interval.start, this->part2.interval.size()) :
+
5334 false;
+
5335 else if (this->model[0] == '0' && this->model[1] == '8')
+
5336 is_valid =
+
5337 this->part3.interval ?
+
5338 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
+
5339 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
+
5340 check11(
+
5341 text + this->part1.interval.start, this->part1.interval.size(),
+
5342 text + this->part2.interval.start, this->part2.interval.size()) &&
+
5343 check11(text + this->part3.interval.start, this->part3.interval.size()) :
5344 false;
-
5345 else if (this->model[0] == '0' && this->model[1] == '7')
+
5345 else if (this->model[0] == '0' && this->model[1] == '9')
5346 is_valid =
5347 this->part3.interval ?
5348 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
5349 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
-
5350 check11(text + this->part2.interval.start, this->part2.interval.size()) :
-
5351 this->part2.interval ?
-
5352 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
-
5353 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
-
5354 check11(text + this->part2.interval.start, this->part2.interval.size()) :
-
5355 false;
-
5356 else if (this->model[0] == '0' && this->model[1] == '8')
-
5357 is_valid =
-
5358 this->part3.interval ?
-
5359 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
-
5360 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
-
5361 check11(
-
5362 text + this->part1.interval.start, this->part1.interval.size(),
-
5363 text + this->part2.interval.start, this->part2.interval.size()) &&
-
5364 check11(text + this->part3.interval.start, this->part3.interval.size()) :
-
5365 false;
-
5366 else if (this->model[0] == '0' && this->model[1] == '9')
-
5367 is_valid =
-
5368 this->part3.interval ?
-
5369 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
-
5370 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
-
5371 check11(
-
5372 text + this->part1.interval.start, this->part1.interval.size(),
-
5373 text + this->part2.interval.start, this->part2.interval.size()) :
-
5374 this->part2.interval ?
-
5375 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
-
5376 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
-
5377 check11(
-
5378 text + this->part1.interval.start, this->part1.interval.size(),
-
5379 text + this->part2.interval.start, this->part2.interval.size()) :
-
5380 this->part1.interval ?
-
5381 this->part1.interval.size() <= 12 &&
-
5382 check11(text + this->part1.interval.start, this->part1.interval.size()) :
-
5383 false;
-
5384 else if (this->model[0] == '1' && this->model[1] == '0')
-
5385 is_valid =
-
5386 this->part3.interval ?
-
5387 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
-
5388 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
-
5389 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
-
5390 check11(
-
5391 text + this->part2.interval.start, this->part2.interval.size(),
-
5392 text + this->part3.interval.start, this->part3.interval.size()) :
-
5393 this->part2.interval ?
-
5394 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
-
5395 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
-
5396 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
-
5397 check11(text + this->part2.interval.start, this->part2.interval.size()) :
-
5398 false;
-
5399 else if (
-
5400 (this->model[0] == '1' && (this->model[1] == '1' || this->model[1] == '8' || this->model[1] == '9')) ||
-
5401 ((this->model[0] == '2' || this->model[0] == '3') && this->model[1] == '8') ||
-
5402 (this->model[0] == '4' && (this->model[1] == '0' || this->model[1] == '1' || this->model[1] == '8' || this->model[1] == '9')) ||
-
5403 (this->model[0] == '5' && (this->model[1] == '1' || this->model[1] == '8')))
+
5350 check11(
+
5351 text + this->part1.interval.start, this->part1.interval.size(),
+
5352 text + this->part2.interval.start, this->part2.interval.size()) :
+
5353 this->part2.interval ?
+
5354 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
+
5355 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
+
5356 check11(
+
5357 text + this->part1.interval.start, this->part1.interval.size(),
+
5358 text + this->part2.interval.start, this->part2.interval.size()) :
+
5359 this->part1.interval ?
+
5360 this->part1.interval.size() <= 12 &&
+
5361 check11(text + this->part1.interval.start, this->part1.interval.size()) :
+
5362 false;
+
5363 else if (this->model[0] == '1' && this->model[1] == '0')
+
5364 is_valid =
+
5365 this->part3.interval ?
+
5366 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
+
5367 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
+
5368 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
+
5369 check11(
+
5370 text + this->part2.interval.start, this->part2.interval.size(),
+
5371 text + this->part3.interval.start, this->part3.interval.size()) :
+
5372 this->part2.interval ?
+
5373 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
+
5374 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
+
5375 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
+
5376 check11(text + this->part2.interval.start, this->part2.interval.size()) :
+
5377 false;
+
5378 else if (
+
5379 (this->model[0] == '1' && (this->model[1] == '1' || this->model[1] == '8' || this->model[1] == '9')) ||
+
5380 ((this->model[0] == '2' || this->model[0] == '3') && this->model[1] == '8') ||
+
5381 (this->model[0] == '4' && (this->model[1] == '0' || this->model[1] == '1' || this->model[1] == '8' || this->model[1] == '9')) ||
+
5382 (this->model[0] == '5' && (this->model[1] == '1' || this->model[1] == '8')))
+
5383 is_valid =
+
5384 this->part3.interval ?
+
5385 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
+
5386 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
+
5387 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
+
5388 check11(text + this->part2.interval.start, this->part2.interval.size()) :
+
5389 this->part2.interval ?
+
5390 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
+
5391 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
+
5392 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
+
5393 check11(text + this->part2.interval.start, this->part2.interval.size()) :
+
5394 false;
+
5395 else if (this->model[0] == '1' && this->model[1] == '2')
+
5396 is_valid =
+
5397 this->part3.interval ? false :
+
5398 this->part2.interval ? false :
+
5399 this->part1.interval ?
+
5400 this->part1.interval.size() <= 13 &&
+
5401 check11(text + this->part1.interval.start, this->part1.interval.size()) :
+
5402 false;
+
5403 else if ((this->model[0] == '2' || this->model[0] == '3') && this->model[1] == '1')
5404 is_valid =
-
5405 this->part3.interval ?
-
5406 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
-
5407 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
-
5408 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
-
5409 check11(text + this->part2.interval.start, this->part2.interval.size()) :
-
5410 this->part2.interval ?
-
5411 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
-
5412 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
-
5413 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
-
5414 check11(text + this->part2.interval.start, this->part2.interval.size()) :
-
5415 false;
-
5416 else if (this->model[0] == '1' && this->model[1] == '2')
-
5417 is_valid =
-
5418 this->part3.interval ? false :
-
5419 this->part2.interval ? false :
-
5420 this->part1.interval ?
-
5421 this->part1.interval.size() <= 13 &&
-
5422 check11(text + this->part1.interval.start, this->part1.interval.size()) :
-
5423 false;
-
5424 else if ((this->model[0] == '2' || this->model[0] == '3') && this->model[1] == '1')
-
5425 is_valid =
-
5426 this->part3.interval ? false :
-
5427 this->part2.interval ?
-
5428 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
-
5429 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
-
5430 check11(text + this->part1.interval.start, this->part1.interval.size()) :
-
5431 false;
-
5432 else
-
5433 is_valid = true; // Assume models we don't handle as valid
-
5434 return true;
-
5435
-
5436 error:
-
5437 invalidate();
-
5438 return false;
-
5439 }
-
5440
-
5441 static bool check11(
-
5442 _In_count_(num_part1) const T* part1, _In_ size_t num_part1)
-
5443 {
-
5444 _Assume_(part1 && num_part1 >= 1);
-
5445 uint32_t nominator = 0, ponder = 2;
-
5446 for (size_t i = num_part1 - 1; i--; ++ponder)
-
5447 nominator += static_cast<uint32_t>(part1[i] - '0') * ponder;
-
5448 uint8_t control = 11 - static_cast<uint8_t>(nominator % 11);
-
5449 if (control >= 10)
-
5450 control = 0;
-
5451 return control == part1[num_part1 - 1] - '0';
-
5452 }
-
5453
-
5454 static bool check11(
-
5455 _In_count_(num_part1) const T* part1, _In_ size_t num_part1,
-
5456 _In_count_(num_part2) const T* part2, _In_ size_t num_part2)
-
5457 {
-
5458 _Assume_(part1 || !num_part1);
-
5459 _Assume_(part2 && num_part2 >= 1);
-
5460 uint32_t nominator = 0, ponder = 2;
-
5461 for (size_t i = num_part2 - 1; i--; ++ponder)
+
5405 this->part3.interval ? false :
+
5406 this->part2.interval ?
+
5407 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
+
5408 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
+
5409 check11(text + this->part1.interval.start, this->part1.interval.size()) :
+
5410 false;
+
5411 else
+
5412 is_valid = true; // Assume models we don't handle as valid
+
5413 return true;
+
5414
+
5415 error:
+
5416 invalidate();
+
5417 return false;
+
5418 }
+
5419
+
5420 static bool check11(
+
5421 _In_count_(num_part1) const T* part1, _In_ size_t num_part1)
+
5422 {
+
5423 _Assume_(part1 && num_part1 >= 1);
+
5424 uint32_t nominator = 0, ponder = 2;
+
5425 for (size_t i = num_part1 - 1; i--; ++ponder)
+
5426 nominator += static_cast<uint32_t>(part1[i] - '0') * ponder;
+
5427 uint8_t control = 11 - static_cast<uint8_t>(nominator % 11);
+
5428 if (control >= 10)
+
5429 control = 0;
+
5430 return control == part1[num_part1 - 1] - '0';
+
5431 }
+
5432
+
5433 static bool check11(
+
5434 _In_count_(num_part1) const T* part1, _In_ size_t num_part1,
+
5435 _In_count_(num_part2) const T* part2, _In_ size_t num_part2)
+
5436 {
+
5437 _Assume_(part1 || !num_part1);
+
5438 _Assume_(part2 && num_part2 >= 1);
+
5439 uint32_t nominator = 0, ponder = 2;
+
5440 for (size_t i = num_part2 - 1; i--; ++ponder)
+
5441 nominator += static_cast<uint32_t>(part2[i] - '0') * ponder;
+
5442 for (size_t i = num_part1; i--; ++ponder)
+
5443 nominator += static_cast<uint32_t>(part1[i] - '0') * ponder;
+
5444 uint8_t control = 11 - static_cast<uint8_t>(nominator % 11);
+
5445 if (control == 10)
+
5446 control = 0;
+
5447 return control == part2[num_part2 - 1] - '0';
+
5448 }
+
5449
+
5450 static bool check11(
+
5451 _In_count_(num_part1) const T* part1, _In_ size_t num_part1,
+
5452 _In_count_(num_part2) const T* part2, _In_ size_t num_part2,
+
5453 _In_count_(num_part3) const T* part3, _In_ size_t num_part3)
+
5454 {
+
5455 _Assume_(part1 || !num_part1);
+
5456 _Assume_(part2 || !num_part2);
+
5457 _Assume_(part3 && num_part3 >= 1);
+
5458 uint32_t nominator = 0, ponder = 2;
+
5459 for (size_t i = num_part3 - 1; i--; ++ponder)
+
5460 nominator += static_cast<uint32_t>(part3[i] - '0') * ponder;
+
5461 for (size_t i = num_part2; i--; ++ponder)
5462 nominator += static_cast<uint32_t>(part2[i] - '0') * ponder;
5463 for (size_t i = num_part1; i--; ++ponder)
5464 nominator += static_cast<uint32_t>(part1[i] - '0') * ponder;
5465 uint8_t control = 11 - static_cast<uint8_t>(nominator % 11);
5466 if (control == 10)
5467 control = 0;
-
5468 return control == part2[num_part2 - 1] - '0';
+
5468 return control == part2[num_part3 - 1] - '0';
5469 }
5470
-
5471 static bool check11(
-
5472 _In_count_(num_part1) const T* part1, _In_ size_t num_part1,
-
5473 _In_count_(num_part2) const T* part2, _In_ size_t num_part2,
-
5474 _In_count_(num_part3) const T* part3, _In_ size_t num_part3)
-
5475 {
-
5476 _Assume_(part1 || !num_part1);
-
5477 _Assume_(part2 || !num_part2);
-
5478 _Assume_(part3 && num_part3 >= 1);
-
5479 uint32_t nominator = 0, ponder = 2;
-
5480 for (size_t i = num_part3 - 1; i--; ++ponder)
-
5481 nominator += static_cast<uint32_t>(part3[i] - '0') * ponder;
-
5482 for (size_t i = num_part2; i--; ++ponder)
-
5483 nominator += static_cast<uint32_t>(part2[i] - '0') * ponder;
-
5484 for (size_t i = num_part1; i--; ++ponder)
-
5485 nominator += static_cast<uint32_t>(part1[i] - '0') * ponder;
-
5486 uint8_t control = 11 - static_cast<uint8_t>(nominator % 11);
-
5487 if (control == 10)
-
5488 control = 0;
-
5489 return control == part2[num_part3 - 1] - '0';
-
5490 }
-
5491
-
5492 std::shared_ptr<basic_parser<T>> m_space;
-
5493 basic_si_reference_delimiter<T> m_delimiter;
-
5494 };
+
5471 std::shared_ptr<basic_parser<T>> m_space;
+
5472 basic_si_reference_delimiter<T> m_delimiter;
+
5473 };
-
5495
-
5496 using si_reference = basic_si_reference<char>;
-
5497 using wsi_reference = basic_si_reference<wchar_t>;
-
5498#ifdef _UNICODE
-
5499 using tsi_reference = wsi_reference;
-
5500#else
-
5501 using tsi_reference = si_reference;
-
5502#endif
-
5503 using sgml_si_reference = basic_si_reference<char>;
-
5504
-
5508 template <class T>
-
- -
5510 {
-
5511 public:
- -
5513 _In_ const std::shared_ptr<basic_parser<T>>& element,
-
5514 _In_ const std::shared_ptr<basic_parser<T>>& digit,
-
5515 _In_ const std::shared_ptr<basic_parser<T>>& sign,
-
5516 _In_ const std::locale& locale = std::locale()) :
- -
5518 m_element(element),
-
5519 m_digit(digit),
-
5520 m_sign(sign),
-
5521 has_digits(false),
-
5522 has_charge(false)
-
5523 {}
-
5524
-
5525 virtual void invalidate()
-
5526 {
-
5527 has_digits = false;
-
5528 has_charge = false;
- -
5530 }
-
5531
-
5532 bool has_digits;
-
5533 bool has_charge;
-
5534
-
5535 protected:
-
5536 virtual bool do_match(
-
5537 _In_reads_or_z_opt_(end) const T* text,
-
5538 _In_ size_t start = 0,
-
5539 _In_ size_t end = SIZE_MAX,
-
5540 _In_ int flags = match_default)
-
5541 {
-
5542 _Assume_(text || start >= end);
-
5543
-
5544 has_digits = false;
-
5545 has_charge = false;
-
5546 this->interval.end = start;
-
5547
-
5548 const int element_match_flags = flags & ~match_case_insensitive; // Chemical elements are always case-sensitive.
-
5549 for (;;) {
-
5550 if (m_element->match(text, this->interval.end, end, element_match_flags)) {
-
5551 this->interval.end = m_element->interval.end;
-
5552 while (m_digit->match(text, this->interval.end, end, flags)) {
-
5553 this->interval.end = m_digit->interval.end;
-
5554 has_digits = true;
-
5555 }
-
5556 }
-
5557 else if (start < this->interval.end) {
-
5558 if (m_sign->match(text, this->interval.end, end, flags)) {
-
5559 this->interval.end = m_sign->interval.end;
-
5560 has_charge = true;
-
5561 }
-
5562 this->interval.start = start;
-
5563 return true;
-
5564 }
-
5565 else {
-
5566 this->interval.invalidate();
-
5567 return false;
-
5568 }
-
5569 }
-
5570 }
-
5571
-
5572 std::shared_ptr<basic_parser<T>> m_element;
-
5573 std::shared_ptr<basic_parser<T>> m_digit;
-
5574 std::shared_ptr<basic_parser<T>> m_sign;
-
5575 };
+
5474
+
5475 using si_reference = basic_si_reference<char>;
+
5476 using wsi_reference = basic_si_reference<wchar_t>;
+
5477#ifdef _UNICODE
+
5478 using tsi_reference = wsi_reference;
+
5479#else
+
5480 using tsi_reference = si_reference;
+
5481#endif
+
5482 using sgml_si_reference = basic_si_reference<char>;
+
5483
+
5487 template <class T>
+
+ +
5489 {
+
5490 public:
+ +
5492 _In_ const std::shared_ptr<basic_parser<T>>& element,
+
5493 _In_ const std::shared_ptr<basic_parser<T>>& digit,
+
5494 _In_ const std::shared_ptr<basic_parser<T>>& sign,
+
5495 _In_ const std::locale& locale = std::locale()) :
+ +
5497 m_element(element),
+
5498 m_digit(digit),
+
5499 m_sign(sign),
+
5500 has_digits(false),
+
5501 has_charge(false)
+
5502 {}
+
5503
+
5504 virtual void invalidate()
+
5505 {
+
5506 has_digits = false;
+
5507 has_charge = false;
+ +
5509 }
+
5510
+
5511 bool has_digits;
+
5512 bool has_charge;
+
5513
+
5514 protected:
+
5515 virtual bool do_match(
+
5516 _In_reads_or_z_opt_(end) const T* text,
+
5517 _In_ size_t start = 0,
+
5518 _In_ size_t end = SIZE_MAX,
+
5519 _In_ int flags = match_default)
+
5520 {
+
5521 _Assume_(text || start >= end);
+
5522
+
5523 has_digits = false;
+
5524 has_charge = false;
+
5525 this->interval.end = start;
+
5526
+
5527 const int element_match_flags = flags & ~match_case_insensitive; // Chemical elements are always case-sensitive.
+
5528 for (;;) {
+
5529 if (m_element->match(text, this->interval.end, end, element_match_flags)) {
+
5530 this->interval.end = m_element->interval.end;
+
5531 while (m_digit->match(text, this->interval.end, end, flags)) {
+
5532 this->interval.end = m_digit->interval.end;
+
5533 has_digits = true;
+
5534 }
+
5535 }
+
5536 else if (start < this->interval.end) {
+
5537 if (m_sign->match(text, this->interval.end, end, flags)) {
+
5538 this->interval.end = m_sign->interval.end;
+
5539 has_charge = true;
+
5540 }
+
5541 this->interval.start = start;
+
5542 return true;
+
5543 }
+
5544 else {
+
5545 this->interval.invalidate();
+
5546 return false;
+
5547 }
+
5548 }
+
5549 }
+
5550
+
5551 std::shared_ptr<basic_parser<T>> m_element;
+
5552 std::shared_ptr<basic_parser<T>> m_digit;
+
5553 std::shared_ptr<basic_parser<T>> m_sign;
+
5554 };
+
+
5555
+ + +
5558#ifdef _UNICODE
+ +
5560#else
+ +
5562#endif
+ +
5564
+
+ +
5569 {
+
5570 protected:
+
5571 virtual bool do_match(
+
5572 _In_reads_or_z_(end) const char* text,
+
5573 _In_ size_t start = 0,
+
5574 _In_ size_t end = SIZE_MAX,
+
5575 _In_ int flags = match_default)
+
5576 {
+
5577 _Assume_(text || start >= end);
+
5578 this->interval.end = start;
+
5579
+
5580 _Assume_(text || this->interval.end >= end);
+
5581 if (this->interval.end < end && text[this->interval.end]) {
+
5582 if (text[this->interval.end] == '\r') {
+
5583 this->interval.end++;
+
5584 if (this->interval.end < end && text[this->interval.end] == '\n') {
+
5585 this->interval.start = start;
+
5586 this->interval.end++;
+
5587 return true;
+
5588 }
+
5589 }
+
5590 else if (text[this->interval.end] == '\n') {
+
5591 this->interval.start = start;
+
5592 this->interval.end++;
+
5593 return true;
+
5594 }
+
5595 }
+
5596 this->interval.invalidate();
+
5597 return false;
+
5598 }
+
5599 };
-
5576
- - -
5579#ifdef _UNICODE
- -
5581#else
- -
5583#endif
- -
5585
-
- -
5590 {
-
5591 protected:
-
5592 virtual bool do_match(
-
5593 _In_reads_or_z_(end) const char* text,
-
5594 _In_ size_t start = 0,
-
5595 _In_ size_t end = SIZE_MAX,
-
5596 _In_ int flags = match_default)
-
5597 {
-
5598 _Assume_(text || start >= end);
-
5599 this->interval.end = start;
5600
-
5601 _Assume_(text || this->interval.end >= end);
-
5602 if (this->interval.end < end && text[this->interval.end]) {
-
5603 if (text[this->interval.end] == '\r') {
-
5604 this->interval.end++;
-
5605 if (this->interval.end < end && text[this->interval.end] == '\n') {
-
5606 this->interval.start = start;
-
5607 this->interval.end++;
-
5608 return true;
-
5609 }
-
5610 }
-
5611 else if (text[this->interval.end] == '\n') {
-
5612 this->interval.start = start;
-
5613 this->interval.end++;
-
5614 return true;
-
5615 }
-
5616 }
-
5617 this->interval.invalidate();
-
5618 return false;
-
5619 }
-
5620 };
+
+
5604 class http_space : public parser
+
5605 {
+
5606 protected:
+
5607 virtual bool do_match(
+
5608 _In_reads_or_z_(end) const char* text,
+
5609 _In_ size_t start = 0,
+
5610 _In_ size_t end = SIZE_MAX,
+
5611 _In_ int flags = match_default)
+
5612 {
+
5613 _Assume_(text || start >= end);
+
5614 this->interval.end = start;
+
5615 if (m_line_break.match(text, this->interval.end, end, flags)) {
+
5616 this->interval.end = m_line_break.interval.end;
+
5617 if (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) {
+
5618 this->interval.start = start;
+
5619 this->interval.end++;
+
5620 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
+
5621 return true;
+
5622 }
+
5623 }
+
5624 else if (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) {
+
5625 this->interval.start = start;
+
5626 this->interval.end++;
+
5627 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
+
5628 return true;
+
5629 }
+
5630 this->interval.invalidate();
+
5631 return false;
+
5632 }
+
5633
+
5634 http_line_break m_line_break;
+
5635 };
-
5621
-
-
5625 class http_space : public parser
-
5626 {
-
5627 protected:
-
5628 virtual bool do_match(
-
5629 _In_reads_or_z_(end) const char* text,
-
5630 _In_ size_t start = 0,
-
5631 _In_ size_t end = SIZE_MAX,
-
5632 _In_ int flags = match_default)
-
5633 {
-
5634 _Assume_(text || start >= end);
-
5635 this->interval.end = start;
-
5636 if (m_line_break.match(text, this->interval.end, end, flags)) {
-
5637 this->interval.end = m_line_break.interval.end;
-
5638 if (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) {
-
5639 this->interval.start = start;
-
5640 this->interval.end++;
-
5641 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
-
5642 return true;
-
5643 }
-
5644 }
-
5645 else if (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) {
-
5646 this->interval.start = start;
-
5647 this->interval.end++;
-
5648 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
-
5649 return true;
-
5650 }
-
5651 this->interval.invalidate();
-
5652 return false;
-
5653 }
-
5654
-
5655 http_line_break m_line_break;
-
5656 };
+
5636
+
+
5640 class http_text_char : public parser
+
5641 {
+
5642 protected:
+
5643 virtual bool do_match(
+
5644 _In_reads_or_z_(end) const char* text,
+
5645 _In_ size_t start = 0,
+
5646 _In_ size_t end = SIZE_MAX,
+
5647 _In_ int flags = match_default)
+
5648 {
+
5649 _Assume_(text || start >= end);
+
5650 this->interval.end = start;
+
5651
+
5652 _Assume_(text || this->interval.end >= end);
+
5653 if (m_space.match(text, this->interval.end, end, flags)) {
+
5654 this->interval.start = start;
+
5655 this->interval.end = m_space.interval.end;
+
5656 return true;
+
5657 }
+
5658 else if (this->interval.end < end && text[this->interval.end] && text[this->interval.end] >= 0x20) {
+
5659 this->interval.start = start;
+
5660 this->interval.end++;
+
5661 return true;
+
5662 }
+
5663 this->interval.invalidate();
+
5664 return false;
+
5665 }
+
5666
+
5667 http_space m_space;
+
5668 };
-
5657
-
-
5661 class http_text_char : public parser
-
5662 {
-
5663 protected:
-
5664 virtual bool do_match(
-
5665 _In_reads_or_z_(end) const char* text,
-
5666 _In_ size_t start = 0,
-
5667 _In_ size_t end = SIZE_MAX,
-
5668 _In_ int flags = match_default)
-
5669 {
-
5670 _Assume_(text || start >= end);
-
5671 this->interval.end = start;
-
5672
-
5673 _Assume_(text || this->interval.end >= end);
-
5674 if (m_space.match(text, this->interval.end, end, flags)) {
-
5675 this->interval.start = start;
-
5676 this->interval.end = m_space.interval.end;
-
5677 return true;
-
5678 }
-
5679 else if (this->interval.end < end && text[this->interval.end] && text[this->interval.end] >= 0x20) {
-
5680 this->interval.start = start;
-
5681 this->interval.end++;
-
5682 return true;
-
5683 }
-
5684 this->interval.invalidate();
-
5685 return false;
-
5686 }
-
5687
-
5688 http_space m_space;
-
5689 };
+
5669
+
+
5673 class http_token : public parser
+
5674 {
+
5675 protected:
+
5676 virtual bool do_match(
+
5677 _In_reads_or_z_(end) const char* text,
+
5678 _In_ size_t start = 0,
+
5679 _In_ size_t end = SIZE_MAX,
+
5680 _In_ int flags = match_default)
+
5681 {
+
5682 _Assume_(text || start >= end);
+
5683 this->interval.end = start;
+
5684 for (;;) {
+
5685 if (this->interval.end < end && text[this->interval.end]) {
+
5686 if ((unsigned int)text[this->interval.end] < 0x20 ||
+
5687 (unsigned int)text[this->interval.end] == 0x7f ||
+
5688 text[this->interval.end] == '(' ||
+
5689 text[this->interval.end] == ')' ||
+
5690 text[this->interval.end] == '<' ||
+
5691 text[this->interval.end] == '>' ||
+
5692 text[this->interval.end] == '@' ||
+
5693 text[this->interval.end] == ',' ||
+
5694 text[this->interval.end] == ';' ||
+
5695 text[this->interval.end] == ':' ||
+
5696 text[this->interval.end] == '\\' ||
+
5697 text[this->interval.end] == '\"' ||
+
5698 text[this->interval.end] == '/' ||
+
5699 text[this->interval.end] == '[' ||
+
5700 text[this->interval.end] == ']' ||
+
5701 text[this->interval.end] == '?' ||
+
5702 text[this->interval.end] == '=' ||
+
5703 text[this->interval.end] == '{' ||
+
5704 text[this->interval.end] == '}' ||
+
5705 stdex::isspace(text[this->interval.end]))
+
5706 break;
+
5707 else
+
5708 this->interval.end++;
+
5709 }
+
5710 else
+
5711 break;
+
5712 }
+ +
5714 this->interval.start = start;
+
5715 return true;
+
5716 }
+
5717 else {
+
5718 this->interval.invalidate();
+
5719 return false;
+
5720 }
+
5721 }
+
5722 };
-
5690
-
-
5694 class http_token : public parser
-
5695 {
-
5696 protected:
-
5697 virtual bool do_match(
-
5698 _In_reads_or_z_(end) const char* text,
-
5699 _In_ size_t start = 0,
-
5700 _In_ size_t end = SIZE_MAX,
-
5701 _In_ int flags = match_default)
-
5702 {
-
5703 _Assume_(text || start >= end);
-
5704 this->interval.end = start;
-
5705 for (;;) {
-
5706 if (this->interval.end < end && text[this->interval.end]) {
-
5707 if ((unsigned int)text[this->interval.end] < 0x20 ||
-
5708 (unsigned int)text[this->interval.end] == 0x7f ||
-
5709 text[this->interval.end] == '(' ||
-
5710 text[this->interval.end] == ')' ||
-
5711 text[this->interval.end] == '<' ||
-
5712 text[this->interval.end] == '>' ||
-
5713 text[this->interval.end] == '@' ||
-
5714 text[this->interval.end] == ',' ||
-
5715 text[this->interval.end] == ';' ||
-
5716 text[this->interval.end] == ':' ||
-
5717 text[this->interval.end] == '\\' ||
-
5718 text[this->interval.end] == '\"' ||
-
5719 text[this->interval.end] == '/' ||
-
5720 text[this->interval.end] == '[' ||
-
5721 text[this->interval.end] == ']' ||
-
5722 text[this->interval.end] == '?' ||
-
5723 text[this->interval.end] == '=' ||
-
5724 text[this->interval.end] == '{' ||
-
5725 text[this->interval.end] == '}' ||
-
5726 stdex::isspace(text[this->interval.end]))
-
5727 break;
-
5728 else
-
5729 this->interval.end++;
-
5730 }
-
5731 else
-
5732 break;
-
5733 }
- -
5735 this->interval.start = start;
-
5736 return true;
-
5737 }
-
5738 else {
-
5739 this->interval.invalidate();
-
5740 return false;
-
5741 }
-
5742 }
-
5743 };
+
5723
+
+ +
5728 {
+
5729 public:
+
5730 virtual void invalidate()
+
5731 {
+
5732 content.start = 1;
+
5733 content.end = 0;
+
5734 parser::invalidate();
+
5735 }
+
5736
+ +
5738
+
5739 protected:
+
5740 virtual bool do_match(
+
5741 _In_reads_or_z_(end) const char* text,
+
5742 _In_ size_t start = 0,
+
5743 _In_ size_t end = SIZE_MAX,
+
5744 _In_ int flags = match_default)
+
5745 {
+
5746 _Assume_(text || start >= end);
+
5747 this->interval.end = start;
+
5748 if (this->interval.end < end && text[this->interval.end] != '"')
+
5749 goto error;
+
5750 this->interval.end++;
+
5751 content.start = this->interval.end;
+
5752 for (;;) {
+
5753 _Assume_(text || this->interval.end >= end);
+
5754 if (this->interval.end < end && text[this->interval.end]) {
+
5755 if (text[this->interval.end] == '"') {
+
5756 content.end = this->interval.end;
+
5757 this->interval.end++;
+
5758 break;
+
5759 }
+
5760 else if (text[this->interval.end] == '\\') {
+
5761 this->interval.end++;
+
5762 if (this->interval.end < end && text[this->interval.end]) {
+
5763 this->interval.end++;
+
5764 }
+
5765 else
+
5766 goto error;
+
5767 }
+
5768 else if (m_chr.match(text, this->interval.end, end, flags))
+
5769 this->interval.end++;
+
5770 else
+
5771 goto error;
+
5772 }
+
5773 else
+
5774 goto error;
+
5775 }
+
5776 this->interval.start = start;
+
5777 return true;
+
5778
+
5779 error:
+
5780 invalidate();
+
5781 return false;
+
5782 }
+
5783
+
5784 http_text_char m_chr;
+
5785 };
-
5744
-
- -
5749 {
-
5750 public:
-
5751 virtual void invalidate()
-
5752 {
-
5753 content.start = 1;
-
5754 content.end = 0;
-
5755 parser::invalidate();
-
5756 }
-
5757
- -
5759
-
5760 protected:
-
5761 virtual bool do_match(
-
5762 _In_reads_or_z_(end) const char* text,
-
5763 _In_ size_t start = 0,
-
5764 _In_ size_t end = SIZE_MAX,
-
5765 _In_ int flags = match_default)
-
5766 {
-
5767 _Assume_(text || start >= end);
-
5768 this->interval.end = start;
-
5769 if (this->interval.end < end && text[this->interval.end] != '"')
-
5770 goto error;
-
5771 this->interval.end++;
-
5772 content.start = this->interval.end;
-
5773 for (;;) {
-
5774 _Assume_(text || this->interval.end >= end);
-
5775 if (this->interval.end < end && text[this->interval.end]) {
-
5776 if (text[this->interval.end] == '"') {
-
5777 content.end = this->interval.end;
-
5778 this->interval.end++;
-
5779 break;
-
5780 }
-
5781 else if (text[this->interval.end] == '\\') {
-
5782 this->interval.end++;
-
5783 if (this->interval.end < end && text[this->interval.end]) {
-
5784 this->interval.end++;
-
5785 }
-
5786 else
-
5787 goto error;
-
5788 }
-
5789 else if (m_chr.match(text, this->interval.end, end, flags))
-
5790 this->interval.end++;
-
5791 else
-
5792 goto error;
-
5793 }
-
5794 else
-
5795 goto error;
-
5796 }
-
5797 this->interval.start = start;
-
5798 return true;
+
5786
+
+
5790 class http_value : public parser
+
5791 {
+
5792 public:
+
5793 virtual void invalidate()
+
5794 {
+
5795 string.invalidate();
+
5796 token.invalidate();
+
5797 parser::invalidate();
+
5798 }
5799
-
5800 error:
-
5801 invalidate();
-
5802 return false;
-
5803 }
-
5804
-
5805 http_text_char m_chr;
-
5806 };
+ + +
5802
+
5803 protected:
+
5804 virtual bool do_match(
+
5805 _In_reads_or_z_(end) const char* text,
+
5806 _In_ size_t start = 0,
+
5807 _In_ size_t end = SIZE_MAX,
+
5808 _In_ int flags = match_default)
+
5809 {
+
5810 _Assume_(text || start >= end);
+
5811 this->interval.end = start;
+
5812 if (string.match(text, this->interval.end, end, flags)) {
+
5813 token.invalidate();
+
5814 this->interval.end = string.interval.end;
+
5815 this->interval.start = start;
+
5816 return true;
+
5817 }
+
5818 else if (token.match(text, this->interval.end, end, flags)) {
+
5819 string.invalidate();
+
5820 this->interval.end = token.interval.end;
+
5821 this->interval.start = start;
+
5822 return true;
+
5823 }
+
5824 else {
+
5825 this->interval.invalidate();
+
5826 return false;
+
5827 }
+
5828 }
+
5829 };
-
5807
-
-
5811 class http_value : public parser
-
5812 {
-
5813 public:
-
5814 virtual void invalidate()
-
5815 {
-
5816 string.invalidate();
-
5817 token.invalidate();
-
5818 parser::invalidate();
-
5819 }
-
5820
- - -
5823
-
5824 protected:
-
5825 virtual bool do_match(
-
5826 _In_reads_or_z_(end) const char* text,
-
5827 _In_ size_t start = 0,
-
5828 _In_ size_t end = SIZE_MAX,
-
5829 _In_ int flags = match_default)
-
5830 {
-
5831 _Assume_(text || start >= end);
-
5832 this->interval.end = start;
-
5833 if (string.match(text, this->interval.end, end, flags)) {
-
5834 token.invalidate();
-
5835 this->interval.end = string.interval.end;
-
5836 this->interval.start = start;
-
5837 return true;
-
5838 }
-
5839 else if (token.match(text, this->interval.end, end, flags)) {
-
5840 string.invalidate();
-
5841 this->interval.end = token.interval.end;
-
5842 this->interval.start = start;
-
5843 return true;
-
5844 }
-
5845 else {
-
5846 this->interval.invalidate();
-
5847 return false;
-
5848 }
-
5849 }
-
5850 };
+
5830
+
+
5834 class http_parameter : public parser
+
5835 {
+
5836 public:
+
5837 virtual void invalidate()
+
5838 {
+
5839 name.invalidate();
+
5840 value.invalidate();
+
5841 parser::invalidate();
+
5842 }
+
5843
+ + +
5846
+
5847 protected:
+
5848 virtual bool do_match(
+
5849 _In_reads_or_z_(end) const char* text,
+
5850 _In_ size_t start = 0,
+
5851 _In_ size_t end = SIZE_MAX,
+
5852 _In_ int flags = match_default)
+
5853 {
+
5854 _Assume_(text || start >= end);
+
5855 this->interval.end = start;
+
5856 if (name.match(text, this->interval.end, end, flags))
+
5857 this->interval.end = name.interval.end;
+
5858 else
+
5859 goto error;
+
5860 while (m_space.match(text, this->interval.end, end, flags))
+
5861 this->interval.end = m_space.interval.end;
+
5862 _Assume_(text || this->interval.end >= end);
+
5863 if (this->interval.end < end && text[this->interval.end] == '=')
+
5864 this->interval.end++;
+
5865 else
+
5866 while (m_space.match(text, this->interval.end, end, flags))
+
5867 this->interval.end = m_space.interval.end;
+
5868 if (value.match(text, this->interval.end, end, flags))
+
5869 this->interval.end = value.interval.end;
+
5870 else
+
5871 goto error;
+
5872 this->interval.start = start;
+
5873 return true;
+
5874
+
5875 error:
+
5876 invalidate();
+
5877 return false;
+
5878 }
+
5879
+
5880 http_space m_space;
+
5881 };
-
5851
-
-
5855 class http_parameter : public parser
-
5856 {
-
5857 public:
-
5858 virtual void invalidate()
-
5859 {
-
5860 name.invalidate();
-
5861 value.invalidate();
-
5862 parser::invalidate();
-
5863 }
-
5864
- - -
5867
-
5868 protected:
-
5869 virtual bool do_match(
-
5870 _In_reads_or_z_(end) const char* text,
-
5871 _In_ size_t start = 0,
-
5872 _In_ size_t end = SIZE_MAX,
-
5873 _In_ int flags = match_default)
-
5874 {
-
5875 _Assume_(text || start >= end);
-
5876 this->interval.end = start;
-
5877 if (name.match(text, this->interval.end, end, flags))
-
5878 this->interval.end = name.interval.end;
-
5879 else
-
5880 goto error;
-
5881 while (m_space.match(text, this->interval.end, end, flags))
-
5882 this->interval.end = m_space.interval.end;
-
5883 _Assume_(text || this->interval.end >= end);
-
5884 if (this->interval.end < end && text[this->interval.end] == '=')
-
5885 this->interval.end++;
-
5886 else
-
5887 while (m_space.match(text, this->interval.end, end, flags))
-
5888 this->interval.end = m_space.interval.end;
-
5889 if (value.match(text, this->interval.end, end, flags))
-
5890 this->interval.end = value.interval.end;
-
5891 else
-
5892 goto error;
-
5893 this->interval.start = start;
-
5894 return true;
-
5895
-
5896 error:
-
5897 invalidate();
-
5898 return false;
-
5899 }
-
5900
-
5901 http_space m_space;
-
5902 };
+
5882
+
+
5886 class http_any_type : public parser
+
5887 {
+
5888 protected:
+
5889 virtual bool do_match(
+
5890 _In_reads_or_z_(end) const char* text,
+
5891 _In_ size_t start = 0,
+
5892 _In_ size_t end = SIZE_MAX,
+
5893 _In_ int flags = match_default)
+
5894 {
+
5895 _Assume_(text || start >= end);
+
5896 if (start + 2 < end &&
+
5897 text[start] == '*' &&
+
5898 text[start + 1] == '/' &&
+
5899 text[start + 2] == '*')
+
5900 {
+
5901 this->interval.end = (this->interval.start = start) + 3;
+
5902 return true;
+
5903 }
+
5904 else if (start < end && text[start] == '*') {
+
5905 this->interval.end = (this->interval.start = start) + 1;
+
5906 return true;
+
5907 }
+
5908 else {
+
5909 this->interval.invalidate();
+
5910 return false;
+
5911 }
+
5912 }
+
5913 };
-
5903
-
-
5907 class http_any_type : public parser
-
5908 {
-
5909 protected:
-
5910 virtual bool do_match(
-
5911 _In_reads_or_z_(end) const char* text,
-
5912 _In_ size_t start = 0,
-
5913 _In_ size_t end = SIZE_MAX,
-
5914 _In_ int flags = match_default)
-
5915 {
-
5916 _Assume_(text || start >= end);
-
5917 if (start + 2 < end &&
-
5918 text[start] == '*' &&
-
5919 text[start + 1] == '/' &&
-
5920 text[start + 2] == '*')
-
5921 {
-
5922 this->interval.end = (this->interval.start = start) + 3;
-
5923 return true;
-
5924 }
-
5925 else if (start < end && text[start] == '*') {
-
5926 this->interval.end = (this->interval.start = start) + 1;
-
5927 return true;
-
5928 }
-
5929 else {
-
5930 this->interval.invalidate();
-
5931 return false;
-
5932 }
-
5933 }
-
5934 };
+
5914
+
+ +
5919 {
+
5920 public:
+
5921 virtual void invalidate()
+
5922 {
+
5923 type.invalidate();
+
5924 subtype.invalidate();
+
5925 parser::invalidate();
+
5926 }
+
5927
+
5928 http_token type;
+
5929 http_token subtype;
+
5930
+
5931 protected:
+
5932 virtual bool do_match(
+
5933 _In_reads_or_z_(end) const char* text,
+
5934 _In_ size_t start = 0,
+
5935 _In_ size_t end = SIZE_MAX,
+
5936 _In_ int flags = match_default)
+
5937 {
+
5938 _Assume_(text || start >= end);
+
5939 this->interval.end = start;
+
5940 if (type.match(text, this->interval.end, end, flags))
+
5941 this->interval.end = type.interval.end;
+
5942 else
+
5943 goto error;
+
5944 while (m_space.match(text, this->interval.end, end, flags))
+
5945 this->interval.end = m_space.interval.end;
+
5946 if (this->interval.end < end && text[this->interval.end] == '/')
+
5947 this->interval.end++;
+
5948 else
+
5949 goto error;
+
5950 while (m_space.match(text, this->interval.end, end, flags))
+
5951 this->interval.end = m_space.interval.end;
+
5952 if (subtype.match(text, this->interval.end, end, flags))
+
5953 this->interval.end = subtype.interval.end;
+
5954 else
+
5955 goto error;
+
5956 this->interval.start = start;
+
5957 return true;
+
5958
+
5959 error:
+
5960 invalidate();
+
5961 return false;
+
5962 }
+
5963
+
5964 http_space m_space;
+
5965 };
-
5935
-
- -
5940 {
-
5941 public:
-
5942 virtual void invalidate()
-
5943 {
-
5944 type.invalidate();
-
5945 subtype.invalidate();
-
5946 parser::invalidate();
-
5947 }
-
5948
-
5949 http_token type;
-
5950 http_token subtype;
-
5951
-
5952 protected:
-
5953 virtual bool do_match(
-
5954 _In_reads_or_z_(end) const char* text,
-
5955 _In_ size_t start = 0,
-
5956 _In_ size_t end = SIZE_MAX,
-
5957 _In_ int flags = match_default)
-
5958 {
-
5959 _Assume_(text || start >= end);
-
5960 this->interval.end = start;
-
5961 if (type.match(text, this->interval.end, end, flags))
-
5962 this->interval.end = type.interval.end;
-
5963 else
-
5964 goto error;
-
5965 while (m_space.match(text, this->interval.end, end, flags))
-
5966 this->interval.end = m_space.interval.end;
-
5967 if (this->interval.end < end && text[this->interval.end] == '/')
-
5968 this->interval.end++;
-
5969 else
-
5970 goto error;
-
5971 while (m_space.match(text, this->interval.end, end, flags))
-
5972 this->interval.end = m_space.interval.end;
-
5973 if (subtype.match(text, this->interval.end, end, flags))
-
5974 this->interval.end = subtype.interval.end;
-
5975 else
-
5976 goto error;
-
5977 this->interval.start = start;
-
5978 return true;
-
5979
-
5980 error:
-
5981 invalidate();
-
5982 return false;
-
5983 }
-
5984
-
5985 http_space m_space;
-
5986 };
+
5966
+
+ +
5971 {
+
5972 public:
+
5973 virtual void invalidate()
+
5974 {
+
5975 params.clear();
+
5976 http_media_range::invalidate();
+
5977 }
+
5978
+
5979 std::list<http_parameter> params;
+
5980
+
5981 protected:
+
5982 virtual bool do_match(
+
5983 _In_reads_or_z_(end) const char* text,
+
5984 _In_ size_t start = 0,
+
5985 _In_ size_t end = SIZE_MAX,
+
5986 _In_ int flags = match_default)
+
5987 {
+
5988 _Assume_(text || start >= end);
+
5989 if (!http_media_range::do_match(text, start, end, flags))
+
5990 goto error;
+
5991 params.clear();
+
5992 for (;;) {
+
5993 if (this->interval.end < end && text[this->interval.end]) {
+
5994 if (m_space.match(text, this->interval.end, end, flags))
+
5995 this->interval.end = m_space.interval.end;
+
5996 else if (text[this->interval.end] == ';') {
+
5997 this->interval.end++;
+
5998 while (m_space.match(text, this->interval.end, end, flags))
+
5999 this->interval.end = m_space.interval.end;
+
6000 http_parameter param;
+
6001 if (param.match(text, this->interval.end, end, flags)) {
+
6002 this->interval.end = param.interval.end;
+
6003 params.push_back(std::move(param));
+
6004 }
+
6005 else
+
6006 break;
+
6007 }
+
6008 else
+
6009 break;
+
6010 }
+
6011 else
+
6012 break;
+
6013 }
+
6014 this->interval.end = params.empty() ? subtype.interval.end : params.back().interval.end;
+
6015 return true;
+
6016
+
6017 error:
+
6018 invalidate();
+
6019 return false;
+
6020 }
+
6021 };
-
5987
-
- -
5992 {
-
5993 public:
-
5994 virtual void invalidate()
-
5995 {
-
5996 params.clear();
-
5997 http_media_range::invalidate();
-
5998 }
-
5999
-
6000 std::list<http_parameter> params;
-
6001
-
6002 protected:
-
6003 virtual bool do_match(
-
6004 _In_reads_or_z_(end) const char* text,
-
6005 _In_ size_t start = 0,
-
6006 _In_ size_t end = SIZE_MAX,
-
6007 _In_ int flags = match_default)
-
6008 {
-
6009 _Assume_(text || start >= end);
-
6010 if (!http_media_range::do_match(text, start, end, flags))
-
6011 goto error;
-
6012 params.clear();
-
6013 for (;;) {
-
6014 if (this->interval.end < end && text[this->interval.end]) {
-
6015 if (m_space.match(text, this->interval.end, end, flags))
-
6016 this->interval.end = m_space.interval.end;
-
6017 else if (text[this->interval.end] == ';') {
-
6018 this->interval.end++;
-
6019 while (m_space.match(text, this->interval.end, end, flags))
-
6020 this->interval.end = m_space.interval.end;
-
6021 http_parameter param;
-
6022 if (param.match(text, this->interval.end, end, flags)) {
-
6023 this->interval.end = param.interval.end;
-
6024 params.push_back(std::move(param));
-
6025 }
-
6026 else
-
6027 break;
-
6028 }
-
6029 else
-
6030 break;
-
6031 }
-
6032 else
-
6033 break;
-
6034 }
-
6035 this->interval.end = params.empty() ? subtype.interval.end : params.back().interval.end;
-
6036 return true;
-
6037
-
6038 error:
-
6039 invalidate();
-
6040 return false;
-
6041 }
-
6042 };
+
6022
+
+ +
6027 {
+
6028 protected:
+
6029 virtual bool do_match(
+
6030 _In_reads_or_z_(end) const char* text,
+
6031 _In_ size_t start = 0,
+
6032 _In_ size_t end = SIZE_MAX,
+
6033 _In_ int flags = match_default)
+
6034 {
+
6035 _Assume_(text || start >= end);
+
6036 this->interval.end = start;
+
6037 for (;;) {
+
6038 if (this->interval.end < end && text[this->interval.end]) {
+
6039 if ((unsigned int)text[this->interval.end] < 0x20 ||
+
6040 (unsigned int)text[this->interval.end] == 0x7f ||
+
6041 text[this->interval.end] == ':' ||
+
6042 text[this->interval.end] == '/' ||
+
6043 stdex::isspace(text[this->interval.end]))
+
6044 break;
+
6045 else
+
6046 this->interval.end++;
+
6047 }
+
6048 else
+
6049 break;
+
6050 }
+ +
6052 this->interval.start = start;
+
6053 return true;
+
6054 }
+
6055 this->interval.invalidate();
+
6056 return false;
+
6057 }
+
6058 };
-
6043
-
- -
6048 {
-
6049 protected:
-
6050 virtual bool do_match(
-
6051 _In_reads_or_z_(end) const char* text,
-
6052 _In_ size_t start = 0,
-
6053 _In_ size_t end = SIZE_MAX,
-
6054 _In_ int flags = match_default)
-
6055 {
-
6056 _Assume_(text || start >= end);
-
6057 this->interval.end = start;
-
6058 for (;;) {
-
6059 if (this->interval.end < end && text[this->interval.end]) {
-
6060 if ((unsigned int)text[this->interval.end] < 0x20 ||
-
6061 (unsigned int)text[this->interval.end] == 0x7f ||
-
6062 text[this->interval.end] == ':' ||
-
6063 text[this->interval.end] == '/' ||
-
6064 stdex::isspace(text[this->interval.end]))
-
6065 break;
-
6066 else
-
6067 this->interval.end++;
-
6068 }
-
6069 else
-
6070 break;
-
6071 }
- -
6073 this->interval.start = start;
-
6074 return true;
-
6075 }
-
6076 this->interval.invalidate();
-
6077 return false;
-
6078 }
-
6079 };
+
6059
+
+
6063 class http_url_port : public parser
+
6064 {
+
6065 public:
+
6066 http_url_port(_In_ const std::locale& locale = std::locale()) :
+
6067 parser(locale),
+
6068 value(0)
+
6069 {}
+
6070
+
6071 virtual void invalidate()
+
6072 {
+
6073 value = 0;
+
6074 parser::invalidate();
+
6075 }
+
6076
+
6077 uint16_t value;
+
6078
+
6079 protected:
+
6080 virtual bool do_match(
+
6081 _In_reads_or_z_(end) const char* text,
+
6082 _In_ size_t start = 0,
+
6083 _In_ size_t end = SIZE_MAX,
+
6084 _In_ int flags = match_default)
+
6085 {
+
6086 _Assume_(text || start >= end);
+
6087 value = 0;
+
6088 this->interval.end = start;
+
6089 for (;;) {
+
6090 if (this->interval.end < end && text[this->interval.end]) {
+
6091 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9') {
+
6092 size_t _value = static_cast<size_t>(value) * 10 + static_cast<size_t>(text[this->interval.end] - '0');
+
6093 if (_value > UINT16_MAX) {
+
6094 value = 0;
+
6095 this->interval.invalidate();
+
6096 return false;
+
6097 }
+
6098 value = (uint16_t)_value;
+
6099 this->interval.end++;
+
6100 }
+
6101 else
+
6102 break;
+
6103 }
+
6104 else
+
6105 break;
+
6106 }
+ +
6108 this->interval.start = start;
+
6109 return true;
+
6110 }
+
6111 this->interval.invalidate();
+
6112 return false;
+
6113 }
+
6114 };
-
6080
-
-
6084 class http_url_port : public parser
-
6085 {
-
6086 public:
-
6087 http_url_port(_In_ const std::locale& locale = std::locale()) :
-
6088 parser(locale),
-
6089 value(0)
-
6090 {}
-
6091
-
6092 virtual void invalidate()
-
6093 {
-
6094 value = 0;
-
6095 parser::invalidate();
-
6096 }
-
6097
-
6098 uint16_t value;
-
6099
-
6100 protected:
-
6101 virtual bool do_match(
-
6102 _In_reads_or_z_(end) const char* text,
-
6103 _In_ size_t start = 0,
-
6104 _In_ size_t end = SIZE_MAX,
-
6105 _In_ int flags = match_default)
-
6106 {
-
6107 _Assume_(text || start >= end);
-
6108 value = 0;
-
6109 this->interval.end = start;
-
6110 for (;;) {
-
6111 if (this->interval.end < end && text[this->interval.end]) {
-
6112 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9') {
-
6113 size_t _value = static_cast<size_t>(value) * 10 + static_cast<size_t>(text[this->interval.end] - '0');
-
6114 if (_value > UINT16_MAX) {
-
6115 value = 0;
-
6116 this->interval.invalidate();
-
6117 return false;
-
6118 }
-
6119 value = (uint16_t)_value;
-
6120 this->interval.end++;
-
6121 }
-
6122 else
-
6123 break;
-
6124 }
-
6125 else
-
6126 break;
-
6127 }
- -
6129 this->interval.start = start;
-
6130 return true;
-
6131 }
-
6132 this->interval.invalidate();
-
6133 return false;
-
6134 }
-
6135 };
+
6115
+
+ +
6120 {
+
6121 protected:
+
6122 virtual bool do_match(
+
6123 _In_reads_or_z_(end) const char* text,
+
6124 _In_ size_t start = 0,
+
6125 _In_ size_t end = SIZE_MAX,
+
6126 _In_ int flags = match_default)
+
6127 {
+
6128 _Assume_(text || start >= end);
+
6129 this->interval.end = start;
+
6130 for (;;) {
+
6131 if (this->interval.end < end && text[this->interval.end]) {
+
6132 if ((unsigned int)text[this->interval.end] < 0x20 ||
+
6133 (unsigned int)text[this->interval.end] == 0x7f ||
+
6134 text[this->interval.end] == '?' ||
+
6135 text[this->interval.end] == '/' ||
+
6136 stdex::isspace(text[this->interval.end]))
+
6137 break;
+
6138 else
+
6139 this->interval.end++;
+
6140 }
+
6141 else
+
6142 break;
+
6143 }
+
6144 this->interval.start = start;
+
6145 return true;
+
6146 }
+
6147 };
-
6136
-
- -
6141 {
-
6142 protected:
-
6143 virtual bool do_match(
-
6144 _In_reads_or_z_(end) const char* text,
-
6145 _In_ size_t start = 0,
-
6146 _In_ size_t end = SIZE_MAX,
-
6147 _In_ int flags = match_default)
-
6148 {
-
6149 _Assume_(text || start >= end);
-
6150 this->interval.end = start;
-
6151 for (;;) {
-
6152 if (this->interval.end < end && text[this->interval.end]) {
-
6153 if ((unsigned int)text[this->interval.end] < 0x20 ||
-
6154 (unsigned int)text[this->interval.end] == 0x7f ||
-
6155 text[this->interval.end] == '?' ||
-
6156 text[this->interval.end] == '/' ||
-
6157 stdex::isspace(text[this->interval.end]))
-
6158 break;
-
6159 else
-
6160 this->interval.end++;
-
6161 }
-
6162 else
-
6163 break;
-
6164 }
-
6165 this->interval.start = start;
-
6166 return true;
-
6167 }
-
6168 };
+
6148
+
+
6152 class http_url_path : public parser
+
6153 {
+
6154 public:
+
6155 virtual void invalidate()
+
6156 {
+
6157 segments.clear();
+
6158 parser::invalidate();
+
6159 }
+
6160
+
6161 std::vector<http_url_path_segment> segments;
+
6162
+
6163 protected:
+
6164 virtual bool do_match(
+
6165 _In_reads_or_z_(end) const char* text,
+
6166 _In_ size_t start = 0,
+
6167 _In_ size_t end = SIZE_MAX,
+
6168 _In_ int flags = match_default)
+
6169 {
+
6170 _Assume_(text || start >= end);
+ +
6172 this->interval.end = start;
+
6173 segments.clear();
+
6174 _Assume_(text || this->interval.end >= end);
+
6175 if (this->interval.end < end && text[this->interval.end] != '/')
+
6176 goto error;
+
6177 this->interval.end++;
+
6178 s.match(text, this->interval.end, end, flags);
+
6179 segments.push_back(s);
+
6180 this->interval.end = s.interval.end;
+
6181 for (;;) {
+
6182 if (this->interval.end < end && text[this->interval.end]) {
+
6183 if (text[this->interval.end] == '/') {
+
6184 this->interval.end++;
+
6185 s.match(text, this->interval.end, end, flags);
+
6186 segments.push_back(s);
+
6187 this->interval.end = s.interval.end;
+
6188 }
+
6189 else
+
6190 break;
+
6191 }
+
6192 else
+
6193 break;
+
6194 }
+
6195 this->interval.start = start;
+
6196 return true;
+
6197
+
6198 error:
+
6199 invalidate();
+
6200 return false;
+
6201 }
+
6202 };
-
6169
-
-
6173 class http_url_path : public parser
-
6174 {
-
6175 public:
-
6176 virtual void invalidate()
-
6177 {
-
6178 segments.clear();
-
6179 parser::invalidate();
-
6180 }
-
6181
-
6182 std::vector<http_url_path_segment> segments;
-
6183
-
6184 protected:
-
6185 virtual bool do_match(
-
6186 _In_reads_or_z_(end) const char* text,
-
6187 _In_ size_t start = 0,
-
6188 _In_ size_t end = SIZE_MAX,
-
6189 _In_ int flags = match_default)
-
6190 {
-
6191 _Assume_(text || start >= end);
- -
6193 this->interval.end = start;
-
6194 segments.clear();
-
6195 _Assume_(text || this->interval.end >= end);
-
6196 if (this->interval.end < end && text[this->interval.end] != '/')
-
6197 goto error;
-
6198 this->interval.end++;
-
6199 s.match(text, this->interval.end, end, flags);
-
6200 segments.push_back(s);
-
6201 this->interval.end = s.interval.end;
-
6202 for (;;) {
-
6203 if (this->interval.end < end && text[this->interval.end]) {
-
6204 if (text[this->interval.end] == '/') {
-
6205 this->interval.end++;
-
6206 s.match(text, this->interval.end, end, flags);
-
6207 segments.push_back(s);
-
6208 this->interval.end = s.interval.end;
-
6209 }
-
6210 else
-
6211 break;
-
6212 }
-
6213 else
-
6214 break;
-
6215 }
-
6216 this->interval.start = start;
-
6217 return true;
+
6203
+
+ +
6208 {
+
6209 public:
+
6210 virtual void invalidate()
+
6211 {
+
6212 name.start = 1;
+
6213 name.end = 0;
+
6214 value.start = 1;
+
6215 value.end = 0;
+
6216 parser::invalidate();
+
6217 }
6218
-
6219 error:
-
6220 invalidate();
-
6221 return false;
-
6222 }
-
6223 };
+ + +
6221
+
6222 protected:
+
6223 virtual bool do_match(
+
6224 _In_reads_or_z_(end) const char* text,
+
6225 _In_ size_t start = 0,
+
6226 _In_ size_t end = SIZE_MAX,
+
6227 _In_ int flags = match_default)
+
6228 {
+
6229 _Assume_(text || start >= end);
+
6230 this->interval.end = start;
+
6231 name.start = this->interval.end;
+
6232 for (;;) {
+
6233 if (this->interval.end < end && text[this->interval.end]) {
+
6234 if ((unsigned int)text[this->interval.end] < 0x20 ||
+
6235 (unsigned int)text[this->interval.end] == 0x7f ||
+
6236 text[this->interval.end] == '&' ||
+
6237 text[this->interval.end] == '=' ||
+
6238 stdex::isspace(text[this->interval.end]))
+
6239 break;
+
6240 else
+
6241 this->interval.end++;
+
6242 }
+
6243 else
+
6244 break;
+
6245 }
+ +
6247 name.end = this->interval.end;
+
6248 else
+
6249 goto error;
+
6250 if (text[this->interval.end] == '=') {
+
6251 this->interval.end++;
+
6252 value.start = this->interval.end;
+
6253 for (;;) {
+
6254 if (this->interval.end < end && text[this->interval.end]) {
+
6255 if ((unsigned int)text[this->interval.end] < 0x20 ||
+
6256 (unsigned int)text[this->interval.end] == 0x7f ||
+
6257 text[this->interval.end] == '&' ||
+
6258 stdex::isspace(text[this->interval.end]))
+
6259 break;
+
6260 else
+
6261 this->interval.end++;
+
6262 }
+
6263 else
+
6264 break;
+
6265 }
+
6266 value.end = this->interval.end;
+
6267 }
+
6268 else {
+
6269 value.start = 1;
+
6270 value.end = 0;
+
6271 }
+
6272 this->interval.start = start;
+
6273 return true;
+
6274
+
6275 error:
+
6276 invalidate();
+
6277 return false;
+
6278 }
+
6279 };
-
6224
-
- -
6229 {
-
6230 public:
-
6231 virtual void invalidate()
-
6232 {
-
6233 name.start = 1;
-
6234 name.end = 0;
-
6235 value.start = 1;
-
6236 value.end = 0;
-
6237 parser::invalidate();
-
6238 }
-
6239
- - -
6242
-
6243 protected:
-
6244 virtual bool do_match(
-
6245 _In_reads_or_z_(end) const char* text,
-
6246 _In_ size_t start = 0,
-
6247 _In_ size_t end = SIZE_MAX,
-
6248 _In_ int flags = match_default)
-
6249 {
-
6250 _Assume_(text || start >= end);
-
6251 this->interval.end = start;
-
6252 name.start = this->interval.end;
-
6253 for (;;) {
-
6254 if (this->interval.end < end && text[this->interval.end]) {
-
6255 if ((unsigned int)text[this->interval.end] < 0x20 ||
-
6256 (unsigned int)text[this->interval.end] == 0x7f ||
-
6257 text[this->interval.end] == '&' ||
-
6258 text[this->interval.end] == '=' ||
-
6259 stdex::isspace(text[this->interval.end]))
-
6260 break;
-
6261 else
-
6262 this->interval.end++;
-
6263 }
-
6264 else
-
6265 break;
-
6266 }
- -
6268 name.end = this->interval.end;
-
6269 else
-
6270 goto error;
-
6271 if (text[this->interval.end] == '=') {
-
6272 this->interval.end++;
-
6273 value.start = this->interval.end;
-
6274 for (;;) {
-
6275 if (this->interval.end < end && text[this->interval.end]) {
-
6276 if ((unsigned int)text[this->interval.end] < 0x20 ||
-
6277 (unsigned int)text[this->interval.end] == 0x7f ||
-
6278 text[this->interval.end] == '&' ||
-
6279 stdex::isspace(text[this->interval.end]))
-
6280 break;
-
6281 else
-
6282 this->interval.end++;
-
6283 }
-
6284 else
-
6285 break;
-
6286 }
-
6287 value.end = this->interval.end;
-
6288 }
-
6289 else {
-
6290 value.start = 1;
-
6291 value.end = 0;
-
6292 }
-
6293 this->interval.start = start;
-
6294 return true;
-
6295
-
6296 error:
-
6297 invalidate();
-
6298 return false;
+
6280
+
+
6284 class http_url : public parser
+
6285 {
+
6286 public:
+
6287 http_url(_In_ const std::locale& locale = std::locale()) :
+
6288 parser(locale),
+
6289 port(locale)
+
6290 {}
+
6291
+
6292 virtual void invalidate()
+
6293 {
+
6294 server.invalidate();
+
6295 port.invalidate();
+
6296 path.invalidate();
+
6297 params.clear();
+
6298 parser::invalidate();
6299 }
-
6300 };
+
6300
+
6301 http_url_server server;
+
6302 http_url_port port;
+
6303 http_url_path path;
+
6304 std::list<http_url_parameter> params;
+
6305
+
6306 protected:
+
6307 virtual bool do_match(
+
6308 _In_reads_or_z_(end) const char* text,
+
6309 _In_ size_t start = 0,
+
6310 _In_ size_t end = SIZE_MAX,
+
6311 _In_ int flags = match_default)
+
6312 {
+
6313 _Assume_(text || start >= end);
+
6314 this->interval.end = start;
+
6315
+
6316 if (this->interval.end + 7 <= end && stdex::strnicmp(text + this->interval.end, 7, "http://", SIZE_MAX, m_locale) == 0) {
+
6317 this->interval.end += 7;
+
6318 if (server.match(text, this->interval.end, end, flags))
+
6319 this->interval.end = server.interval.end;
+
6320 else
+
6321 goto error;
+
6322 if (this->interval.end < end && text[this->interval.end] == ':') {
+
6323 this->interval.end++;
+
6324 if (port.match(text, this->interval.end, end, flags))
+
6325 this->interval.end = port.interval.end;
+
6326 }
+
6327 else {
+
6328 port.invalidate();
+
6329 port.value = 80;
+
6330 }
+
6331 }
+
6332 else {
+
6333 server.invalidate();
+
6334 port.invalidate();
+
6335 port.value = 80;
+
6336 }
+
6337
+
6338 if (path.match(text, this->interval.end, end, flags))
+
6339 this->interval.end = path.interval.end;
+
6340 else
+
6341 goto error;
+
6342
+
6343 params.clear();
+
6344
+
6345 if (this->interval.end < end && text[this->interval.end] == '?') {
+
6346 this->interval.end++;
+
6347 for (;;) {
+
6348 if (this->interval.end < end && text[this->interval.end]) {
+
6349 if ((unsigned int)text[this->interval.end] < 0x20 ||
+
6350 (unsigned int)text[this->interval.end] == 0x7f ||
+
6351 stdex::isspace(text[this->interval.end]))
+
6352 break;
+
6353 else if (text[this->interval.end] == '&')
+
6354 this->interval.end++;
+
6355 else {
+
6356 http_url_parameter param;
+
6357 if (param.match(text, this->interval.end, end, flags)) {
+
6358 this->interval.end = param.interval.end;
+
6359 params.push_back(std::move(param));
+
6360 }
+
6361 else
+
6362 break;
+
6363 }
+
6364 }
+
6365 else
+
6366 break;
+
6367 }
+
6368 }
+
6369
+
6370 this->interval.start = start;
+
6371 return true;
+
6372
+
6373 error:
+
6374 invalidate();
+
6375 return false;
+
6376 }
+
6377 };
-
6301
-
-
6305 class http_url : public parser
-
6306 {
-
6307 public:
-
6308 http_url(_In_ const std::locale& locale = std::locale()) :
-
6309 parser(locale),
-
6310 port(locale)
-
6311 {}
-
6312
-
6313 virtual void invalidate()
-
6314 {
-
6315 server.invalidate();
-
6316 port.invalidate();
-
6317 path.invalidate();
-
6318 params.clear();
-
6319 parser::invalidate();
-
6320 }
-
6321
-
6322 http_url_server server;
-
6323 http_url_port port;
-
6324 http_url_path path;
-
6325 std::list<http_url_parameter> params;
-
6326
-
6327 protected:
-
6328 virtual bool do_match(
-
6329 _In_reads_or_z_(end) const char* text,
-
6330 _In_ size_t start = 0,
-
6331 _In_ size_t end = SIZE_MAX,
-
6332 _In_ int flags = match_default)
-
6333 {
-
6334 _Assume_(text || start >= end);
-
6335 this->interval.end = start;
-
6336
-
6337 if (this->interval.end + 7 <= end && stdex::strnicmp(text + this->interval.end, 7, "http://", SIZE_MAX, m_locale) == 0) {
-
6338 this->interval.end += 7;
-
6339 if (server.match(text, this->interval.end, end, flags))
-
6340 this->interval.end = server.interval.end;
-
6341 else
-
6342 goto error;
-
6343 if (this->interval.end < end && text[this->interval.end] == ':') {
-
6344 this->interval.end++;
-
6345 if (port.match(text, this->interval.end, end, flags))
-
6346 this->interval.end = port.interval.end;
-
6347 }
-
6348 else {
-
6349 port.invalidate();
-
6350 port.value = 80;
-
6351 }
-
6352 }
-
6353 else {
-
6354 server.invalidate();
-
6355 port.invalidate();
-
6356 port.value = 80;
-
6357 }
-
6358
-
6359 if (path.match(text, this->interval.end, end, flags))
-
6360 this->interval.end = path.interval.end;
-
6361 else
-
6362 goto error;
-
6363
-
6364 params.clear();
-
6365
-
6366 if (this->interval.end < end && text[this->interval.end] == '?') {
-
6367 this->interval.end++;
-
6368 for (;;) {
-
6369 if (this->interval.end < end && text[this->interval.end]) {
-
6370 if ((unsigned int)text[this->interval.end] < 0x20 ||
-
6371 (unsigned int)text[this->interval.end] == 0x7f ||
-
6372 stdex::isspace(text[this->interval.end]))
-
6373 break;
-
6374 else if (text[this->interval.end] == '&')
-
6375 this->interval.end++;
-
6376 else {
-
6377 http_url_parameter param;
-
6378 if (param.match(text, this->interval.end, end, flags)) {
-
6379 this->interval.end = param.interval.end;
-
6380 params.push_back(std::move(param));
-
6381 }
-
6382 else
-
6383 break;
-
6384 }
-
6385 }
-
6386 else
-
6387 break;
-
6388 }
-
6389 }
+
6378
+
+
6382 class http_language : public parser
+
6383 {
+
6384 public:
+
6385 virtual void invalidate()
+
6386 {
+
6387 components.clear();
+
6388 parser::invalidate();
+
6389 }
6390
-
6391 this->interval.start = start;
-
6392 return true;
-
6393
-
6394 error:
-
6395 invalidate();
-
6396 return false;
-
6397 }
-
6398 };
+
6391 std::vector<stdex::interval<size_t>> components;
+
6392
+
6393 protected:
+
6394 virtual bool do_match(
+
6395 _In_reads_or_z_(end) const char* text,
+
6396 _In_ size_t start = 0,
+
6397 _In_ size_t end = SIZE_MAX,
+
6398 _In_ int flags = match_default)
+
6399 {
+
6400 _Assume_(text || start >= end);
+
6401 this->interval.end = start;
+
6402 components.clear();
+
6403 for (;;) {
+
6404 if (this->interval.end < end && text[this->interval.end]) {
+ +
6406 k.end = this->interval.end;
+
6407 for (;;) {
+
6408 if (k.end < end && text[k.end]) {
+
6409 if (stdex::isalpha(text[k.end]))
+
6410 k.end++;
+
6411 else
+
6412 break;
+
6413 }
+
6414 else
+
6415 break;
+
6416 }
+
6417 if (this->interval.end < k.end) {
+
6418 k.start = this->interval.end;
+
6419 this->interval.end = k.end;
+
6420 components.push_back(k);
+
6421 }
+
6422 else
+
6423 break;
+
6424 if (this->interval.end < end && text[this->interval.end] == '-')
+
6425 this->interval.end++;
+
6426 else
+
6427 break;
+
6428 }
+
6429 else
+
6430 break;
+
6431 }
+
6432 if (!components.empty()) {
+
6433 this->interval.start = start;
+
6434 this->interval.end = components.back().end;
+
6435 return true;
+
6436 }
+
6437 this->interval.invalidate();
+
6438 return false;
+
6439 }
+
6440 };
-
6399
-
-
6403 class http_language : public parser
-
6404 {
-
6405 public:
-
6406 virtual void invalidate()
-
6407 {
-
6408 components.clear();
-
6409 parser::invalidate();
-
6410 }
-
6411
-
6412 std::vector<stdex::interval<size_t>> components;
-
6413
-
6414 protected:
-
6415 virtual bool do_match(
-
6416 _In_reads_or_z_(end) const char* text,
-
6417 _In_ size_t start = 0,
-
6418 _In_ size_t end = SIZE_MAX,
-
6419 _In_ int flags = match_default)
-
6420 {
-
6421 _Assume_(text || start >= end);
-
6422 this->interval.end = start;
-
6423 components.clear();
-
6424 for (;;) {
-
6425 if (this->interval.end < end && text[this->interval.end]) {
- -
6427 k.end = this->interval.end;
-
6428 for (;;) {
-
6429 if (k.end < end && text[k.end]) {
-
6430 if (stdex::isalpha(text[k.end]))
-
6431 k.end++;
-
6432 else
-
6433 break;
-
6434 }
-
6435 else
-
6436 break;
-
6437 }
-
6438 if (this->interval.end < k.end) {
-
6439 k.start = this->interval.end;
-
6440 this->interval.end = k.end;
-
6441 components.push_back(k);
-
6442 }
-
6443 else
-
6444 break;
-
6445 if (this->interval.end < end && text[this->interval.end] == '-')
-
6446 this->interval.end++;
-
6447 else
-
6448 break;
-
6449 }
-
6450 else
-
6451 break;
-
6452 }
-
6453 if (!components.empty()) {
-
6454 this->interval.start = start;
-
6455 this->interval.end = components.back().end;
-
6456 return true;
-
6457 }
-
6458 this->interval.invalidate();
-
6459 return false;
-
6460 }
-
6461 };
+
6441
+
+
6445 class http_weight : public parser
+
6446 {
+
6447 public:
+
6448 http_weight(_In_ const std::locale& locale = std::locale()) :
+
6449 parser(locale),
+
6450 value(1.0f)
+
6451 {}
+
6452
+
6453 virtual void invalidate()
+
6454 {
+
6455 value = 1.0f;
+
6456 parser::invalidate();
+
6457 }
+
6458
+
6459 float value;
+
6460
+
6461 protected:
+
6462 virtual bool do_match(
+
6463 _In_reads_or_z_(end) const char* text,
+
6464 _In_ size_t start = 0,
+
6465 _In_ size_t end = SIZE_MAX,
+
6466 _In_ int flags = match_default)
+
6467 {
+
6468 _Assume_(text || start >= end);
+
6469 size_t celi_del = 0, decimalni_del = 0, decimalni_del_n = 1;
+
6470 this->interval.end = start;
+
6471 for (;;) {
+
6472 if (this->interval.end < end && text[this->interval.end]) {
+
6473 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9') {
+
6474 celi_del = celi_del * 10 + static_cast<size_t>(text[this->interval.end] - '0');
+
6475 this->interval.end++;
+
6476 }
+
6477 else if (text[this->interval.end] == '.') {
+
6478 this->interval.end++;
+
6479 for (;;) {
+
6480 if (this->interval.end < end && text[this->interval.end]) {
+
6481 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9') {
+
6482 decimalni_del = decimalni_del * 10 + static_cast<size_t>(text[this->interval.end] - '0');
+
6483 decimalni_del_n *= 10;
+
6484 this->interval.end++;
+
6485 }
+
6486 else
+
6487 break;
+
6488 }
+
6489 else
+
6490 break;
+
6491 }
+
6492 break;
+
6493 }
+
6494 else
+
6495 break;
+
6496 }
+
6497 else
+
6498 break;
+
6499 }
+ + +
6502 this->interval.start = start;
+
6503 return true;
+
6504 }
+
6505 value = 1.0f;
+
6506 this->interval.invalidate();
+
6507 return false;
+
6508 }
+
6509 };
-
6462
-
-
6466 class http_weight : public parser
-
6467 {
-
6468 public:
-
6469 http_weight(_In_ const std::locale& locale = std::locale()) :
-
6470 parser(locale),
-
6471 value(1.0f)
-
6472 {}
-
6473
-
6474 virtual void invalidate()
-
6475 {
-
6476 value = 1.0f;
-
6477 parser::invalidate();
-
6478 }
-
6479
-
6480 float value;
-
6481
-
6482 protected:
-
6483 virtual bool do_match(
-
6484 _In_reads_or_z_(end) const char* text,
-
6485 _In_ size_t start = 0,
-
6486 _In_ size_t end = SIZE_MAX,
-
6487 _In_ int flags = match_default)
-
6488 {
-
6489 _Assume_(text || start >= end);
-
6490 size_t celi_del = 0, decimalni_del = 0, decimalni_del_n = 1;
-
6491 this->interval.end = start;
-
6492 for (;;) {
-
6493 if (this->interval.end < end && text[this->interval.end]) {
-
6494 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9') {
-
6495 celi_del = celi_del * 10 + static_cast<size_t>(text[this->interval.end] - '0');
-
6496 this->interval.end++;
-
6497 }
-
6498 else if (text[this->interval.end] == '.') {
-
6499 this->interval.end++;
-
6500 for (;;) {
-
6501 if (this->interval.end < end && text[this->interval.end]) {
-
6502 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9') {
-
6503 decimalni_del = decimalni_del * 10 + static_cast<size_t>(text[this->interval.end] - '0');
-
6504 decimalni_del_n *= 10;
-
6505 this->interval.end++;
-
6506 }
-
6507 else
-
6508 break;
-
6509 }
-
6510 else
-
6511 break;
-
6512 }
-
6513 break;
-
6514 }
-
6515 else
-
6516 break;
-
6517 }
-
6518 else
-
6519 break;
-
6520 }
- - -
6523 this->interval.start = start;
-
6524 return true;
-
6525 }
-
6526 value = 1.0f;
-
6527 this->interval.invalidate();
-
6528 return false;
-
6529 }
-
6530 };
+
6510
+
+
6514 class http_asterisk : public parser
+
6515 {
+
6516 protected:
+
6517 virtual bool do_match(
+
6518 _In_reads_or_z_(end) const char* text,
+
6519 _In_ size_t start = 0,
+
6520 _In_ size_t end = SIZE_MAX,
+
6521 _In_ int flags = match_default)
+
6522 {
+
6523 _Assume_(text || end <= start);
+
6524 if (start < end && text[start] == '*') {
+
6525 this->interval.end = (this->interval.start = start) + 1;
+
6526 return true;
+
6527 }
+
6528 this->interval.invalidate();
+
6529 return false;
+
6530 }
+
6531 };
-
6531
-
-
6535 class http_asterisk : public parser
-
6536 {
-
6537 protected:
-
6538 virtual bool do_match(
-
6539 _In_reads_or_z_(end) const char* text,
-
6540 _In_ size_t start = 0,
-
6541 _In_ size_t end = SIZE_MAX,
-
6542 _In_ int flags = match_default)
-
6543 {
-
6544 _Assume_(text || end <= start);
-
6545 if (start < end && text[start] == '*') {
-
6546 this->interval.end = (this->interval.start = start) + 1;
-
6547 return true;
-
6548 }
-
6549 this->interval.invalidate();
-
6550 return false;
+
6532
+
6536 template <class T, class T_asterisk = http_asterisk>
+
+ +
6538 {
+
6539 public:
+
6540 http_weighted_value(_In_ const std::locale& locale = std::locale()) :
+
6541 parser(locale),
+
6542 factor(locale)
+
6543 {}
+
6544
+
6545 virtual void invalidate()
+
6546 {
+
6547 asterisk.invalidate();
+
6548 value.invalidate();
+
6549 factor.invalidate();
+
6550 parser::invalidate();
6551 }
-
6552 };
+
6552
+
6553 T_asterisk asterisk;
+
6554 T value;
+
6555 http_weight factor;
+
6556
+
6557 protected:
+
6558 virtual bool do_match(
+
6559 _In_reads_or_z_(end) const char* text,
+
6560 _In_ size_t start = 0,
+
6561 _In_ size_t end = SIZE_MAX,
+
6562 _In_ int flags = match_default)
+
6563 {
+
6564 _Assume_(text || start >= end);
+
6565 size_t konec_vrednosti;
+
6566 this->interval.end = start;
+
6567 if (asterisk.match(text, this->interval.end, end, flags)) {
+
6568 this->interval.end = konec_vrednosti = asterisk.interval.end;
+
6569 value.invalidate();
+
6570 }
+
6571 else if (value.match(text, this->interval.end, end, flags)) {
+
6572 this->interval.end = konec_vrednosti = value.interval.end;
+
6573 asterisk.invalidate();
+
6574 }
+
6575 else {
+
6576 asterisk.invalidate();
+
6577 value.invalidate();
+
6578 this->interval.invalidate();
+
6579 return false;
+
6580 }
+
6581
+
6582 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
+
6583 if (this->interval.end < end && text[this->interval.end] == ';') {
+
6584 this->interval.end++;
+
6585 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
+
6586 if (this->interval.end < end && (text[this->interval.end] == 'q' || text[this->interval.end] == 'Q')) {
+
6587 this->interval.end++;
+
6588 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
+
6589 if (this->interval.end < end && text[this->interval.end] == '=') {
+
6590 this->interval.end++;
+
6591 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
+
6592 if (factor.match(text, this->interval.end, end, flags))
+
6593 this->interval.end = factor.interval.end;
+
6594 }
+
6595 }
+
6596 }
+
6597 if (!factor.interval) {
+
6598 factor.invalidate();
+
6599 this->interval.end = konec_vrednosti;
+
6600 }
+
6601 this->interval.start = start;
+
6602 return true;
+
6603 }
+
6604 };
-
6553
-
6557 template <class T, class T_asterisk = http_asterisk>
-
- -
6559 {
-
6560 public:
-
6561 http_weighted_value(_In_ const std::locale& locale = std::locale()) :
-
6562 parser(locale),
-
6563 factor(locale)
-
6564 {}
-
6565
-
6566 virtual void invalidate()
-
6567 {
-
6568 asterisk.invalidate();
-
6569 value.invalidate();
-
6570 factor.invalidate();
-
6571 parser::invalidate();
-
6572 }
-
6573
-
6574 T_asterisk asterisk;
-
6575 T value;
-
6576 http_weight factor;
-
6577
-
6578 protected:
-
6579 virtual bool do_match(
-
6580 _In_reads_or_z_(end) const char* text,
-
6581 _In_ size_t start = 0,
-
6582 _In_ size_t end = SIZE_MAX,
-
6583 _In_ int flags = match_default)
-
6584 {
-
6585 _Assume_(text || start >= end);
-
6586 size_t konec_vrednosti;
-
6587 this->interval.end = start;
-
6588 if (asterisk.match(text, this->interval.end, end, flags)) {
-
6589 this->interval.end = konec_vrednosti = asterisk.interval.end;
-
6590 value.invalidate();
-
6591 }
-
6592 else if (value.match(text, this->interval.end, end, flags)) {
-
6593 this->interval.end = konec_vrednosti = value.interval.end;
-
6594 asterisk.invalidate();
-
6595 }
-
6596 else {
-
6597 asterisk.invalidate();
-
6598 value.invalidate();
-
6599 this->interval.invalidate();
-
6600 return false;
-
6601 }
-
6602
-
6603 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
-
6604 if (this->interval.end < end && text[this->interval.end] == ';') {
-
6605 this->interval.end++;
-
6606 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
-
6607 if (this->interval.end < end && (text[this->interval.end] == 'q' || text[this->interval.end] == 'Q')) {
-
6608 this->interval.end++;
-
6609 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
-
6610 if (this->interval.end < end && text[this->interval.end] == '=') {
-
6611 this->interval.end++;
-
6612 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
-
6613 if (factor.match(text, this->interval.end, end, flags))
-
6614 this->interval.end = factor.interval.end;
-
6615 }
-
6616 }
-
6617 }
-
6618 if (!factor.interval) {
-
6619 factor.invalidate();
-
6620 this->interval.end = konec_vrednosti;
-
6621 }
-
6622 this->interval.start = start;
-
6623 return true;
-
6624 }
-
6625 };
+
6605
+
+ +
6610 {
+
6611 public:
+
6612 virtual void invalidate()
+
6613 {
+
6614 name.invalidate();
+
6615 value.invalidate();
+
6616 parser::invalidate();
+
6617 }
+
6618
+
6619 http_token name;
+
6620 http_value value;
+
6621
+
6622 protected:
+
6623 virtual bool do_match(
+
6624 _In_reads_or_z_(end) const char* text,
+
6625 _In_ size_t start = 0,
+
6626 _In_ size_t end = SIZE_MAX,
+
6627 _In_ int flags = match_default)
+
6628 {
+
6629 _Assume_(text || start >= end);
+
6630 this->interval.end = start;
+
6631 if (this->interval.end < end && text[this->interval.end] == '$')
+
6632 this->interval.end++;
+
6633 else
+
6634 goto error;
+
6635 if (name.match(text, this->interval.end, end, flags))
+
6636 this->interval.end = name.interval.end;
+
6637 else
+
6638 goto error;
+
6639 while (m_space.match(text, this->interval.end, end, flags))
+
6640 this->interval.end = m_space.interval.end;
+
6641 if (this->interval.end < end && text[this->interval.end] == '=')
+
6642 this->interval.end++;
+
6643 else
+
6644 goto error;
+
6645 while (m_space.match(text, this->interval.end, end, flags))
+
6646 this->interval.end = m_space.interval.end;
+
6647 if (value.match(text, this->interval.end, end, flags))
+
6648 this->interval.end = value.interval.end;
+
6649 else
+
6650 goto error;
+
6651 this->interval.start = start;
+
6652 return true;
+
6653
+
6654 error:
+
6655 invalidate();
+
6656 return false;
+
6657 }
+
6658
+
6659 http_space m_space;
+
6660 };
-
6626
-
- -
6631 {
-
6632 public:
-
6633 virtual void invalidate()
-
6634 {
-
6635 name.invalidate();
-
6636 value.invalidate();
-
6637 parser::invalidate();
-
6638 }
-
6639
-
6640 http_token name;
-
6641 http_value value;
-
6642
-
6643 protected:
-
6644 virtual bool do_match(
-
6645 _In_reads_or_z_(end) const char* text,
-
6646 _In_ size_t start = 0,
-
6647 _In_ size_t end = SIZE_MAX,
-
6648 _In_ int flags = match_default)
-
6649 {
-
6650 _Assume_(text || start >= end);
-
6651 this->interval.end = start;
-
6652 if (this->interval.end < end && text[this->interval.end] == '$')
-
6653 this->interval.end++;
-
6654 else
-
6655 goto error;
-
6656 if (name.match(text, this->interval.end, end, flags))
-
6657 this->interval.end = name.interval.end;
-
6658 else
-
6659 goto error;
-
6660 while (m_space.match(text, this->interval.end, end, flags))
-
6661 this->interval.end = m_space.interval.end;
-
6662 if (this->interval.end < end && text[this->interval.end] == '=')
-
6663 this->interval.end++;
-
6664 else
-
6665 goto error;
-
6666 while (m_space.match(text, this->interval.end, end, flags))
-
6667 this->interval.end = m_space.interval.end;
-
6668 if (value.match(text, this->interval.end, end, flags))
-
6669 this->interval.end = value.interval.end;
-
6670 else
-
6671 goto error;
-
6672 this->interval.start = start;
-
6673 return true;
-
6674
-
6675 error:
-
6676 invalidate();
-
6677 return false;
-
6678 }
+
6661
+
+
6665 class http_cookie : public parser
+
6666 {
+
6667 public:
+
6668 virtual void invalidate()
+
6669 {
+
6670 name.invalidate();
+
6671 value.invalidate();
+
6672 params.clear();
+
6673 parser::invalidate();
+
6674 }
+
6675
+ + +
6678 std::list<http_cookie_parameter> params;
6679
-
6680 http_space m_space;
-
6681 };
+
6680 protected:
+
6681 virtual bool do_match(
+
6682 _In_reads_or_z_(end) const char* text,
+
6683 _In_ size_t start = 0,
+
6684 _In_ size_t end = SIZE_MAX,
+
6685 _In_ int flags = match_default)
+
6686 {
+
6687 _Assume_(text || start >= end);
+
6688 this->interval.end = start;
+
6689 if (name.match(text, this->interval.end, end, flags))
+
6690 this->interval.end = name.interval.end;
+
6691 else
+
6692 goto error;
+
6693 while (m_space.match(text, this->interval.end, end, flags))
+
6694 this->interval.end = m_space.interval.end;
+
6695 if (this->interval.end < end && text[this->interval.end] == '=')
+
6696 this->interval.end++;
+
6697 else
+
6698 goto error;
+
6699 while (m_space.match(text, this->interval.end, end, flags))
+
6700 this->interval.end = m_space.interval.end;
+
6701 if (value.match(text, this->interval.end, end, flags))
+
6702 this->interval.end = value.interval.end;
+
6703 else
+
6704 goto error;
+
6705 params.clear();
+
6706 for (;;) {
+
6707 if (this->interval.end < end && text[this->interval.end]) {
+
6708 if (m_space.match(text, this->interval.end, end, flags))
+
6709 this->interval.end = m_space.interval.end;
+
6710 else if (text[this->interval.end] == ';') {
+
6711 this->interval.end++;
+
6712 while (m_space.match(text, this->interval.end, end, flags))
+
6713 this->interval.end = m_space.interval.end;
+ +
6715 if (param.match(text, this->interval.end, end, flags)) {
+
6716 this->interval.end = param.interval.end;
+
6717 params.push_back(std::move(param));
+
6718 }
+
6719 else
+
6720 break;
+
6721 }
+
6722 else
+
6723 break;
+
6724 }
+
6725 else
+
6726 break;
+
6727 }
+
6728 this->interval.start = start;
+
6729 this->interval.end = params.empty() ? value.interval.end : params.back().interval.end;
+
6730 return true;
+
6731
+
6732 error:
+
6733 invalidate();
+
6734 return false;
+
6735 }
+
6736
+
6737 http_space m_space;
+
6738 };
-
6682
-
-
6686 class http_cookie : public parser
-
6687 {
-
6688 public:
-
6689 virtual void invalidate()
-
6690 {
-
6691 name.invalidate();
-
6692 value.invalidate();
-
6693 params.clear();
-
6694 parser::invalidate();
-
6695 }
-
6696
- - -
6699 std::list<http_cookie_parameter> params;
-
6700
-
6701 protected:
-
6702 virtual bool do_match(
-
6703 _In_reads_or_z_(end) const char* text,
-
6704 _In_ size_t start = 0,
-
6705 _In_ size_t end = SIZE_MAX,
-
6706 _In_ int flags = match_default)
-
6707 {
-
6708 _Assume_(text || start >= end);
-
6709 this->interval.end = start;
-
6710 if (name.match(text, this->interval.end, end, flags))
-
6711 this->interval.end = name.interval.end;
-
6712 else
-
6713 goto error;
-
6714 while (m_space.match(text, this->interval.end, end, flags))
-
6715 this->interval.end = m_space.interval.end;
-
6716 if (this->interval.end < end && text[this->interval.end] == '=')
-
6717 this->interval.end++;
-
6718 else
-
6719 goto error;
-
6720 while (m_space.match(text, this->interval.end, end, flags))
-
6721 this->interval.end = m_space.interval.end;
-
6722 if (value.match(text, this->interval.end, end, flags))
-
6723 this->interval.end = value.interval.end;
-
6724 else
-
6725 goto error;
-
6726 params.clear();
-
6727 for (;;) {
-
6728 if (this->interval.end < end && text[this->interval.end]) {
-
6729 if (m_space.match(text, this->interval.end, end, flags))
-
6730 this->interval.end = m_space.interval.end;
-
6731 else if (text[this->interval.end] == ';') {
-
6732 this->interval.end++;
-
6733 while (m_space.match(text, this->interval.end, end, flags))
-
6734 this->interval.end = m_space.interval.end;
- -
6736 if (param.match(text, this->interval.end, end, flags)) {
-
6737 this->interval.end = param.interval.end;
-
6738 params.push_back(std::move(param));
-
6739 }
-
6740 else
-
6741 break;
-
6742 }
-
6743 else
-
6744 break;
-
6745 }
-
6746 else
-
6747 break;
-
6748 }
-
6749 this->interval.start = start;
-
6750 this->interval.end = params.empty() ? value.interval.end : params.back().interval.end;
-
6751 return true;
-
6752
-
6753 error:
-
6754 invalidate();
-
6755 return false;
-
6756 }
+
6739
+
+
6743 class http_agent : public parser
+
6744 {
+
6745 public:
+
6746 virtual void invalidate()
+
6747 {
+
6748 type.start = 1;
+
6749 type.end = 0;
+
6750 version.start = 1;
+
6751 version.end = 0;
+
6752 parser::invalidate();
+
6753 }
+
6754
+ +
6757
-
6758 http_space m_space;
-
6759 };
+
6758 protected:
+
6759 virtual bool do_match(
+
6760 _In_reads_or_z_(end) const char* text,
+
6761 _In_ size_t start = 0,
+
6762 _In_ size_t end = SIZE_MAX,
+
6763 _In_ int flags = match_default)
+
6764 {
+
6765 _Assume_(text || start >= end);
+
6766 this->interval.end = start;
+
6767 type.start = this->interval.end;
+
6768 for (;;) {
+
6769 if (this->interval.end < end && text[this->interval.end]) {
+
6770 if (text[this->interval.end] == '/') {
+
6771 type.end = this->interval.end;
+
6772 this->interval.end++;
+
6773 version.start = this->interval.end;
+
6774 for (;;) {
+
6775 if (this->interval.end < end && text[this->interval.end]) {
+
6776 if (stdex::isspace(text[this->interval.end])) {
+
6777 version.end = this->interval.end;
+
6778 break;
+
6779 }
+
6780 else
+
6781 this->interval.end++;
+
6782 }
+
6783 else {
+
6784 version.end = this->interval.end;
+
6785 break;
+
6786 }
+
6787 }
+
6788 break;
+
6789 }
+
6790 else if (stdex::isspace(text[this->interval.end])) {
+
6791 type.end = this->interval.end;
+
6792 break;
+
6793 }
+
6794 else
+
6795 this->interval.end++;
+
6796 }
+
6797 else {
+
6798 type.end = this->interval.end;
+
6799 break;
+
6800 }
+
6801 }
+ +
6803 this->interval.start = start;
+
6804 return true;
+
6805 }
+
6806 type.start = 1;
+
6807 type.end = 0;
+
6808 version.start = 1;
+
6809 version.end = 0;
+
6810 this->interval.invalidate();
+
6811 return false;
+
6812 }
+
6813 };
-
6760
-
-
6764 class http_agent : public parser
-
6765 {
-
6766 public:
-
6767 virtual void invalidate()
-
6768 {
-
6769 type.start = 1;
-
6770 type.end = 0;
-
6771 version.start = 1;
-
6772 version.end = 0;
-
6773 parser::invalidate();
-
6774 }
-
6775
- - -
6778
-
6779 protected:
-
6780 virtual bool do_match(
-
6781 _In_reads_or_z_(end) const char* text,
-
6782 _In_ size_t start = 0,
-
6783 _In_ size_t end = SIZE_MAX,
-
6784 _In_ int flags = match_default)
-
6785 {
-
6786 _Assume_(text || start >= end);
-
6787 this->interval.end = start;
-
6788 type.start = this->interval.end;
-
6789 for (;;) {
-
6790 if (this->interval.end < end && text[this->interval.end]) {
-
6791 if (text[this->interval.end] == '/') {
-
6792 type.end = this->interval.end;
-
6793 this->interval.end++;
-
6794 version.start = this->interval.end;
-
6795 for (;;) {
-
6796 if (this->interval.end < end && text[this->interval.end]) {
-
6797 if (stdex::isspace(text[this->interval.end])) {
-
6798 version.end = this->interval.end;
-
6799 break;
-
6800 }
-
6801 else
-
6802 this->interval.end++;
-
6803 }
-
6804 else {
-
6805 version.end = this->interval.end;
-
6806 break;
-
6807 }
-
6808 }
-
6809 break;
-
6810 }
-
6811 else if (stdex::isspace(text[this->interval.end])) {
-
6812 type.end = this->interval.end;
-
6813 break;
-
6814 }
-
6815 else
-
6816 this->interval.end++;
-
6817 }
-
6818 else {
-
6819 type.end = this->interval.end;
-
6820 break;
-
6821 }
-
6822 }
- -
6824 this->interval.start = start;
-
6825 return true;
-
6826 }
-
6827 type.start = 1;
-
6828 type.end = 0;
-
6829 version.start = 1;
-
6830 version.end = 0;
-
6831 this->interval.invalidate();
-
6832 return false;
-
6833 }
-
6834 };
-
-
6835
-
-
6839 class http_protocol : public parser
-
6840 {
-
6841 public:
-
6842 http_protocol(_In_ const std::locale& locale = std::locale()) :
-
6843 parser(locale),
-
6844 version(0x009)
-
6845 {}
-
6846
-
6847 virtual void invalidate()
-
6848 {
-
6849 type.start = 1;
-
6850 type.end = 0;
-
6851 version_maj.start = 1;
-
6852 version_maj.end = 0;
-
6853 version_min.start = 1;
-
6854 version_min.end = 0;
-
6855 version = 0x009;
-
6856 parser::invalidate();
-
6857 }
-
6858
- -
6860 stdex::interval<size_t> version_maj;
-
6861 stdex::interval<size_t> version_min;
- -
6863
-
6864 protected:
-
6865 virtual bool do_match(
-
6866 _In_reads_or_z_(end) const char* text,
-
6867 _In_ size_t start = 0,
-
6868 _In_ size_t end = SIZE_MAX,
-
6869 _In_ int flags = match_default)
-
6870 {
-
6871 _Assume_(text || start >= end);
-
6872 this->interval.end = start;
-
6873 type.start = this->interval.end;
-
6874 for (;;) {
-
6875 if (this->interval.end < end && text[this->interval.end]) {
-
6876 if (text[this->interval.end] == '/') {
-
6877 type.end = this->interval.end;
-
6878 this->interval.end++;
-
6879 break;
-
6880 }
-
6881 else if (stdex::isspace(text[this->interval.end]))
-
6882 goto error;
-
6883 else
-
6884 this->interval.end++;
-
6885 }
-
6886 else {
-
6887 type.end = this->interval.end;
-
6888 goto error;
-
6889 }
-
6890 }
-
6891 version_maj.start = this->interval.end;
-
6892 for (;;) {
-
6893 if (this->interval.end < end && text[this->interval.end]) {
-
6894 if (text[this->interval.end] == '.') {
+
6814
+
+
6818 class http_protocol : public parser
+
6819 {
+
6820 public:
+
6821 http_protocol(_In_ const std::locale& locale = std::locale()) :
+
6822 parser(locale),
+
6823 version(0x009)
+
6824 {}
+
6825
+
6826 virtual void invalidate()
+
6827 {
+
6828 type.start = 1;
+
6829 type.end = 0;
+
6830 version_maj.start = 1;
+
6831 version_maj.end = 0;
+
6832 version_min.start = 1;
+
6833 version_min.end = 0;
+
6834 version = 0x009;
+
6835 parser::invalidate();
+
6836 }
+
6837
+ +
6839 stdex::interval<size_t> version_maj;
+
6840 stdex::interval<size_t> version_min;
+ +
6842
+
6843 protected:
+
6844 virtual bool do_match(
+
6845 _In_reads_or_z_(end) const char* text,
+
6846 _In_ size_t start = 0,
+
6847 _In_ size_t end = SIZE_MAX,
+
6848 _In_ int flags = match_default)
+
6849 {
+
6850 _Assume_(text || start >= end);
+
6851 this->interval.end = start;
+
6852 type.start = this->interval.end;
+
6853 for (;;) {
+
6854 if (this->interval.end < end && text[this->interval.end]) {
+
6855 if (text[this->interval.end] == '/') {
+
6856 type.end = this->interval.end;
+
6857 this->interval.end++;
+
6858 break;
+
6859 }
+
6860 else if (stdex::isspace(text[this->interval.end]))
+
6861 goto error;
+
6862 else
+
6863 this->interval.end++;
+
6864 }
+
6865 else {
+
6866 type.end = this->interval.end;
+
6867 goto error;
+
6868 }
+
6869 }
+
6870 version_maj.start = this->interval.end;
+
6871 for (;;) {
+
6872 if (this->interval.end < end && text[this->interval.end]) {
+
6873 if (text[this->interval.end] == '.') {
+
6874 version_maj.end = this->interval.end;
+
6875 this->interval.end++;
+
6876 version_min.start = this->interval.end;
+
6877 for (;;) {
+
6878 if (this->interval.end < end && text[this->interval.end]) {
+
6879 if (stdex::isspace(text[this->interval.end])) {
+
6880 version_min.end = this->interval.end;
+
6881 version =
+
6882 (uint16_t)strtoui(text + version_maj.start, version_maj.size(), nullptr, 10) * 0x100 +
+
6883 (uint16_t)strtoui(text + version_min.start, version_min.size(), nullptr, 10);
+
6884 break;
+
6885 }
+
6886 else
+
6887 this->interval.end++;
+
6888 }
+
6889 else
+
6890 goto error;
+
6891 }
+
6892 break;
+
6893 }
+
6894 else if (stdex::isspace(text[this->interval.end])) {
6895 version_maj.end = this->interval.end;
-
6896 this->interval.end++;
-
6897 version_min.start = this->interval.end;
-
6898 for (;;) {
-
6899 if (this->interval.end < end && text[this->interval.end]) {
-
6900 if (stdex::isspace(text[this->interval.end])) {
-
6901 version_min.end = this->interval.end;
-
6902 version =
-
6903 (uint16_t)strtoui(text + version_maj.start, version_maj.size(), nullptr, 10) * 0x100 +
-
6904 (uint16_t)strtoui(text + version_min.start, version_min.size(), nullptr, 10);
-
6905 break;
-
6906 }
-
6907 else
-
6908 this->interval.end++;
-
6909 }
-
6910 else
-
6911 goto error;
-
6912 }
-
6913 break;
-
6914 }
-
6915 else if (stdex::isspace(text[this->interval.end])) {
-
6916 version_maj.end = this->interval.end;
-
6917 version_min.start = 1;
-
6918 version_min.end = 0;
-
6919 version = (uint16_t)strtoui(text + version_maj.start, version_maj.size(), nullptr, 10) * 0x100;
-
6920 break;
-
6921 }
-
6922 else
-
6923 this->interval.end++;
-
6924 }
-
6925 else
-
6926 goto error;
-
6927 }
-
6928 this->interval.start = start;
-
6929 return true;
-
6930
-
6931 error:
-
6932 invalidate();
-
6933 return false;
-
6934 }
-
6935 };
+
6896 version_min.start = 1;
+
6897 version_min.end = 0;
+
6898 version = (uint16_t)strtoui(text + version_maj.start, version_maj.size(), nullptr, 10) * 0x100;
+
6899 break;
+
6900 }
+
6901 else
+
6902 this->interval.end++;
+
6903 }
+
6904 else
+
6905 goto error;
+
6906 }
+
6907 this->interval.start = start;
+
6908 return true;
+
6909
+
6910 error:
+
6911 invalidate();
+
6912 return false;
+
6913 }
+
6914 };
+
6915
+
+
6919 class http_request : public parser
+
6920 {
+
6921 public:
+
6922 http_request(_In_ const std::locale& locale = std::locale()) :
+
6923 parser(locale),
+
6924 url(locale),
+
6925 protocol(locale)
+
6926 {}
+
6927
+
6928 virtual void invalidate()
+
6929 {
+
6930 verb.start = 1;
+
6931 verb.end = 0;
+
6932 url.invalidate();
+
6933 protocol.invalidate();
+
6934 parser::invalidate();
+
6935 }
6936
-
-
6940 class http_request : public parser
-
6941 {
-
6942 public:
-
6943 http_request(_In_ const std::locale& locale = std::locale()) :
-
6944 parser(locale),
-
6945 url(locale),
-
6946 protocol(locale)
-
6947 {}
-
6948
-
6949 virtual void invalidate()
-
6950 {
-
6951 verb.start = 1;
-
6952 verb.end = 0;
-
6953 url.invalidate();
-
6954 protocol.invalidate();
-
6955 parser::invalidate();
-
6956 }
-
6957
- -
6959 http_url url;
-
6960 http_protocol protocol;
-
6961
-
6962 protected:
-
6963 virtual bool do_match(
-
6964 _In_reads_or_z_(end) const char* text,
-
6965 _In_ size_t start = 0,
-
6966 _In_ size_t end = SIZE_MAX,
-
6967 _In_ int flags = match_default)
-
6968 {
-
6969 _Assume_(text || start >= end);
-
6970 this->interval.end = start;
-
6971
-
6972 for (;;) {
-
6973 if (m_line_break.match(text, this->interval.end, end, flags))
-
6974 goto error;
-
6975 else if (this->interval.end < end && text[this->interval.end]) {
-
6976 if (stdex::isspace(text[this->interval.end]))
-
6977 this->interval.end++;
-
6978 else
-
6979 break;
-
6980 }
-
6981 else
+ +
6938 http_url url;
+
6939 http_protocol protocol;
+
6940
+
6941 protected:
+
6942 virtual bool do_match(
+
6943 _In_reads_or_z_(end) const char* text,
+
6944 _In_ size_t start = 0,
+
6945 _In_ size_t end = SIZE_MAX,
+
6946 _In_ int flags = match_default)
+
6947 {
+
6948 _Assume_(text || start >= end);
+
6949 this->interval.end = start;
+
6950
+
6951 for (;;) {
+
6952 if (m_line_break.match(text, this->interval.end, end, flags))
+
6953 goto error;
+
6954 else if (this->interval.end < end && text[this->interval.end]) {
+
6955 if (stdex::isspace(text[this->interval.end]))
+
6956 this->interval.end++;
+
6957 else
+
6958 break;
+
6959 }
+
6960 else
+
6961 goto error;
+
6962 }
+
6963 verb.start = this->interval.end;
+
6964 for (;;) {
+
6965 if (m_line_break.match(text, this->interval.end, end, flags))
+
6966 goto error;
+
6967 else if (this->interval.end < end && text[this->interval.end]) {
+
6968 if (stdex::isspace(text[this->interval.end])) {
+
6969 verb.end = this->interval.end;
+
6970 this->interval.end++;
+
6971 break;
+
6972 }
+
6973 else
+
6974 this->interval.end++;
+
6975 }
+
6976 else
+
6977 goto error;
+
6978 }
+
6979
+
6980 for (;;) {
+
6981 if (m_line_break.match(text, this->interval.end, end, flags))
6982 goto error;
-
6983 }
-
6984 verb.start = this->interval.end;
-
6985 for (;;) {
-
6986 if (m_line_break.match(text, this->interval.end, end, flags))
-
6987 goto error;
-
6988 else if (this->interval.end < end && text[this->interval.end]) {
-
6989 if (stdex::isspace(text[this->interval.end])) {
-
6990 verb.end = this->interval.end;
-
6991 this->interval.end++;
-
6992 break;
-
6993 }
-
6994 else
-
6995 this->interval.end++;
-
6996 }
-
6997 else
-
6998 goto error;
-
6999 }
-
7000
-
7001 for (;;) {
-
7002 if (m_line_break.match(text, this->interval.end, end, flags))
-
7003 goto error;
-
7004 else if (this->interval.end < end && text[this->interval.end]) {
-
7005 if (stdex::isspace(text[this->interval.end]))
-
7006 this->interval.end++;
-
7007 else
-
7008 break;
-
7009 }
-
7010 else
-
7011 goto error;
-
7012 }
-
7013 if (url.match(text, this->interval.end, end, flags))
-
7014 this->interval.end = url.interval.end;
-
7015 else
-
7016 goto error;
-
7017
-
7018 protocol.invalidate();
-
7019 for (;;) {
-
7020 if (m_line_break.match(text, this->interval.end, end, flags)) {
-
7021 this->interval.end = m_line_break.interval.end;
+
6983 else if (this->interval.end < end && text[this->interval.end]) {
+
6984 if (stdex::isspace(text[this->interval.end]))
+
6985 this->interval.end++;
+
6986 else
+
6987 break;
+
6988 }
+
6989 else
+
6990 goto error;
+
6991 }
+
6992 if (url.match(text, this->interval.end, end, flags))
+
6993 this->interval.end = url.interval.end;
+
6994 else
+
6995 goto error;
+
6996
+
6997 protocol.invalidate();
+
6998 for (;;) {
+
6999 if (m_line_break.match(text, this->interval.end, end, flags)) {
+
7000 this->interval.end = m_line_break.interval.end;
+
7001 goto end;
+
7002 }
+
7003 else if (this->interval.end < end && text[this->interval.end]) {
+
7004 if (stdex::isspace(text[this->interval.end]))
+
7005 this->interval.end++;
+
7006 else
+
7007 break;
+
7008 }
+
7009 else
+
7010 goto end;
+
7011 }
+
7012 for (;;) {
+
7013 if (m_line_break.match(text, this->interval.end, end, flags)) {
+
7014 this->interval.end = m_line_break.interval.end;
+
7015 goto end;
+
7016 }
+
7017 else if (protocol.match(text, this->interval.end, end, flags)) {
+
7018 this->interval.end = protocol.interval.end;
+
7019 break;
+
7020 }
+
7021 else
7022 goto end;
-
7023 }
-
7024 else if (this->interval.end < end && text[this->interval.end]) {
-
7025 if (stdex::isspace(text[this->interval.end]))
-
7026 this->interval.end++;
-
7027 else
-
7028 break;
+
7023 }
+
7024
+
7025 for (;;) {
+
7026 if (m_line_break.match(text, this->interval.end, end, flags)) {
+
7027 this->interval.end = m_line_break.interval.end;
+
7028 break;
7029 }
-
7030 else
-
7031 goto end;
-
7032 }
-
7033 for (;;) {
-
7034 if (m_line_break.match(text, this->interval.end, end, flags)) {
-
7035 this->interval.end = m_line_break.interval.end;
-
7036 goto end;
-
7037 }
-
7038 else if (protocol.match(text, this->interval.end, end, flags)) {
-
7039 this->interval.end = protocol.interval.end;
-
7040 break;
-
7041 }
-
7042 else
-
7043 goto end;
-
7044 }
-
7045
-
7046 for (;;) {
-
7047 if (m_line_break.match(text, this->interval.end, end, flags)) {
-
7048 this->interval.end = m_line_break.interval.end;
-
7049 break;
-
7050 }
-
7051 else if (this->interval.end < end && text[this->interval.end])
-
7052 this->interval.end++;
-
7053 else
-
7054 goto end;
-
7055 }
-
7056
-
7057 end:
-
7058 this->interval.start = start;
-
7059 return true;
-
7060
-
7061 error:
-
7062 invalidate();
-
7063 return false;
-
7064 }
+
7030 else if (this->interval.end < end && text[this->interval.end])
+
7031 this->interval.end++;
+
7032 else
+
7033 goto end;
+
7034 }
+
7035
+
7036 end:
+
7037 this->interval.start = start;
+
7038 return true;
+
7039
+
7040 error:
+
7041 invalidate();
+
7042 return false;
+
7043 }
+
7044
+
7045 http_line_break m_line_break;
+
7046 };
+
+
7047
+
+
7051 class http_header : public parser
+
7052 {
+
7053 public:
+
7054 virtual void invalidate()
+
7055 {
+
7056 name.start = 1;
+
7057 name.end = 0;
+
7058 value.start = 1;
+
7059 value.end = 0;
+
7060 parser::invalidate();
+
7061 }
+
7062
+ +
7065
-
7066 http_line_break m_line_break;
-
7067 };
+
7066 protected:
+
7067 virtual bool do_match(
+
7068 _In_reads_or_z_(end) const char* text,
+
7069 _In_ size_t start = 0,
+
7070 _In_ size_t end = SIZE_MAX,
+
7071 _In_ int flags = match_default)
+
7072 {
+
7073 _Assume_(text || start >= end);
+
7074 this->interval.end = start;
+
7075
+
7076 if (m_line_break.match(text, this->interval.end, end, flags) ||
+
7077 (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])))
+
7078 goto error;
+
7079 name.start = this->interval.end;
+
7080 for (;;) {
+
7081 if (m_line_break.match(text, this->interval.end, end, flags))
+
7082 goto error;
+
7083 else if (this->interval.end < end && text[this->interval.end]) {
+
7084 if (stdex::isspace(text[this->interval.end])) {
+
7085 name.end = this->interval.end;
+
7086 this->interval.end++;
+
7087 for (;;) {
+
7088 if (m_line_break.match(text, this->interval.end, end, flags))
+
7089 goto error;
+
7090 else if (this->interval.end < end && text[this->interval.end]) {
+
7091 if (stdex::isspace(text[this->interval.end]))
+
7092 this->interval.end++;
+
7093 else
+
7094 break;
+
7095 }
+
7096 else
+
7097 goto error;
+
7098 }
+
7099 if (this->interval.end < end && text[this->interval.end] == ':') {
+
7100 this->interval.end++;
+
7101 break;
+
7102 }
+
7103 else
+
7104 goto error;
+
7105 break;
+
7106 }
+
7107 else if (text[this->interval.end] == ':') {
+
7108 name.end = this->interval.end;
+
7109 this->interval.end++;
+
7110 break;
+
7111 }
+
7112 else
+
7113 this->interval.end++;
+
7114 }
+
7115 else
+
7116 goto error;
+
7117 }
+
7118 value.start = SIZE_MAX;
+
7119 value.end = 0;
+
7120 for (;;) {
+
7121 if (m_line_break.match(text, this->interval.end, end, flags)) {
+
7122 this->interval.end = m_line_break.interval.end;
+
7123 if (!m_line_break.match(text, this->interval.end, end, flags) &&
+
7124 this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end]))
+
7125 this->interval.end++;
+
7126 else
+
7127 break;
+
7128 }
+
7129 else if (this->interval.end < end && text[this->interval.end]) {
+
7130 if (stdex::isspace(text[this->interval.end]))
+
7131 this->interval.end++;
+
7132 else {
+
7133 if (value.start == SIZE_MAX) value.start = this->interval.end;
+
7134 value.end = ++this->interval.end;
+
7135 }
+
7136 }
+
7137 else
+
7138 break;
+
7139 }
+
7140 this->interval.start = start;
+
7141 return true;
+
7142
+
7143 error:
+
7144 invalidate();
+
7145 return false;
+
7146 }
+
7147
+
7148 http_line_break m_line_break;
+
7149 };
-
7068
-
-
7072 class http_header : public parser
-
7073 {
-
7074 public:
-
7075 virtual void invalidate()
-
7076 {
-
7077 name.start = 1;
-
7078 name.end = 0;
-
7079 value.start = 1;
-
7080 value.end = 0;
-
7081 parser::invalidate();
-
7082 }
-
7083
- - -
7086
-
7087 protected:
-
7088 virtual bool do_match(
-
7089 _In_reads_or_z_(end) const char* text,
-
7090 _In_ size_t start = 0,
-
7091 _In_ size_t end = SIZE_MAX,
-
7092 _In_ int flags = match_default)
-
7093 {
-
7094 _Assume_(text || start >= end);
-
7095 this->interval.end = start;
-
7096
-
7097 if (m_line_break.match(text, this->interval.end, end, flags) ||
-
7098 (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])))
-
7099 goto error;
-
7100 name.start = this->interval.end;
-
7101 for (;;) {
-
7102 if (m_line_break.match(text, this->interval.end, end, flags))
-
7103 goto error;
-
7104 else if (this->interval.end < end && text[this->interval.end]) {
-
7105 if (stdex::isspace(text[this->interval.end])) {
-
7106 name.end = this->interval.end;
-
7107 this->interval.end++;
-
7108 for (;;) {
-
7109 if (m_line_break.match(text, this->interval.end, end, flags))
-
7110 goto error;
-
7111 else if (this->interval.end < end && text[this->interval.end]) {
-
7112 if (stdex::isspace(text[this->interval.end]))
-
7113 this->interval.end++;
-
7114 else
-
7115 break;
-
7116 }
-
7117 else
-
7118 goto error;
-
7119 }
-
7120 if (this->interval.end < end && text[this->interval.end] == ':') {
-
7121 this->interval.end++;
-
7122 break;
-
7123 }
-
7124 else
-
7125 goto error;
-
7126 break;
-
7127 }
-
7128 else if (text[this->interval.end] == ':') {
-
7129 name.end = this->interval.end;
-
7130 this->interval.end++;
-
7131 break;
-
7132 }
-
7133 else
-
7134 this->interval.end++;
-
7135 }
-
7136 else
-
7137 goto error;
-
7138 }
-
7139 value.start = SIZE_MAX;
-
7140 value.end = 0;
-
7141 for (;;) {
-
7142 if (m_line_break.match(text, this->interval.end, end, flags)) {
-
7143 this->interval.end = m_line_break.interval.end;
-
7144 if (!m_line_break.match(text, this->interval.end, end, flags) &&
-
7145 this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end]))
-
7146 this->interval.end++;
-
7147 else
-
7148 break;
-
7149 }
-
7150 else if (this->interval.end < end && text[this->interval.end]) {
-
7151 if (stdex::isspace(text[this->interval.end]))
-
7152 this->interval.end++;
-
7153 else {
-
7154 if (value.start == SIZE_MAX) value.start = this->interval.end;
-
7155 value.end = ++this->interval.end;
-
7156 }
-
7157 }
-
7158 else
-
7159 break;
-
7160 }
-
7161 this->interval.start = start;
-
7162 return true;
-
7163
-
7164 error:
-
7165 invalidate();
-
7166 return false;
-
7167 }
-
7168
-
7169 http_line_break m_line_break;
-
7170 };
+
7150
+
7154 template <class KEY, class T>
+
+
7155 class http_value_collection : public T
+
7156 {
+
7157 public:
+
7158 void insert(
+
7159 _In_reads_or_z_(end) const char* text,
+
7160 _In_ size_t start = 0,
+
7161 _In_ size_t end = SIZE_MAX,
+
7162 _In_ int flags = match_default)
+
7163 {
+
7164 while (start < end) {
+
7165 while (start < end && text[start] && stdex::isspace(text[start])) start++;
+
7166 if (start < end && text[start] == ',') {
+
7167 start++;
+
7168 while (start < end&& text[start] && stdex::isspace(text[start])) start++;
+
7169 }
+
7170 KEY el;
+
7171 if (el.match(text, start, end, flags)) {
+
7172 start = el.interval.end;
+
7173 T::insert(std::move(el));
+
7174 }
+
7175 else
+
7176 break;
+
7177 }
+
7178 }
+
7179 };
-
7171
-
7175 template <class KEY, class T>
-
-
7176 class http_value_collection : public T
-
7177 {
-
7178 public:
-
7179 void insert(
-
7180 _In_reads_or_z_(end) const char* text,
-
7181 _In_ size_t start = 0,
-
7182 _In_ size_t end = SIZE_MAX,
-
7183 _In_ int flags = match_default)
+
7180
+
7181 template <class T>
+
+ +
7183 constexpr bool operator()(const T& a, const T& b) const noexcept
7184 {
-
7185 while (start < end) {
-
7186 while (start < end && text[start] && stdex::isspace(text[start])) start++;
-
7187 if (start < end && text[start] == ',') {
-
7188 start++;
-
7189 while (start < end&& text[start] && stdex::isspace(text[start])) start++;
-
7190 }
-
7191 KEY el;
-
7192 if (el.match(text, start, end, flags)) {
-
7193 start = el.interval.end;
-
7194 T::insert(std::move(el));
-
7195 }
-
7196 else
-
7197 break;
-
7198 }
-
7199 }
-
7200 };
+
7185 return a.factor.value > b.factor.value;
+
7186 }
+
7187 };
-
7201
-
7202 template <class T>
-
- -
7204 constexpr bool operator()(const T& a, const T& b) const noexcept
-
7205 {
-
7206 return a.factor.value > b.factor.value;
-
7207 }
-
7208 };
+
7188
+
7192 template <class T, class AX = std::allocator<T>>
+ +
7194
+
7198 template <class T>
+
+ +
7200 {
+
7201 public:
+ +
7203 _In_ const std::shared_ptr<basic_parser<T>>& quote,
+
7204 _In_ const std::shared_ptr<basic_parser<T>>& chr,
+
7205 _In_ const std::shared_ptr<basic_parser<T>>& escape,
+
7206 _In_ const std::shared_ptr<basic_parser<T>>& sol,
+
7207 _In_ const std::shared_ptr<basic_parser<T>>& bs,
+
7208 _In_ const std::shared_ptr<basic_parser<T>>& ff,
+
7209 _In_ const std::shared_ptr<basic_parser<T>>& lf,
+
7210 _In_ const std::shared_ptr<basic_parser<T>>& cr,
+
7211 _In_ const std::shared_ptr<basic_parser<T>>& htab,
+
7212 _In_ const std::shared_ptr<basic_parser<T>>& uni,
+
7213 _In_ const std::shared_ptr<basic_integer16<T>>& hex,
+
7214 _In_ const std::locale& locale = std::locale()) :
+ +
7216 m_quote(quote),
+
7217 m_chr(chr),
+
7218 m_escape(escape),
+
7219 m_sol(sol),
+
7220 m_bs(bs),
+
7221 m_ff(ff),
+
7222 m_lf(lf),
+
7223 m_cr(cr),
+
7224 m_htab(htab),
+
7225 m_uni(uni),
+
7226 m_hex(hex)
+
7227 {}
+
7228
+
7229 virtual void invalidate()
+
7230 {
+
7231 value.clear();
+ +
7233 }
+
7234
+
7235 std::basic_string<T> value;
+
7236
+
7237 protected:
+
7238 virtual bool do_match(
+
7239 _In_reads_or_z_opt_(end) const T* text,
+
7240 _In_ size_t start = 0,
+
7241 _In_ size_t end = SIZE_MAX,
+
7242 _In_ int flags = match_default)
+
7243 {
+
7244 _Assume_(text || start >= end);
+
7245 this->interval.end = start;
+
7246 if (m_quote->match(text, this->interval.end, end, flags)) {
+
7247 this->interval.end = m_quote->interval.end;
+
7248 value.clear();
+
7249 for (;;) {
+
7250 if (m_quote->match(text, this->interval.end, end, flags)) {
+
7251 this->interval.start = start;
+
7252 this->interval.end = m_quote->interval.end;
+
7253 return true;
+
7254 }
+
7255 if (m_escape->match(text, this->interval.end, end, flags)) {
+
7256 if (m_quote->match(text, m_escape->interval.end, end, flags)) {
+
7257 value += '"'; this->interval.end = m_quote->interval.end;
+
7258 continue;
+
7259 }
+
7260 if (m_sol->match(text, m_escape->interval.end, end, flags)) {
+
7261 value += '/'; this->interval.end = m_sol->interval.end;
+
7262 continue;
+
7263 }
+
7264 if (m_bs->match(text, m_escape->interval.end, end, flags)) {
+
7265 value += '\b'; this->interval.end = m_bs->interval.end;
+
7266 continue;
+
7267 }
+
7268 if (m_ff->match(text, m_escape->interval.end, end, flags)) {
+
7269 value += '\f'; this->interval.end = m_ff->interval.end;
+
7270 continue;
+
7271 }
+
7272 if (m_lf->match(text, m_escape->interval.end, end, flags)) {
+
7273 value += '\n'; this->interval.end = m_lf->interval.end;
+
7274 continue;
+
7275 }
+
7276 if (m_cr->match(text, m_escape->interval.end, end, flags)) {
+
7277 value += '\r'; this->interval.end = m_cr->interval.end;
+
7278 continue;
+
7279 }
+
7280 if (m_htab->match(text, m_escape->interval.end, end, flags)) {
+
7281 value += '\t'; this->interval.end = m_htab->interval.end;
+
7282 continue;
+
7283 }
+
7284 if (
+
7285 m_uni->match(text, m_escape->interval.end, end, flags) &&
+
7286 m_hex->match(text, m_uni->interval.end, std::min(m_uni->interval.end + 4, end), flags | match_case_insensitive) &&
+
7287 m_hex->interval.size() == 4 /* JSON requests 4-digit Unicode sequneces: \u.... */)
+
7288 {
+
7289 _Assume_(m_hex->value <= 0xffff);
+
7290 if (sizeof(T) == 1) {
+
7291 if (m_hex->value > 0x7ff) {
+
7292 value += (T)(0xe0 | ((m_hex->value >> 12) & 0x0f));
+
7293 value += (T)(0x80 | ((m_hex->value >> 6) & 0x3f));
+
7294 value += (T)(0x80 | (m_hex->value & 0x3f));
+
7295 }
+
7296 else if (m_hex->value > 0x7f) {
+
7297 value += (T)(0xc0 | ((m_hex->value >> 6) & 0x1f));
+
7298 value += (T)(0x80 | (m_hex->value & 0x3f));
+
7299 }
+
7300 else
+
7301 value += (T)(m_hex->value & 0x7f);
+
7302 }
+
7303 else
+
7304 value += (T)m_hex->value;
+
7305 this->interval.end = m_hex->interval.end;
+
7306 continue;
+
7307 }
+
7308 if (m_escape->match(text, m_escape->interval.end, end, flags)) {
+
7309 value += '\\'; this->interval.end = m_escape->interval.end;
+
7310 continue;
+
7311 }
+
7312 }
+
7313 if (m_chr->match(text, this->interval.end, end, flags)) {
+
7314 value.append(text + m_chr->interval.start, m_chr->interval.size());
+
7315 this->interval.end = m_chr->interval.end;
+
7316 continue;
+
7317 }
+
7318 break;
+
7319 }
+
7320 }
+
7321 value.clear();
+
7322 this->interval.invalidate();
+
7323 return false;
+
7324 }
+
7325
+
7326 std::shared_ptr<basic_parser<T>> m_quote;
+
7327 std::shared_ptr<basic_parser<T>> m_chr;
+
7328 std::shared_ptr<basic_parser<T>> m_escape;
+
7329 std::shared_ptr<basic_parser<T>> m_sol;
+
7330 std::shared_ptr<basic_parser<T>> m_bs;
+
7331 std::shared_ptr<basic_parser<T>> m_ff;
+
7332 std::shared_ptr<basic_parser<T>> m_lf;
+
7333 std::shared_ptr<basic_parser<T>> m_cr;
+
7334 std::shared_ptr<basic_parser<T>> m_htab;
+
7335 std::shared_ptr<basic_parser<T>> m_uni;
+
7336 std::shared_ptr<basic_integer16<T>> m_hex;
+
7337 };
-
7209
-
7213 template <class T, class AX = std::allocator<T>>
- -
7215
-
7219 template <class T>
-
- -
7221 {
-
7222 public:
- -
7224 _In_ const std::shared_ptr<basic_parser<T>>& quote,
-
7225 _In_ const std::shared_ptr<basic_parser<T>>& chr,
-
7226 _In_ const std::shared_ptr<basic_parser<T>>& escape,
-
7227 _In_ const std::shared_ptr<basic_parser<T>>& sol,
-
7228 _In_ const std::shared_ptr<basic_parser<T>>& bs,
-
7229 _In_ const std::shared_ptr<basic_parser<T>>& ff,
-
7230 _In_ const std::shared_ptr<basic_parser<T>>& lf,
-
7231 _In_ const std::shared_ptr<basic_parser<T>>& cr,
-
7232 _In_ const std::shared_ptr<basic_parser<T>>& htab,
-
7233 _In_ const std::shared_ptr<basic_parser<T>>& uni,
-
7234 _In_ const std::shared_ptr<basic_integer16<T>>& hex,
-
7235 _In_ const std::locale& locale = std::locale()) :
- -
7237 m_quote(quote),
-
7238 m_chr(chr),
-
7239 m_escape(escape),
-
7240 m_sol(sol),
-
7241 m_bs(bs),
-
7242 m_ff(ff),
-
7243 m_lf(lf),
-
7244 m_cr(cr),
-
7245 m_htab(htab),
-
7246 m_uni(uni),
-
7247 m_hex(hex)
-
7248 {}
-
7249
-
7250 virtual void invalidate()
-
7251 {
-
7252 value.clear();
- -
7254 }
-
7255
-
7256 std::basic_string<T> value;
-
7257
-
7258 protected:
-
7259 virtual bool do_match(
-
7260 _In_reads_or_z_opt_(end) const T* text,
-
7261 _In_ size_t start = 0,
-
7262 _In_ size_t end = SIZE_MAX,
-
7263 _In_ int flags = match_default)
-
7264 {
-
7265 _Assume_(text || start >= end);
-
7266 this->interval.end = start;
-
7267 if (m_quote->match(text, this->interval.end, end, flags)) {
-
7268 this->interval.end = m_quote->interval.end;
-
7269 value.clear();
-
7270 for (;;) {
-
7271 if (m_quote->match(text, this->interval.end, end, flags)) {
-
7272 this->interval.start = start;
-
7273 this->interval.end = m_quote->interval.end;
-
7274 return true;
-
7275 }
-
7276 if (m_escape->match(text, this->interval.end, end, flags)) {
-
7277 if (m_quote->match(text, m_escape->interval.end, end, flags)) {
-
7278 value += '"'; this->interval.end = m_quote->interval.end;
-
7279 continue;
-
7280 }
-
7281 if (m_sol->match(text, m_escape->interval.end, end, flags)) {
-
7282 value += '/'; this->interval.end = m_sol->interval.end;
-
7283 continue;
-
7284 }
-
7285 if (m_bs->match(text, m_escape->interval.end, end, flags)) {
-
7286 value += '\b'; this->interval.end = m_bs->interval.end;
-
7287 continue;
-
7288 }
-
7289 if (m_ff->match(text, m_escape->interval.end, end, flags)) {
-
7290 value += '\f'; this->interval.end = m_ff->interval.end;
-
7291 continue;
-
7292 }
-
7293 if (m_lf->match(text, m_escape->interval.end, end, flags)) {
-
7294 value += '\n'; this->interval.end = m_lf->interval.end;
-
7295 continue;
-
7296 }
-
7297 if (m_cr->match(text, m_escape->interval.end, end, flags)) {
-
7298 value += '\r'; this->interval.end = m_cr->interval.end;
-
7299 continue;
-
7300 }
-
7301 if (m_htab->match(text, m_escape->interval.end, end, flags)) {
-
7302 value += '\t'; this->interval.end = m_htab->interval.end;
-
7303 continue;
-
7304 }
-
7305 if (
-
7306 m_uni->match(text, m_escape->interval.end, end, flags) &&
-
7307 m_hex->match(text, m_uni->interval.end, std::min(m_uni->interval.end + 4, end), flags | match_case_insensitive) &&
-
7308 m_hex->interval.size() == 4 /* JSON requests 4-digit Unicode sequneces: \u.... */)
-
7309 {
-
7310 _Assume_(m_hex->value <= 0xffff);
-
7311 if (sizeof(T) == 1) {
-
7312 if (m_hex->value > 0x7ff) {
-
7313 value += (T)(0xe0 | ((m_hex->value >> 12) & 0x0f));
-
7314 value += (T)(0x80 | ((m_hex->value >> 6) & 0x3f));
-
7315 value += (T)(0x80 | (m_hex->value & 0x3f));
-
7316 }
-
7317 else if (m_hex->value > 0x7f) {
-
7318 value += (T)(0xc0 | ((m_hex->value >> 6) & 0x1f));
-
7319 value += (T)(0x80 | (m_hex->value & 0x3f));
-
7320 }
-
7321 else
-
7322 value += (T)(m_hex->value & 0x7f);
-
7323 }
-
7324 else
-
7325 value += (T)m_hex->value;
-
7326 this->interval.end = m_hex->interval.end;
-
7327 continue;
-
7328 }
-
7329 if (m_escape->match(text, m_escape->interval.end, end, flags)) {
-
7330 value += '\\'; this->interval.end = m_escape->interval.end;
-
7331 continue;
-
7332 }
-
7333 }
-
7334 if (m_chr->match(text, this->interval.end, end, flags)) {
-
7335 value.append(text + m_chr->interval.start, m_chr->interval.size());
-
7336 this->interval.end = m_chr->interval.end;
-
7337 continue;
-
7338 }
-
7339 break;
-
7340 }
-
7341 }
-
7342 value.clear();
-
7343 this->interval.invalidate();
-
7344 return false;
-
7345 }
+
7338
+ + +
7341#ifdef _UNICODE
+
7342 using tjson_string = wjson_string;
+
7343#else
+
7344 using tjson_string = json_string;
+
7345#endif
7346
-
7347 std::shared_ptr<basic_parser<T>> m_quote;
-
7348 std::shared_ptr<basic_parser<T>> m_chr;
-
7349 std::shared_ptr<basic_parser<T>> m_escape;
-
7350 std::shared_ptr<basic_parser<T>> m_sol;
-
7351 std::shared_ptr<basic_parser<T>> m_bs;
-
7352 std::shared_ptr<basic_parser<T>> m_ff;
-
7353 std::shared_ptr<basic_parser<T>> m_lf;
-
7354 std::shared_ptr<basic_parser<T>> m_cr;
-
7355 std::shared_ptr<basic_parser<T>> m_htab;
-
7356 std::shared_ptr<basic_parser<T>> m_uni;
-
7357 std::shared_ptr<basic_integer16<T>> m_hex;
-
7358 };
-
+
7350 template <class T>
+
+ +
7352 {
+
7353 public:
+
7354 virtual void invalidate()
+
7355 {
+
7356 this->content.invalidate();
+ +
7358 }
7359
- - -
7362#ifdef _UNICODE
-
7363 using tjson_string = wjson_string;
-
7364#else
-
7365 using tjson_string = json_string;
-
7366#endif
-
7367
-
7371 template <class T>
-
- -
7373 {
-
7374 public:
-
7375 virtual void invalidate()
-
7376 {
-
7377 this->content.invalidate();
- -
7379 }
-
7380
- -
7382
-
7383 protected:
-
7384 virtual bool do_match(
-
7385 _In_reads_or_z_opt_(end) const T* text,
-
7386 _In_ size_t start = 0,
-
7387 _In_ size_t end = SIZE_MAX,
-
7388 _In_ int flags = match_multiline)
-
7389 {
-
7390 _Unreferenced_(flags);
-
7391 _Assume_(text || start + 1 >= end);
-
7392 if (start + 1 < end &&
-
7393 text[start] == '/' &&
-
7394 text[start + 1] == '*')
-
7395 {
-
7396 // /*
-
7397 this->content.start = this->interval.end = start + 2;
-
7398 for (;;) {
-
7399 if (this->interval.end >= end || !text[this->interval.end])
-
7400 break;
-
7401 if (this->interval.end + 1 < end &&
-
7402 text[this->interval.end] == '*' &&
-
7403 text[this->interval.end + 1] == '/')
-
7404 {
-
7405 // /*...*/
-
7406 this->content.end = this->interval.end;
-
7407 this->interval.start = start;
-
7408 this->interval.end = this->interval.end + 2;
-
7409 return true;
-
7410 }
-
7411 this->interval.end++;
-
7412 }
-
7413 }
-
7414 this->content.invalidate();
-
7415 this->interval.invalidate();
-
7416 return false;
-
7417 }
-
7418 };
+ +
7361
+
7362 protected:
+
7363 virtual bool do_match(
+
7364 _In_reads_or_z_opt_(end) const T* text,
+
7365 _In_ size_t start = 0,
+
7366 _In_ size_t end = SIZE_MAX,
+
7367 _In_ int flags = match_multiline)
+
7368 {
+
7369 _Unreferenced_(flags);
+
7370 _Assume_(text || start + 1 >= end);
+
7371 if (start + 1 < end &&
+
7372 text[start] == '/' &&
+
7373 text[start + 1] == '*')
+
7374 {
+
7375 // /*
+
7376 this->content.start = this->interval.end = start + 2;
+
7377 for (;;) {
+
7378 if (this->interval.end >= end || !text[this->interval.end])
+
7379 break;
+
7380 if (this->interval.end + 1 < end &&
+
7381 text[this->interval.end] == '*' &&
+
7382 text[this->interval.end + 1] == '/')
+
7383 {
+
7384 // /*...*/
+
7385 this->content.end = this->interval.end;
+
7386 this->interval.start = start;
+
7387 this->interval.end = this->interval.end + 2;
+
7388 return true;
+
7389 }
+
7390 this->interval.end++;
+
7391 }
+
7392 }
+
7393 this->content.invalidate();
+
7394 this->interval.invalidate();
+
7395 return false;
+
7396 }
+
7397 };
-
7419
-
7420 using css_comment = basic_css_comment<char>;
-
7421 using wcss_comment = basic_css_comment<wchar_t>;
-
7422#ifdef _UNICODE
-
7423 using tcss_comment = wcss_comment;
-
7424#else
-
7425 using tcss_comment = css_comment;
-
7426#endif
-
7427
-
7431 template <class T>
-
-
7432 class basic_css_cdo : public basic_parser<T>
-
7433 {
-
7434 protected:
-
7435 virtual bool do_match(
-
7436 _In_reads_or_z_opt_(end) const T* text,
-
7437 _In_ size_t start = 0,
-
7438 _In_ size_t end = SIZE_MAX,
-
7439 _In_ int flags = match_multiline)
-
7440 {
-
7441 _Unreferenced_(flags);
-
7442 _Assume_(text || start + 3 >= end);
-
7443 if (start + 3 < end &&
-
7444 text[start] == '<' &&
-
7445 text[start + 1] == '!' &&
-
7446 text[start + 2] == '-' &&
-
7447 text[start + 3] == '-')
-
7448 {
-
7449 this->interval.start = start;
-
7450 this->interval.end = start + 4;
-
7451 return true;
-
7452 }
-
7453 this->interval.invalidate();
-
7454 return false;
-
7455 }
-
7456 };
+
7398
+
7399 using css_comment = basic_css_comment<char>;
+
7400 using wcss_comment = basic_css_comment<wchar_t>;
+
7401#ifdef _UNICODE
+
7402 using tcss_comment = wcss_comment;
+
7403#else
+
7404 using tcss_comment = css_comment;
+
7405#endif
+
7406
+
7410 template <class T>
+
+
7411 class basic_css_cdo : public basic_parser<T>
+
7412 {
+
7413 protected:
+
7414 virtual bool do_match(
+
7415 _In_reads_or_z_opt_(end) const T* text,
+
7416 _In_ size_t start = 0,
+
7417 _In_ size_t end = SIZE_MAX,
+
7418 _In_ int flags = match_multiline)
+
7419 {
+
7420 _Unreferenced_(flags);
+
7421 _Assume_(text || start + 3 >= end);
+
7422 if (start + 3 < end &&
+
7423 text[start] == '<' &&
+
7424 text[start + 1] == '!' &&
+
7425 text[start + 2] == '-' &&
+
7426 text[start + 3] == '-')
+
7427 {
+
7428 this->interval.start = start;
+
7429 this->interval.end = start + 4;
+
7430 return true;
+
7431 }
+
7432 this->interval.invalidate();
+
7433 return false;
+
7434 }
+
7435 };
-
7457
- - -
7460#ifdef _UNICODE
-
7461 using tcss_cdo = wcss_cdo;
-
7462#else
-
7463 using tcss_cdo = css_cdo;
-
7464#endif
-
7465
-
7469 template <class T>
-
-
7470 class basic_css_cdc : public basic_parser<T>
-
7471 {
-
7472 protected:
-
7473 virtual bool do_match(
-
7474 _In_reads_or_z_opt_(end) const T* text,
-
7475 _In_ size_t start = 0,
-
7476 _In_ size_t end = SIZE_MAX,
-
7477 _In_ int flags = match_multiline)
-
7478 {
-
7479 _Unreferenced_(flags);
-
7480 _Assume_(text || start + 2 >= end);
-
7481 if (start + 2 < end &&
-
7482 text[start] == '-' &&
-
7483 text[start + 1] == '-' &&
-
7484 text[start + 2] == '>')
-
7485 {
-
7486 this->interval.start = start;
-
7487 this->interval.end = start + 3;
-
7488 return true;
-
7489 }
-
7490 this->interval.invalidate();
-
7491 return false;
-
7492 }
-
7493 };
+
7436
+ + +
7439#ifdef _UNICODE
+
7440 using tcss_cdo = wcss_cdo;
+
7441#else
+
7442 using tcss_cdo = css_cdo;
+
7443#endif
+
7444
+
7448 template <class T>
+
+
7449 class basic_css_cdc : public basic_parser<T>
+
7450 {
+
7451 protected:
+
7452 virtual bool do_match(
+
7453 _In_reads_or_z_opt_(end) const T* text,
+
7454 _In_ size_t start = 0,
+
7455 _In_ size_t end = SIZE_MAX,
+
7456 _In_ int flags = match_multiline)
+
7457 {
+
7458 _Unreferenced_(flags);
+
7459 _Assume_(text || start + 2 >= end);
+
7460 if (start + 2 < end &&
+
7461 text[start] == '-' &&
+
7462 text[start + 1] == '-' &&
+
7463 text[start + 2] == '>')
+
7464 {
+
7465 this->interval.start = start;
+
7466 this->interval.end = start + 3;
+
7467 return true;
+
7468 }
+
7469 this->interval.invalidate();
+
7470 return false;
+
7471 }
+
7472 };
+
7473
+ + +
7476#ifdef _UNICODE
+
7477 using tcss_cdc = wcss_cdc;
+
7478#else
+
7479 using tcss_cdc = css_cdc;
+
7480#endif
+
7481
+
7485 template <class T>
+
+ +
7487 {
+
7488 public:
+
7489 virtual void invalidate()
+
7490 {
+
7491 this->content.invalidate();
+ +
7493 }
7494
- - -
7497#ifdef _UNICODE
-
7498 using tcss_cdc = wcss_cdc;
-
7499#else
-
7500 using tcss_cdc = css_cdc;
-
7501#endif
-
7502
-
7506 template <class T>
-
- -
7508 {
-
7509 public:
-
7510 virtual void invalidate()
-
7511 {
-
7512 this->content.invalidate();
- -
7514 }
-
7515
- -
7517
-
7518 protected:
-
7519 virtual bool do_match(
-
7520 _In_reads_or_z_opt_(end) const T* text,
-
7521 _In_ size_t start = 0,
-
7522 _In_ size_t end = SIZE_MAX,
-
7523 _In_ int flags = match_multiline)
-
7524 {
-
7525 _Unreferenced_(flags);
-
7526 this->interval.end = start;
-
7527 _Assume_(text || this->interval.end >= end);
-
7528 if (this->interval.end < end &&
-
7529 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
-
7530 {
-
7531 // "Quoted...
-
7532 T quote = text[this->interval.end];
-
7533 this->content.start = ++this->interval.end;
-
7534 for (;;) {
-
7535 if (this->interval.end >= end || !text[this->interval.end])
-
7536 break;
-
7537 if (text[this->interval.end] == quote) {
-
7538 // End quote"
-
7539 this->content.end = this->interval.end;
-
7540 this->interval.start = start;
-
7541 this->interval.end++;
-
7542 return true;
-
7543 }
-
7544 if (this->interval.end + 1 < end &&
-
7545 text[this->interval.end] == '\\' &&
-
7546 (text[this->interval.end + 1] == '\"' || text[this->interval.end + 1] == '\''))
-
7547 {
-
7548 // Escaped quote
-
7549 this->interval.end = this->interval.end + 2;
-
7550 }
-
7551 else
-
7552 this->interval.end++;
-
7553 }
-
7554 }
-
7555
-
7556 this->content.invalidate();
-
7557 this->interval.invalidate();
-
7558 return false;
-
7559 }
-
7560 };
+ +
7496
+
7497 protected:
+
7498 virtual bool do_match(
+
7499 _In_reads_or_z_opt_(end) const T* text,
+
7500 _In_ size_t start = 0,
+
7501 _In_ size_t end = SIZE_MAX,
+
7502 _In_ int flags = match_multiline)
+
7503 {
+
7504 _Unreferenced_(flags);
+
7505 this->interval.end = start;
+
7506 _Assume_(text || this->interval.end >= end);
+
7507 if (this->interval.end < end &&
+
7508 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
+
7509 {
+
7510 // "Quoted...
+
7511 T quote = text[this->interval.end];
+
7512 this->content.start = ++this->interval.end;
+
7513 for (;;) {
+
7514 if (this->interval.end >= end || !text[this->interval.end])
+
7515 break;
+
7516 if (text[this->interval.end] == quote) {
+
7517 // End quote"
+
7518 this->content.end = this->interval.end;
+
7519 this->interval.start = start;
+
7520 this->interval.end++;
+
7521 return true;
+
7522 }
+
7523 if (this->interval.end + 1 < end &&
+
7524 text[this->interval.end] == '\\' &&
+
7525 (text[this->interval.end + 1] == '\"' || text[this->interval.end + 1] == '\''))
+
7526 {
+
7527 // Escaped quote
+
7528 this->interval.end = this->interval.end + 2;
+
7529 }
+
7530 else
+
7531 this->interval.end++;
+
7532 }
+
7533 }
+
7534
+
7535 this->content.invalidate();
+
7536 this->interval.invalidate();
+
7537 return false;
+
7538 }
+
7539 };
+
7540
+
7541 using css_string = basic_css_string<char>;
+
7542 using wcss_string = basic_css_string<wchar_t>;
+
7543#ifdef _UNICODE
+
7544 using tcss_string = wcss_string;
+
7545#else
+
7546 using tcss_string = css_string;
+
7547#endif
+
7548
+
7552 template <class T>
+
+
7553 class basic_css_uri : public basic_parser<T>
+
7554 {
+
7555 public:
+
7556 virtual void invalidate()
+
7557 {
+
7558 this->content.invalidate();
+ +
7560 }
7561
-
7562 using css_string = basic_css_string<char>;
-
7563 using wcss_string = basic_css_string<wchar_t>;
-
7564#ifdef _UNICODE
-
7565 using tcss_string = wcss_string;
-
7566#else
-
7567 using tcss_string = css_string;
-
7568#endif
-
7569
-
7573 template <class T>
-
-
7574 class basic_css_uri : public basic_parser<T>
-
7575 {
-
7576 public:
-
7577 virtual void invalidate()
-
7578 {
-
7579 this->content.invalidate();
- -
7581 }
+ +
7563
+
7564 protected:
+
7565 virtual bool do_match(
+
7566 _In_reads_or_z_opt_(end) const T* text,
+
7567 _In_ size_t start = 0,
+
7568 _In_ size_t end = SIZE_MAX,
+
7569 _In_ int flags = match_multiline)
+
7570 {
+
7571 _Unreferenced_(flags);
+
7572 this->interval.end = start;
+
7573 _Assume_(text || this->interval.end + 3 >= end);
+
7574 if (this->interval.end + 3 < end &&
+
7575 (text[this->interval.end] == 'u' || text[this->interval.end] == 'U') &&
+
7576 (text[this->interval.end + 1] == 'r' || text[this->interval.end + 1] == 'R') &&
+
7577 (text[this->interval.end + 2] == 'l' || text[this->interval.end + 2] == 'L') &&
+
7578 text[this->interval.end + 3] == '(')
+
7579 {
+
7580 // url(
+
7581 this->interval.end = this->interval.end + 4;
7582
- -
7584
-
7585 protected:
-
7586 virtual bool do_match(
-
7587 _In_reads_or_z_opt_(end) const T* text,
-
7588 _In_ size_t start = 0,
-
7589 _In_ size_t end = SIZE_MAX,
-
7590 _In_ int flags = match_multiline)
-
7591 {
-
7592 _Unreferenced_(flags);
-
7593 this->interval.end = start;
-
7594 _Assume_(text || this->interval.end + 3 >= end);
-
7595 if (this->interval.end + 3 < end &&
-
7596 (text[this->interval.end] == 'u' || text[this->interval.end] == 'U') &&
-
7597 (text[this->interval.end + 1] == 'r' || text[this->interval.end + 1] == 'R') &&
-
7598 (text[this->interval.end + 2] == 'l' || text[this->interval.end + 2] == 'L') &&
-
7599 text[this->interval.end + 3] == '(')
-
7600 {
-
7601 // url(
-
7602 this->interval.end = this->interval.end + 4;
-
7603
-
7604 // Skip whitespace.
-
7605 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
-
7606 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
-
7607
-
7608 if (this->interval.end < end &&
-
7609 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
-
7610 {
-
7611 // url("Quoted...
-
7612 T quote = text[this->interval.end];
-
7613 this->content.start = ++this->interval.end;
-
7614 for (;;) {
-
7615 if (this->interval.end >= end || !text[this->interval.end])
-
7616 goto error;
-
7617 if (text[this->interval.end] == quote) {
-
7618 // End quote"
-
7619 this->content.end = this->interval.end;
-
7620 this->interval.end++;
-
7621 break;
-
7622 }
-
7623 if (this->interval.end + 1 < end &&
-
7624 text[this->interval.end] == '\\' &&
-
7625 (text[this->interval.end + 1] == '\"' || text[this->interval.end + 1] == '\''))
-
7626 {
-
7627 // Escaped quote
-
7628 this->interval.end = this->interval.end + 2;
-
7629 }
-
7630 else
-
7631 this->interval.end++;
-
7632 }
-
7633
-
7634 // Skip whitespace.
-
7635 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
-
7636
-
7637 if (this->interval.end < end &&
-
7638 text[this->interval.end] == ')')
-
7639 {
-
7640 // url("...")
-
7641 this->interval.start = start;
-
7642 this->interval.end++;
-
7643 return true;
-
7644 }
-
7645 }
-
7646 else {
-
7647 // url(...
-
7648 this->content.start = content.end = this->interval.end;
-
7649 for (;;) {
-
7650 if (this->interval.end >= end || !text[this->interval.end])
-
7651 goto error;
-
7652 if (text[this->interval.end] == ')') {
-
7653 // url(...)
-
7654 this->interval.start = start;
-
7655 this->interval.end++;
-
7656 return true;
-
7657 }
-
7658 if (ctype.is(ctype.space, text[this->interval.end]))
-
7659 this->interval.end++;
-
7660 else
-
7661 this->content.end = ++this->interval.end;
-
7662 }
-
7663 }
-
7664 }
-
7665
-
7666 error:
-
7667 invalidate();
-
7668 return false;
-
7669 }
-
7670 };
+
7583 // Skip whitespace.
+
7584 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
+
7585 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
+
7586
+
7587 if (this->interval.end < end &&
+
7588 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
+
7589 {
+
7590 // url("Quoted...
+
7591 T quote = text[this->interval.end];
+
7592 this->content.start = ++this->interval.end;
+
7593 for (;;) {
+
7594 if (this->interval.end >= end || !text[this->interval.end])
+
7595 goto error;
+
7596 if (text[this->interval.end] == quote) {
+
7597 // End quote"
+
7598 this->content.end = this->interval.end;
+
7599 this->interval.end++;
+
7600 break;
+
7601 }
+
7602 if (this->interval.end + 1 < end &&
+
7603 text[this->interval.end] == '\\' &&
+
7604 (text[this->interval.end + 1] == '\"' || text[this->interval.end + 1] == '\''))
+
7605 {
+
7606 // Escaped quote
+
7607 this->interval.end = this->interval.end + 2;
+
7608 }
+
7609 else
+
7610 this->interval.end++;
+
7611 }
+
7612
+
7613 // Skip whitespace.
+
7614 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
+
7615
+
7616 if (this->interval.end < end &&
+
7617 text[this->interval.end] == ')')
+
7618 {
+
7619 // url("...")
+
7620 this->interval.start = start;
+
7621 this->interval.end++;
+
7622 return true;
+
7623 }
+
7624 }
+
7625 else {
+
7626 // url(...
+
7627 this->content.start = content.end = this->interval.end;
+
7628 for (;;) {
+
7629 if (this->interval.end >= end || !text[this->interval.end])
+
7630 goto error;
+
7631 if (text[this->interval.end] == ')') {
+
7632 // url(...)
+
7633 this->interval.start = start;
+
7634 this->interval.end++;
+
7635 return true;
+
7636 }
+
7637 if (ctype.is(ctype.space, text[this->interval.end]))
+
7638 this->interval.end++;
+
7639 else
+
7640 this->content.end = ++this->interval.end;
+
7641 }
+
7642 }
+
7643 }
+
7644
+
7645 error:
+
7646 invalidate();
+
7647 return false;
+
7648 }
+
7649 };
+
7650
+
7651 using css_uri = basic_css_uri<char>;
+
7652 using wcss_uri = basic_css_uri<wchar_t>;
+
7653#ifdef _UNICODE
+
7654 using tcss_uri = wcss_uri;
+
7655#else
+
7656 using tcss_uri = css_uri;
+
7657#endif
+
7658
+
7662 template <class T>
+
+ +
7664 {
+
7665 public:
+
7666 virtual void invalidate()
+
7667 {
+
7668 this->content.invalidate();
+ +
7670 }
7671
-
7672 using css_uri = basic_css_uri<char>;
-
7673 using wcss_uri = basic_css_uri<wchar_t>;
-
7674#ifdef _UNICODE
-
7675 using tcss_uri = wcss_uri;
-
7676#else
-
7677 using tcss_uri = css_uri;
-
7678#endif
-
7679
-
7683 template <class T>
-
- -
7685 {
-
7686 public:
-
7687 virtual void invalidate()
-
7688 {
-
7689 this->content.invalidate();
- -
7691 }
-
7692
- -
7694
-
7695 protected:
-
7696 virtual bool do_match(
-
7697 _In_reads_or_z_opt_(end) const T* text,
-
7698 _In_ size_t start = 0,
-
7699 _In_ size_t end = SIZE_MAX,
-
7700 _In_ int flags = match_multiline)
-
7701 {
-
7702 _Unreferenced_(flags);
-
7703 this->interval.end = start;
-
7704 _Assume_(text || this->interval.end + 6 >= end);
-
7705 if (this->interval.end + 6 < end &&
-
7706 text[this->interval.end] == '@' &&
-
7707 (text[this->interval.end + 1] == 'i' || text[this->interval.end + 1] == 'I') &&
-
7708 (text[this->interval.end + 2] == 'm' || text[this->interval.end + 2] == 'M') &&
-
7709 (text[this->interval.end + 3] == 'p' || text[this->interval.end + 3] == 'P') &&
-
7710 (text[this->interval.end + 4] == 'o' || text[this->interval.end + 4] == 'O') &&
-
7711 (text[this->interval.end + 5] == 'r' || text[this->interval.end + 5] == 'R') &&
-
7712 (text[this->interval.end + 6] == 't' || text[this->interval.end + 6] == 'T'))
-
7713 {
-
7714 // @import...
-
7715 this->interval.end = this->interval.end + 7;
-
7716
-
7717 // Skip whitespace.
-
7718 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
-
7719 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
-
7720
-
7721 if (this->interval.end < end &&
-
7722 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
-
7723 {
-
7724 // @import "Quoted
-
7725 T quote = text[this->interval.end];
-
7726 this->content.start = ++this->interval.end;
-
7727 for (;;) {
-
7728 if (this->interval.end >= end || !text[this->interval.end])
-
7729 goto error;
-
7730 if (text[this->interval.end] == quote) {
-
7731 // End quote"
-
7732 this->content.end = this->interval.end;
-
7733 this->interval.start = start;
-
7734 this->interval.end++;
-
7735 return true;
-
7736 }
-
7737 if (this->interval.end + 1 < end &&
-
7738 text[this->interval.end] == '\\' &&
-
7739 (text[this->interval.end + 1] == '\"' || text[this->interval.end + 1] == '\''))
-
7740 {
-
7741 // Escaped quote
-
7742 this->interval.end = this->interval.end + 2;
-
7743 }
-
7744 else
-
7745 this->interval.end++;
-
7746 }
-
7747 }
-
7748 }
-
7749
-
7750 error:
-
7751 invalidate();
-
7752 return false;
-
7753 }
-
7754 };
+ +
7673
+
7674 protected:
+
7675 virtual bool do_match(
+
7676 _In_reads_or_z_opt_(end) const T* text,
+
7677 _In_ size_t start = 0,
+
7678 _In_ size_t end = SIZE_MAX,
+
7679 _In_ int flags = match_multiline)
+
7680 {
+
7681 _Unreferenced_(flags);
+
7682 this->interval.end = start;
+
7683 _Assume_(text || this->interval.end + 6 >= end);
+
7684 if (this->interval.end + 6 < end &&
+
7685 text[this->interval.end] == '@' &&
+
7686 (text[this->interval.end + 1] == 'i' || text[this->interval.end + 1] == 'I') &&
+
7687 (text[this->interval.end + 2] == 'm' || text[this->interval.end + 2] == 'M') &&
+
7688 (text[this->interval.end + 3] == 'p' || text[this->interval.end + 3] == 'P') &&
+
7689 (text[this->interval.end + 4] == 'o' || text[this->interval.end + 4] == 'O') &&
+
7690 (text[this->interval.end + 5] == 'r' || text[this->interval.end + 5] == 'R') &&
+
7691 (text[this->interval.end + 6] == 't' || text[this->interval.end + 6] == 'T'))
+
7692 {
+
7693 // @import...
+
7694 this->interval.end = this->interval.end + 7;
+
7695
+
7696 // Skip whitespace.
+
7697 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
+
7698 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
+
7699
+
7700 if (this->interval.end < end &&
+
7701 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
+
7702 {
+
7703 // @import "Quoted
+
7704 T quote = text[this->interval.end];
+
7705 this->content.start = ++this->interval.end;
+
7706 for (;;) {
+
7707 if (this->interval.end >= end || !text[this->interval.end])
+
7708 goto error;
+
7709 if (text[this->interval.end] == quote) {
+
7710 // End quote"
+
7711 this->content.end = this->interval.end;
+
7712 this->interval.start = start;
+
7713 this->interval.end++;
+
7714 return true;
+
7715 }
+
7716 if (this->interval.end + 1 < end &&
+
7717 text[this->interval.end] == '\\' &&
+
7718 (text[this->interval.end + 1] == '\"' || text[this->interval.end + 1] == '\''))
+
7719 {
+
7720 // Escaped quote
+
7721 this->interval.end = this->interval.end + 2;
+
7722 }
+
7723 else
+
7724 this->interval.end++;
+
7725 }
+
7726 }
+
7727 }
+
7728
+
7729 error:
+
7730 invalidate();
+
7731 return false;
+
7732 }
+
7733 };
-
7755
-
7756 using css_import = basic_css_import<char>;
-
7757 using wcss_import = basic_css_import<wchar_t>;
-
7758#ifdef _UNICODE
-
7759 using tcss_import = wcss_import;
-
7760#else
-
7761 using tcss_import = css_import;
-
7762#endif
-
7763
-
7767 template <class T>
-
- -
7769 {
-
7770 public:
-
7771 virtual void invalidate()
-
7772 {
-
7773 this->base_type.invalidate();
-
7774 this->sub_type.invalidate();
-
7775 this->charset.invalidate();
- -
7777 }
-
7778
- - - -
7782
-
7783 protected:
-
7784 virtual bool do_match(
-
7785 _In_reads_or_z_opt_(end) const T* text,
-
7786 _In_ size_t start = 0,
-
7787 _In_ size_t end = SIZE_MAX,
-
7788 _In_ int flags = match_multiline)
-
7789 {
-
7790 _Unreferenced_(flags);
-
7791 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
-
7792
-
7793 this->interval.end = start;
-
7794 this->base_type.start = this->interval.end;
-
7795 for (;;) {
-
7796 _Assume_(text || this->interval.end >= end);
-
7797 if (this->interval.end >= end || !text[this->interval.end])
-
7798 break;
-
7799 if (text[this->interval.end] == '/' ||
-
7800 text[this->interval.end] == ';' ||
-
7801 ctype.is(ctype.space, text[this->interval.end]))
-
7802 break;
-
7803 this->interval.end++;
-
7804 }
-
7805 if (this->interval.end <= this->base_type.start)
-
7806 goto error;
-
7807 this->base_type.end = this->interval.end;
-
7808
-
7809 if (end <= this->interval.end || text[this->interval.end] != '/')
-
7810 goto error;
-
7811
-
7812 this->interval.end++;
-
7813 this->sub_type.start = this->interval.end;
-
7814 for (;;) {
-
7815 if (this->interval.end >= end || !text[this->interval.end])
-
7816 break;
-
7817 if (text[this->interval.end] == '/' ||
-
7818 text[this->interval.end] == ';' ||
-
7819 ctype.is(ctype.space, text[this->interval.end]))
-
7820 break;
-
7821 this->interval.end++;
-
7822 }
-
7823 if (this->interval.end <= this->sub_type.start)
-
7824 goto error;
-
7825
-
7826 this->sub_type.end = this->interval.end;
-
7827 this->charset.invalidate();
-
7828 if (this->interval.end < end && text[this->interval.end] == ';') {
-
7829 this->interval.end++;
-
7830
-
7831 // Skip whitespace.
-
7832 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
-
7833
-
7834 if (this->interval.end + 7 < end &&
-
7835 (text[this->interval.end] == 'c' || text[this->interval.end] == 'C') &&
-
7836 (text[this->interval.end + 1] == 'h' || text[this->interval.end + 1] == 'H') &&
-
7837 (text[this->interval.end + 2] == 'a' || text[this->interval.end + 2] == 'A') &&
-
7838 (text[this->interval.end + 3] == 'r' || text[this->interval.end + 3] == 'R') &&
-
7839 (text[this->interval.end + 4] == 's' || text[this->interval.end + 4] == 'S') &&
-
7840 (text[this->interval.end + 5] == 'e' || text[this->interval.end + 5] == 'E') &&
-
7841 (text[this->interval.end + 6] == 't' || text[this->interval.end + 6] == 'T') &&
-
7842 text[this->interval.end + 7] == '=')
-
7843 {
-
7844 this->interval.end = this->interval.end + 8;
-
7845 if (this->interval.end < end &&
-
7846 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
-
7847 {
-
7848 // "Quoted...
-
7849 T quote = text[this->interval.end];
-
7850 this->charset.start = ++this->interval.end;
-
7851 for (;;) {
-
7852 if (this->interval.end >= end || !text[this->interval.end]) {
-
7853 // No end quote!
-
7854 this->charset.invalidate();
-
7855 break;
-
7856 }
-
7857 if (text[this->interval.end] == quote) {
-
7858 // End quote"
-
7859 this->charset.end = this->interval.end;
-
7860 this->interval.end++;
-
7861 break;
-
7862 }
-
7863 this->interval.end++;
-
7864 }
-
7865 }
-
7866 else {
-
7867 // Nonquoted
-
7868 this->charset.start = this->interval.end;
-
7869 for (;;) {
-
7870 if (this->interval.end >= end || !text[this->interval.end] ||
-
7871 ctype.is(ctype.space, text[this->interval.end])) {
-
7872 this->charset.end = this->interval.end;
-
7873 break;
-
7874 }
-
7875 this->interval.end++;
-
7876 }
-
7877 }
-
7878 }
-
7879 }
-
7880 this->interval.start = start;
-
7881 return true;
-
7882
-
7883 error:
-
7884 invalidate();
-
7885 return false;
-
7886 }
-
7887 };
+
7734
+
7735 using css_import = basic_css_import<char>;
+
7736 using wcss_import = basic_css_import<wchar_t>;
+
7737#ifdef _UNICODE
+
7738 using tcss_import = wcss_import;
+
7739#else
+
7740 using tcss_import = css_import;
+
7741#endif
+
7742
+
7746 template <class T>
+
+ +
7748 {
+
7749 public:
+
7750 virtual void invalidate()
+
7751 {
+
7752 this->base_type.invalidate();
+
7753 this->sub_type.invalidate();
+
7754 this->charset.invalidate();
+ +
7756 }
+
7757
+ + + +
7761
+
7762 protected:
+
7763 virtual bool do_match(
+
7764 _In_reads_or_z_opt_(end) const T* text,
+
7765 _In_ size_t start = 0,
+
7766 _In_ size_t end = SIZE_MAX,
+
7767 _In_ int flags = match_multiline)
+
7768 {
+
7769 _Unreferenced_(flags);
+
7770 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
+
7771
+
7772 this->interval.end = start;
+
7773 this->base_type.start = this->interval.end;
+
7774 for (;;) {
+
7775 _Assume_(text || this->interval.end >= end);
+
7776 if (this->interval.end >= end || !text[this->interval.end])
+
7777 break;
+
7778 if (text[this->interval.end] == '/' ||
+
7779 text[this->interval.end] == ';' ||
+
7780 ctype.is(ctype.space, text[this->interval.end]))
+
7781 break;
+
7782 this->interval.end++;
+
7783 }
+
7784 if (this->interval.end <= this->base_type.start)
+
7785 goto error;
+
7786 this->base_type.end = this->interval.end;
+
7787
+
7788 if (end <= this->interval.end || text[this->interval.end] != '/')
+
7789 goto error;
+
7790
+
7791 this->interval.end++;
+
7792 this->sub_type.start = this->interval.end;
+
7793 for (;;) {
+
7794 if (this->interval.end >= end || !text[this->interval.end])
+
7795 break;
+
7796 if (text[this->interval.end] == '/' ||
+
7797 text[this->interval.end] == ';' ||
+
7798 ctype.is(ctype.space, text[this->interval.end]))
+
7799 break;
+
7800 this->interval.end++;
+
7801 }
+
7802 if (this->interval.end <= this->sub_type.start)
+
7803 goto error;
+
7804
+
7805 this->sub_type.end = this->interval.end;
+
7806 this->charset.invalidate();
+
7807 if (this->interval.end < end && text[this->interval.end] == ';') {
+
7808 this->interval.end++;
+
7809
+
7810 // Skip whitespace.
+
7811 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
+
7812
+
7813 if (this->interval.end + 7 < end &&
+
7814 (text[this->interval.end] == 'c' || text[this->interval.end] == 'C') &&
+
7815 (text[this->interval.end + 1] == 'h' || text[this->interval.end + 1] == 'H') &&
+
7816 (text[this->interval.end + 2] == 'a' || text[this->interval.end + 2] == 'A') &&
+
7817 (text[this->interval.end + 3] == 'r' || text[this->interval.end + 3] == 'R') &&
+
7818 (text[this->interval.end + 4] == 's' || text[this->interval.end + 4] == 'S') &&
+
7819 (text[this->interval.end + 5] == 'e' || text[this->interval.end + 5] == 'E') &&
+
7820 (text[this->interval.end + 6] == 't' || text[this->interval.end + 6] == 'T') &&
+
7821 text[this->interval.end + 7] == '=')
+
7822 {
+
7823 this->interval.end = this->interval.end + 8;
+
7824 if (this->interval.end < end &&
+
7825 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
+
7826 {
+
7827 // "Quoted...
+
7828 T quote = text[this->interval.end];
+
7829 this->charset.start = ++this->interval.end;
+
7830 for (;;) {
+
7831 if (this->interval.end >= end || !text[this->interval.end]) {
+
7832 // No end quote!
+
7833 this->charset.invalidate();
+
7834 break;
+
7835 }
+
7836 if (text[this->interval.end] == quote) {
+
7837 // End quote"
+
7838 this->charset.end = this->interval.end;
+
7839 this->interval.end++;
+
7840 break;
+
7841 }
+
7842 this->interval.end++;
+
7843 }
+
7844 }
+
7845 else {
+
7846 // Nonquoted
+
7847 this->charset.start = this->interval.end;
+
7848 for (;;) {
+
7849 if (this->interval.end >= end || !text[this->interval.end] ||
+
7850 ctype.is(ctype.space, text[this->interval.end])) {
+
7851 this->charset.end = this->interval.end;
+
7852 break;
+
7853 }
+
7854 this->interval.end++;
+
7855 }
+
7856 }
+
7857 }
+
7858 }
+
7859 this->interval.start = start;
+
7860 return true;
+
7861
+
7862 error:
+
7863 invalidate();
+
7864 return false;
+
7865 }
+
7866 };
-
7888
-
7889 using mime_type = basic_mime_type<char>;
-
7890 using wmime_type = basic_mime_type<wchar_t>;
-
7891#ifdef _UNICODE
-
7892 using tmime_type = wmime_type;
-
7893#else
-
7894 using tmime_type = mime_type;
-
7895#endif
-
7896
-
7900 template <class T>
-
- -
7902 {
-
7903 protected:
-
7904 virtual bool do_match(
-
7905 _In_reads_or_z_opt_(end) const T* text,
-
7906 _In_ size_t start = 0,
-
7907 _In_ size_t end = SIZE_MAX,
-
7908 _In_ int flags = match_default)
-
7909 {
-
7910 _Unreferenced_(flags);
-
7911 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
-
7912 this->interval.end = start;
-
7913 for (;;) {
-
7914 _Assume_(text || this->interval.end >= end);
-
7915 if (this->interval.end >= end || !text[this->interval.end]) {
- -
7917 this->interval.start = start;
-
7918 return true;
-
7919 }
-
7920 this->interval.invalidate();
-
7921 return false;
-
7922 }
-
7923 if (text[this->interval.end] == '>' ||
-
7924 text[this->interval.end] == '=' ||
-
7925 (text[this->interval.end] == '/' && this->interval.end + 1 < end && text[this->interval.end + 1] == '>') ||
-
7926 ctype.is(ctype.space, text[this->interval.end]))
-
7927 {
-
7928 this->interval.start = start;
-
7929 return true;
-
7930 }
-
7931 this->interval.end++;
-
7932 }
-
7933 }
-
7934 };
+
7867
+
7868 using mime_type = basic_mime_type<char>;
+
7869 using wmime_type = basic_mime_type<wchar_t>;
+
7870#ifdef _UNICODE
+
7871 using tmime_type = wmime_type;
+
7872#else
+
7873 using tmime_type = mime_type;
+
7874#endif
+
7875
+
7879 template <class T>
+
+ +
7881 {
+
7882 protected:
+
7883 virtual bool do_match(
+
7884 _In_reads_or_z_opt_(end) const T* text,
+
7885 _In_ size_t start = 0,
+
7886 _In_ size_t end = SIZE_MAX,
+
7887 _In_ int flags = match_default)
+
7888 {
+
7889 _Unreferenced_(flags);
+
7890 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
+
7891 this->interval.end = start;
+
7892 for (;;) {
+
7893 _Assume_(text || this->interval.end >= end);
+
7894 if (this->interval.end >= end || !text[this->interval.end]) {
+ +
7896 this->interval.start = start;
+
7897 return true;
+
7898 }
+
7899 this->interval.invalidate();
+
7900 return false;
+
7901 }
+
7902 if (text[this->interval.end] == '>' ||
+
7903 text[this->interval.end] == '=' ||
+
7904 (text[this->interval.end] == '/' && this->interval.end + 1 < end && text[this->interval.end + 1] == '>') ||
+
7905 ctype.is(ctype.space, text[this->interval.end]))
+
7906 {
+
7907 this->interval.start = start;
+
7908 return true;
+
7909 }
+
7910 this->interval.end++;
+
7911 }
+
7912 }
+
7913 };
+
7914
+ + +
7917#ifdef _UNICODE
+
7918 using thtml_ident = whtml_ident;
+
7919#else
+
7920 using thtml_ident = html_ident;
+
7921#endif
+
7922
+
7926 template <class T>
+
+ +
7928 {
+
7929 public:
+
7930 virtual void invalidate()
+
7931 {
+
7932 this->content.invalidate();
+ +
7934 }
7935
- - -
7938#ifdef _UNICODE
-
7939 using thtml_ident = whtml_ident;
-
7940#else
-
7941 using thtml_ident = html_ident;
-
7942#endif
-
7943
-
7947 template <class T>
-
- -
7949 {
-
7950 public:
-
7951 virtual void invalidate()
-
7952 {
-
7953 this->content.invalidate();
- -
7955 }
-
7956
- -
7958
-
7959 protected:
-
7960 virtual bool do_match(
-
7961 _In_reads_or_z_opt_(end) const T* text,
-
7962 _In_ size_t start = 0,
-
7963 _In_ size_t end = SIZE_MAX,
-
7964 _In_ int flags = match_default)
-
7965 {
-
7966 _Unreferenced_(flags);
-
7967 this->interval.end = start;
-
7968 _Assume_(text || this->interval.end >= end);
-
7969 if (this->interval.end < end &&
-
7970 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
-
7971 {
-
7972 // "Quoted...
-
7973 T quote = text[this->interval.end];
-
7974 this->content.start = ++this->interval.end;
-
7975 for (;;) {
-
7976 if (this->interval.end >= end || !text[this->interval.end]) {
-
7977 // No end quote!
-
7978 this->content.invalidate();
-
7979 this->interval.invalidate();
-
7980 return false;
-
7981 }
-
7982 if (text[this->interval.end] == quote) {
-
7983 // End quote"
-
7984 this->content.end = this->interval.end;
-
7985 this->interval.start = start;
-
7986 this->interval.end++;
-
7987 return true;
-
7988 }
-
7989 this->interval.end++;
-
7990 }
+ +
7937
+
7938 protected:
+
7939 virtual bool do_match(
+
7940 _In_reads_or_z_opt_(end) const T* text,
+
7941 _In_ size_t start = 0,
+
7942 _In_ size_t end = SIZE_MAX,
+
7943 _In_ int flags = match_default)
+
7944 {
+
7945 _Unreferenced_(flags);
+
7946 this->interval.end = start;
+
7947 _Assume_(text || this->interval.end >= end);
+
7948 if (this->interval.end < end &&
+
7949 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
+
7950 {
+
7951 // "Quoted...
+
7952 T quote = text[this->interval.end];
+
7953 this->content.start = ++this->interval.end;
+
7954 for (;;) {
+
7955 if (this->interval.end >= end || !text[this->interval.end]) {
+
7956 // No end quote!
+
7957 this->content.invalidate();
+
7958 this->interval.invalidate();
+
7959 return false;
+
7960 }
+
7961 if (text[this->interval.end] == quote) {
+
7962 // End quote"
+
7963 this->content.end = this->interval.end;
+
7964 this->interval.start = start;
+
7965 this->interval.end++;
+
7966 return true;
+
7967 }
+
7968 this->interval.end++;
+
7969 }
+
7970 }
+
7971
+
7972 // Nonquoted
+
7973 this->content.start = this->interval.end;
+
7974 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
+
7975 for (;;) {
+
7976 _Assume_(text || this->interval.end >= end);
+
7977 if (this->interval.end >= end || !text[this->interval.end]) {
+
7978 this->content.end = this->interval.end;
+
7979 this->interval.start = start;
+
7980 return true;
+
7981 }
+
7982 if (text[this->interval.end] == '>' ||
+
7983 (text[this->interval.end] == '/' && this->interval.end + 1 < end && text[this->interval.end + 1] == '>') ||
+
7984 ctype.is(ctype.space, text[this->interval.end]))
+
7985 {
+
7986 this->content.end = this->interval.end;
+
7987 this->interval.start = start;
+
7988 return true;
+
7989 }
+
7990 this->interval.end++;
7991 }
-
7992
-
7993 // Nonquoted
-
7994 this->content.start = this->interval.end;
-
7995 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
-
7996 for (;;) {
-
7997 _Assume_(text || this->interval.end >= end);
-
7998 if (this->interval.end >= end || !text[this->interval.end]) {
-
7999 this->content.end = this->interval.end;
-
8000 this->interval.start = start;
-
8001 return true;
-
8002 }
-
8003 if (text[this->interval.end] == '>' ||
-
8004 (text[this->interval.end] == '/' && this->interval.end + 1 < end && text[this->interval.end + 1] == '>') ||
-
8005 ctype.is(ctype.space, text[this->interval.end]))
-
8006 {
-
8007 this->content.end = this->interval.end;
-
8008 this->interval.start = start;
-
8009 return true;
-
8010 }
-
8011 this->interval.end++;
-
8012 }
-
8013 }
-
8014 };
+
7992 }
+
7993 };
-
8015
-
8016 using html_value = basic_html_value<char>;
-
8017 using whtml_value = basic_html_value<wchar_t>;
-
8018#ifdef _UNICODE
-
8019 using thtml_value = whtml_value;
-
8020#else
-
8021 using thtml_value = html_value;
-
8022#endif
-
8023
-
8027 enum class html_sequence_t {
-
8028 text = 0,
-
8029 element,
-
8030 element_start,
-
8031 element_end,
-
8032 declaration,
-
8033 comment,
-
8034 instruction,
-
8035 PCDATA,
-
8036 CDATA,
-
8037
-
8038 unknown = -1,
-
8039 };
-
8040
-
- - - -
8047 };
+
7994
+
7995 using html_value = basic_html_value<char>;
+
7996 using whtml_value = basic_html_value<wchar_t>;
+
7997#ifdef _UNICODE
+
7998 using thtml_value = whtml_value;
+
7999#else
+
8000 using thtml_value = html_value;
+
8001#endif
+
8002
+
8006 enum class html_sequence_t {
+
8007 text = 0,
+
8008 element,
+
8009 element_start,
+
8010 element_end,
+
8011 declaration,
+
8012 comment,
+
8013 instruction,
+
8014 PCDATA,
+
8015 CDATA,
+
8016
+
8017 unknown = -1,
+
8018 };
+
8019
+ -
8048
-
8052 template <class T>
-
- -
8054 {
-
8055 public:
-
8056 basic_html_tag(_In_ const std::locale& locale = std::locale()) :
- -
8058 type(html_sequence_t::unknown)
-
8059 {}
-
8060
-
8061 virtual void invalidate()
-
8062 {
-
8063 this->type = html_sequence_t::unknown;
-
8064 this->name.invalidate();
-
8065 this->attributes.clear();
- -
8067 }
-
8068
-
8069 html_sequence_t type;
- -
8071 std::vector<html_attribute> attributes;
-
8072
-
8073 protected:
-
8074 virtual bool do_match(
-
8075 _In_reads_or_z_opt_(end) const T* text,
-
8076 _In_ size_t start = 0,
-
8077 _In_ size_t end = SIZE_MAX,
-
8078 _In_ int flags = match_multiline)
-
8079 {
-
8080 _Assume_(text || start >= end);
-
8081 if (start >= end || text[start] != '<')
-
8082 goto error;
-
8083 this->interval.end = start + 1;
-
8084 if (this->interval.end >= end || !text[this->interval.end])
-
8085 goto error;
-
8086 if (text[this->interval.end] == '/' &&
-
8087 this->m_ident.match(text, this->interval.end + 1, end, flags))
-
8088 {
-
8089 // </...
-
8090 this->type = html_sequence_t::element_end;
-
8091 this->name = this->m_ident.interval;
-
8092 this->interval.end = this->m_ident.interval.end;
-
8093 }
-
8094 else if (text[this->interval.end] == '!') {
-
8095 // <!...
-
8096 this->interval.end++;
-
8097 if (this->interval.end + 1 < end &&
-
8098 text[this->interval.end] == '-' &&
-
8099 text[this->interval.end + 1] == '-')
-
8100 {
-
8101 // <!--...
-
8102 this->name.start = this->interval.end = this->interval.end + 2;
-
8103 for (;;) {
-
8104 if (this->interval.end >= end || !text[this->interval.end])
-
8105 goto error;
-
8106 if (this->interval.end + 2 < end &&
-
8107 text[this->interval.end] == '-' &&
-
8108 text[this->interval.end + 1] == '-' &&
-
8109 text[this->interval.end + 2] == '>')
-
8110 {
-
8111 // <!--...-->
-
8112 this->type = html_sequence_t::comment;
-
8113 this->name.end = this->interval.end;
-
8114 this->attributes.clear();
-
8115 this->interval.start = start;
-
8116 this->interval.end = this->interval.end + 3;
-
8117 return true;
-
8118 }
-
8119 this->interval.end++;
-
8120 }
-
8121 }
-
8122 this->type = html_sequence_t::declaration;
-
8123 this->name.start = this->name.end = this->interval.end;
-
8124 }
-
8125 else if (text[this->interval.end] == '?') {
-
8126 // <?...
-
8127 this->name.start = ++this->interval.end;
-
8128 for (;;) {
-
8129 if (this->interval.end >= end || !text[this->interval.end])
-
8130 goto error;
-
8131 if (text[this->interval.end] == '>') {
-
8132 // <?...>
-
8133 this->type = html_sequence_t::instruction;
-
8134 this->name.end = this->interval.end;
-
8135 this->attributes.clear();
-
8136 this->interval.start = start;
-
8137 this->interval.end++;
-
8138 return true;
-
8139 }
-
8140 if (this->interval.end + 1 < end &&
-
8141 text[this->interval.end] == '?' &&
-
8142 text[this->interval.end + 1] == '>')
-
8143 {
-
8144 // <?...?>
-
8145 this->type = html_sequence_t::instruction;
-
8146 this->name.end = this->interval.end;
-
8147 this->attributes.clear();
-
8148 this->interval.start = start;
-
8149 this->interval.end = this->interval.end + 2;
-
8150 return true;
-
8151 }
-
8152 this->interval.end++;
-
8153 }
-
8154 }
-
8155 else if (this->m_ident.match(text, this->interval.end, end, flags)) {
-
8156 // <tag...
-
8157 this->type = html_sequence_t::element_start;
-
8158 this->name = this->m_ident.interval;
-
8159 this->interval.end = this->m_ident.interval.end;
-
8160 }
-
8161 else
-
8162 goto error;
-
8163
-
8164 {
-
8165 // Skip whitespace.
-
8166 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
-
8167 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
-
8168
-
8169 this->attributes.clear();
-
8170 for (;;) {
-
8171 if (this->type == html_sequence_t::element_start &&
-
8172 this->interval.end + 1 < end &&
-
8173 text[this->interval.end] == '/' &&
-
8174 text[this->interval.end + 1] == '>')
-
8175 {
-
8176 // <tag .../>
-
8177 this->type = html_sequence_t::element;
-
8178 this->interval.end = this->interval.end + 2;
-
8179 break;
-
8180 }
-
8181 if (this->interval.end < end &&
-
8182 text[this->interval.end] == '>')
-
8183 {
-
8184 // <tag ...>
-
8185 this->interval.end++;
-
8186 break;
-
8187 }
-
8188 if (this->type == html_sequence_t::declaration &&
-
8189 this->interval.end + 1 < end &&
-
8190 text[this->interval.end] == '!' &&
-
8191 text[this->interval.end + 1] == '>')
-
8192 {
-
8193 // "<!...!>".
-
8194 this->interval.end = this->interval.end + 2;
-
8195 break;
-
8196 }
-
8197 if (this->type == html_sequence_t::declaration &&
-
8198 this->interval.end + 1 < end &&
-
8199 text[this->interval.end] == '-' &&
-
8200 text[this->interval.end + 1] == '-')
-
8201 {
-
8202 // "<! ... --...".
-
8203 this->interval.end = this->interval.end + 2;
-
8204 for (;;) {
-
8205 if (this->interval.end >= end || !text[this->interval.end])
-
8206 goto error;
-
8207 if (this->interval.end + 1 < end &&
-
8208 text[this->interval.end] == '-' &&
-
8209 text[this->interval.end + 1] == '-')
-
8210 {
-
8211 // "<! ... --...--".
-
8212 this->interval.end = this->interval.end + 2;
-
8213 break;
-
8214 }
-
8215 this->interval.end++;
-
8216 }
-
8217
-
8218 // Skip whitespace.
-
8219 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
-
8220 continue;
-
8221 }
-
8222
-
8223 if (this->interval.end >= end || !text[this->interval.end])
-
8224 goto error;
-
8225
-
8226 // Attributes follow...
-
8227 html_attribute* a = nullptr;
-
8228 if (this->m_ident.match(text, this->interval.end, end, flags)) {
-
8229 this->attributes.push_back(std::move(html_attribute{ this->m_ident.interval }));
-
8230 a = &this->attributes.back();
-
8231 _Assume_(a);
-
8232 this->interval.end = this->m_ident.interval.end;
-
8233 }
-
8234 else {
-
8235 // What was that?! Skip.
-
8236 this->interval.end++;
-
8237 continue;
-
8238 }
-
8239
-
8240 // Skip whitespace.
-
8241 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
-
8242
-
8243 if (this->interval.end < end && text[this->interval.end] == '=') {
-
8244 this->interval.end++;
-
8245
-
8246 // Skip whitespace.
-
8247 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
-
8248
-
8249 if (this->m_value.match(text, this->interval.end, end, flags)) {
-
8250 // This attribute has value.
-
8251 a->value = this->m_value.content;
-
8252 this->interval.end = this->m_value.interval.end;
-
8253
-
8254 // Skip whitespace.
-
8255 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
-
8256 }
-
8257 }
-
8258 else {
-
8259 // This attribute has no value.
-
8260 a->value.invalidate();
-
8261 }
-
8262 }
-
8263 }
-
8264
-
8265 this->interval.start = start;
-
8266 return true;
-
8267
-
8268 error:
-
8269 invalidate();
-
8270 return false;
-
8271 }
-
8272
-
8273 basic_html_ident<T> m_ident;
-
8274 basic_html_value<T> m_value;
-
8275 };
+
8027
+
8031 template <class T>
+
+ +
8033 {
+
8034 public:
+
8035 basic_html_tag(_In_ const std::locale& locale = std::locale()) :
+ +
8037 type(html_sequence_t::unknown)
+
8038 {}
+
8039
+
8040 virtual void invalidate()
+
8041 {
+
8042 this->type = html_sequence_t::unknown;
+
8043 this->name.invalidate();
+
8044 this->attributes.clear();
+ +
8046 }
+
8047
+
8048 html_sequence_t type;
+ +
8050 std::vector<html_attribute> attributes;
+
8051
+
8052 protected:
+
8053 virtual bool do_match(
+
8054 _In_reads_or_z_opt_(end) const T* text,
+
8055 _In_ size_t start = 0,
+
8056 _In_ size_t end = SIZE_MAX,
+
8057 _In_ int flags = match_multiline)
+
8058 {
+
8059 _Assume_(text || start >= end);
+
8060 if (start >= end || text[start] != '<')
+
8061 goto error;
+
8062 this->interval.end = start + 1;
+
8063 if (this->interval.end >= end || !text[this->interval.end])
+
8064 goto error;
+
8065 if (text[this->interval.end] == '/' &&
+
8066 this->m_ident.match(text, this->interval.end + 1, end, flags))
+
8067 {
+
8068 // </...
+
8069 this->type = html_sequence_t::element_end;
+
8070 this->name = this->m_ident.interval;
+
8071 this->interval.end = this->m_ident.interval.end;
+
8072 }
+
8073 else if (text[this->interval.end] == '!') {
+
8074 // <!...
+
8075 this->interval.end++;
+
8076 if (this->interval.end + 1 < end &&
+
8077 text[this->interval.end] == '-' &&
+
8078 text[this->interval.end + 1] == '-')
+
8079 {
+
8080 // <!--...
+
8081 this->name.start = this->interval.end = this->interval.end + 2;
+
8082 for (;;) {
+
8083 if (this->interval.end >= end || !text[this->interval.end])
+
8084 goto error;
+
8085 if (this->interval.end + 2 < end &&
+
8086 text[this->interval.end] == '-' &&
+
8087 text[this->interval.end + 1] == '-' &&
+
8088 text[this->interval.end + 2] == '>')
+
8089 {
+
8090 // <!--...-->
+
8091 this->type = html_sequence_t::comment;
+
8092 this->name.end = this->interval.end;
+
8093 this->attributes.clear();
+
8094 this->interval.start = start;
+
8095 this->interval.end = this->interval.end + 3;
+
8096 return true;
+
8097 }
+
8098 this->interval.end++;
+
8099 }
+
8100 }
+
8101 this->type = html_sequence_t::declaration;
+
8102 this->name.start = this->name.end = this->interval.end;
+
8103 }
+
8104 else if (text[this->interval.end] == '?') {
+
8105 // <?...
+
8106 this->name.start = ++this->interval.end;
+
8107 for (;;) {
+
8108 if (this->interval.end >= end || !text[this->interval.end])
+
8109 goto error;
+
8110 if (text[this->interval.end] == '>') {
+
8111 // <?...>
+
8112 this->type = html_sequence_t::instruction;
+
8113 this->name.end = this->interval.end;
+
8114 this->attributes.clear();
+
8115 this->interval.start = start;
+
8116 this->interval.end++;
+
8117 return true;
+
8118 }
+
8119 if (this->interval.end + 1 < end &&
+
8120 text[this->interval.end] == '?' &&
+
8121 text[this->interval.end + 1] == '>')
+
8122 {
+
8123 // <?...?>
+
8124 this->type = html_sequence_t::instruction;
+
8125 this->name.end = this->interval.end;
+
8126 this->attributes.clear();
+
8127 this->interval.start = start;
+
8128 this->interval.end = this->interval.end + 2;
+
8129 return true;
+
8130 }
+
8131 this->interval.end++;
+
8132 }
+
8133 }
+
8134 else if (this->m_ident.match(text, this->interval.end, end, flags)) {
+
8135 // <tag...
+
8136 this->type = html_sequence_t::element_start;
+
8137 this->name = this->m_ident.interval;
+
8138 this->interval.end = this->m_ident.interval.end;
+
8139 }
+
8140 else
+
8141 goto error;
+
8142
+
8143 {
+
8144 // Skip whitespace.
+
8145 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
+
8146 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
+
8147
+
8148 this->attributes.clear();
+
8149 for (;;) {
+
8150 if (this->type == html_sequence_t::element_start &&
+
8151 this->interval.end + 1 < end &&
+
8152 text[this->interval.end] == '/' &&
+
8153 text[this->interval.end + 1] == '>')
+
8154 {
+
8155 // <tag .../>
+
8156 this->type = html_sequence_t::element;
+
8157 this->interval.end = this->interval.end + 2;
+
8158 break;
+
8159 }
+
8160 if (this->interval.end < end &&
+
8161 text[this->interval.end] == '>')
+
8162 {
+
8163 // <tag ...>
+
8164 this->interval.end++;
+
8165 break;
+
8166 }
+
8167 if (this->type == html_sequence_t::declaration &&
+
8168 this->interval.end + 1 < end &&
+
8169 text[this->interval.end] == '!' &&
+
8170 text[this->interval.end + 1] == '>')
+
8171 {
+
8172 // "<!...!>".
+
8173 this->interval.end = this->interval.end + 2;
+
8174 break;
+
8175 }
+
8176 if (this->type == html_sequence_t::declaration &&
+
8177 this->interval.end + 1 < end &&
+
8178 text[this->interval.end] == '-' &&
+
8179 text[this->interval.end + 1] == '-')
+
8180 {
+
8181 // "<! ... --...".
+
8182 this->interval.end = this->interval.end + 2;
+
8183 for (;;) {
+
8184 if (this->interval.end >= end || !text[this->interval.end])
+
8185 goto error;
+
8186 if (this->interval.end + 1 < end &&
+
8187 text[this->interval.end] == '-' &&
+
8188 text[this->interval.end + 1] == '-')
+
8189 {
+
8190 // "<! ... --...--".
+
8191 this->interval.end = this->interval.end + 2;
+
8192 break;
+
8193 }
+
8194 this->interval.end++;
+
8195 }
+
8196
+
8197 // Skip whitespace.
+
8198 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
+
8199 continue;
+
8200 }
+
8201
+
8202 if (this->interval.end >= end || !text[this->interval.end])
+
8203 goto error;
+
8204
+
8205 // Attributes follow...
+
8206 html_attribute* a = nullptr;
+
8207 if (this->m_ident.match(text, this->interval.end, end, flags)) {
+
8208 this->attributes.push_back(std::move(html_attribute{ this->m_ident.interval }));
+
8209 a = &this->attributes.back();
+
8210 _Assume_(a);
+
8211 this->interval.end = this->m_ident.interval.end;
+
8212 }
+
8213 else {
+
8214 // What was that?! Skip.
+
8215 this->interval.end++;
+
8216 continue;
+
8217 }
+
8218
+
8219 // Skip whitespace.
+
8220 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
+
8221
+
8222 if (this->interval.end < end && text[this->interval.end] == '=') {
+
8223 this->interval.end++;
+
8224
+
8225 // Skip whitespace.
+
8226 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
+
8227
+
8228 if (this->m_value.match(text, this->interval.end, end, flags)) {
+
8229 // This attribute has value.
+
8230 a->value = this->m_value.content;
+
8231 this->interval.end = this->m_value.interval.end;
+
8232
+
8233 // Skip whitespace.
+
8234 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
+
8235 }
+
8236 }
+
8237 else {
+
8238 // This attribute has no value.
+
8239 a->value.invalidate();
+
8240 }
+
8241 }
+
8242 }
+
8243
+
8244 this->interval.start = start;
+
8245 return true;
+
8246
+
8247 error:
+
8248 invalidate();
+
8249 return false;
+
8250 }
+
8251
+
8252 basic_html_ident<T> m_ident;
+
8253 basic_html_value<T> m_value;
+
8254 };
+
8255
+
8256 using html_tag = basic_html_tag<char>;
+
8257 using whtml_tag = basic_html_tag<wchar_t>;
+
8258#ifdef _UNICODE
+
8259 using thtml_tag = whtml_tag;
+
8260#else
+
8261 using thtml_tag = html_tag;
+
8262#endif
+
8263
+
8267 template <class T>
+
+ +
8269 {
+
8270 public:
+
8271 virtual void invalidate()
+
8272 {
+
8273 this->condition.invalidate();
+ +
8275 }
8276
-
8277 using html_tag = basic_html_tag<char>;
-
8278 using whtml_tag = basic_html_tag<wchar_t>;
-
8279#ifdef _UNICODE
-
8280 using thtml_tag = whtml_tag;
-
8281#else
-
8282 using thtml_tag = html_tag;
-
8283#endif
-
8284
-
8288 template <class T>
-
- -
8290 {
-
8291 public:
-
8292 virtual void invalidate()
-
8293 {
-
8294 this->condition.invalidate();
- -
8296 }
-
8297
-
8298 stdex::interval<size_t> condition;
-
8299
-
8300 protected:
-
-
8301 virtual bool do_match(
-
8302 _In_reads_or_z_opt_(end) const T* text,
-
8303 _In_ size_t start = 0,
-
8304 _In_ size_t end = SIZE_MAX,
-
8305 _In_ int flags = match_multiline)
-
8306 {
-
8307 _Unreferenced_(flags);
-
8308 _Assume_(text || start + 2 >= end);
-
8309 if (start + 2 < end &&
-
8310 text[start] == '<' &&
-
8311 text[start + 1] == '!' &&
-
8312 text[start + 2] == '[')
-
8313 {
-
8314 this->interval.end = start + 3;
+
8277 stdex::interval<size_t> condition;
+
8278
+
8279 protected:
+
+
8280 virtual bool do_match(
+
8281 _In_reads_or_z_opt_(end) const T* text,
+
8282 _In_ size_t start = 0,
+
8283 _In_ size_t end = SIZE_MAX,
+
8284 _In_ int flags = match_multiline)
+
8285 {
+
8286 _Unreferenced_(flags);
+
8287 _Assume_(text || start + 2 >= end);
+
8288 if (start + 2 < end &&
+
8289 text[start] == '<' &&
+
8290 text[start + 1] == '!' &&
+
8291 text[start + 2] == '[')
+
8292 {
+
8293 this->interval.end = start + 3;
+
8294
+
8295 // Skip whitespace.
+
8296 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
+
8297 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
+
8298
+
8299 this->condition.start = this->condition.end = this->interval.end;
+
8300
+
8301 for (;;) {
+
8302 if (this->interval.end >= end || !text[this->interval.end])
+
8303 break;
+
8304 if (text[this->interval.end] == '[') {
+
8305 this->interval.start = start;
+
8306 this->interval.end++;
+
8307 return true;
+
8308 }
+
8309 if (ctype.is(ctype.space, text[this->interval.end]))
+
8310 this->interval.end++;
+
8311 else
+
8312 this->condition.end = ++this->interval.end;
+
8313 }
+
8314 }
8315
-
8316 // Skip whitespace.
-
8317 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
-
8318 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
-
8319
-
8320 this->condition.start = this->condition.end = this->interval.end;
+
8316 this->condition.invalidate();
+
8317 this->interval.invalidate();
+
8318 return false;
+
8319 }
+
+
8320 };
+
8321
-
8322 for (;;) {
-
8323 if (this->interval.end >= end || !text[this->interval.end])
-
8324 break;
-
8325 if (text[this->interval.end] == '[') {
-
8326 this->interval.start = start;
-
8327 this->interval.end++;
-
8328 return true;
-
8329 }
-
8330 if (ctype.is(ctype.space, text[this->interval.end]))
-
8331 this->interval.end++;
-
8332 else
-
8333 this->condition.end = ++this->interval.end;
-
8334 }
-
8335 }
-
8336
-
8337 this->condition.invalidate();
-
8338 this->interval.invalidate();
-
8339 return false;
-
8340 }
+
8322 using html_declaration_condition_start = basic_html_declaration_condition_start<char>;
+
8323 using whtml_declaration_condition_start = basic_html_declaration_condition_start<wchar_t>;
+
8324#ifdef _UNICODE
+
8325 using thtml_declaration_condition_start = whtml_declaration_condition_start;
+
8326#else
+
8327 using thtml_declaration_condition_start = html_declaration_condition_start;
+
8328#endif
+
8329
+
8333 template <class T>
+
+ +
8335 {
+
8336 protected:
+
8337 virtual bool do_match(
+
8338 _In_reads_or_z_opt_(end) const T* text,
+
8339 _In_ size_t start = 0,
+
8340 _In_ size_t end = SIZE_MAX,
+
8341 _In_ int flags = match_multiline)
+
8342 {
+
8343 _Unreferenced_(flags);
+
8344 _Assume_(text || start + 2 >= end);
+
8345 if (start + 2 < end &&
+
8346 text[start] == ']' &&
+
8347 text[start + 1] == ']' &&
+
8348 text[start + 2] == '>')
+
8349 {
+
8350 this->interval.start = start;
+
8351 this->interval.end = start + 3;
+
8352 return true;
+
8353 }
+
8354 this->interval.invalidate();
+
8355 return false;
+
8356 }
+
8357 };
-
8341 };
-
-
8342
-
8343 using html_declaration_condition_start = basic_html_declaration_condition_start<char>;
-
8344 using whtml_declaration_condition_start = basic_html_declaration_condition_start<wchar_t>;
-
8345#ifdef _UNICODE
-
8346 using thtml_declaration_condition_start = whtml_declaration_condition_start;
-
8347#else
-
8348 using thtml_declaration_condition_start = html_declaration_condition_start;
-
8349#endif
-
8350
-
8354 template <class T>
-
- -
8356 {
-
8357 protected:
-
8358 virtual bool do_match(
-
8359 _In_reads_or_z_opt_(end) const T* text,
-
8360 _In_ size_t start = 0,
-
8361 _In_ size_t end = SIZE_MAX,
-
8362 _In_ int flags = match_multiline)
-
8363 {
-
8364 _Unreferenced_(flags);
-
8365 _Assume_(text || start + 2 >= end);
-
8366 if (start + 2 < end &&
-
8367 text[start] == ']' &&
-
8368 text[start + 1] == ']' &&
-
8369 text[start + 2] == '>')
-
8370 {
-
8371 this->interval.start = start;
-
8372 this->interval.end = start + 3;
-
8373 return true;
-
8374 }
-
8375 this->interval.invalidate();
-
8376 return false;
-
8377 }
-
8378 };
-
-
8379
- - -
8382#ifdef _UNICODE
- -
8384#else
- -
8386#endif
-
8387 }
-
8388}
-
8389
-
8390#undef ENUM_FLAG_OPERATOR
-
8391#undef ENUM_FLAGS
-
8392
-
8393#if defined(_MSC_VER)
-
8394#pragma warning(pop)
-
8395#elif defined(__GNUC__)
-
8396#pragma GCC diagnostic pop
-
8397#endif
+
8358
+ + +
8361#ifdef _UNICODE
+ +
8363#else
+ +
8365#endif
+
8366 }
+
8367}
+
8368
+
8369#undef ENUM_FLAG_OPERATOR
+
8370#undef ENUM_FLAGS
+
8371
+
8372#if defined(_MSC_VER)
+
8373#pragma warning(pop)
+
8374#elif defined(__GNUC__)
+
8375#pragma GCC diagnostic pop
+
8376#endif
locale_t helper class to free_locale when going out of scope.
Definition locale.hpp:74
-
Test for angle in d°mm'ss.dddd form.
Definition parser.hpp:4381
-
Test for any code unit.
Definition parser.hpp:236
-
Test for beginning of line.
Definition parser.hpp:635
-
Test for any.
Definition parser.hpp:1078
-
Test for chemical formula.
Definition parser.hpp:5510
-
Test for Creditor Reference.
Definition parser.hpp:4945
-
T reference[22]
Normalized national reference number.
Definition parser.hpp:4967
-
T check_digits[3]
Two check digits.
Definition parser.hpp:4966
-
bool is_valid
Is reference valid per ISO 7064.
Definition parser.hpp:4968
-
Legacy CSS comment end -->
Definition parser.hpp:7471
-
Legacy CSS comment start <!--
Definition parser.hpp:7433
-
CSS comment.
Definition parser.hpp:7373
-
stdex::interval< size_t > content
content position in source
Definition parser.hpp:7381
-
CSS import directive.
Definition parser.hpp:7685
-
stdex::interval< size_t > content
content position in source
Definition parser.hpp:7693
-
CSS string.
Definition parser.hpp:7508
-
stdex::interval< size_t > content
content position in source
Definition parser.hpp:7516
-
URI in CSS.
Definition parser.hpp:7575
-
stdex::interval< size_t > content
content position in source
Definition parser.hpp:7583
-
Test for any code unit from a given string of code units.
Definition parser.hpp:740
-
Test for specific code unit.
Definition parser.hpp:308
-
Test for date.
Definition parser.hpp:4014
-
Test for valid DNS domain character.
Definition parser.hpp:2796
-
bool allow_on_edge
Is character allowed at the beginning or an end of a DNS domain?
Definition parser.hpp:2806
-
Test for DNS domain/hostname.
Definition parser.hpp:2896
-
bool m_allow_absolute
May DNS names end with a dot (absolute name)?
Definition parser.hpp:2960
-
Test for e-mail address.
Definition parser.hpp:3788
-
Test for emoticon.
Definition parser.hpp:3891
-
std::shared_ptr< basic_parser< T > > apex
apex/eyebrows/halo (e.g. O, 0)
Definition parser.hpp:3919
-
std::shared_ptr< basic_parser< T > > eyes
eyes (e.g. :, ;, >, |, B)
Definition parser.hpp:3920
-
std::shared_ptr< basic_set< T > > mouth
mouth (e.g. ), ), (, (, |, P, D, p, d)
Definition parser.hpp:3922
-
std::shared_ptr< basic_parser< T > > nose
nose (e.g. -, o)
Definition parser.hpp:3921
-
std::shared_ptr< basic_parser< T > > emoticon
emoticon as a whole (e.g. 😀, 🤔, 😶)
Definition parser.hpp:3918
-
Test for end of line.
Definition parser.hpp:674
-
Test for fraction.
Definition parser.hpp:1706
-
End of condition ...]]>
Definition parser.hpp:8356
-
Start of condition <![condition[...
Definition parser.hpp:8290
-
virtual bool do_match(_In_reads_or_z_opt_(end) const T *text, size_t start=0, size_t end=SIZE_MAX, int flags=match_multiline)
condition position in source
Definition parser.hpp:8301
-
Contiguous sequence of characters representing name of element, attribute etc.
Definition parser.hpp:7902
-
Tag.
Definition parser.hpp:8054
-
std::vector< html_attribute > attributes
tag attributes
Definition parser.hpp:8071
-
html_sequence_t type
tag type
Definition parser.hpp:8069
-
stdex::interval< size_t > name
tag name position in source
Definition parser.hpp:8070
-
Optionally-quoted string representing value of an attribute.
Definition parser.hpp:7949
-
stdex::interval< size_t > content
content position in source
Definition parser.hpp:7957
-
Test for International Bank Account Number.
Definition parser.hpp:4656
-
T bban[31]
Normalized Basic Bank Account Number.
Definition parser.hpp:4681
-
T country[3]
ISO 3166-1 alpha-2 country code.
Definition parser.hpp:4679
-
T check_digits[3]
Two check digits.
Definition parser.hpp:4680
-
bool is_valid
Is IBAN valid per ISO 7064.
Definition parser.hpp:4682
-
Test for decimal integer.
Definition parser.hpp:1316
-
Test for decimal integer possibly containing thousand separators.
Definition parser.hpp:1401
-
bool has_separators
Did integer have any separators?
Definition parser.hpp:1422
-
size_t digit_count
Total number of digits in integer.
Definition parser.hpp:1421
-
Test for hexadecimal integer.
Definition parser.hpp:1481
-
Base class for integer testing.
Definition parser.hpp:1294
-
size_t value
Calculated value of the numeral.
Definition parser.hpp:1308
-
Test for IPv4 address.
Definition parser.hpp:2364
-
stdex::interval< size_t > components[4]
Individual component intervals.
Definition parser.hpp:2409
-
struct in_addr value
IPv4 address value.
Definition parser.hpp:2410
-
Test for IPv6 address.
Definition parser.hpp:2576
-
std::shared_ptr< basic_parser< T > > scope_id
Scope ID (e.g. NIC index with link-local addresses)
Definition parser.hpp:2648
-
stdex::interval< size_t > components[8]
Individual component intervals.
Definition parser.hpp:2646
-
struct in6_addr value
IPv6 address value.
Definition parser.hpp:2647
-
Test for valid IPv6 address scope ID character.
Definition parser.hpp:2502
-
Test for repeating.
Definition parser.hpp:930
-
bool m_greedy
try to match as long sequence as possible
Definition parser.hpp:969
-
std::shared_ptr< basic_parser< T > > m_el
repeating element
Definition parser.hpp:966
-
size_t m_min_iterations
minimum number of iterations
Definition parser.hpp:967
-
size_t m_max_iterations
maximum number of iterations
Definition parser.hpp:968
-
Test for JSON string.
Definition parser.hpp:7221
-
MIME content type.
Definition parser.hpp:7769
-
stdex::interval< size_t > base_type
basic type position in source
Definition parser.hpp:7779
-
stdex::interval< size_t > sub_type
sub-type position in source
Definition parser.hpp:7780
-
stdex::interval< size_t > charset
charset position in source
Definition parser.hpp:7781
-
Test for mixed numeral.
Definition parser.hpp:1941
-
std::shared_ptr< basic_parser< T > > fraction
fraction
Definition parser.hpp:1974
-
std::shared_ptr< basic_parser< T > > special_sign
Special sign (e.g. plus-minus '±')
Definition parser.hpp:1972
-
std::shared_ptr< basic_parser< T > > negative_sign
Negative sign.
Definition parser.hpp:1971
-
std::shared_ptr< basic_parser< T > > positive_sign
Positive sign.
Definition parser.hpp:1970
-
std::shared_ptr< basic_parser< T > > integer
Integer part.
Definition parser.hpp:1973
-
Test for monetary numeral.
Definition parser.hpp:2235
-
std::shared_ptr< basic_parser< T > > positive_sign
Positive sign.
Definition parser.hpp:2268
-
std::shared_ptr< basic_parser< T > > decimal_separator
Decimal separator.
Definition parser.hpp:2273
-
std::shared_ptr< basic_parser< T > > currency
Currency part.
Definition parser.hpp:2271
-
std::shared_ptr< basic_parser< T > > decimal
Decimal part.
Definition parser.hpp:2274
-
std::shared_ptr< basic_parser< T > > integer
Integer part.
Definition parser.hpp:2272
-
std::shared_ptr< basic_parser< T > > negative_sign
Negative sign.
Definition parser.hpp:2269
-
std::shared_ptr< basic_parser< T > > special_sign
Special sign (e.g. plus-minus '±')
Definition parser.hpp:2270
-
"No-op" match
Definition parser.hpp:204
+
Test for angle in d°mm'ss.dddd form.
Definition parser.hpp:4360
+
Test for any code unit.
Definition parser.hpp:215
+
Test for beginning of line.
Definition parser.hpp:614
+
Test for any.
Definition parser.hpp:1057
+
Test for chemical formula.
Definition parser.hpp:5489
+
Test for Creditor Reference.
Definition parser.hpp:4924
+
T reference[22]
Normalized national reference number.
Definition parser.hpp:4946
+
T check_digits[3]
Two check digits.
Definition parser.hpp:4945
+
bool is_valid
Is reference valid per ISO 7064.
Definition parser.hpp:4947
+
Legacy CSS comment end -->
Definition parser.hpp:7450
+
Legacy CSS comment start <!--
Definition parser.hpp:7412
+
CSS comment.
Definition parser.hpp:7352
+
stdex::interval< size_t > content
content position in source
Definition parser.hpp:7360
+
CSS import directive.
Definition parser.hpp:7664
+
stdex::interval< size_t > content
content position in source
Definition parser.hpp:7672
+
CSS string.
Definition parser.hpp:7487
+
stdex::interval< size_t > content
content position in source
Definition parser.hpp:7495
+
URI in CSS.
Definition parser.hpp:7554
+
stdex::interval< size_t > content
content position in source
Definition parser.hpp:7562
+
Test for any code unit from a given string of code units.
Definition parser.hpp:719
+
Test for specific code unit.
Definition parser.hpp:287
+
Test for date.
Definition parser.hpp:3993
+
Test for valid DNS domain character.
Definition parser.hpp:2775
+
bool allow_on_edge
Is character allowed at the beginning or an end of a DNS domain?
Definition parser.hpp:2785
+
Test for DNS domain/hostname.
Definition parser.hpp:2875
+
bool m_allow_absolute
May DNS names end with a dot (absolute name)?
Definition parser.hpp:2939
+
Test for e-mail address.
Definition parser.hpp:3767
+
Test for emoticon.
Definition parser.hpp:3870
+
std::shared_ptr< basic_parser< T > > apex
apex/eyebrows/halo (e.g. O, 0)
Definition parser.hpp:3898
+
std::shared_ptr< basic_parser< T > > eyes
eyes (e.g. :, ;, >, |, B)
Definition parser.hpp:3899
+
std::shared_ptr< basic_set< T > > mouth
mouth (e.g. ), ), (, (, |, P, D, p, d)
Definition parser.hpp:3901
+
std::shared_ptr< basic_parser< T > > nose
nose (e.g. -, o)
Definition parser.hpp:3900
+
std::shared_ptr< basic_parser< T > > emoticon
emoticon as a whole (e.g. 😀, 🤔, 😶)
Definition parser.hpp:3897
+
Test for end of line.
Definition parser.hpp:653
+
Test for fraction.
Definition parser.hpp:1685
+
End of condition ...]]>
Definition parser.hpp:8335
+
Start of condition <![condition[...
Definition parser.hpp:8269
+
virtual bool do_match(_In_reads_or_z_opt_(end) const T *text, size_t start=0, size_t end=SIZE_MAX, int flags=match_multiline)
condition position in source
Definition parser.hpp:8280
+
Contiguous sequence of characters representing name of element, attribute etc.
Definition parser.hpp:7881
+
Tag.
Definition parser.hpp:8033
+
std::vector< html_attribute > attributes
tag attributes
Definition parser.hpp:8050
+
html_sequence_t type
tag type
Definition parser.hpp:8048
+
stdex::interval< size_t > name
tag name position in source
Definition parser.hpp:8049
+
Optionally-quoted string representing value of an attribute.
Definition parser.hpp:7928
+
stdex::interval< size_t > content
content position in source
Definition parser.hpp:7936
+
Test for International Bank Account Number.
Definition parser.hpp:4635
+
T bban[31]
Normalized Basic Bank Account Number.
Definition parser.hpp:4660
+
T country[3]
ISO 3166-1 alpha-2 country code.
Definition parser.hpp:4658
+
T check_digits[3]
Two check digits.
Definition parser.hpp:4659
+
bool is_valid
Is IBAN valid per ISO 7064.
Definition parser.hpp:4661
+
Test for decimal integer.
Definition parser.hpp:1295
+
Test for decimal integer possibly containing thousand separators.
Definition parser.hpp:1380
+
bool has_separators
Did integer have any separators?
Definition parser.hpp:1401
+
size_t digit_count
Total number of digits in integer.
Definition parser.hpp:1400
+
Test for hexadecimal integer.
Definition parser.hpp:1460
+
Base class for integer testing.
Definition parser.hpp:1273
+
size_t value
Calculated value of the numeral.
Definition parser.hpp:1287
+
Test for IPv4 address.
Definition parser.hpp:2343
+
stdex::interval< size_t > components[4]
Individual component intervals.
Definition parser.hpp:2388
+
struct in_addr value
IPv4 address value.
Definition parser.hpp:2389
+
Test for IPv6 address.
Definition parser.hpp:2555
+
std::shared_ptr< basic_parser< T > > scope_id
Scope ID (e.g. NIC index with link-local addresses)
Definition parser.hpp:2627
+
stdex::interval< size_t > components[8]
Individual component intervals.
Definition parser.hpp:2625
+
struct in6_addr value
IPv6 address value.
Definition parser.hpp:2626
+
Test for valid IPv6 address scope ID character.
Definition parser.hpp:2481
+
Test for repeating.
Definition parser.hpp:909
+
bool m_greedy
try to match as long sequence as possible
Definition parser.hpp:948
+
std::shared_ptr< basic_parser< T > > m_el
repeating element
Definition parser.hpp:945
+
size_t m_min_iterations
minimum number of iterations
Definition parser.hpp:946
+
size_t m_max_iterations
maximum number of iterations
Definition parser.hpp:947
+
Test for JSON string.
Definition parser.hpp:7200
+
MIME content type.
Definition parser.hpp:7748
+
stdex::interval< size_t > base_type
basic type position in source
Definition parser.hpp:7758
+
stdex::interval< size_t > sub_type
sub-type position in source
Definition parser.hpp:7759
+
stdex::interval< size_t > charset
charset position in source
Definition parser.hpp:7760
+
Test for mixed numeral.
Definition parser.hpp:1920
+
std::shared_ptr< basic_parser< T > > fraction
fraction
Definition parser.hpp:1953
+
std::shared_ptr< basic_parser< T > > special_sign
Special sign (e.g. plus-minus '±')
Definition parser.hpp:1951
+
std::shared_ptr< basic_parser< T > > negative_sign
Negative sign.
Definition parser.hpp:1950
+
std::shared_ptr< basic_parser< T > > positive_sign
Positive sign.
Definition parser.hpp:1949
+
std::shared_ptr< basic_parser< T > > integer
Integer part.
Definition parser.hpp:1952
+
Test for monetary numeral.
Definition parser.hpp:2214
+
std::shared_ptr< basic_parser< T > > positive_sign
Positive sign.
Definition parser.hpp:2247
+
std::shared_ptr< basic_parser< T > > decimal_separator
Decimal separator.
Definition parser.hpp:2252
+
std::shared_ptr< basic_parser< T > > currency
Currency part.
Definition parser.hpp:2250
+
std::shared_ptr< basic_parser< T > > decimal
Decimal part.
Definition parser.hpp:2253
+
std::shared_ptr< basic_parser< T > > integer
Integer part.
Definition parser.hpp:2251
+
std::shared_ptr< basic_parser< T > > negative_sign
Negative sign.
Definition parser.hpp:2248
+
std::shared_ptr< basic_parser< T > > special_sign
Special sign (e.g. plus-minus '±')
Definition parser.hpp:2249
+
"No-op" match
Definition parser.hpp:183
Base template for all parsers.
Definition parser.hpp:80
stdex::interval< size_t > interval
Region of the last match.
Definition parser.hpp:120
-
Test for permutation.
Definition parser.hpp:1218
-
Test for phone number.
Definition parser.hpp:4504
-
std::basic_string< T > value
Normalized phone number.
Definition parser.hpp:4529
-
Test for any punctuation code unit.
Definition parser.hpp:481
-
Test for Roman numeral.
Definition parser.hpp:1590
-
Test for scientific numeral.
Definition parser.hpp:2066
-
std::shared_ptr< basic_parser< T > > special_sign
Special sign (e.g. plus-minus '±')
Definition parser.hpp:2112
-
std::shared_ptr< basic_parser< T > > exponent_symbol
Exponent symbol (e.g. 'e')
Definition parser.hpp:2116
-
std::shared_ptr< basic_parser< T > > positive_sign
Positive sign.
Definition parser.hpp:2110
-
std::shared_ptr< basic_parser< T > > negative_sign
Negative sign.
Definition parser.hpp:2111
-
double value
Calculated value of the numeral.
Definition parser.hpp:2120
-
std::shared_ptr< basic_parser< T > > negative_exp_sign
Negative exponent sign (e.g. '-')
Definition parser.hpp:2118
-
std::shared_ptr< basic_integer< T > > decimal
Decimal part.
Definition parser.hpp:2115
-
std::shared_ptr< basic_parser< T > > positive_exp_sign
Positive exponent sign (e.g. '+')
Definition parser.hpp:2117
-
std::shared_ptr< basic_integer< T > > exponent
Exponent part.
Definition parser.hpp:2119
-
std::shared_ptr< basic_parser< T > > decimal_separator
Decimal separator.
Definition parser.hpp:2114
-
std::shared_ptr< basic_integer< T > > integer
Integer part.
Definition parser.hpp:2113
-
Test for match score.
Definition parser.hpp:1769
-
Test for sequence.
Definition parser.hpp:1026
-
Definition parser.hpp:709
-
Test for SI Reference delimiter.
Definition parser.hpp:5139
-
Test for SI Reference part.
Definition parser.hpp:5093
-
Test for SI Reference.
Definition parser.hpp:5178
-
basic_si_reference_part< T > part3
Reference data part 3 (P3)
Definition parser.hpp:5207
-
basic_si_reference_part< T > part1
Reference data part 1 (P1)
Definition parser.hpp:5205
-
bool is_valid
Is reference valid.
Definition parser.hpp:5208
-
T model[3]
Reference model.
Definition parser.hpp:5204
-
basic_si_reference_part< T > part2
Reference data part 2 (P2)
Definition parser.hpp:5206
-
Test for signed numeral.
Definition parser.hpp:1855
-
std::shared_ptr< basic_parser< T > > special_sign
Special sign (e.g. plus-minus '±')
Definition parser.hpp:1881
-
std::shared_ptr< basic_parser< T > > negative_sign
Negative sign.
Definition parser.hpp:1880
-
std::shared_ptr< basic_parser< T > > positive_sign
Positive sign.
Definition parser.hpp:1879
-
std::shared_ptr< basic_parser< T > > number
Number.
Definition parser.hpp:1882
-
Test for any space code unit.
Definition parser.hpp:401
-
Test for any space or punctuation code unit.
Definition parser.hpp:556
-
Test for any string.
Definition parser.hpp:1146
-
Test for given string.
Definition parser.hpp:835
-
Test for time.
Definition parser.hpp:4279
-
Test for valid URL password character.
Definition parser.hpp:3080
-
Test for valid URL path character.
Definition parser.hpp:3182
-
Test for URL path.
Definition parser.hpp:3292
-
Test for valid URL username character.
Definition parser.hpp:2979
-
Test for URL.
Definition parser.hpp:3432
-
Test for HTTP agent.
Definition parser.hpp:6765
-
Test for HTTP any type.
Definition parser.hpp:5908
-
Test for HTTP asterisk.
Definition parser.hpp:6536
- - - - - -
Test for HTTP header.
Definition parser.hpp:7073
-
Test for HTTP language (RFC1766)
Definition parser.hpp:6404
-
Test for HTTP line break (RFC2616: CRLF | LF)
Definition parser.hpp:5590
-
Test for HTTP media range (RFC2616: media-range)
Definition parser.hpp:5940
-
Test for HTTP media type (RFC2616: media-type)
Definition parser.hpp:5992
-
Test for HTTP parameter (RFC2616: parameter)
Definition parser.hpp:5856
-
http_token name
Parameter name.
Definition parser.hpp:5865
-
http_value value
Parameter value.
Definition parser.hpp:5866
-
Test for HTTP protocol.
Definition parser.hpp:6840
-
uint16_t version
HTTP protocol version: 0x100 = 1.0, 0x101 = 1.1...
Definition parser.hpp:6862
-
Test for HTTP quoted string (RFC2616: quoted-string)
Definition parser.hpp:5749
-
stdex::interval< size_t > content
String content (without quotes)
Definition parser.hpp:5758
-
Test for HTTP request.
Definition parser.hpp:6941
-
Test for HTTP space (RFC2616: LWS)
Definition parser.hpp:5626
-
Test for HTTP text character (RFC2616: TEXT)
Definition parser.hpp:5662
-
Test for HTTP token (RFC2616: token - tolerates non-ASCII)
Definition parser.hpp:5695
-
Test for HTTP URL parameter.
Definition parser.hpp:6229
-
Test for HTTP URL path segment.
Definition parser.hpp:6141
-
Test for HTTP URL path segment.
Definition parser.hpp:6174
-
std::vector< http_url_path_segment > segments
Path segments.
Definition parser.hpp:6182
-
Test for HTTP URL port.
Definition parser.hpp:6085
-
Test for HTTP URL server.
Definition parser.hpp:6048
-
Test for HTTP URL.
Definition parser.hpp:6306
-
Collection of HTTP values.
Definition parser.hpp:7177
-
Test for HTTP value (RFC2616: value)
Definition parser.hpp:5812
-
http_quoted_string string
Value when matched as quoted string.
Definition parser.hpp:5821
-
http_token token
Value when matched as token.
Definition parser.hpp:5822
-
Test for HTTP weight factor.
Definition parser.hpp:6467
-
float value
Calculated value of the weight factor.
Definition parser.hpp:6480
-
Test for HTTP weighted value.
Definition parser.hpp:6559
-
Base template for collection-holding parsers.
Definition parser.hpp:986
-
Test for any SGML code point.
Definition parser.hpp:269
-
Test for any SGML code point from a given string of SGML code points.
Definition parser.hpp:792
-
Test for specific SGML code point.
Definition parser.hpp:357
-
Test for valid DNS domain SGML character.
Definition parser.hpp:2851
-
Test for valid IPv6 address scope ID SGML character.
Definition parser.hpp:2541
-
Test for any SGML punctuation code point.
Definition parser.hpp:522
-
Test for any SGML space code point.
Definition parser.hpp:444
-
Test for any SGML space or punctuation code point.
Definition parser.hpp:599
-
Test for SGML given string.
Definition parser.hpp:882
-
Test for valid URL password SGML character.
Definition parser.hpp:3133
-
Test for valid URL path SGML character.
Definition parser.hpp:3239
-
Test for valid URL username SGML character.
Definition parser.hpp:3031
+
Test for permutation.
Definition parser.hpp:1197
+
Test for phone number.
Definition parser.hpp:4483
+
std::basic_string< T > value
Normalized phone number.
Definition parser.hpp:4508
+
Test for any punctuation code unit.
Definition parser.hpp:460
+
Test for Roman numeral.
Definition parser.hpp:1569
+
Test for scientific numeral.
Definition parser.hpp:2045
+
std::shared_ptr< basic_parser< T > > special_sign
Special sign (e.g. plus-minus '±')
Definition parser.hpp:2091
+
std::shared_ptr< basic_parser< T > > exponent_symbol
Exponent symbol (e.g. 'e')
Definition parser.hpp:2095
+
std::shared_ptr< basic_parser< T > > positive_sign
Positive sign.
Definition parser.hpp:2089
+
std::shared_ptr< basic_parser< T > > negative_sign
Negative sign.
Definition parser.hpp:2090
+
double value
Calculated value of the numeral.
Definition parser.hpp:2099
+
std::shared_ptr< basic_parser< T > > negative_exp_sign
Negative exponent sign (e.g. '-')
Definition parser.hpp:2097
+
std::shared_ptr< basic_integer< T > > decimal
Decimal part.
Definition parser.hpp:2094
+
std::shared_ptr< basic_parser< T > > positive_exp_sign
Positive exponent sign (e.g. '+')
Definition parser.hpp:2096
+
std::shared_ptr< basic_integer< T > > exponent
Exponent part.
Definition parser.hpp:2098
+
std::shared_ptr< basic_parser< T > > decimal_separator
Decimal separator.
Definition parser.hpp:2093
+
std::shared_ptr< basic_integer< T > > integer
Integer part.
Definition parser.hpp:2092
+
Test for match score.
Definition parser.hpp:1748
+
Test for sequence.
Definition parser.hpp:1005
+
Definition parser.hpp:688
+
Test for SI Reference delimiter.
Definition parser.hpp:5118
+
Test for SI Reference part.
Definition parser.hpp:5072
+
Test for SI Reference.
Definition parser.hpp:5157
+
basic_si_reference_part< T > part3
Reference data part 3 (P3)
Definition parser.hpp:5186
+
basic_si_reference_part< T > part1
Reference data part 1 (P1)
Definition parser.hpp:5184
+
bool is_valid
Is reference valid.
Definition parser.hpp:5187
+
T model[3]
Reference model.
Definition parser.hpp:5183
+
basic_si_reference_part< T > part2
Reference data part 2 (P2)
Definition parser.hpp:5185
+
Test for signed numeral.
Definition parser.hpp:1834
+
std::shared_ptr< basic_parser< T > > special_sign
Special sign (e.g. plus-minus '±')
Definition parser.hpp:1860
+
std::shared_ptr< basic_parser< T > > negative_sign
Negative sign.
Definition parser.hpp:1859
+
std::shared_ptr< basic_parser< T > > positive_sign
Positive sign.
Definition parser.hpp:1858
+
std::shared_ptr< basic_parser< T > > number
Number.
Definition parser.hpp:1861
+
Test for any space code unit.
Definition parser.hpp:380
+
Test for any space or punctuation code unit.
Definition parser.hpp:535
+
Test for any string.
Definition parser.hpp:1125
+
Test for given string.
Definition parser.hpp:814
+
Test for time.
Definition parser.hpp:4258
+
Test for valid URL password character.
Definition parser.hpp:3059
+
Test for valid URL path character.
Definition parser.hpp:3161
+
Test for URL path.
Definition parser.hpp:3271
+
Test for valid URL username character.
Definition parser.hpp:2958
+
Test for URL.
Definition parser.hpp:3411
+
Test for HTTP agent.
Definition parser.hpp:6744
+
Test for HTTP any type.
Definition parser.hpp:5887
+
Test for HTTP asterisk.
Definition parser.hpp:6515
+ + + + + +
Test for HTTP header.
Definition parser.hpp:7052
+
Test for HTTP language (RFC1766)
Definition parser.hpp:6383
+
Test for HTTP line break (RFC2616: CRLF | LF)
Definition parser.hpp:5569
+
Test for HTTP media range (RFC2616: media-range)
Definition parser.hpp:5919
+
Test for HTTP media type (RFC2616: media-type)
Definition parser.hpp:5971
+
Test for HTTP parameter (RFC2616: parameter)
Definition parser.hpp:5835
+
http_token name
Parameter name.
Definition parser.hpp:5844
+
http_value value
Parameter value.
Definition parser.hpp:5845
+
Test for HTTP protocol.
Definition parser.hpp:6819
+
uint16_t version
HTTP protocol version: 0x100 = 1.0, 0x101 = 1.1...
Definition parser.hpp:6841
+
Test for HTTP quoted string (RFC2616: quoted-string)
Definition parser.hpp:5728
+
stdex::interval< size_t > content
String content (without quotes)
Definition parser.hpp:5737
+
Test for HTTP request.
Definition parser.hpp:6920
+
Test for HTTP space (RFC2616: LWS)
Definition parser.hpp:5605
+
Test for HTTP text character (RFC2616: TEXT)
Definition parser.hpp:5641
+
Test for HTTP token (RFC2616: token - tolerates non-ASCII)
Definition parser.hpp:5674
+
Test for HTTP URL parameter.
Definition parser.hpp:6208
+
Test for HTTP URL path segment.
Definition parser.hpp:6120
+
Test for HTTP URL path segment.
Definition parser.hpp:6153
+
std::vector< http_url_path_segment > segments
Path segments.
Definition parser.hpp:6161
+
Test for HTTP URL port.
Definition parser.hpp:6064
+
Test for HTTP URL server.
Definition parser.hpp:6027
+
Test for HTTP URL.
Definition parser.hpp:6285
+
Collection of HTTP values.
Definition parser.hpp:7156
+
Test for HTTP value (RFC2616: value)
Definition parser.hpp:5791
+
http_quoted_string string
Value when matched as quoted string.
Definition parser.hpp:5800
+
http_token token
Value when matched as token.
Definition parser.hpp:5801
+
Test for HTTP weight factor.
Definition parser.hpp:6446
+
float value
Calculated value of the weight factor.
Definition parser.hpp:6459
+
Test for HTTP weighted value.
Definition parser.hpp:6538
+
Base template for collection-holding parsers.
Definition parser.hpp:965
+
Test for any SGML code point.
Definition parser.hpp:248
+
Test for any SGML code point from a given string of SGML code points.
Definition parser.hpp:771
+
Test for specific SGML code point.
Definition parser.hpp:336
+
Test for valid DNS domain SGML character.
Definition parser.hpp:2830
+
Test for valid IPv6 address scope ID SGML character.
Definition parser.hpp:2520
+
Test for any SGML punctuation code point.
Definition parser.hpp:501
+
Test for any SGML space code point.
Definition parser.hpp:423
+
Test for any SGML space or punctuation code point.
Definition parser.hpp:578
+
Test for SGML given string.
Definition parser.hpp:861
+
Test for valid URL password SGML character.
Definition parser.hpp:3112
+
Test for valid URL path SGML character.
Definition parser.hpp:3218
+
Test for valid URL username SGML character.
Definition parser.hpp:3010
Numerical interval.
Definition interval.hpp:18
T size() const
Returns interval size.
Definition interval.hpp:47
T end
interval end
Definition interval.hpp:20
interval() noexcept
Constructs an invalid interval.
Definition interval.hpp:25
void invalidate()
Invalidates interval.
Definition interval.hpp:59
T start
interval start
Definition interval.hpp:19
-
Tag attribute.
Definition parser.hpp:8044
-
stdex::interval< size_t > name
attribute name position in source
Definition parser.hpp:8045
-
stdex::interval< size_t > value
attribute value position in source
Definition parser.hpp:8046
-
Definition parser.hpp:7203
+
Tag attribute.
Definition parser.hpp:8023
+
stdex::interval< size_t > name
attribute name position in source
Definition parser.hpp:8024
+
stdex::interval< size_t > value
attribute value position in source
Definition parser.hpp:8025
+
Definition parser.hpp:7182
diff --git a/pch_8hpp_source.html b/pch_8hpp_source.html index 62137d10f..d2e213d1d 100644 --- a/pch_8hpp_source.html +++ b/pch_8hpp_source.html @@ -209,7 +209,7 @@ $(function() { codefold.init(0); });
diff --git a/pool_8hpp_source.html b/pool_8hpp_source.html index b603b2cee..a8bd125ba 100644 --- a/pool_8hpp_source.html +++ b/pool_8hpp_source.html @@ -189,7 +189,7 @@ $(function() { codefold.init(0); });
diff --git a/progress_8hpp_source.html b/progress_8hpp_source.html index 5bed22915..7d51d02c8 100644 --- a/progress_8hpp_source.html +++ b/progress_8hpp_source.html @@ -539,7 +539,7 @@ $(function() { codefold.init(0); });
diff --git a/ring_8hpp_source.html b/ring_8hpp_source.html index 773d1b209..2edc88633 100644 --- a/ring_8hpp_source.html +++ b/ring_8hpp_source.html @@ -234,7 +234,7 @@ $(function() { codefold.init(0); });
diff --git a/sgml_8hpp_source.html b/sgml_8hpp_source.html index cf0ec1fae..3c37e34b0 100644 --- a/sgml_8hpp_source.html +++ b/sgml_8hpp_source.html @@ -108,691 +108,687 @@ $(function() { codefold.init(0); });
22namespace stdex
23{
25 template <class T>
-
26 const wchar_t* sgml2uni(_In_reads_or_z_(count) const T* entity, _In_ size_t count)
+
26 const utf32_t* sgml2uni(_In_reads_or_z_(count) const T* entity, _In_ size_t count, utf32_t buf[2])
27 {
28 _Assume_(entity && count);
-
29 _Assume_(count < 2 || entity[0] != '#'); // No numeric entities
-
30
-
31 for (size_t i = 0, j = _countof(sgml_unicode); i < j; ) {
-
32 size_t m = (i + j) / 2;
-
33 if (sgml_unicode[m].sgml[0] < entity[0])
-
34 i = m + 1;
-
35 else if (sgml_unicode[m].sgml[0] > entity[0])
-
36 j = m;
-
37 else {
-
38 auto r = strncmp<char, T>(sgml_unicode[m].sgml + 1, _countof(sgml_unicode[0].sgml) - 1, entity + 1, count - 1);
-
39 if (r < 0)
-
40 i = m + 1;
-
41 else if (r > 0)
-
42 j = m;
-
43 else {
-
44 for (; i < m && strncmp<char, T>(sgml_unicode[m - 1].sgml, _countof(sgml_unicode[0].sgml), entity, count) == 0; m--);
-
45 return sgml_unicode[m].unicode;
-
46 }
-
47 }
-
48 }
-
49 return nullptr;
-
50 }
+
29
+
30 if (count < 2 || entity[0] != '#') {
+
31 for (size_t i = 0, j = _countof(sgml_unicode); i < j; ) {
+
32 size_t m = (i + j) / 2;
+
33 if (sgml_unicode[m].sgml[0] < entity[0])
+
34 i = m + 1;
+
35 else if (sgml_unicode[m].sgml[0] > entity[0])
+
36 j = m;
+
37 else {
+
38 auto r = strncmp<char, T>(sgml_unicode[m].sgml + 1, _countof(sgml_unicode[0].sgml) - 1, entity + 1, count - 1);
+
39 if (r < 0)
+
40 i = m + 1;
+
41 else if (r > 0)
+
42 j = m;
+
43 else {
+
44 for (; i < m && strncmp<char, T>(sgml_unicode[m - 1].sgml, _countof(sgml_unicode[0].sgml), entity, count) == 0; m--);
+
45 return sgml_unicode[m].unicode;
+
46 }
+
47 }
+
48 }
+
49 return nullptr;
+
50 }
51
-
52 template <class T>
-
53 const T* sgmlend(
-
54 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count)
-
55 {
-
56 _Assume_(str || !count);
-
57 for (size_t i = 0; i < count; i++) {
-
58 if (str[i] == ';')
-
59 return str + i;
-
60 if (!str[i] || str[i] == '&' || isspace(str[i]))
-
61 break;
-
62 }
-
63 return nullptr;
-
64 }
-
66
-
67 constexpr int sgml_full = 0x40000000;
-
68 constexpr int sgml_quot = 0x00000001;
-
69 constexpr int sgml_apos = 0x00000002;
-
70 constexpr int sgml_quot_apos = sgml_quot | sgml_apos;
-
71 constexpr int sgml_amp = 0x00000004;
-
72 constexpr int sgml_lt_gt = 0x00000008;
-
73 constexpr int sgml_bsol = 0x00000010;
-
74 constexpr int sgml_dollar = 0x00000020;
-
75 constexpr int sgml_percnt = 0x00000040;
-
76 constexpr int sgml_commat = 0x00000080;
-
77 constexpr int sgml_num = 0x00000100;
-
78 constexpr int sgml_lpar_rpar = 0x00000200;
-
79 constexpr int sgml_lcub_rcub = 0x00000400;
-
80 constexpr int sgml_lsqb_rsqb = 0x00000800;
-
81 constexpr int sgml_sgml = sgml_amp | sgml_lt_gt;
-
82 constexpr int sgml_ml_attrib = sgml_amp | sgml_quot_apos;
-
83 constexpr int sgml_c = sgml_amp | sgml_bsol | sgml_quot_apos;
-
84 // constexpr int sgml_kolos = sgml_amp | sgml_quot | sgml_dollar | sgml_percnt | sgml_lt_gt | sgml_bsol/* | sgml_commat | sgml_num*/ | sgml_lpar_rpar | sgml_lcub_rcub | sgml_lsqb_rsqb;
-
85
-
95 template <class T_from>
-
96 size_t sgmlerr(
-
97 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
-
98 _In_ int what = 0)
-
99 {
-
100 _Assume_(src || !count_src);
-
101
-
102 const bool
-
103 do_ascii = (what & sgml_full) == 0;
-
104
-
105 for (size_t i = 0; i < count_src && src[i];) {
-
106 if (src[i] == '&') {
-
107 auto end = sgmlend(src + i + 1, count_src - i - 1);
-
108 if (end) {
-
109 const wchar_t* entity_w;
-
110 wchar_t chr[3];
-
111 size_t n = end - src - i - 1;
-
112 if (n >= 2 && src[i + 1] == '#') {
-
113 utf32_t unicode;
-
114 if (src[i + 2] == 'x' || src[i + 2] == 'X')
-
115 unicode = strtou32(src + i + 3, n - 2, nullptr, 16);
-
116 else
-
117 unicode = strtou32(src + i + 2, n - 1, nullptr, 10);
-
118#ifdef _WIN32
-
119 if (unicode < 0x10000) {
-
120 chr[0] = (wchar_t)unicode;
-
121 chr[1] = 0;
-
122 }
-
123 else {
-
124 ucs4_to_surrogate_pair(chr, unicode);
-
125 chr[2] = 0;
-
126 }
-
127#else
-
128 chr[0] = (wchar_t)unicode;
-
129 chr[1] = 0;
-
130#endif
-
131 entity_w = chr;
-
132 }
-
133 else
-
134 entity_w = sgml2uni(src + i + 1, n);
+
52 buf[0] = entity[1] == 'x' || entity[1] == 'X' ?
+
53 static_cast<utf32_t>(strtou32(&entity[2], count - 2, nullptr, 16)) :
+
54 static_cast<utf32_t>(strtou32(&entity[1], count - 1, nullptr, 10));
+
55 buf[1] = 0;
+
56 return buf;
+
57 }
+
58
+
59 inline const utf16_t* utf32_to_wstr(_In_opt_z_ const utf32_t* str, utf16_t* buf)
+
60 {
+
61 if (!str)
+
62 return nullptr;
+
63 for (size_t i = 0, j = 0;; ++i) {
+
64 if (!str[i]) {
+
65 buf[j] = 0;
+
66 return buf;
+
67 }
+
68 if (str[i] < 0x10000)
+
69 buf[j++] = static_cast<utf16_t>(str[i]);
+
70 else {
+
71 ucs4_to_surrogate_pair(&buf[j], str[i]);
+
72 j += 2;
+
73 }
+
74 }
+
75 }
+
76
+
77 inline const utf32_t* utf32_to_wstr(_In_opt_z_ const utf32_t* str, utf32_t* buf)
+
78 {
+
79 _Unreferenced_(buf);
+
80 return str;
+
81 }
+
82
+
83 template <class T>
+
84 const T* sgmlend(
+
85 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count)
+
86 {
+
87 _Assume_(str || !count);
+
88 for (size_t i = 0; i < count; i++) {
+
89 if (str[i] == ';')
+
90 return str + i;
+
91 if (!str[i] || str[i] == '&' || isspace(str[i]))
+
92 break;
+
93 }
+
94 return nullptr;
+
95 }
+
97
+
98 constexpr int sgml_full = 0x40000000;
+
99 constexpr int sgml_quot = 0x00000001;
+
100 constexpr int sgml_apos = 0x00000002;
+
101 constexpr int sgml_quot_apos = sgml_quot | sgml_apos;
+
102 constexpr int sgml_amp = 0x00000004;
+
103 constexpr int sgml_lt_gt = 0x00000008;
+
104 constexpr int sgml_bsol = 0x00000010;
+
105 constexpr int sgml_dollar = 0x00000020;
+
106 constexpr int sgml_percnt = 0x00000040;
+
107 constexpr int sgml_commat = 0x00000080;
+
108 constexpr int sgml_num = 0x00000100;
+
109 constexpr int sgml_lpar_rpar = 0x00000200;
+
110 constexpr int sgml_lcub_rcub = 0x00000400;
+
111 constexpr int sgml_lsqb_rsqb = 0x00000800;
+
112 constexpr int sgml_sgml = sgml_amp | sgml_lt_gt;
+
113 constexpr int sgml_ml_attrib = sgml_amp | sgml_quot_apos;
+
114 constexpr int sgml_c = sgml_amp | sgml_bsol | sgml_quot_apos;
+
115 // constexpr int sgml_kolos = sgml_amp | sgml_quot | sgml_dollar | sgml_percnt | sgml_lt_gt | sgml_bsol/* | sgml_commat | sgml_num*/ | sgml_lpar_rpar | sgml_lcub_rcub | sgml_lsqb_rsqb;
+
116
+
126 template <class T_from>
+
127 size_t sgmlerr(
+
128 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
+
129 _In_ int what = 0)
+
130 {
+
131 _Assume_(src || !count_src);
+
132
+
133 const bool
+
134 do_ascii = (what & sgml_full) == 0;
135
-
136 if (entity_w) {
-
137 i = end - src + 1;
-
138 continue;
-
139 }
-
140
-
141 // Unknown entity.
-
142 return i;
-
143 }
-
144
-
145 // Unterminated entity.
-
146 return i;
-
147 }
-
148
-
149 if (do_ascii && !is7bit(src[i])) {
-
150 // Non-ASCII character
-
151 return i;
-
152 }
-
153 i++;
-
154 }
+
136 for (size_t i = 0; i < count_src && src[i];) {
+
137 if (src[i] == '&') {
+
138 auto end = sgmlend(&src[i + 1], count_src - i - 1);
+
139 if (end) {
+
140 utf32_t chr[2];
+
141 size_t n = end - src - i - 1;
+
142 auto entity_w = sgml2uni(&src[i + 1], n, chr);
+
143 if (entity_w) {
+
144 i = end - src + 1;
+
145 continue;
+
146 }
+
147
+
148 // Unknown entity.
+
149 return i;
+
150 }
+
151
+
152 // Unterminated entity.
+
153 return i;
+
154 }
155
-
156 return npos;
-
157 }
-
158
-
169 template <class T_from, class TR_to = std::char_traits<wchar_t>, class AX_to = std::allocator<wchar_t>>
-
170 void sgml2strcat(
-
171 _Inout_ std::basic_string<wchar_t, TR_to, AX_to>& dst,
-
172 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
-
173 _In_ int skip = 0,
-
174 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
-
175 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
-
176 {
-
177 _Assume_(src || !count_src);
-
178
-
179 const bool
-
180 skip_quot = (skip & sgml_quot) == 0,
-
181 skip_apos = (skip & sgml_apos) == 0,
-
182 skip_amp = (skip & sgml_amp) == 0,
-
183 skip_lt_gt = (skip & sgml_lt_gt) == 0,
-
184 skip_bsol = (skip & sgml_bsol) == 0,
-
185 skip_dollar = (skip & sgml_dollar) == 0,
-
186 skip_percnt = (skip & sgml_percnt) == 0,
-
187 skip_commat = (skip & sgml_commat) == 0,
-
188 skip_num = (skip & sgml_num) == 0,
-
189 skip_lpar_rpar = (skip & sgml_lpar_rpar) == 0,
-
190 skip_lcub_rcub = (skip & sgml_lcub_rcub) == 0,
-
191 skip_lsqb_rsqb = (skip & sgml_lsqb_rsqb) == 0;
-
192
-
193 count_src = strnlen(src, count_src);
-
194 dst.reserve(dst.size() + count_src);
-
195 for (size_t i = 0; i < count_src;) {
-
196 if (src[i] == '&') {
-
197 auto end = sgmlend(src + i + 1, count_src - i - 1);
-
198 if (end) {
-
199 const wchar_t* entity_w;
-
200 wchar_t chr[3];
-
201 _Assume_(src + i + 1 <= end);
-
202 size_t n = static_cast<size_t>(end - src) - i - 1;
-
203 if (n >= 2 && src[i + 1] == '#') {
-
204 utf32_t unicode;
-
205 if (src[i + 2] == 'x' || src[i + 2] == 'X')
-
206 unicode = static_cast<utf32_t>(strtou32(src + i + 3, n - 2, nullptr, 16));
-
207 else
-
208 unicode = static_cast<utf32_t>(strtou32(src + i + 2, n - 1, nullptr, 10));
-
209#ifdef _WIN32
-
210 if (unicode < 0x10000) {
-
211 chr[0] = (wchar_t)unicode;
-
212 chr[1] = 0;
-
213 }
-
214 else {
-
215 ucs4_to_surrogate_pair(chr, unicode);
-
216 chr[2] = 0;
-
217 }
-
218#else
-
219 chr[0] = (wchar_t)unicode;
-
220 chr[1] = 0;
-
221#endif
-
222 entity_w = chr;
-
223 }
-
224 else
-
225 entity_w = sgml2uni(src + i + 1, n);
-
226
-
227 if (entity_w &&
-
228 (skip_quot || (entity_w[0] != L'"')) &&
-
229 (skip_apos || (entity_w[0] != L'\'')) &&
-
230 (skip_amp || (entity_w[0] != L'&')) &&
-
231 (skip_lt_gt || (entity_w[0] != L'<' && entity_w[0] != L'>')) &&
-
232 (skip_bsol || (entity_w[0] != L'\\')) &&
-
233 (skip_dollar || (entity_w[0] != L'$')) &&
-
234 (skip_percnt || (entity_w[0] != L'%')) &&
-
235 (skip_commat || (entity_w[0] != L'@')) &&
-
236 (skip_num || (entity_w[0] != L'#')) &&
-
237 (skip_lpar_rpar || (entity_w[0] != L'(' && entity_w[0] != L')')) &&
-
238 (skip_lcub_rcub || (entity_w[0] != L'{' && entity_w[0] != L'}')) &&
-
239 (skip_lsqb_rsqb || (entity_w[0] != L'[' && entity_w[0] != L']')))
-
240 {
-
241 if (map) map->push_back(mapping<size_t>(offset.from + i, offset.to + dst.size()));
-
242 dst.append(entity_w);
-
243 _Assume_(src <= end);
-
244 i = static_cast<size_t>(end - src) + 1;
-
245 if (map) map->push_back(mapping<size_t>(offset.from + i, offset.to + dst.size()));
-
246 continue;
-
247 }
-
248 }
-
249 }
-
250 dst.append(1, src[i++]);
-
251 }
-
252 }
-
253
-
263 template <class T_from, class TR_to = std::char_traits<wchar_t>, class AX_to = std::allocator<wchar_t>, class TR_from = std::char_traits<T_from>, class AX_from = std::allocator<T_from>>
-
264 void sgml2strcat(
-
265 _Inout_ std::basic_string<wchar_t, TR_to, AX_to>& dst,
-
266 _In_ const std::basic_string<T_from, TR_from, AX_from>& src,
-
267 _In_ int skip = 0,
-
268 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
-
269 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
-
270 {
-
271 sgml2strcat(dst, src.data(), src.size(), skip, offset, map);
-
272 }
-
273
-
287 template <class T_from>
-
288 size_t sgml2strcat(
-
289 _Inout_cap_(count_dst) wchar_t* dst, _In_ size_t count_dst,
-
290 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
-
291 _In_ int skip = 0,
-
292 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
-
293 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
-
294 {
-
295 _Assume_(dst || !count_dst);
-
296 _Assume_(src || !count_src);
-
297
-
298 static const std::invalid_argument buffer_overrun("buffer overrun");
-
299 const bool
-
300 skip_quot = (skip & sgml_quot) == 0,
-
301 skip_apos = (skip & sgml_apos) == 0,
-
302 skip_amp = (skip & sgml_amp) == 0,
-
303 skip_lt_gt = (skip & sgml_lt_gt) == 0,
-
304 skip_bsol = (skip & sgml_bsol) == 0,
-
305 skip_dollar = (skip & sgml_dollar) == 0,
-
306 skip_percnt = (skip & sgml_percnt) == 0,
-
307 skip_commat = (skip & sgml_commat) == 0,
-
308 skip_num = (skip & sgml_num) == 0,
-
309 skip_lpar_rpar = (skip & sgml_lpar_rpar) == 0,
-
310 skip_lcub_rcub = (skip & sgml_lcub_rcub) == 0,
-
311 skip_lsqb_rsqb = (skip & sgml_lsqb_rsqb) == 0;
-
312
-
313 size_t j = strnlen(dst, count_dst);
-
314 count_src = strnlen(src, count_src);
-
315 for (size_t i = 0; i < count_src;) {
-
316 if (src[i] == '&') {
-
317 auto end = sgmlend(src + i + 1, count_src - i - 1);
-
318 if (end) {
-
319 const wchar_t* entity_w;
-
320 wchar_t chr[3];
-
321 size_t n = end - src - i - 1;
-
322 if (n >= 2 && src[i + 1] == '#') {
-
323 utf32_t unicode;
-
324 if (src[i + 2] == 'x' || src[i + 2] == 'X')
-
325 unicode = strtou32(src + i + 3, n - 2, nullptr, 16);
-
326 else
-
327 unicode = strtou32(src + i + 2, n - 1, nullptr, 10);
-
328#ifdef _WIN32
-
329 if (unicode < 0x10000) {
-
330 chr[0] = (wchar_t)unicode;
-
331 chr[1] = 0;
-
332 }
-
333 else {
-
334 ucs4_to_surrogate_pair(chr, unicode);
-
335 chr[2] = 0;
-
336 }
-
337#else
-
338 chr[0] = (wchar_t)unicode;
-
339 chr[1] = 0;
-
340#endif
-
341 entity_w = chr;
-
342 }
-
343 else
-
344 entity_w = sgml2uni(src + i + 1, n);
-
345
-
346 if (entity_w &&
-
347 (skip_quot || (entity_w[0] != L'"')) &&
-
348 (skip_apos || (entity_w[0] != L'\'')) &&
-
349 (skip_amp || (entity_w[0] != L'&')) &&
-
350 (skip_lt_gt || (entity_w[0] != L'<' && entity_w[0] != L'>')) &&
-
351 (skip_bsol || (entity_w[0] != L'\\')) &&
-
352 (skip_dollar || (entity_w[0] != L'$')) &&
-
353 (skip_percnt || (entity_w[0] != L'%')) &&
-
354 (skip_commat || (entity_w[0] != L'@')) &&
-
355 (skip_num || (entity_w[0] != L'#')) &&
-
356 (skip_lpar_rpar || (entity_w[0] != L'(' && entity_w[0] != L')')) &&
-
357 (skip_lcub_rcub || (entity_w[0] != L'{' && entity_w[0] != L'}')) &&
-
358 (skip_lsqb_rsqb || (entity_w[0] != L'[' && entity_w[0] != L']')))
-
359 {
-
360 if (map) map->push_back(mapping<size_t>(offset.from + i, offset.to + j));
-
361 size_t m = wcslen(entity_w);
-
362 if (j + m >= count_dst)
-
363 throw buffer_overrun;
-
364 memcpy(dst + j, entity_w, m * sizeof(wchar_t)); j += m;
-
365 i = end - src + 1;
-
366 if (map) map->push_back(mapping<size_t>(offset.from + i, offset.to + j));
-
367 continue;
-
368 }
-
369 }
-
370 }
-
371 if (j + 1 >= count_dst)
-
372 throw buffer_overrun;
-
373 dst[j++] = src[i++];
-
374 }
-
375 if (j >= count_dst)
-
376 throw buffer_overrun;
-
377 dst[j] = 0;
-
378 return j;
-
379 }
-
380
-
391 template <class T_from, class TR_to = std::char_traits<wchar_t>, class AX_to = std::allocator<wchar_t>>
-
392 void sgml2strcpy(
-
393 _Inout_ std::basic_string<wchar_t, TR_to, AX_to>& dst,
-
394 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
-
395 _In_ int skip = 0,
-
396 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
-
397 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
-
398 {
-
399 dst.clear();
-
400 if (map)
-
401 map->clear();
-
402 sgml2strcat(dst, src, count_src, skip, offset, map);
-
403 }
-
404
-
414 template<class T_from, class TR_to = std::char_traits<wchar_t>, class AX_to = std::allocator<wchar_t>, class TR_from = std::char_traits<T_from>, class AX_from = std::allocator<T_from>>
-
415 void sgml2strcpy(
-
416 _Inout_ std::basic_string<wchar_t, TR_to, AX_to>& dst,
-
417 _In_ const std::basic_string<T_from, TR_from, AX_from>& src,
-
418 _In_ int skip = 0,
-
419 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
-
420 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
-
421 {
-
422 sgml2strcpy(dst, src.data(), src.size(), skip, offset, map);
-
423 }
-
424
-
438 template <class T_from>
-
439 size_t sgml2strcpy(
-
440 _Inout_cap_(count_dst) wchar_t* dst, _In_ size_t count_dst,
-
441 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
-
442 _In_ int skip = 0,
-
443 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
-
444 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
-
445 {
-
446 _Assume_(dst || !count_dst);
-
447 if (count_dst)
-
448 dst[0] = 0;
-
449 if (map)
-
450 map->clear();
-
451 return sgml2strcat(dst, count_dst, src, count_src, skip, offset, map);
-
452 }
-
453
-
465 template <class T_from>
-
466 std::wstring sgml2str(
-
467 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
-
468 _In_ int skip = 0,
-
469 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
-
470 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
-
471 {
-
472 std::wstring dst;
-
473 sgml2strcat(dst, src, count_src, skip, offset, map);
-
474 return dst;
-
475 }
-
476
-
487 template <class T_from, class TR_from = std::char_traits<T_from>, class AX_from = std::allocator<T_from>>
-
488 std::wstring sgml2str(
-
489 _In_ const std::basic_string<T_from, TR_from, AX_from>& src,
-
490 _In_ int skip = 0,
-
491 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
-
492 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
-
493 {
-
494 return sgml2str(src.data(), src.size(), skip, offset, map);
-
495 }
-
496
-
498 inline const char* chr2sgml(_In_reads_or_z_(count) const wchar_t* entity, _In_ size_t count)
-
499 {
-
500 _Assume_(entity && count);
-
501
-
502 const wchar_t e2 = entity[0];
-
503 for (size_t i = 0, j = _countof(unicode_sgml); i < j; ) {
-
504 size_t m = (i + j) / 2;
-
505 wchar_t e1 = sgml_unicode[unicode_sgml[m]].unicode[0];
-
506 if (e1 < e2)
-
507 i = m + 1;
-
508 else if (e1 > e2)
-
509 j = m;
-
510 else {
-
511 auto r = strncmp(sgml_unicode[unicode_sgml[m]].unicode + 1, _countof(sgml_unicode[0].unicode) - 1, entity + 1, count - 1);
-
512 if (r < 0)
-
513 i = m + 1;
-
514 else if (r > 0)
-
515 j = m;
-
516 else {
-
517 for (; i < m && sgml_unicode[unicode_sgml[m - 1]].unicode[0] == e2 && strncmp(sgml_unicode[unicode_sgml[m - 1]].unicode + 1, _countof(sgml_unicode[0].unicode) - 1, entity + 1, count - 1) == 0; m--);
-
518 return sgml_unicode[unicode_sgml[m]].sgml;
-
519 }
-
520 }
-
521 }
-
522 return nullptr;
-
523 }
-
525
-
534 template <class TR_to = std::char_traits<char>, class AX_to = std::allocator<char>>
-
535 inline void str2sgmlcat(
-
536 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
-
537 _In_reads_or_z_opt_(count_src) const wchar_t* src, _In_ size_t count_src,
-
538 _In_ int what = 0)
-
539 {
-
540 _Assume_(src || !count_src);
-
541
-
542 const bool
-
543 do_ascii = (what & sgml_full) == 0,
-
544 do_quot = (what & sgml_quot) == 0,
-
545 do_apos = (what & sgml_apos) == 0,
-
546 do_lt_gt = (what & sgml_lt_gt) == 0,
-
547 do_bsol = (what & sgml_bsol) == 0,
-
548 do_dollar = (what & sgml_dollar) == 0,
-
549 do_percnt = (what & sgml_percnt) == 0,
-
550 do_commat = (what & sgml_commat) == 0,
-
551 do_num = (what & sgml_num) == 0,
-
552 do_lpar_rpar = (what & sgml_lpar_rpar) == 0,
-
553 do_lcub_rcub = (what & sgml_lcub_rcub) == 0,
-
554 do_lsqb_rsqb = (what & sgml_lsqb_rsqb) == 0;
+
156 if (do_ascii && !is7bit(src[i])) {
+
157 // Non-ASCII character
+
158 return i;
+
159 }
+
160 i++;
+
161 }
+
162
+
163 return npos;
+
164 }
+
165
+
176 template <class T_to = wchar_t, class T_from, class TR_to = std::char_traits<T_to>, class AX_to = std::allocator<T_to>>
+
177 void sgml2strcat(
+
178 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
+
179 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
+
180 _In_ int skip = 0,
+
181 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
+
182 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
+
183 {
+
184 _Assume_(src || !count_src);
+
185
+
186 const bool
+
187 skip_quot = (skip & sgml_quot) == 0,
+
188 skip_apos = (skip & sgml_apos) == 0,
+
189 skip_amp = (skip & sgml_amp) == 0,
+
190 skip_lt_gt = (skip & sgml_lt_gt) == 0,
+
191 skip_bsol = (skip & sgml_bsol) == 0,
+
192 skip_dollar = (skip & sgml_dollar) == 0,
+
193 skip_percnt = (skip & sgml_percnt) == 0,
+
194 skip_commat = (skip & sgml_commat) == 0,
+
195 skip_num = (skip & sgml_num) == 0,
+
196 skip_lpar_rpar = (skip & sgml_lpar_rpar) == 0,
+
197 skip_lcub_rcub = (skip & sgml_lcub_rcub) == 0,
+
198 skip_lsqb_rsqb = (skip & sgml_lsqb_rsqb) == 0;
+
199
+
200 count_src = strnlen(src, count_src);
+
201 dst.reserve(dst.size() + count_src);
+
202 for (size_t i = 0; i < count_src;) {
+
203 if (src[i] == '&') {
+
204 auto end = sgmlend(&src[i + 1], count_src - i - 1);
+
205 if (end) {
+
206 utf32_t chr32[2];
+
207 _Assume_(&src[i + 1] <= end);
+
208 size_t n = static_cast<size_t>(end - src) - i - 1;
+
209 T_to chr[5];
+
210 auto entity_w = utf32_to_wstr(sgml2uni(&src[i + 1], n, chr32), chr);
+
211 if (entity_w &&
+
212 (skip_quot || (entity_w[0] != '"')) &&
+
213 (skip_apos || (entity_w[0] != '\'')) &&
+
214 (skip_amp || (entity_w[0] != '&')) &&
+
215 (skip_lt_gt || (entity_w[0] != '<' && entity_w[0] != '>')) &&
+
216 (skip_bsol || (entity_w[0] != '\\')) &&
+
217 (skip_dollar || (entity_w[0] != '$')) &&
+
218 (skip_percnt || (entity_w[0] != '%')) &&
+
219 (skip_commat || (entity_w[0] != '@')) &&
+
220 (skip_num || (entity_w[0] != '#')) &&
+
221 (skip_lpar_rpar || (entity_w[0] != '(' && entity_w[0] != ')')) &&
+
222 (skip_lcub_rcub || (entity_w[0] != '{' && entity_w[0] != '}')) &&
+
223 (skip_lsqb_rsqb || (entity_w[0] != '[' && entity_w[0] != ']')))
+
224 {
+
225 if (map) map->push_back(mapping<size_t>(offset.from + i, offset.to + dst.size()));
+
226 dst.append(entity_w);
+
227 _Assume_(src <= end);
+
228 i = static_cast<size_t>(end - src) + 1;
+
229 if (map) map->push_back(mapping<size_t>(offset.from + i, offset.to + dst.size()));
+
230 continue;
+
231 }
+
232 }
+
233 }
+
234 dst.append(1, src[i++]);
+
235 }
+
236 }
+
237
+
247 template <class T_to = wchar_t, class T_from, class TR_to = std::char_traits<T_to>, class AX_to = std::allocator<T_to>, class TR_from = std::char_traits<T_from>, class AX_from = std::allocator<T_from>>
+
248 void sgml2strcat(
+
249 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
+
250 _In_ const std::basic_string<T_from, TR_from, AX_from>& src,
+
251 _In_ int skip = 0,
+
252 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
+
253 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
+
254 {
+
255 sgml2strcat(dst, src.data(), src.size(), skip, offset, map);
+
256 }
+
257
+
271 template <class T_to = wchar_t, class T_from>
+
272 size_t sgml2strcat(
+
273 _Inout_cap_(count_dst) T_to* dst, _In_ size_t count_dst,
+
274 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
+
275 _In_ int skip = 0,
+
276 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
+
277 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
+
278 {
+
279 _Assume_(dst || !count_dst);
+
280 _Assume_(src || !count_src);
+
281
+
282 static const std::invalid_argument buffer_overrun("buffer overrun");
+
283 const bool
+
284 skip_quot = (skip & sgml_quot) == 0,
+
285 skip_apos = (skip & sgml_apos) == 0,
+
286 skip_amp = (skip & sgml_amp) == 0,
+
287 skip_lt_gt = (skip & sgml_lt_gt) == 0,
+
288 skip_bsol = (skip & sgml_bsol) == 0,
+
289 skip_dollar = (skip & sgml_dollar) == 0,
+
290 skip_percnt = (skip & sgml_percnt) == 0,
+
291 skip_commat = (skip & sgml_commat) == 0,
+
292 skip_num = (skip & sgml_num) == 0,
+
293 skip_lpar_rpar = (skip & sgml_lpar_rpar) == 0,
+
294 skip_lcub_rcub = (skip & sgml_lcub_rcub) == 0,
+
295 skip_lsqb_rsqb = (skip & sgml_lsqb_rsqb) == 0;
+
296
+
297 size_t j = strnlen(dst, count_dst);
+
298 count_src = strnlen(src, count_src);
+
299 for (size_t i = 0; i < count_src;) {
+
300 if (src[i] == '&') {
+
301 auto end = sgmlend(&src[i + 1], count_src - i - 1);
+
302 if (end) {
+
303 utf32_t chr32[2];
+
304 T_to chr[5];
+
305 size_t n = end - src - i - 1;
+
306 auto entity_w = utf32_to_wstr(sgml2uni(&src[i + 1], n, chr32), chr);
+
307 if (entity_w &&
+
308 (skip_quot || (entity_w[0] != '"')) &&
+
309 (skip_apos || (entity_w[0] != '\'')) &&
+
310 (skip_amp || (entity_w[0] != '&')) &&
+
311 (skip_lt_gt || (entity_w[0] != '<' && entity_w[0] != '>')) &&
+
312 (skip_bsol || (entity_w[0] != '\\')) &&
+
313 (skip_dollar || (entity_w[0] != '$')) &&
+
314 (skip_percnt || (entity_w[0] != '%')) &&
+
315 (skip_commat || (entity_w[0] != '@')) &&
+
316 (skip_num || (entity_w[0] != '#')) &&
+
317 (skip_lpar_rpar || (entity_w[0] != '(' && entity_w[0] != ')')) &&
+
318 (skip_lcub_rcub || (entity_w[0] != '{' && entity_w[0] != '}')) &&
+
319 (skip_lsqb_rsqb || (entity_w[0] != '[' && entity_w[0] != ']')))
+
320 {
+
321 if (map) map->push_back(mapping<size_t>(offset.from + i, offset.to + j));
+
322 size_t m = strlen(entity_w);
+
323 if (j + m >= count_dst)
+
324 throw buffer_overrun;
+
325 memcpy(dst + j, entity_w, m * sizeof(*entity_w)); j += m;
+
326 i = end - src + 1;
+
327 if (map) map->push_back(mapping<size_t>(offset.from + i, offset.to + j));
+
328 continue;
+
329 }
+
330 }
+
331 }
+
332 if (j + 1 >= count_dst)
+
333 throw buffer_overrun;
+
334 dst[j++] = src[i++];
+
335 }
+
336 if (j >= count_dst)
+
337 throw buffer_overrun;
+
338 dst[j] = 0;
+
339 return j;
+
340 }
+
341
+
352 template <class T_to = wchar_t, class T_from, class TR_to = std::char_traits<T_to>, class AX_to = std::allocator<T_to>>
+
353 void sgml2strcpy(
+
354 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
+
355 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
+
356 _In_ int skip = 0,
+
357 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
+
358 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
+
359 {
+
360 dst.clear();
+
361 if (map)
+
362 map->clear();
+
363 sgml2strcat(dst, src, count_src, skip, offset, map);
+
364 }
+
365
+
375 template<class T_to = wchar_t, class T_from, class TR_to = std::char_traits<T_to>, class AX_to = std::allocator<T_to>, class TR_from = std::char_traits<T_from>, class AX_from = std::allocator<T_from>>
+
376 void sgml2strcpy(
+
377 _Inout_ std::basic_string<T_to, TR_to, AX_to>& dst,
+
378 _In_ const std::basic_string<T_from, TR_from, AX_from>& src,
+
379 _In_ int skip = 0,
+
380 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
+
381 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
+
382 {
+
383 sgml2strcpy(dst, src.data(), src.size(), skip, offset, map);
+
384 }
+
385
+
399 template <class T_to = wchar_t, class T_from>
+
400 size_t sgml2strcpy(
+
401 _Inout_cap_(count_dst) T_to* dst, _In_ size_t count_dst,
+
402 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
+
403 _In_ int skip = 0,
+
404 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
+
405 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
+
406 {
+
407 _Assume_(dst || !count_dst);
+
408 if (count_dst)
+
409 dst[0] = 0;
+
410 if (map)
+
411 map->clear();
+
412 return sgml2strcat(dst, count_dst, src, count_src, skip, offset, map);
+
413 }
+
414
+
426 template <class T_to = wchar_t, class T_from, class TR_to = std::char_traits<T_to>, class AX_to = std::allocator<T_to>>
+
427 std::basic_string<T_to, TR_to, AX_to> sgml2str(
+
428 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
+
429 _In_ int skip = 0,
+
430 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
+
431 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
+
432 {
+
433 std::basic_string<T_to, TR_to, AX_to> dst;
+
434 sgml2strcat(dst, src, count_src, skip, offset, map);
+
435 return dst;
+
436 }
+
437
+
448 template <class T_to = wchar_t, class T_from, class TR_to = std::char_traits<T_to>, class AX_to = std::allocator<T_to>, class TR_from = std::char_traits<T_from>, class AX_from = std::allocator<T_from>>
+
449 std::basic_string<T_to, TR_to, AX_to> sgml2str(
+
450 _In_ const std::basic_string<T_from, TR_from, AX_from>& src,
+
451 _In_ int skip = 0,
+
452 _In_ const mapping<size_t>& offset = mapping<size_t>(0, 0),
+
453 _Inout_opt_ mapping_vector<size_t>* map = nullptr)
+
454 {
+
455 return sgml2str<T_to, T_from, TR_to, AX_to>(src.data(), src.size(), skip, offset, map);
+
456 }
+
457
+
459 inline const char* chr2sgml(_In_reads_or_z_(count) const utf16_t* entity, _In_ size_t count)
+
460 {
+
461 _Assume_(entity && count);
+
462
+
463 utf32_t e2;
+
464 size_t offset;
+
465 if (count < 2 || !is_surrogate_pair(entity)) {
+
466 e2 = static_cast<utf32_t>(entity[0]);
+
467 offset = 1;
+
468 }
+
469 else {
+
470 e2 = surrogate_pair_to_ucs4(entity);
+
471 offset = 2;
+
472 }
+
473 for (size_t i = 0, j = _countof(unicode_sgml); i < j; ) {
+
474 size_t m = (i + j) / 2;
+
475 auto e1 = sgml_unicode[unicode_sgml[m]].unicode[0];
+
476 if (e1 < e2)
+
477 i = m + 1;
+
478 else if (e1 > e2)
+
479 j = m;
+
480 else {
+
481 auto r = strncmp(sgml_unicode[unicode_sgml[m]].unicode + 1, _countof(sgml_unicode[0].unicode) - 1, entity + offset, count - offset);
+
482 if (r < 0)
+
483 i = m + 1;
+
484 else if (r > 0)
+
485 j = m;
+
486 else {
+
487 for (; i < m && sgml_unicode[unicode_sgml[m - 1]].unicode[0] == e2 && strncmp(sgml_unicode[unicode_sgml[m - 1]].unicode + 1, _countof(sgml_unicode[0].unicode) - 1, entity + offset, count - offset) == 0; m--);
+
488 return sgml_unicode[unicode_sgml[m]].sgml;
+
489 }
+
490 }
+
491 }
+
492 return nullptr;
+
493 }
+
494
+
495 inline const char* chr2sgml(_In_reads_or_z_(count) const utf32_t* entity, _In_ size_t count)
+
496 {
+
497 _Assume_(entity && count);
+
498
+
499 utf32_t e2 = entity[0];
+
500 for (size_t i = 0, j = _countof(unicode_sgml); i < j; ) {
+
501 size_t m = (i + j) / 2;
+
502 auto e1 = sgml_unicode[unicode_sgml[m]].unicode[0];
+
503 if (e1 < e2)
+
504 i = m + 1;
+
505 else if (e1 > e2)
+
506 j = m;
+
507 else {
+
508 auto r = strncmp(sgml_unicode[unicode_sgml[m]].unicode + 1, _countof(sgml_unicode[0].unicode) - 1, entity + 1, count - 1);
+
509 if (r < 0)
+
510 i = m + 1;
+
511 else if (r > 0)
+
512 j = m;
+
513 else {
+
514 for (; i < m && sgml_unicode[unicode_sgml[m - 1]].unicode[0] == e2 && strncmp(sgml_unicode[unicode_sgml[m - 1]].unicode + 1, _countof(sgml_unicode[0].unicode) - 1, entity + 1, count - 1) == 0; m--);
+
515 return sgml_unicode[unicode_sgml[m]].sgml;
+
516 }
+
517 }
+
518 }
+
519 return nullptr;
+
520 }
+
521
+
522 inline utf32_t wstr_to_utf32(_In_reads_(end) const utf16_t* src, _Inout_ size_t& i, _In_ size_t end)
+
523 {
+
524 _Assume_(i < end);
+
525 if (i + 1 >= end || !is_surrogate_pair(src + i))
+
526 return src[i++];
+
527
+
528 utf32_t unicode = surrogate_pair_to_ucs4(src + i);
+
529 i += 2;
+
530 return unicode;
+
531 }
+
532
+
533 inline utf32_t wstr_to_utf32(_In_reads_(end) const utf32_t* src, _Inout_ size_t& i, _In_ size_t end)
+
534 {
+
535 _Assume_(i < end);
+
536 return src[i++];
+
537 }
+
539
+
548 template <class T_from = wchar_t, class TR_to = std::char_traits<char>, class AX_to = std::allocator<char>>
+
549 void str2sgmlcat(
+
550 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
+
551 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
+
552 _In_ int what = 0)
+
553 {
+
554 _Assume_(src || !count_src);
555
-
556 count_src = strnlen(src, count_src);
-
557 dst.reserve(dst.size() + count_src);
-
558 for (size_t i = 0; i < count_src;) {
-
559 size_t n = glyphlen(src + i, count_src - i);
-
560 if (n == 1 &&
-
561 do_ascii && is7bit(src[i]) &&
-
562 src[i] != L'&' &&
-
563 (do_quot || (src[i] != L'"')) &&
-
564 (do_apos || (src[i] != L'\'')) &&
-
565 (do_lt_gt || (src[i] != L'<' && src[i] != L'>')) &&
-
566 (do_bsol || (src[i] != L'\\')) &&
-
567 (do_dollar || (src[i] != L'$')) &&
-
568 (do_percnt || (src[i] != L'%')) &&
-
569 (do_commat || (src[i] != L'@')) &&
-
570 (do_num || (src[i] != L'#')) &&
-
571 (do_lpar_rpar || (src[i] != L'(' && src[i] != L')')) &&
-
572 (do_lcub_rcub || (src[i] != L'{' && src[i] != L'}')) &&
-
573 (do_lsqb_rsqb || (src[i] != L'[' && src[i] != L']')))
-
574 {
-
575 // 7-bit ASCII and no desire to encode it as an SGML entity.
-
576 dst.append(1, static_cast<char>(src[i++]));
-
577 }
-
578 else {
-
579 const char* entity = chr2sgml(src + i, n);
-
580 if (entity) {
-
581 dst.append(1, '&');
-
582 dst.append(entity);
-
583 dst.append(1, ';');
-
584 i += n;
-
585 }
-
586 else if (n == 1) {
-
587 // Trivial character (1 code unit, 1 glyph), no entity available.
-
588 if (is7bit(src[i]))
-
589 dst.append(1, static_cast<char>(src[i++]));
-
590 else {
-
591 char tmp[3 + 8 + 1 + 1];
-
592 snprintf(tmp, _countof(tmp), "&#x%x;", src[i++]);
-
593 dst.append(tmp);
-
594 }
-
595 }
-
596 else {
-
597 // Non-trivial character. Decompose.
-
598 const size_t end = i + n;
-
599 while (i < end) {
-
600 if ((entity = chr2sgml(src + i, 1)) != nullptr) {
-
601 dst.append(1, '&');
-
602 dst.append(entity);
-
603 dst.append(1, ';');
-
604 i++;
-
605 }
-
606 else if (is7bit(src[i]))
-
607 dst.append(1, static_cast<char>(src[i++]));
-
608 else {
-
609 utf32_t unicode;
-
610#ifdef _WIN32
-
611 if (i + 1 < end && is_surrogate_pair(src + i)) {
-
612 unicode = surrogate_pair_to_ucs4(src + i);
-
613 i += 2;
-
614 }
-
615 else
-
616#endif
-
617 {
-
618 unicode = src[i++];
-
619 }
-
620 char tmp[3 + 8 + 1 + 1];
-
621 snprintf(tmp, _countof(tmp), "&#x%x;", static_cast<unsigned int>(unicode));
-
622 dst.append(tmp);
-
623 }
-
624 }
-
625 }
-
626 }
-
627 }
-
628 }
-
629
-
637 template <class TR_to = std::char_traits<char>, class AX_to = std::allocator<char>>
-
638 void str2sgmlcat(
-
639 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
-
640 _In_ const std::basic_string_view<wchar_t, std::char_traits<wchar_t>> src,
-
641 _In_ int what = 0)
-
642 {
-
643 str2sgmlcat(dst, src.data(), src.size(), what);
-
644 }
-
645
-
657 inline size_t str2sgmlcat(
-
658 _Inout_cap_(count_dst) char* dst, _In_ size_t count_dst,
-
659 _In_reads_or_z_opt_(count_src) const wchar_t* src, _In_ size_t count_src,
-
660 _In_ int what = 0)
-
661 {
-
662 _Assume_(dst || !count_dst);
-
663 _Assume_(src || !count_src);
-
664
-
665 static const std::invalid_argument buffer_overrun("buffer overrun");
-
666 const bool
-
667 do_ascii = (what & sgml_full) == 0,
-
668 do_quot = (what & sgml_quot) == 0,
-
669 do_apos = (what & sgml_apos) == 0,
-
670 do_lt_gt = (what & sgml_lt_gt) == 0,
-
671 do_bsol = (what & sgml_bsol) == 0,
-
672 do_dollar = (what & sgml_dollar) == 0,
-
673 do_percnt = (what & sgml_percnt) == 0,
-
674 do_commat = (what & sgml_commat) == 0,
-
675 do_num = (what & sgml_num) == 0,
-
676 do_lpar_rpar = (what & sgml_lpar_rpar) == 0,
-
677 do_lcub_rcub = (what & sgml_lcub_rcub) == 0,
-
678 do_lsqb_rsqb = (what & sgml_lsqb_rsqb) == 0;
-
679
-
680 size_t j = strnlen(dst, count_dst);
-
681 count_src = strnlen(src, count_src);
-
682 for (size_t i = 0; i < count_src;) {
-
683 size_t n = glyphlen(src + i, count_src - i);
-
684 if (n == 1 &&
-
685 do_ascii && is7bit(src[i]) &&
-
686 src[i] != L'&' &&
-
687 (do_quot || (src[i] != L'"')) &&
-
688 (do_apos || (src[i] != L'\'')) &&
-
689 (do_lt_gt || (src[i] != L'<' && src[i] != L'>')) &&
-
690 (do_bsol || (src[i] != L'\\')) &&
-
691 (do_dollar || (src[i] != L'$')) &&
-
692 (do_percnt || (src[i] != L'%')) &&
-
693 (do_commat || (src[i] != L'@')) &&
-
694 (do_num || (src[i] != L'#')) &&
-
695 (do_lpar_rpar || (src[i] != L'(' && src[i] != L')')) &&
-
696 (do_lcub_rcub || (src[i] != L'{' && src[i] != L'}')) &&
-
697 (do_lsqb_rsqb || (src[i] != L'[' && src[i] != L']')))
-
698 {
-
699 // 7-bit ASCII and no desire to encode it as an SGML entity.
-
700 if (j + 1 >= count_dst)
-
701 throw buffer_overrun;
-
702 dst[j++] = static_cast<char>(src[i++]);
-
703 }
-
704 else {
-
705 const char* entity = chr2sgml(src + i, n);
-
706 if (entity) {
-
707 size_t m = strlen(entity);
-
708 if (j + m + 2 >= count_dst)
-
709 throw buffer_overrun;
-
710 dst[j++] = '&';
-
711 memcpy(dst + j, entity, m * sizeof(char)); j += m;
-
712 dst[j++] = ';';
-
713 i += n;
-
714 }
-
715 else if (n == 1) {
-
716 // Trivial character (1 code unit, 1 glyph), no entity available.
-
717 if (is7bit(src[i])) {
-
718 if (j + 1 >= count_dst)
-
719 throw buffer_overrun;
-
720 dst[j++] = static_cast<char>(src[i++]);
-
721 }
-
722 else {
-
723 char tmp[3 + 8 + 1 + 1];
-
724 int m = snprintf(tmp, _countof(tmp), "&#x%x;", src[i++]);
-
725 _Assume_(m >= 0);
-
726 if (static_cast<size_t>(m) >= count_dst)
-
727 throw buffer_overrun;
-
728 memcpy(dst + j, tmp, static_cast<size_t>(m) * sizeof(char));
-
729 j += static_cast<size_t>(m);
-
730 }
-
731 }
-
732 else {
-
733 // Non-trivial character. Decompose.
-
734 const size_t end = i + n;
-
735 while (i < end) {
-
736 if ((entity = chr2sgml(src + i, 1)) != nullptr) {
-
737 size_t m = strlen(entity);
-
738 if (j + m + 2 >= count_dst)
-
739 throw buffer_overrun;
-
740 dst[j++] = '&';
-
741 memcpy(dst + j, entity, m * sizeof(char)); j += m;
-
742 dst[j++] = ';';
-
743 i++;
-
744 }
-
745 else if (is7bit(src[i])) {
-
746 if (j + 1 >= count_dst)
-
747 throw buffer_overrun;
-
748 dst[j++] = static_cast<char>(src[i++]);
-
749 }
-
750 else {
-
751 utf32_t unicode;
-
752#ifdef _WIN32
-
753 if (i + 1 < end && is_surrogate_pair(src + i)) {
-
754 unicode = surrogate_pair_to_ucs4(src + i);
-
755 i += 2;
-
756 }
-
757 else
-
758#endif
-
759 {
-
760 unicode = src[i++];
-
761 }
-
762 char tmp[3 + 8 + 1 + 1];
-
763 int m = snprintf(tmp, _countof(tmp), "&#x%x;", static_cast<unsigned int>(unicode));
-
764 _Assume_(m >= 0);
-
765 if (static_cast<size_t>(m) >= count_dst)
-
766 throw buffer_overrun;
-
767 memcpy(dst + j, tmp, static_cast<size_t>(m) * sizeof(char));
-
768 j += static_cast<size_t>(m);
-
769 }
-
770 }
-
771 }
-
772 }
-
773 }
-
774 if (j >= count_dst)
-
775 throw buffer_overrun;
-
776 dst[j] = 0;
-
777 return j;
-
778 }
-
779
-
788 template <class TR_to = std::char_traits<char>, class AX_to = std::allocator<char>>
-
789 inline void str2sgmlcpy(
-
790 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
-
791 _In_reads_or_z_opt_(count_src) const wchar_t* src, _In_ size_t count_src,
-
792 _In_ int what = 0)
-
793 {
-
794 dst.clear();
-
795 str2sgmlcat(dst, src, count_src, what);
-
796 }
-
797
-
805 template <class TR_to = std::char_traits<char>, class AX_to = std::allocator<char>>
-
806 void str2sgmlcpy(
-
807 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
-
808 _In_ const std::basic_string_view<wchar_t, std::char_traits<wchar_t>> src,
-
809 _In_ int what = 0)
-
810 {
-
811 str2sgmlcpy(dst, src.data(), src.size(), what);
-
812 }
-
813
-
825 inline size_t str2sgmlcpy(
-
826 _Inout_cap_(count_dst) char* dst, _In_ size_t count_dst,
-
827 _In_reads_or_z_opt_(count_src) const wchar_t* src, _In_ size_t count_src,
-
828 _In_ int what = 0)
-
829 {
-
830 _Assume_(dst || !count_dst);
-
831 if (count_dst)
-
832 dst[0] = 0;
-
833 return str2sgmlcat(dst, count_dst, src, count_src, what);
-
834 }
-
835
-
845 inline std::string str2sgml(
-
846 _In_reads_or_z_opt_(count_src) const wchar_t* src, _In_ size_t count_src,
-
847 _In_ int what = 0)
-
848 {
-
849 std::string dst;
-
850 str2sgmlcat(dst, src, count_src, what);
-
851 return dst;
-
852 }
-
853
-
862 inline std::string str2sgml(
-
863 _In_ const std::basic_string_view<wchar_t, std::char_traits<wchar_t>> src,
-
864 _In_ int what = 0)
-
865 {
-
866 return str2sgml(src.data(), src.size(), what);
-
867 }
-
868}
-
869
-
870#if defined(__GNUC__)
-
871#pragma GCC diagnostic pop
-
872#endif
+
556 const bool
+
557 do_ascii = (what & sgml_full) == 0,
+
558 do_quot = (what & sgml_quot) == 0,
+
559 do_apos = (what & sgml_apos) == 0,
+
560 do_lt_gt = (what & sgml_lt_gt) == 0,
+
561 do_bsol = (what & sgml_bsol) == 0,
+
562 do_dollar = (what & sgml_dollar) == 0,
+
563 do_percnt = (what & sgml_percnt) == 0,
+
564 do_commat = (what & sgml_commat) == 0,
+
565 do_num = (what & sgml_num) == 0,
+
566 do_lpar_rpar = (what & sgml_lpar_rpar) == 0,
+
567 do_lcub_rcub = (what & sgml_lcub_rcub) == 0,
+
568 do_lsqb_rsqb = (what & sgml_lsqb_rsqb) == 0;
+
569
+
570 count_src = strnlen(src, count_src);
+
571 dst.reserve(dst.size() + count_src);
+
572 for (size_t i = 0; i < count_src;) {
+
573 size_t n = glyphlen(src + i, count_src - i);
+
574 if (n == 1 &&
+
575 do_ascii && is7bit(src[i]) &&
+
576 src[i] != '&' &&
+
577 (do_quot || (src[i] != '"')) &&
+
578 (do_apos || (src[i] != '\'')) &&
+
579 (do_lt_gt || (src[i] != '<' && src[i] != '>')) &&
+
580 (do_bsol || (src[i] != '\\')) &&
+
581 (do_dollar || (src[i] != '$')) &&
+
582 (do_percnt || (src[i] != '%')) &&
+
583 (do_commat || (src[i] != '@')) &&
+
584 (do_num || (src[i] != '#')) &&
+
585 (do_lpar_rpar || (src[i] != '(' && src[i] != ')')) &&
+
586 (do_lcub_rcub || (src[i] != '{' && src[i] != '}')) &&
+
587 (do_lsqb_rsqb || (src[i] != '[' && src[i] != ']')))
+
588 {
+
589 // 7-bit ASCII and no desire to encode it as an SGML entity.
+
590 dst.append(1, static_cast<char>(src[i++]));
+
591 }
+
592 else {
+
593 const char* entity = chr2sgml(src + i, n);
+
594 if (entity) {
+
595 dst.append(1, '&');
+
596 dst.append(entity);
+
597 dst.append(1, ';');
+
598 i += n;
+
599 }
+
600 else if (n == 1) {
+
601 // Trivial character (1 code unit, 1 glyph), no entity available.
+
602 if (is7bit(src[i]))
+
603 dst.append(1, static_cast<char>(src[i++]));
+
604 else {
+
605 char tmp[3 + 8 + 1 + 1];
+
606 snprintf(tmp, _countof(tmp), "&#x%x;", static_cast<unsigned int>(src[i++]));
+
607 dst.append(tmp);
+
608 }
+
609 }
+
610 else {
+
611 // Non-trivial character. Decompose.
+
612 const size_t end = i + n;
+
613 while (i < end) {
+
614 if ((entity = chr2sgml(src + i, 1)) != nullptr) {
+
615 dst.append(1, '&');
+
616 dst.append(entity);
+
617 dst.append(1, ';');
+
618 i++;
+
619 }
+
620 else if (is7bit(src[i]))
+
621 dst.append(1, static_cast<char>(src[i++]));
+
622 else {
+
623 char tmp[3 + 8 + 1 + 1];
+
624 snprintf(tmp, _countof(tmp), "&#x%x;", static_cast<unsigned int>(wstr_to_utf32(src, i, end)));
+
625 dst.append(tmp);
+
626 }
+
627 }
+
628 }
+
629 }
+
630 }
+
631 }
+
632
+
640 template <class T_from = wchar_t, class TR_to = std::char_traits<char>, class AX_to = std::allocator<char>>
+
641 void str2sgmlcat(
+
642 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
+
643 _In_ const std::basic_string_view<T_from, std::char_traits<T_from>> src,
+
644 _In_ int what = 0)
+
645 {
+
646 str2sgmlcat(dst, src.data(), src.size(), what);
+
647 }
+
648
+
660 template <class T_from = wchar_t>
+
661 size_t str2sgmlcat(
+
662 _Inout_cap_(count_dst) char* dst, _In_ size_t count_dst,
+
663 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
+
664 _In_ int what = 0)
+
665 {
+
666 _Assume_(dst || !count_dst);
+
667 _Assume_(src || !count_src);
+
668
+
669 static const std::invalid_argument buffer_overrun("buffer overrun");
+
670 const bool
+
671 do_ascii = (what & sgml_full) == 0,
+
672 do_quot = (what & sgml_quot) == 0,
+
673 do_apos = (what & sgml_apos) == 0,
+
674 do_lt_gt = (what & sgml_lt_gt) == 0,
+
675 do_bsol = (what & sgml_bsol) == 0,
+
676 do_dollar = (what & sgml_dollar) == 0,
+
677 do_percnt = (what & sgml_percnt) == 0,
+
678 do_commat = (what & sgml_commat) == 0,
+
679 do_num = (what & sgml_num) == 0,
+
680 do_lpar_rpar = (what & sgml_lpar_rpar) == 0,
+
681 do_lcub_rcub = (what & sgml_lcub_rcub) == 0,
+
682 do_lsqb_rsqb = (what & sgml_lsqb_rsqb) == 0;
+
683
+
684 size_t j = strnlen(dst, count_dst);
+
685 count_src = strnlen(src, count_src);
+
686 for (size_t i = 0; i < count_src;) {
+
687 size_t n = glyphlen(src + i, count_src - i);
+
688 if (n == 1 &&
+
689 do_ascii && is7bit(src[i]) &&
+
690 src[i] != '&' &&
+
691 (do_quot || (src[i] != '"')) &&
+
692 (do_apos || (src[i] != '\'')) &&
+
693 (do_lt_gt || (src[i] != '<' && src[i] != '>')) &&
+
694 (do_bsol || (src[i] != '\\')) &&
+
695 (do_dollar || (src[i] != '$')) &&
+
696 (do_percnt || (src[i] != '%')) &&
+
697 (do_commat || (src[i] != '@')) &&
+
698 (do_num || (src[i] != '#')) &&
+
699 (do_lpar_rpar || (src[i] != '(' && src[i] != ')')) &&
+
700 (do_lcub_rcub || (src[i] != '{' && src[i] != '}')) &&
+
701 (do_lsqb_rsqb || (src[i] != '[' && src[i] != ']')))
+
702 {
+
703 // 7-bit ASCII and no desire to encode it as an SGML entity.
+
704 if (j + 1 >= count_dst)
+
705 throw buffer_overrun;
+
706 dst[j++] = static_cast<char>(src[i++]);
+
707 }
+
708 else {
+
709 const char* entity = chr2sgml(src + i, n);
+
710 if (entity) {
+
711 size_t m = strlen(entity);
+
712 if (j + m + 2 >= count_dst)
+
713 throw buffer_overrun;
+
714 dst[j++] = '&';
+
715 memcpy(dst + j, entity, m * sizeof(char)); j += m;
+
716 dst[j++] = ';';
+
717 i += n;
+
718 }
+
719 else if (n == 1) {
+
720 // Trivial character (1 code unit, 1 glyph), no entity available.
+
721 if (is7bit(src[i])) {
+
722 if (j + 1 >= count_dst)
+
723 throw buffer_overrun;
+
724 dst[j++] = static_cast<char>(src[i++]);
+
725 }
+
726 else {
+
727 char tmp[3 + 8 + 1 + 1];
+
728 int m = snprintf(tmp, _countof(tmp), "&#x%x;", static_cast<unsigned int>(src[i++]));
+
729 _Assume_(m >= 0);
+
730 if (static_cast<size_t>(m) >= count_dst)
+
731 throw buffer_overrun;
+
732 memcpy(dst + j, tmp, static_cast<size_t>(m) * sizeof(char));
+
733 j += static_cast<size_t>(m);
+
734 }
+
735 }
+
736 else {
+
737 // Non-trivial character. Decompose.
+
738 const size_t end = i + n;
+
739 while (i < end) {
+
740 if ((entity = chr2sgml(src + i, 1)) != nullptr) {
+
741 size_t m = strlen(entity);
+
742 if (j + m + 2 >= count_dst)
+
743 throw buffer_overrun;
+
744 dst[j++] = '&';
+
745 memcpy(dst + j, entity, m * sizeof(char)); j += m;
+
746 dst[j++] = ';';
+
747 i++;
+
748 }
+
749 else if (is7bit(src[i])) {
+
750 if (j + 1 >= count_dst)
+
751 throw buffer_overrun;
+
752 dst[j++] = static_cast<char>(src[i++]);
+
753 }
+
754 else {
+
755 char tmp[3 + 8 + 1 + 1];
+
756 int m = snprintf(tmp, _countof(tmp), "&#x%x;", static_cast<unsigned int>(wstr_to_utf32(src, i, end)));
+
757 _Assume_(m >= 0);
+
758 if (static_cast<size_t>(m) >= count_dst)
+
759 throw buffer_overrun;
+
760 memcpy(dst + j, tmp, static_cast<size_t>(m) * sizeof(char));
+
761 j += static_cast<size_t>(m);
+
762 }
+
763 }
+
764 }
+
765 }
+
766 }
+
767 if (j >= count_dst)
+
768 throw buffer_overrun;
+
769 dst[j] = 0;
+
770 return j;
+
771 }
+
772
+
781 template <class T_from = wchar_t, class TR_to = std::char_traits<char>, class AX_to = std::allocator<char>>
+
782 void str2sgmlcpy(
+
783 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
+
784 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
+
785 _In_ int what = 0)
+
786 {
+
787 dst.clear();
+
788 str2sgmlcat(dst, src, count_src, what);
+
789 }
+
790
+
798 template <class T_from = wchar_t, class TR_to = std::char_traits<char>, class AX_to = std::allocator<char>>
+
799 void str2sgmlcpy(
+
800 _Inout_ std::basic_string<char, TR_to, AX_to>& dst,
+
801 _In_ const std::basic_string_view<T_from, std::char_traits<T_from>> src,
+
802 _In_ int what = 0)
+
803 {
+
804 str2sgmlcpy(dst, src.data(), src.size(), what);
+
805 }
+
806
+
818 template <class T_from = wchar_t>
+
819 size_t str2sgmlcpy(
+
820 _Inout_cap_(count_dst) char* dst, _In_ size_t count_dst,
+
821 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
+
822 _In_ int what = 0)
+
823 {
+
824 _Assume_(dst || !count_dst);
+
825 if (count_dst)
+
826 dst[0] = 0;
+
827 return str2sgmlcat(dst, count_dst, src, count_src, what);
+
828 }
+
829
+
839 template <class T_from = wchar_t>
+
840 std::string str2sgml(
+
841 _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src,
+
842 _In_ int what = 0)
+
843 {
+
844 std::string dst;
+
845 str2sgmlcat(dst, src, count_src, what);
+
846 return dst;
+
847 }
+
848
+
857 template <class T_from = wchar_t>
+
858 std::string str2sgml(
+
859 _In_ const std::basic_string_view<T_from, std::char_traits<T_from>> src,
+
860 _In_ int what = 0)
+
861 {
+
862 return str2sgml(src.data(), src.size(), what);
+
863 }
+
864}
+
865
+
866#if defined(__GNUC__)
+
867#pragma GCC diagnostic pop
+
868#endif
diff --git a/sgml__unicode_8hpp_source.html b/sgml__unicode_8hpp_source.html index 0fcc11c2f..782a891ab 100644 --- a/sgml__unicode_8hpp_source.html +++ b/sgml__unicode_8hpp_source.html @@ -91,3093 +91,3095 @@ $(function() { codefold.init(0); });
5
6#pragma once
7
-
8namespace stdex
-
9{
-
11 struct sgml_unicode_pair {
-
12 char sgml[12];
-
13 wchar_t unicode[3];
-
14 };
-
15
-
16 inline const sgml_unicode_pair sgml_unicode[] = {
-
17 { "AElig", L"\u00c6" },
-
18 { "Aacgr", L"\u0386" },
-
19 { "Aacute", L"\u00c1" },
-
20 { "Aacute", L"\u0041\u0301" },
-
21 { "Abreve", L"\u0102" },
-
22 { "Abreve", L"\u0041\u0306" },
-
23 { "Abring", L"\u0041\u032f" },
-
24 { "Acaron", L"\u0041\u030c" },
-
25 { "Acirc", L"\u00c2" },
-
26 { "Acirc", L"\u0041\u0302" },
-
27 { "Acy", L"\u0410" },
-
28 { "Adot", L"\u0041\u0307" },
-
29 { "Agr", L"\u0391" },
-
30 { "Agrave", L"\u00c0" },
-
31 { "Agrave", L"\u0041\u0300" },
-
32 { "Alpha", L"\u0391" },
-
33 { "Amacr", L"\u0100" },
-
34 { "Amacr", L"\u0041\u0304" },
-
35 { "Aogon", L"\u0104" },
-
36 { "Aring", L"\u00c5" },
-
37 { "Atilde", L"\u00c3" },
-
38 { "Atilde", L"\u0041\u0303" },
-
39 { "Auml", L"\u00c4" },
-
40 { "Auml", L"\u0041\u0308" },
-
41 { "Bacute", L"\u0042\u0301" },
-
42 { "Barwed", L"\u2306" },
-
43 { "Bbreve", L"\u0042\u0306" },
-
44 { "Bbring", L"\u0042\u032f" },
-
45 { "Bcaron", L"\u0042\u030c" },
-
46 { "Bcirc", L"\u0042\u0302" },
-
47 { "Bcy", L"\u0411" },
-
48 { "Bdot", L"\u0042\u0307" },
-
49 { "Beta", L"\u0392" },
-
50 { "Bgr", L"\u0392" },
-
51 { "Bgrave", L"\u0042\u0300" },
-
52 { "Bmacr", L"\u0042\u0304" },
-
53 { "Btilde", L"\u0042\u0303" },
-
54 { "Buml", L"\u0042\u0308" },
-
55 { "CHcy", L"\u0427" },
-
56 { "Cacute", L"\u0106" },
-
57 { "Cacute", L"\u0043\u0301" },
-
58 { "Cap", L"\u22d2" },
-
59 { "Cbreve", L"\u0043\u0306" },
-
60 { "Cbring", L"\u0043\u032f" },
-
61 { "Ccaron", L"\u010c" },
-
62 { "Ccaron", L"\u0043\u030c" },
-
63 { "Ccedil", L"\u00c7" },
-
64 { "Ccirc", L"\u0108" },
-
65 { "Ccirc", L"\u0043\u0302" },
-
66 { "Cdot", L"\u010a" },
-
67 { "Cdot", L"\u0043\u0307" },
-
68 { "Cgrave", L"\u0043\u0300" },
-
69 { "Chi", L"\u03a7" },
-
70 { "Cmacr", L"\u0043\u0304" },
-
71 { "Ctilde", L"\u0043\u0303" },
-
72 { "Cuml", L"\u0043\u0308" },
-
73 { "Cup", L"\u22d3" },
-
74 { "DJcy", L"\u0402" },
-
75 { "DScy", L"\u0405" },
-
76 { "DZcy", L"\u040f" },
-
77 { "Dacute", L"\u0044\u0301" },
-
78 { "Dagger", L"\u2021" },
-
79 { "Dbreve", L"\u0044\u0306" },
-
80 { "Dbring", L"\u0044\u032f" },
-
81 { "Dcaron", L"\u010e" },
-
82 { "Dcaron", L"\u0044\u030c" },
-
83 { "Dcirc", L"\u0044\u0302" },
-
84 { "Dcy", L"\u0414" },
-
85 { "Ddot", L"\u0044\u0307" },
-
86 { "Delta", L"\u0394" },
-
87 { "Dgr", L"\u0394" },
-
88 { "Dgrave", L"\u0044\u0300" },
-
89 { "Dmacr", L"\u0044\u0304" },
-
90 { "Dot", L"\u00a8" },
-
91 { "DotDot", L"\u20dc" },
-
92 { "Dstrok", L"\u0110" },
-
93 { "Dtilde", L"\u0044\u0303" },
-
94 { "Duml", L"\u0044\u0308" },
-
95 { "EEacgr", L"\u0389" },
-
96 { "EEgr", L"\u0397" },
-
97 { "ENG", L"\u014a" },
-
98 { "ETH", L"\u00d0" },
-
99 { "Eacgr", L"\u0388" },
-
100 { "Eacute", L"\u00c9" },
-
101 { "Eacute", L"\u0045\u0301" },
-
102 { "Ebreve", L"\u0045\u0306" },
-
103 { "Ebring", L"\u0045\u032f" },
-
104 { "Ecaron", L"\u011a" },
-
105 { "Ecaron", L"\u0045\u030c" },
-
106 { "Ecirc", L"\u00ca" },
-
107 { "Ecirc", L"\u0045\u0302" },
-
108 { "Ecy", L"\u042d" },
-
109 { "Edot", L"\u0116" },
-
110 { "Edot", L"\u0045\u0307" },
-
111 { "Edotb", L"\u1eb8" },
-
112 { "Egr", L"\u0395" },
-
113 { "Egrave", L"\u00c8" },
-
114 { "Egrave", L"\u0045\u0300" },
-
115 { "Emacr", L"\u0112" },
-
116 { "Emacr", L"\u0045\u0304" },
-
117 { "Eogon", L"\u0118" },
-
118 { "Epsilon", L"\u0395" },
-
119 { "Eta", L"\u0397" },
-
120 { "Etilde", L"\u0045\u0303" },
-
121 { "Euml", L"\u00cb" },
-
122 { "Euml", L"\u0045\u0308" },
-
123 { "Facute", L"\u0046\u0301" },
-
124 { "Fbreve", L"\u0046\u0306" },
-
125 { "Fbring", L"\u0046\u032f" },
-
126 { "Fcaron", L"\u0046\u030c" },
-
127 { "Fcirc", L"\u0046\u0302" },
-
128 { "Fcy", L"\u0424" },
-
129 { "Fdot", L"\u0046\u0307" },
-
130 { "Fgrave", L"\u0046\u0300" },
-
131 { "Fmacr", L"\u0046\u0304" },
-
132 { "Ftilde", L"\u0046\u0303" },
-
133 { "Fuml", L"\u0046\u0308" },
-
134 { "GJcy", L"\u0403" },
-
135 { "Gacute", L"\u0047\u0301" },
-
136 { "Gamma", L"\u0393" },
-
137 { "Gbreve", L"\u011e" },
-
138 { "Gbreve", L"\u0047\u0306" },
-
139 { "Gbring", L"\u0047\u032f" },
-
140 { "Gcaron", L"\u0047\u030c" },
-
141 { "Gcedil", L"\u0122" },
-
142 { "Gcirc", L"\u011c" },
-
143 { "Gcirc", L"\u0047\u0302" },
-
144 { "Gcy", L"\u0413" },
-
145 { "Gdot", L"\u0120" },
-
146 { "Gdot", L"\u0047\u0307" },
-
147 { "Gg", L"\u22d9" },
-
148 { "Ggr", L"\u0393" },
-
149 { "Ggrave", L"\u0047\u0300" },
-
150 { "Gmacr", L"\u0047\u0304" },
-
151 { "Gt", L"\u226b" },
-
152 { "Gtilde", L"\u0047\u0303" },
-
153 { "Guml", L"\u0047\u0308" },
-
154 { "HARDcy", L"\u042a" },
-
155 { "Hacute", L"\u0048\u0301" },
-
156 { "Hbreve", L"\u0048\u0306" },
-
157 { "Hbring", L"\u0048\u032f" },
-
158 { "Hcaron", L"\u0048\u030c" },
-
159 { "Hcirc", L"\u0124" },
-
160 { "Hcirc", L"\u0048\u0302" },
-
161 { "Hdot", L"\u0048\u0307" },
-
162 { "Hgrave", L"\u0048\u0300" },
-
163 { "Hmacr", L"\u0048\u0304" },
-
164 { "Hstrok", L"\u0126" },
-
165 { "Htilde", L"\u0048\u0303" },
-
166 { "Huml", L"\u0048\u0308" },
-
167 { "IEcy", L"\u0415" },
-
168 { "IJlig", L"\u0132" },
-
169 { "IOcy", L"\u0401" },
-
170 { "Iacgr", L"\u038a" },
-
171 { "Iacute", L"\u00cd" },
-
172 { "Iacute", L"\u0049\u0301" },
-
173 { "Ibreve", L"\u0049\u0306" },
-
174 { "Ibring", L"\u0049\u032f" },
-
175 { "Icaron", L"\u0049\u030c" },
-
176 { "Icirc", L"\u00ce" },
-
177 { "Icirc", L"\u0049\u0302" },
-
178 { "Icy", L"\u0418" },
-
179 { "Idigr", L"\u03aa" },
-
180 { "Idot", L"\u0130" },
-
181 { "Idot", L"\u0049\u0307" },
-
182 { "Igr", L"\u0399" },
-
183 { "Igrave", L"\u00cc" },
-
184 { "Igrave", L"\u0049\u0300" },
-
185 { "Imacr", L"\u012a" },
-
186 { "Imacr", L"\u0049\u0304" },
-
187 { "Iogon", L"\u012e" },
-
188 { "Iota", L"\u0399" },
-
189 { "Itilde", L"\u0128" },
-
190 { "Itilde", L"\u0049\u0303" },
-
191 { "Iukcy", L"\u0406" },
-
192 { "Iuml", L"\u00cf" },
-
193 { "Iuml", L"\u0049\u0308" },
-
194 { "Jacute", L"\u004a\u0301" },
-
195 { "Jbreve", L"\u004a\u0306" },
-
196 { "Jbring", L"\u004a\u032f" },
-
197 { "Jcaron", L"\u004a\u030c" },
-
198 { "Jcirc", L"\u0134" },
-
199 { "Jcirc", L"\u004a\u0302" },
-
200 { "Jcy", L"\u0419" },
-
201 { "Jdot", L"\u004a\u0307" },
-
202 { "Jgrave", L"\u004a\u0300" },
-
203 { "Jmacr", L"\u004a\u0304" },
-
204 { "Jsercy", L"\u0408" },
-
205 { "Jtilde", L"\u004a\u0303" },
-
206 { "Jukcy", L"\u0404" },
-
207 { "Juml", L"\u004a\u0308" },
-
208 { "KHcy", L"\u0425" },
-
209 { "KHgr", L"\u03a7" },
-
210 { "KJcy", L"\u040c" },
-
211 { "Kacute", L"\u004b\u0301" },
-
212 { "Kappa", L"\u039a" },
-
213 { "Kbreve", L"\u004b\u0306" },
-
214 { "Kbring", L"\u004b\u032f" },
-
215 { "Kcaron", L"\u004b\u030c" },
-
216 { "Kcedil", L"\u0136" },
-
217 { "Kcirc", L"\u004b\u0302" },
-
218 { "Kcy", L"\u041a" },
-
219 { "Kdot", L"\u004b\u0307" },
-
220 { "Kgr", L"\u039a" },
-
221 { "Kgrave", L"\u004b\u0300" },
-
222 { "Kmacr", L"\u004b\u0304" },
-
223 { "Ktilde", L"\u004b\u0303" },
-
224 { "Kuml", L"\u004b\u0308" },
-
225 { "LJcy", L"\u0409" },
-
226 { "Lacute", L"\u0139" },
-
227 { "Lacute", L"\u004c\u0301" },
-
228 { "Lambda", L"\u039b" },
-
229 { "Larr", L"\u219e" },
-
230 { "Lbreve", L"\u004c\u0306" },
-
231 { "Lbring", L"\u004c\u032f" },
-
232 { "Lcaron", L"\u013d" },
-
233 { "Lcaron", L"\u004c\u030c" },
-
234 { "Lcedil", L"\u013b" },
-
235 { "Lcirc", L"\u004c\u0302" },
-
236 { "Lcy", L"\u041b" },
-
237 { "Ldot", L"\u004c\u0307" },
-
238 { "Lgr", L"\u039b" },
-
239 { "Lgrave", L"\u004c\u0300" },
-
240 { "Ll", L"\u22d8" },
-
241 { "Lmacr", L"\u004c\u0304" },
-
242 { "Lmidot", L"\u013f" },
-
243 { "Lstrok", L"\u0141" },
-
244 { "Lt", L"\u226a" },
-
245 { "Ltilde", L"\u004c\u0303" },
-
246 { "Luml", L"\u004c\u0308" },
-
247 { "Macute", L"\u004d\u0301" },
-
248 { "Mbreve", L"\u004d\u0306" },
-
249 { "Mbring", L"\u004d\u032f" },
-
250 { "Mcaron", L"\u004d\u030c" },
-
251 { "Mcirc", L"\u004d\u0302" },
-
252 { "Mcy", L"\u041c" },
-
253 { "Mdot", L"\u004d\u0307" },
-
254 { "Mgr", L"\u039c" },
-
255 { "Mgrave", L"\u004d\u0300" },
-
256 { "Mmacr", L"\u004d\u0304" },
-
257 { "Mtilde", L"\u004d\u0303" },
-
258 { "Mu", L"\u039c" },
-
259 { "Muml", L"\u004d\u0308" },
-
260 { "NJcy", L"\u040a" },
-
261 { "Nacute", L"\u0143" },
-
262 { "Nacute", L"\u004e\u0301" },
-
263 { "Nbreve", L"\u004e\u0306" },
-
264 { "Nbring", L"\u004e\u032f" },
-
265 { "Ncaron", L"\u0147" },
-
266 { "Ncaron", L"\u004e\u030c" },
-
267 { "Ncedil", L"\u0145" },
-
268 { "Ncirc", L"\u004e\u0302" },
-
269 { "Ncy", L"\u041d" },
-
270 { "Ndot", L"\u004e\u0307" },
-
271 { "Ngr", L"\u039d" },
-
272 { "Ngrave", L"\u004e\u0300" },
-
273 { "Nmacr", L"\u004e\u0304" },
-
274 { "Ntilde", L"\u00d1" },
-
275 { "Ntilde", L"\u004e\u0303" },
-
276 { "Nu", L"\u039d" },
-
277 { "Numl", L"\u004e\u0308" },
-
278 { "OElig", L"\u0152" },
-
279 { "OHacgr", L"\u038f" },
-
280 { "OHgr", L"\u03a9" },
-
281 { "Oacgr", L"\u038c" },
-
282 { "Oacute", L"\u00d3" },
-
283 { "Oacute", L"\u004f\u0301" },
-
284 { "Obreve", L"\u004f\u0306" },
-
285 { "Obring", L"\u004f\u032f" },
-
286 { "Ocaron", L"\u01d1" },
-
287 { "Ocaron", L"\u004f\u030c" },
-
288 { "Ocirc", L"\u00d4" },
-
289 { "Ocirc", L"\u004f\u0302" },
-
290 { "Ocy", L"\u041e" },
-
291 { "Odblac", L"\u0150" },
-
292 { "Odot", L"\u004f\u0307" },
-
293 { "Odotb", L"\u1ecc" },
-
294 { "Ogr", L"\u039f" },
-
295 { "Ograve", L"\u00d2" },
-
296 { "Ograve", L"\u004f\u0300" },
-
297 { "Omacr", L"\u014c" },
-
298 { "Omacr", L"\u004f\u0304" },
-
299 { "Omega", L"\u03a9" },
-
300 { "Omicron", L"\u039f" },
-
301 { "Oslash", L"\u00d8" },
-
302 { "Otilde", L"\u00d5" },
-
303 { "Otilde", L"\u004f\u0303" },
-
304 { "Ouml", L"\u00d6" },
-
305 { "Ouml", L"\u004f\u0308" },
-
306 { "PHgr", L"\u03a6" },
-
307 { "PSgr", L"\u03a8" },
-
308 { "Pacute", L"\u0050\u0301" },
-
309 { "Pbreve", L"\u0050\u0306" },
-
310 { "Pbring", L"\u0050\u032f" },
-
311 { "Pcaron", L"\u0050\u030c" },
-
312 { "Pcirc", L"\u0050\u0302" },
-
313 { "Pcy", L"\u041f" },
-
314 { "Pdot", L"\u0050\u0307" },
-
315 { "Pgr", L"\u03a0" },
-
316 { "Pgrave", L"\u0050\u0300" },
-
317 { "Phi", L"\u03a6" },
-
318 { "Pi", L"\u03a0" },
-
319 { "Pmacr", L"\u0050\u0304" },
-
320 { "Prime", L"\u2033" },
-
321 { "Psi", L"\u03a8" },
-
322 { "Ptilde", L"\u0050\u0303" },
-
323 { "Puml", L"\u0050\u0308" },
-
324 { "Qacute", L"\u0051\u0301" },
-
325 { "Qbreve", L"\u0051\u0306" },
-
326 { "Qbring", L"\u0051\u032f" },
-
327 { "Qcaron", L"\u0051\u030c" },
-
328 { "Qcirc", L"\u0051\u0302" },
-
329 { "Qdot", L"\u0051\u0307" },
-
330 { "Qgrave", L"\u0051\u0300" },
-
331 { "Qmacr", L"\u0051\u0304" },
-
332 { "Qtilde", L"\u0051\u0303" },
-
333 { "Quml", L"\u0051\u0308" },
-
334 { "Racute", L"\u0154" },
-
335 { "Racute", L"\u0052\u0301" },
-
336 { "Rarr", L"\u21a0" },
-
337 { "Rbreve", L"\u0052\u0306" },
-
338 { "Rbring", L"\u0052\u032f" },
-
339 { "Rcaron", L"\u0158" },
-
340 { "Rcaron", L"\u0052\u030c" },
-
341 { "Rcedil", L"\u0156" },
-
342 { "Rcirc", L"\u0052\u0302" },
-
343 { "Rcy", L"\u0420" },
-
344 { "Rdot", L"\u0052\u0307" },
-
345 { "Rgr", L"\u03a1" },
-
346 { "Rgrave", L"\u0052\u0300" },
-
347 { "Rho", L"\u03a1" },
-
348 { "Rmacr", L"\u0052\u0304" },
-
349 { "Rtilde", L"\u0052\u0303" },
-
350 { "Ruml", L"\u0052\u0308" },
-
351 { "SHCHcy", L"\u0429" },
-
352 { "SHcy", L"\u0428" },
-
353 { "SOFTcy", L"\u042c" },
-
354 { "Sacute", L"\u015a" },
-
355 { "Sacute", L"\u0053\u0301" },
-
356 { "Sbreve", L"\u0053\u0306" },
-
357 { "Sbring", L"\u0053\u032f" },
-
358 { "Scaron", L"\u0160" },
-
359 { "Scaron", L"\u0053\u030c" },
-
360 { "Scedil", L"\u015e" },
-
361 { "Scirc", L"\u015c" },
-
362 { "Scirc", L"\u0053\u0302" },
-
363 { "Scy", L"\u0421" },
-
364 { "Sdot", L"\u0053\u0307" },
-
365 { "Sgr", L"\u03a3" },
-
366 { "Sgrave", L"\u0053\u0300" },
-
367 { "Sigma", L"\u03a3" },
-
368 { "Smacr", L"\u0053\u0304" },
-
369 { "Stilde", L"\u0053\u0303" },
-
370 { "Sub", L"\u22d0" },
-
371 { "Suml", L"\u0053\u0308" },
-
372 { "Sup", L"\u22d1" },
-
373 { "THORN", L"\u00de" },
-
374 { "THgr", L"\u0398" },
-
375 { "TSHcy", L"\u040b" },
-
376 { "TScy", L"\u0426" },
-
377 { "Tacute", L"\u0054\u0301" },
-
378 { "Tau", L"\u03a4" },
-
379 { "Tbreve", L"\u0054\u0306" },
-
380 { "Tbring", L"\u0054\u032f" },
-
381 { "Tcaron", L"\u0164" },
-
382 { "Tcaron", L"\u0054\u030c" },
-
383 { "Tcedil", L"\u0162" },
-
384 { "Tcirc", L"\u0054\u0302" },
-
385 { "Tcy", L"\u0422" },
-
386 { "Tdot", L"\u0054\u0307" },
-
387 { "Tgr", L"\u03a4" },
-
388 { "Tgrave", L"\u0054\u0300" },
-
389 { "Theta", L"\u0398" },
-
390 { "Tmacr", L"\u0054\u0304" },
-
391 { "Tstrok", L"\u0166" },
-
392 { "Ttilde", L"\u0054\u0303" },
-
393 { "Tuml", L"\u0054\u0308" },
-
394 { "Uacgr", L"\u038e" },
-
395 { "Uacute", L"\u00da" },
-
396 { "Uacute", L"\u0055\u0301" },
-
397 { "Ubrcy", L"\u040e" },
-
398 { "Ubreve", L"\u016c" },
-
399 { "Ubreve", L"\u0055\u0306" },
-
400 { "Ubring", L"\u0055\u032f" },
-
401 { "Ucaron", L"\u0055\u030c" },
-
402 { "Ucirc", L"\u00db" },
-
403 { "Ucirc", L"\u0055\u0302" },
-
404 { "Ucy", L"\u0423" },
-
405 { "Udblac", L"\u0170" },
-
406 { "Udigr", L"\u03ab" },
-
407 { "Udot", L"\u0055\u0307" },
-
408 { "Ugr", L"\u03a5" },
-
409 { "Ugrave", L"\u00d9" },
-
410 { "Ugrave", L"\u0055\u0300" },
-
411 { "Umacr", L"\u016a" },
-
412 { "Umacr", L"\u0055\u0304" },
-
413 { "Uogon", L"\u0172" },
-
414 { "Upsi", L"\u03a5" },
-
415 { "Upsilon", L"\u03a5" },
-
416 { "Uring", L"\u016e" },
-
417 { "Utilde", L"\u0168" },
-
418 { "Utilde", L"\u0055\u0303" },
-
419 { "Uuml", L"\u00dc" },
-
420 { "Uuml", L"\u0055\u0308" },
-
421 { "Vacute", L"\u0056\u0301" },
-
422 { "Vbreve", L"\u0056\u0306" },
-
423 { "Vbring", L"\u0056\u032f" },
-
424 { "Vcaron", L"\u0056\u030c" },
-
425 { "Vcirc", L"\u0056\u0302" },
-
426 { "Vcy", L"\u0412" },
-
427 { "Vdash", L"\u22a9" },
-
428 { "Vdot", L"\u0056\u0307" },
-
429 { "Verbar", L"\u2016" },
-
430 { "Vgrave", L"\u0056\u0300" },
-
431 { "Vmacr", L"\u0056\u0304" },
-
432 { "Vtilde", L"\u0056\u0303" },
-
433 { "Vuml", L"\u0056\u0308" },
-
434 { "Vvdash", L"\u22aa" },
-
435 { "Wacute", L"\u0057\u0301" },
-
436 { "Wbreve", L"\u0057\u0306" },
-
437 { "Wbring", L"\u0057\u032f" },
-
438 { "Wcaron", L"\u0057\u030c" },
-
439 { "Wcirc", L"\u0174" },
-
440 { "Wcirc", L"\u0057\u0302" },
-
441 { "Wdot", L"\u0057\u0307" },
-
442 { "Wgrave", L"\u0057\u0300" },
-
443 { "Wmacr", L"\u0057\u0304" },
-
444 { "Wtilde", L"\u0057\u0303" },
-
445 { "Wuml", L"\u0057\u0308" },
-
446 { "Xacute", L"\u0058\u0301" },
-
447 { "Xbreve", L"\u0058\u0306" },
-
448 { "Xbring", L"\u0058\u032f" },
-
449 { "Xcaron", L"\u0058\u030c" },
-
450 { "Xcirc", L"\u0058\u0302" },
-
451 { "Xdot", L"\u0058\u0307" },
-
452 { "Xgr", L"\u039e" },
-
453 { "Xgrave", L"\u0058\u0300" },
-
454 { "Xi", L"\u039e" },
-
455 { "Xmacr", L"\u0058\u0304" },
-
456 { "Xtilde", L"\u0058\u0303" },
-
457 { "Xuml", L"\u0058\u0308" },
-
458 { "YAcy", L"\u042f" },
-
459 { "YIcy", L"\u0407" },
-
460 { "YUcy", L"\u042e" },
-
461 { "Yacute", L"\u00dd" },
-
462 { "Yacute", L"\u0059\u0301" },
-
463 { "Ybreve", L"\u0059\u0306" },
-
464 { "Ybring", L"\u0059\u032f" },
-
465 { "Ycaron", L"\u0059\u030c" },
-
466 { "Ycirc", L"\u0176" },
-
467 { "Ycirc", L"\u0059\u0302" },
-
468 { "Ycy", L"\u042b" },
-
469 { "Ydot", L"\u0059\u0307" },
-
470 { "Ygrave", L"\u0059\u0300" },
-
471 { "Ymacr", L"\u0059\u0304" },
-
472 { "Ytilde", L"\u0059\u0303" },
-
473 { "Yuml", L"\u0178" },
-
474 { "Yuml", L"\u0059\u0308" },
-
475 { "ZHcy", L"\u0416" },
-
476 { "Zacute", L"\u0179" },
-
477 { "Zacute", L"\u005a\u0301" },
-
478 { "Zbreve", L"\u005a\u0306" },
-
479 { "Zbring", L"\u005a\u032f" },
-
480 { "Zcaron", L"\u017d" },
-
481 { "Zcaron", L"\u005a\u030c" },
-
482 { "Zcirc", L"\u005a\u0302" },
-
483 { "Zcy", L"\u0417" },
-
484 { "Zdot", L"\u017b" },
-
485 { "Zdot", L"\u005a\u0307" },
-
486 { "Zeta", L"\u0396" },
-
487 { "Zgr", L"\u0396" },
-
488 { "Zgrave", L"\u005a\u0300" },
-
489 { "Zmacr", L"\u005a\u0304" },
-
490 { "Ztilde", L"\u005a\u0303" },
-
491 { "Zuml", L"\u005a\u0308" },
-
492 { "aacgr", L"\u03ac" },
-
493 { "aacute", L"\u00e1" },
-
494 { "aacute", L"\u0061\u0301" },
-
495 { "abreve", L"\u0103" },
-
496 { "abreve", L"\u0061\u0306" },
-
497 { "abring", L"\u0061\u032f" },
-
498 { "acaron", L"\u0061\u030c" },
-
499 { "acirc", L"\u00e2" },
-
500 { "acirc", L"\u0061\u0302" },
-
501 { "acute", L"\u00b4" },
-
502 { "acy", L"\u0430" },
-
503 { "adot", L"\u0061\u0307" },
-
504 { "aelig", L"\u00e6" },
-
505 { "agr", L"\u03b1" },
-
506 { "agrave", L"\u00e0" },
-
507 { "agrave", L"\u0061\u0300" },
-
508 { "alefsym", L"\u2135" },
-
509 { "aleph", L"\u2135" },
-
510 { "alpha", L"\u03b1" },
-
511 { "amacr", L"\u0101" },
-
512 { "amacr", L"\u0061\u0304" },
-
513 { "amalg", L"\u2210" },
-
514 { "amp", L"\u0026" },
-
515 { "and", L"\u2227" },
-
516 { "ang", L"\u2220" },
-
517 { "ang90", L"\u221f" },
-
518 { "angmsd", L"\u2221" },
-
519 { "angsph", L"\u2222" },
-
520 { "angst", L"\u212b" },
-
521 { "aogon", L"\u0105" },
-
522 { "ap", L"\u2248" },
-
523 { "ape", L"\u224a" },
-
524 { "apos", L"\u0027" },
-
525 { "apos", L"\u02bc" },
-
526 { "aring", L"\u00e5" },
-
527 { "ast", L"\u002a" },
-
528 { "asymp", L"\u2248" },
-
529 { "atilde", L"\u00e3" },
-
530 { "atilde", L"\u0061\u0303" },
-
531 { "auml", L"\u00e4" },
-
532 { "auml", L"\u0061\u0308" },
-
533 { "b.Delta", L"\u0394" },
-
534 { "b.Gamma", L"\u0393" },
-
535 { "b.Lambda", L"\u039b" },
-
536 { "b.Omega", L"\u03a9" },
-
537 { "b.Phi", L"\u03a6" },
-
538 { "b.Pi", L"\u03a0" },
-
539 { "b.Psi", L"\u03a8" },
-
540 { "b.Sigma", L"\u03a3" },
-
541 { "b.Theta", L"\u0398" },
-
542 { "b.Upsi", L"\u03a5" },
-
543 { "b.Xi", L"\u039e" },
-
544 { "b.alpha", L"\u03b1" },
-
545 { "b.beta", L"\u03b2" },
-
546 { "b.chi", L"\u03c7" },
-
547 { "b.delta", L"\u03b4" },
-
548 { "b.epsi", L"\u03b5" },
-
549 { "b.epsis", L"\u03b5" },
-
550 { "b.epsiv", L"\u03b5" },
-
551 { "b.eta", L"\u03b7" },
-
552 { "b.gamma", L"\u03b3" },
-
553 { "b.gammad", L"\u03dc" },
-
554 { "b.iota", L"\u03b9" },
-
555 { "b.kappa", L"\u03ba" },
-
556 { "b.kappav", L"\u03f0" },
-
557 { "b.lambda", L"\u03bb" },
-
558 { "b.mu", L"\u03bc" },
-
559 { "b.nu", L"\u03bd" },
-
560 { "b.omega", L"\u03ce" },
-
561 { "b.phis", L"\u03c6" },
-
562 { "b.phiv", L"\u03d5" },
-
563 { "b.pi", L"\u03c0" },
-
564 { "b.piv", L"\u03d6" },
-
565 { "b.psi", L"\u03c8" },
-
566 { "b.rho", L"\u03c1" },
-
567 { "b.rhov", L"\u03f1" },
-
568 { "b.sigma", L"\u03c3" },
-
569 { "b.sigmav", L"\u03c2" },
-
570 { "b.tau", L"\u03c4" },
-
571 { "b.thetas", L"\u03b8" },
-
572 { "b.thetav", L"\u03d1" },
-
573 { "b.upsi", L"\u03c5" },
-
574 { "b.xi", L"\u03be" },
-
575 { "b.zeta", L"\u03b6" },
-
576 { "bacute", L"\u0062\u0301" },
-
577 { "barwed", L"\u22bc" },
-
578 { "bbreve", L"\u0062\u0306" },
-
579 { "bbring", L"\u0062\u032f" },
-
580 { "bcaron", L"\u0062\u030c" },
-
581 { "bcirc", L"\u0062\u0302" },
-
582 { "bcong", L"\u224c" },
-
583 { "bcy", L"\u0431" },
-
584 { "bdot", L"\u0062\u0307" },
-
585 { "bdquo", L"\u201e" },
-
586 { "becaus", L"\u2235" },
-
587 { "bepsi", L"\u220d" },
-
588 { "bernou", L"\u212c" },
-
589 { "beta", L"\u03b2" },
-
590 { "beth", L"\u2136" },
-
591 { "bgr", L"\u03b2" },
-
592 { "bgrave", L"\u0062\u0300" },
-
593 { "blank", L"\u2423" },
-
594 { "blk12", L"\u2592" },
-
595 { "blk14", L"\u2591" },
-
596 { "blk34", L"\u2593" },
-
597 { "block", L"\u2588" },
-
598 { "bmacr", L"\u0062\u0304" },
-
599 { "bottom", L"\u22a5" },
-
600 { "bowtie", L"\u22c8" },
-
601 { "boxDL", L"\u2557" },
-
602 { "boxDR", L"\u2554" },
-
603 { "boxDl", L"\u2556" },
-
604 { "boxDr", L"\u2553" },
-
605 { "boxH", L"\u2550" },
-
606 { "boxHD", L"\u2566" },
-
607 { "boxHU", L"\u2569" },
-
608 { "boxHd", L"\u2564" },
-
609 { "boxHu", L"\u2567" },
-
610 { "boxUL", L"\u255d" },
-
611 { "boxUR", L"\u255a" },
-
612 { "boxUl", L"\u255c" },
-
613 { "boxUr", L"\u2559" },
-
614 { "boxV", L"\u2551" },
-
615 { "boxVH", L"\u256c" },
-
616 { "boxVL", L"\u2563" },
-
617 { "boxVR", L"\u2560" },
-
618 { "boxVh", L"\u256b" },
-
619 { "boxVl", L"\u2562" },
-
620 { "boxVr", L"\u255f" },
-
621 { "boxdL", L"\u2555" },
-
622 { "boxdR", L"\u2552" },
-
623 { "boxdl", L"\u2510" },
-
624 { "boxdr", L"\u250c" },
-
625 { "boxh", L"\u2500" },
-
626 { "boxhD", L"\u2565" },
-
627 { "boxhU", L"\u2568" },
-
628 { "boxhd", L"\u252c" },
-
629 { "boxhu", L"\u2534" },
-
630 { "boxuL", L"\u255b" },
-
631 { "boxuR", L"\u2558" },
-
632 { "boxul", L"\u2518" },
-
633 { "boxur", L"\u2514" },
-
634 { "boxv", L"\u2502" },
-
635 { "boxvH", L"\u256a" },
-
636 { "boxvL", L"\u2561" },
-
637 { "boxvR", L"\u255e" },
-
638 { "boxvh", L"\u253c" },
-
639 { "boxvl", L"\u2524" },
-
640 { "boxvr", L"\u251c" },
-
641 { "bprime", L"\u2035" },
-
642 { "breve", L"\u02d8" },
-
643 { "brvbar", L"\u00a6" },
-
644 { "bsim", L"\u223d" },
-
645 { "bsime", L"\u22cd" },
-
646 { "bsol", L"\u005c" },
-
647 { "btilde", L"\u0062\u0303" },
-
648 { "bull", L"\u2022" },
-
649 { "buml", L"\u0062\u0308" },
-
650 { "bump", L"\u224e" },
-
651 { "bumpe", L"\u224f" },
-
652 { "cacute", L"\u0107" },
-
653 { "cacute", L"\u0063\u0301" },
-
654 { "cap", L"\u2229" },
-
655 { "caret", L"\u2041" },
-
656 { "caron", L"\u02c7" },
-
657 { "cbreve", L"\u0063\u0306" },
-
658 { "cbring", L"\u0063\u032f" },
-
659 { "ccaron", L"\u010d" },
-
660 { "ccaron", L"\u0063\u030c" },
-
661 { "ccedil", L"\u00e7" },
-
662 { "ccirc", L"\u0109" },
-
663 { "ccirc", L"\u0063\u0302" },
-
664 { "cdot", L"\u010b" },
-
665 { "cdot", L"\u0063\u0307" },
-
666 { "cedil", L"\u00b8" },
-
667 { "cent", L"\u00a2" },
-
668 { "cgrave", L"\u0063\u0300" },
-
669 { "chcy", L"\u0447" },
-
670 { "check", L"\u2713" },
-
671 { "chi", L"\u03c7" },
-
672 { "cir", L"\u25cb" },
-
673 { "circ", L"\u02c6" },
-
674 { "circlef", L"\u25cf" },
-
675 { "circlefb", L"\u25d2" },
-
676 { "circlefl", L"\u25d0" },
-
677 { "circlefr", L"\u25d1" },
-
678 { "circleft", L"\u25d3" },
-
679 { "cire", L"\u2257" },
-
680 { "clubs", L"\u2663" },
-
681 { "cmacr", L"\u0063\u0304" },
-
682 { "colon", L"\u003a" },
-
683 { "colone", L"\u2254" },
-
684 { "comma", L"\u002c" },
-
685 { "commat", L"\u0040" },
-
686 { "comp", L"\u2201" },
-
687 { "compfn", L"\u2218" },
-
688 { "cong", L"\u2245" },
-
689 { "conint", L"\u222e" },
-
690 { "coprod", L"\u2210" },
-
691 { "copy", L"\u00a9" },
-
692 { "copysr", L"\u2117" },
-
693 { "crarr", L"\u21b5" },
-
694 { "cross", L"\u2717" },
-
695 { "ctilde", L"\u0063\u0303" },
-
696 { "cuepr", L"\u22de" },
-
697 { "cuesc", L"\u22df" },
-
698 { "cularr", L"\u21b6" },
-
699 { "cuml", L"\u0063\u0308" },
-
700 { "cup", L"\u222a" },
-
701 { "cupre", L"\u227c" },
-
702 { "curarr", L"\u21b7" },
-
703 { "curren", L"\u00a4" },
-
704 { "cuvee", L"\u22ce" },
-
705 { "cuwed", L"\u22cf" },
-
706 { "dArr", L"\u21d3" },
-
707 { "dacute", L"\u0064\u0301" },
-
708 { "dagger", L"\u2020" },
-
709 { "daleth", L"\u2138" },
-
710 { "darr", L"\u2193" },
-
711 { "darr2", L"\u21ca" },
-
712 { "dash", L"\u2010" },
-
713 { "dashv", L"\u22a3" },
-
714 { "dblac", L"\u02dd" },
-
715 { "dbreve", L"\u0064\u0306" },
-
716 { "dbring", L"\u0064\u032f" },
-
717 { "dcaron", L"\u010f" },
-
718 { "dcaron", L"\u0064\u030c" },
-
719 { "dcirc", L"\u0064\u0302" },
-
720 { "dcy", L"\u0434" },
-
721 { "ddot", L"\u0064\u0307" },
-
722 { "deg", L"\u00b0" },
-
723 { "delta", L"\u03b4" },
-
724 { "dgr", L"\u03b4" },
-
725 { "dgrave", L"\u0064\u0300" },
-
726 { "dharl", L"\u21c3" },
-
727 { "dharr", L"\u21c2" },
-
728 { "diam", L"\u22c4" },
-
729 { "diamondf", L"\u25c6" },
-
730 { "diams", L"\u2666" },
-
731 { "die", L"\u00a8" },
-
732 { "divide", L"\u00f7" },
-
733 { "divonx", L"\u22c7" },
-
734 { "djcy", L"\u0452" },
-
735 { "dlarr", L"\u2199" },
-
736 { "dlcorn", L"\u231e" },
-
737 { "dlcrop", L"\u230d" },
-
738 { "dmacr", L"\u0064\u0304" },
-
739 { "dollar", L"\u0024" },
-
740 { "dot", L"\u02d9" },
-
741 { "drarr", L"\u2198" },
-
742 { "drcorn", L"\u231f" },
-
743 { "drcrop", L"\u230c" },
-
744 { "dscy", L"\u0455" },
-
745 { "dstrok", L"\u0111" },
-
746 { "dtilde", L"\u0064\u0303" },
-
747 { "dtri", L"\u25bf" },
-
748 { "dtrif", L"\u25be" },
-
749 { "duml", L"\u0064\u0308" },
-
750 { "dzcy", L"\u045f" },
-
751 { "eDot", L"\u2251" },
-
752 { "eacgr", L"\u03ad" },
-
753 { "eacute", L"\u00e9" },
-
754 { "eacute", L"\u0065\u0301" },
-
755 { "ebreve", L"\u0065\u0306" },
-
756 { "ebring", L"\u0065\u032f" },
-
757 { "ecaron", L"\u011b" },
-
758 { "ecaron", L"\u0065\u030c" },
-
759 { "ecir", L"\u2256" },
-
760 { "ecirc", L"\u00ea" },
-
761 { "ecirc", L"\u0065\u0302" },
-
762 { "ecolon", L"\u2255" },
-
763 { "ecy", L"\u044d" },
-
764 { "edot", L"\u0117" },
-
765 { "edot", L"\u0065\u0307" },
-
766 { "edotb", L"\u1eb9" },
-
767 { "eeacgr", L"\u03ae" },
-
768 { "eegr", L"\u03b7" },
-
769 { "efDot", L"\u2252" },
-
770 { "egr", L"\u03b5" },
-
771 { "egrave", L"\u00e8" },
-
772 { "egrave", L"\u0065\u0300" },
-
773 { "egs", L"\u22dd" },
-
774 { "ell", L"\u2113" },
-
775 { "els", L"\u22dc" },
-
776 { "emacr", L"\u0113" },
-
777 { "emacr", L"\u0065\u0304" },
-
778 { "empty", L"\u2205" },
-
779 { "emsp", L"\u2003" },
-
780 { "emsp13", L"\u2004" },
-
781 { "emsp14", L"\u2005" },
-
782 { "eng", L"\u014b" },
-
783 { "ensp", L"\u2002" },
-
784 { "eogon", L"\u0119" },
-
785 { "epsi", L"\u03b5" },
-
786 { "epsilon", L"\u03b5" },
-
787 { "epsis", L"\u220a" },
-
788 { "equals", L"\u003d" },
-
789 { "equiv", L"\u2261" },
-
790 { "erDot", L"\u2253" },
-
791 { "esdot", L"\u2250" },
-
792 { "eta", L"\u03b7" },
-
793 { "eth", L"\u00f0" },
-
794 { "etilde", L"\u0065\u0303" },
-
795 { "euml", L"\u00eb" },
-
796 { "euml", L"\u0065\u0308" },
-
797 { "euro", L"\u20ac" },
-
798 { "excl", L"\u0021" },
-
799 { "exist", L"\u2203" },
-
800 { "facute", L"\u0066\u0301" },
-
801 { "fbreve", L"\u0066\u0306" },
-
802 { "fbring", L"\u0066\u032f" },
-
803 { "fcaron", L"\u0066\u030c" },
-
804 { "fcirc", L"\u0066\u0302" },
-
805 { "fcy", L"\u0444" },
-
806 { "fdot", L"\u0066\u0307" },
-
807 { "female", L"\u2640" },
-
808 { "ffilig", L"\ufb03" },
-
809 { "fflig", L"\ufb00" },
-
810 { "ffllig", L"\ufb04" },
-
811 { "fgrave", L"\u0066\u0300" },
-
812 { "filig", L"\ufb01" },
-
813 { "flat", L"\u266d" },
-
814 { "fllig", L"\ufb02" },
-
815 { "fmacr", L"\u0066\u0304" },
-
816 { "fnof", L"\u0192" },
-
817 { "forall", L"\u2200" },
-
818 { "fork", L"\u22d4" },
-
819 { "frac12", L"\u00bd" },
-
820 { "frac13", L"\u2153" },
-
821 { "frac14", L"\u00bc" },
-
822 { "frac15", L"\u2155" },
-
823 { "frac16", L"\u2159" },
-
824 { "frac18", L"\u215b" },
-
825 { "frac23", L"\u2154" },
-
826 { "frac25", L"\u2156" },
-
827 { "frac34", L"\u00be" },
-
828 { "frac35", L"\u2157" },
-
829 { "frac38", L"\u215c" },
-
830 { "frac45", L"\u2158" },
-
831 { "frac56", L"\u215a" },
-
832 { "frac58", L"\u215d" },
-
833 { "frac78", L"\u215e" },
-
834 { "frasl", L"\u2044" },
-
835 { "frown", L"\u2322" },
-
836 { "ftilde", L"\u0066\u0303" },
-
837 { "fuml", L"\u0066\u0308" },
-
838 { "gE", L"\u2267" },
-
839 { "gacute", L"\u01f5" },
-
840 { "gacute", L"\u0067\u0301" },
-
841 { "gamma", L"\u03b3" },
-
842 { "gammad", L"\u03dc" },
-
843 { "gbreve", L"\u011f" },
-
844 { "gbreve", L"\u0067\u0306" },
-
845 { "gbring", L"\u0067\u032f" },
-
846 { "gcaron", L"\u0067\u030c" },
-
847 { "gcedil", L"\u0123" },
-
848 { "gcirc", L"\u011d" },
-
849 { "gcirc", L"\u0067\u0302" },
-
850 { "gcy", L"\u0433" },
-
851 { "gdot", L"\u0121" },
-
852 { "gdot", L"\u0067\u0307" },
-
853 { "ge", L"\u2265" },
-
854 { "gel", L"\u22db" },
-
855 { "ges", L"\u2265" },
-
856 { "ggr", L"\u03b3" },
-
857 { "ggrave", L"\u0067\u0300" },
-
858 { "gimel", L"\u2137" },
-
859 { "gjcy", L"\u0453" },
-
860 { "gl", L"\u2277" },
-
861 { "gmacr", L"\u0067\u0304" },
-
862 { "gnE", L"\u2269" },
-
863 { "gne", L"\u2269" },
-
864 { "gnsim", L"\u22e7" },
-
865 { "grave", L"\u0060" },
-
866 { "gsdot", L"\u22d7" },
-
867 { "gsim", L"\u2273" },
-
868 { "gt", L"\u003e" },
-
869 { "gtilde", L"\u0067\u0303" },
-
870 { "guml", L"\u0067\u0308" },
-
871 { "gvnE", L"\u2269" },
-
872 { "hArr", L"\u21d4" },
-
873 { "hacute", L"\u0068\u0301" },
-
874 { "hairsp", L"\u200a" },
-
875 { "half", L"\u00bd" },
-
876 { "hamilt", L"\u210b" },
-
877 { "hardcy", L"\u044a" },
-
878 { "harr", L"\u2194" },
-
879 { "harrw", L"\u21ad" },
-
880 { "hbreve", L"\u0068\u0306" },
-
881 { "hbring", L"\u0068\u032f" },
-
882 { "hcaron", L"\u0068\u030c" },
-
883 { "hcirc", L"\u0125" },
-
884 { "hcirc", L"\u0068\u0302" },
-
885 { "hdot", L"\u0068\u0307" },
-
886 { "hearts", L"\u2665" },
-
887 { "hellip", L"\u2026" },
-
888 { "hgrave", L"\u0068\u0300" },
-
889 { "hmacr", L"\u0068\u0304" },
-
890 { "horbar", L"\u2015" },
-
891 { "hstrok", L"\u0127" },
-
892 { "htilde", L"\u0068\u0303" },
-
893 { "huml", L"\u0068\u0308" },
-
894 { "hybull", L"\u2043" },
-
895 { "hyphen", L"\u002d" },
-
896 { "iacgr", L"\u03af" },
-
897 { "iacute", L"\u00ed" },
-
898 { "iacute", L"\u0069\u0301" },
-
899 { "ibreve", L"\u0069\u0306" },
-
900 { "ibring", L"\u0069\u032f" },
-
901 { "icaron", L"\u0069\u030c" },
-
902 { "icirc", L"\u00ee" },
-
903 { "icirc", L"\u0069\u0302" },
-
904 { "icy", L"\u0438" },
-
905 { "idiagr", L"\u0390" },
-
906 { "idigr", L"\u03ca" },
-
907 { "idot", L"\u0069\u0307" },
-
908 { "iecy", L"\u0435" },
-
909 { "iexcl", L"\u00a1" },
-
910 { "iff", L"\u21d4" },
-
911 { "igr", L"\u03b9" },
-
912 { "igrave", L"\u00ec" },
-
913 { "igrave", L"\u0069\u0300" },
-
914 { "ijlig", L"\u0133" },
-
915 { "imacr", L"\u012b" },
-
916 { "imacr", L"\u0069\u0304" },
-
917 { "image", L"\u2111" },
-
918 { "incare", L"\u2105" },
-
919 { "infin", L"\u221e" },
-
920 { "inodot", L"\u0131" },
-
921 { "inodot", L"\u0131" },
-
922 { "int", L"\u222b" },
-
923 { "intcal", L"\u22ba" },
-
924 { "iocy", L"\u0451" },
-
925 { "iogon", L"\u012f" },
-
926 { "iota", L"\u03b9" },
-
927 { "iquest", L"\u00bf" },
-
928 { "isin", L"\u2208" },
-
929 { "itilde", L"\u0129" },
-
930 { "itilde", L"\u0069\u0303" },
-
931 { "iukcy", L"\u0456" },
-
932 { "iuml", L"\u00ef" },
-
933 { "iuml", L"\u0069\u0308" },
-
934 { "jacute", L"\u006a\u0301" },
-
935 { "jbreve", L"\u006a\u0306" },
-
936 { "jbring", L"\u006a\u032f" },
-
937 { "jcaron", L"\u006a\u030c" },
-
938 { "jcirc", L"\u0135" },
-
939 { "jcirc", L"\u006a\u0302" },
-
940 { "jcy", L"\u0439" },
-
941 { "jdot", L"\u006a\u0307" },
-
942 { "jgrave", L"\u006a\u0300" },
-
943 { "jmacr", L"\u006a\u0304" },
-
944 { "jsercy", L"\u0458" },
-
945 { "jtilde", L"\u006a\u0303" },
-
946 { "jukcy", L"\u0454" },
-
947 { "juml", L"\u006a\u0308" },
-
948 { "kacute", L"\u006b\u0301" },
-
949 { "kappa", L"\u03ba" },
-
950 { "kappav", L"\u03f0" },
-
951 { "kbreve", L"\u006b\u0306" },
-
952 { "kbring", L"\u006b\u032f" },
-
953 { "kcaron", L"\u006b\u030c" },
-
954 { "kcedil", L"\u0137" },
-
955 { "kcirc", L"\u006b\u0302" },
-
956 { "kcy", L"\u043a" },
-
957 { "kdot", L"\u006b\u0307" },
-
958 { "kgr", L"\u03ba" },
-
959 { "kgrave", L"\u006b\u0300" },
-
960 { "kgreen", L"\u0138" },
-
961 { "khcy", L"\u0445" },
-
962 { "khgr", L"\u03c7" },
-
963 { "kjcy", L"\u045c" },
-
964 { "kmacr", L"\u006b\u0304" },
-
965 { "ktilde", L"\u006b\u0303" },
-
966 { "kuml", L"\u006b\u0308" },
-
967 { "lAarr", L"\u21da" },
-
968 { "lArr", L"\u21d0" },
-
969 { "lE", L"\u2266" },
-
970 { "lacute", L"\u013a" },
-
971 { "lacute", L"\u006c\u0301" },
-
972 { "lagran", L"\u2112" },
-
973 { "lambda", L"\u03bb" },
-
974 { "lang", L"\u2329" },
-
975 { "laquo", L"\u00ab" },
-
976 { "larr", L"\u2190" },
-
977 { "larr2", L"\u21c7" },
-
978 { "larrhk", L"\u21a9" },
-
979 { "larrlp", L"\u21ab" },
-
980 { "larrtl", L"\u21a2" },
-
981 { "lbreve", L"\u006c\u0306" },
-
982 { "lbring", L"\u006c\u032f" },
-
983 { "lcaron", L"\u013e" },
-
984 { "lcaron", L"\u006c\u030c" },
-
985 { "lcedil", L"\u013c" },
-
986 { "lceil", L"\u2308" },
-
987 { "lcirc", L"\u006c\u0302" },
-
988 { "lcub", L"\u007b" },
-
989 { "lcy", L"\u043b" },
-
990 { "ldot", L"\u22d6" },
-
991 { "ldot", L"\u006c\u0307" },
-
992 { "ldquo", L"\u201c" },
-
993 { "ldquor", L"\u201e" },
-
994 { "le", L"\u2264" },
-
995 { "leg", L"\u22da" },
-
996 { "les", L"\u2264" },
-
997 { "lfloor", L"\u230a" },
-
998 { "lg", L"\u2276" },
-
999 { "lgr", L"\u03bb" },
-
1000 { "lgrave", L"\u006c\u0300" },
-
1001 { "lhard", L"\u21bd" },
-
1002 { "lharu", L"\u21bc" },
-
1003 { "lhblk", L"\u2584" },
-
1004 { "ljcy", L"\u0459" },
-
1005 { "lmacr", L"\u006c\u0304" },
-
1006 { "lmidot", L"\u0140" },
-
1007 { "lnE", L"\u2268" },
-
1008 { "lne", L"\u2268" },
-
1009 { "lnsim", L"\u22e6" },
-
1010 { "lowast", L"\u2217" },
-
1011 { "lowbar", L"\u005f" },
-
1012 { "loz", L"\u25ca" },
-
1013 { "loz", L"\u2727" },
-
1014 { "lozf", L"\u2726" },
-
1015 { "lpar", L"\u0028" },
-
1016 { "lrarr2", L"\u21c6" },
-
1017 { "lrhar2", L"\u21cb" },
-
1018 { "lrm", L"\u200e" },
-
1019 { "lsaquo", L"\u2039" },
-
1020 { "lsh", L"\u21b0" },
-
1021 { "lsim", L"\u2272" },
-
1022 { "lsqb", L"\u005b" },
-
1023 { "lsquo", L"\u2018" },
-
1024 { "lsquor", L"\u201a" },
-
1025 { "lstrok", L"\u0142" },
-
1026 { "lt", L"\u003c" },
-
1027 { "lthree", L"\u22cb" },
-
1028 { "ltilde", L"\u006c\u0303" },
-
1029 { "ltimes", L"\u22c9" },
-
1030 { "ltri", L"\u25c3" },
-
1031 { "ltrie", L"\u22b4" },
-
1032 { "ltrif", L"\u25c2" },
-
1033 { "luml", L"\u006c\u0308" },
-
1034 { "lvnE", L"\u2268" },
-
1035 { "macr", L"\u00af" },
-
1036 { "macute", L"\u006d\u0301" },
-
1037 { "male", L"\u2642" },
-
1038 { "malt", L"\u2720" },
-
1039 { "map", L"\u21a6" },
-
1040 { "marker", L"\u25ae" },
-
1041 { "mbreve", L"\u006d\u0306" },
-
1042 { "mbring", L"\u006d\u032f" },
-
1043 { "mcaron", L"\u006d\u030c" },
-
1044 { "mcirc", L"\u006d\u0302" },
-
1045 { "mcy", L"\u043c" },
-
1046 { "mdash", L"\u2014" },
-
1047 { "mdot", L"\u006d\u0307" },
-
1048 { "mgr", L"\u03bc" },
-
1049 { "mgrave", L"\u006d\u0300" },
-
1050 { "micro", L"\u00b5" },
-
1051 { "mid", L"\u2223" },
-
1052 { "middot", L"\u00b7" },
-
1053 { "minus", L"\u2212" },
-
1054 { "minusb", L"\u229f" },
-
1055 { "mldr", L"\u2026" },
-
1056 { "mmacr", L"\u006d\u0304" },
-
1057 { "mnplus", L"\u2213" },
-
1058 { "models", L"\u22a7" },
-
1059 { "mtilde", L"\u006d\u0303" },
-
1060 { "mu", L"\u03bc" },
-
1061 { "mumap", L"\u22b8" },
-
1062 { "muml", L"\u006d\u0308" },
-
1063 { "nVDash", L"\u22af" },
-
1064 { "nVdash", L"\u22ae" },
-
1065 { "nabla", L"\u2207" },
-
1066 { "nacute", L"\u0144" },
-
1067 { "nacute", L"\u006e\u0301" },
-
1068 { "nap", L"\u2249" },
-
1069 { "napos", L"\u0149" },
-
1070 { "natur", L"\u266e" },
-
1071 { "nbreve", L"\u006e\u0306" },
-
1072 { "nbring", L"\u006e\u032f" },
-
1073 { "nbsp", L"\u00a0" },
-
1074 { "ncaron", L"\u0148" },
-
1075 { "ncaron", L"\u006e\u030c" },
-
1076 { "ncedil", L"\u0146" },
-
1077 { "ncirc", L"\u006e\u0302" },
-
1078 { "ncong", L"\u2247" },
-
1079 { "ncy", L"\u043d" },
-
1080 { "ndash", L"\u2013" },
-
1081 { "ndot", L"\u006e\u0307" },
-
1082 { "ne", L"\u2260" },
-
1083 { "nearr", L"\u2197" },
-
1084 { "nequiv", L"\u2262" },
-
1085 { "nexist", L"\u2204" },
-
1086 { "nge", L"\u2271" },
-
1087 { "nges", L"\u2271" },
-
1088 { "ngr", L"\u03bd" },
-
1089 { "ngrave", L"\u006e\u0300" },
-
1090 { "ngt", L"\u226f" },
-
1091 { "nhArr", L"\u21ce" },
-
1092 { "nharr", L"\u21ae" },
-
1093 { "ni", L"\u220b" },
-
1094 { "njcy", L"\u045a" },
-
1095 { "nlArr", L"\u21cd" },
-
1096 { "nlarr", L"\u219a" },
-
1097 { "nldr", L"\u2025" },
-
1098 { "nle", L"\u2270" },
-
1099 { "nles", L"\u2270" },
-
1100 { "nlt", L"\u226e" },
-
1101 { "nltri", L"\u22ea" },
-
1102 { "nltrie", L"\u22ec" },
-
1103 { "nmacr", L"\u006e\u0304" },
-
1104 { "nmid", L"\u2224" },
-
1105 { "not", L"\u00ac" },
-
1106 { "notin", L"\u2209" },
-
1107 { "npar", L"\u2226" },
-
1108 { "npr", L"\u2280" },
-
1109 { "npre", L"\u22e0" },
-
1110 { "nrArr", L"\u21cf" },
-
1111 { "nrarr", L"\u219b" },
-
1112 { "nrtri", L"\u22eb" },
-
1113 { "nrtrie", L"\u22ed" },
-
1114 { "nsc", L"\u2281" },
-
1115 { "nsce", L"\u22e1" },
-
1116 { "nsim", L"\u2241" },
-
1117 { "nsime", L"\u2244" },
-
1118 { "nspar", L"\u2226" },
-
1119 { "nsub", L"\u2284" },
-
1120 { "nsubE", L"\u2288" },
-
1121 { "nsube", L"\u2288" },
-
1122 { "nsup", L"\u2285" },
-
1123 { "nsupE", L"\u2289" },
-
1124 { "nsupe", L"\u2289" },
-
1125 { "ntilde", L"\u00f1" },
-
1126 { "ntilde", L"\u006e\u0303" },
-
1127 { "nu", L"\u03bd" },
-
1128 { "num", L"\u0023" },
-
1129 { "numero", L"\u2116" },
-
1130 { "numl", L"\u006e\u0308" },
-
1131 { "numsp", L"\u2007" },
-
1132 { "nvDash", L"\u22ad" },
-
1133 { "nvdash", L"\u22ac" },
-
1134 { "nwarr", L"\u2196" },
-
1135 { "oS", L"\u24c8" },
-
1136 { "oacgr", L"\u03cc" },
-
1137 { "oacute", L"\u00f3" },
-
1138 { "oacute", L"\u006f\u0301" },
-
1139 { "oast", L"\u229b" },
-
1140 { "obreve", L"\u006f\u0306" },
-
1141 { "obring", L"\u006f\u032f" },
-
1142 { "ocaron", L"\u01d2" },
-
1143 { "ocaron", L"\u006f\u030c" },
-
1144 { "ocir", L"\u229a" },
-
1145 { "ocirc", L"\u00f4" },
-
1146 { "ocirc", L"\u006f\u0302" },
-
1147 { "ocy", L"\u043e" },
-
1148 { "odash", L"\u229d" },
-
1149 { "odblac", L"\u0151" },
-
1150 { "odot", L"\u2299" },
-
1151 { "odot", L"\u006f\u0307" },
-
1152 { "odotb", L"\u1ecd" },
-
1153 { "oelig", L"\u0153" },
-
1154 { "ogon", L"\u02db" },
-
1155 { "ogr", L"\u03bf" },
-
1156 { "ograve", L"\u00f2" },
-
1157 { "ograve", L"\u006f\u0300" },
-
1158 { "ohacgr", L"\u03ce" },
-
1159 { "ohgr", L"\u03c9" },
-
1160 { "ohm", L"\u2126" },
-
1161 { "olarr", L"\u21ba" },
-
1162 { "oline", L"\u203e" },
-
1163 { "omacr", L"\u014d" },
-
1164 { "omacr", L"\u006f\u0304" },
-
1165 { "omega", L"\u03c9" },
-
1166 { "omicron", L"\u03bf" },
-
1167 { "ominus", L"\u2296" },
-
1168 { "oplus", L"\u2295" },
-
1169 { "or", L"\u2228" },
-
1170 { "orarr", L"\u21bb" },
-
1171 { "order", L"\u2134" },
-
1172 { "ordf", L"\u00aa" },
-
1173 { "ordm", L"\u00ba" },
-
1174 { "oslash", L"\u00f8" },
-
1175 { "osol", L"\u2298" },
-
1176 { "otilde", L"\u00f5" },
-
1177 { "otilde", L"\u006f\u0303" },
-
1178 { "otimes", L"\u2297" },
-
1179 { "ouml", L"\u00f6" },
-
1180 { "ouml", L"\u006f\u0308" },
-
1181 { "pacute", L"\u0070\u0301" },
-
1182 { "page", L"\u000c" },
-
1183 { "par", L"\u2225" },
-
1184 { "para", L"\u00b6" },
-
1185 { "part", L"\u2202" },
-
1186 { "pbreve", L"\u0070\u0306" },
-
1187 { "pbring", L"\u0070\u032f" },
-
1188 { "pcaron", L"\u0070\u030c" },
-
1189 { "pcirc", L"\u0070\u0302" },
-
1190 { "pcy", L"\u043f" },
-
1191 { "pdot", L"\u0070\u0307" },
-
1192 { "percnt", L"\u0025" },
-
1193 { "period", L"\u002e" },
-
1194 { "permil", L"\u2030" },
-
1195 { "perp", L"\u22a5" },
-
1196 { "pgr", L"\u03c0" },
-
1197 { "pgrave", L"\u0070\u0300" },
-
1198 { "phgr", L"\u03c6" },
-
1199 { "phi", L"\u03c6" },
-
1200 { "phis", L"\u03c6" },
-
1201 { "phiv", L"\u03d5" },
-
1202 { "phmmat", L"\u2133" },
-
1203 { "phone", L"\u260e" },
-
1204 { "pi", L"\u03c0" },
-
1205 { "piv", L"\u03d6" },
-
1206 { "planck", L"\u210f" },
-
1207 { "plus", L"\u002b" },
-
1208 { "plusb", L"\u229e" },
-
1209 { "plusdo", L"\u2214" },
-
1210 { "plusmn", L"\u00b1" },
-
1211 { "pmacr", L"\u0070\u0304" },
-
1212 { "pound", L"\u00a3" },
-
1213 { "pr", L"\u227a" },
-
1214 { "pre", L"\u227c" },
-
1215 { "prime", L"\u2032" },
-
1216 { "prnsim", L"\u22e8" },
-
1217 { "prod", L"\u220f" },
-
1218 { "prop", L"\u221d" },
-
1219 { "prsim", L"\u227e" },
-
1220 { "psgr", L"\u03c8" },
-
1221 { "psi", L"\u03c8" },
-
1222 { "ptilde", L"\u0070\u0303" },
-
1223 { "puml", L"\u0070\u0308" },
-
1224 { "puncsp", L"\u2008" },
-
1225 { "qacute", L"\u0071\u0301" },
-
1226 { "qbreve", L"\u0071\u0306" },
-
1227 { "qbring", L"\u0071\u032f" },
-
1228 { "qcaron", L"\u0071\u030c" },
-
1229 { "qcirc", L"\u0071\u0302" },
-
1230 { "qdot", L"\u0071\u0307" },
-
1231 { "qgrave", L"\u0071\u0300" },
-
1232 { "qmacr", L"\u0071\u0304" },
-
1233 { "qtilde", L"\u0071\u0303" },
-
1234 { "quest", L"\u003f" },
-
1235 { "quml", L"\u0071\u0308" },
-
1236 { "quot", L"\u0022" },
-
1237 { "rAarr", L"\u21db" },
-
1238 { "rArr", L"\u21d2" },
-
1239 { "racute", L"\u0155" },
-
1240 { "racute", L"\u0072\u0301" },
-
1241 { "radic", L"\u221a" },
-
1242 { "rang", L"\u232a" },
-
1243 { "raquo", L"\u00bb" },
-
1244 { "rarr", L"\u2192" },
-
1245 { "rarr2", L"\u21c9" },
-
1246 { "rarrhk", L"\u21aa" },
-
1247 { "rarrlp", L"\u21ac" },
-
1248 { "rarrtl", L"\u21a3" },
-
1249 { "rarrw", L"\u219d" },
-
1250 { "rbreve", L"\u0072\u0306" },
-
1251 { "rbring", L"\u0072\u032f" },
-
1252 { "rcaron", L"\u0159" },
-
1253 { "rcaron", L"\u0072\u030c" },
-
1254 { "rcedil", L"\u0157" },
-
1255 { "rceil", L"\u2309" },
-
1256 { "rcirc", L"\u0072\u0302" },
-
1257 { "rcub", L"\u007d" },
-
1258 { "rcy", L"\u0440" },
-
1259 { "rdot", L"\u0072\u0307" },
-
1260 { "rdquo", L"\u201d" },
-
1261 { "rdquor", L"\u201c" },
-
1262 { "real", L"\u211c" },
-
1263 { "rect", L"\u25ad" },
-
1264 { "reg", L"\u00ae" },
-
1265 { "rfloor", L"\u230b" },
-
1266 { "rgr", L"\u03c1" },
-
1267 { "rgrave", L"\u0072\u0300" },
-
1268 { "rhard", L"\u21c1" },
-
1269 { "rharu", L"\u21c0" },
-
1270 { "rho", L"\u03c1" },
-
1271 { "rhov", L"\u03f1" },
-
1272 { "ring", L"\u02da" },
-
1273 { "rlarr2", L"\u21c4" },
-
1274 { "rlhar2", L"\u21cc" },
-
1275 { "rlm", L"\u200f" },
-
1276 { "rmacr", L"\u0072\u0304" },
-
1277 { "rpar", L"\u0029" },
-
1278 { "rsaquo", L"\u203a" },
-
1279 { "rsh", L"\u21b1" },
-
1280 { "rsqb", L"\u005d" },
-
1281 { "rsquo", L"\u2019" },
-
1282 { "rsquor", L"\u2018" },
-
1283 { "rthree", L"\u22cc" },
-
1284 { "rtilde", L"\u0072\u0303" },
-
1285 { "rtimes", L"\u22ca" },
-
1286 { "rtri", L"\u25b9" },
-
1287 { "rtrie", L"\u22b5" },
-
1288 { "rtrif", L"\u25b8" },
-
1289 { "ruml", L"\u0072\u0308" },
-
1290 { "rx", L"\u211e" },
-
1291 { "sacute", L"\u015b" },
-
1292 { "sacute", L"\u0073\u0301" },
-
1293 { "samalg", L"\u2210" },
-
1294 { "sbquo", L"\u201a" },
-
1295 { "sbreve", L"\u0073\u0306" },
-
1296 { "sbring", L"\u0073\u032f" },
-
1297 { "sbsol", L"\u005c" },
-
1298 { "sc", L"\u227b" },
-
1299 { "scaron", L"\u0161" },
-
1300 { "scaron", L"\u0073\u030c" },
-
1301 { "sccue", L"\u227d" },
-
1302 { "sce", L"\u227d" },
-
1303 { "scedil", L"\u015f" },
-
1304 { "schwa", L"\u0259" },
-
1305 { "schwaacute", L"\u0259\u0301" },
-
1306 { "schwadgrave", L"\u0259\u030f" },
-
1307 { "schwagrave", L"\u0259\u0300" },
-
1308 { "schwamacr", L"\u0259\u0304" },
-
1309 { "scirc", L"\u015d" },
-
1310 { "scirc", L"\u0073\u0302" },
-
1311 { "scnsim", L"\u22e9" },
-
1312 { "scsim", L"\u227f" },
-
1313 { "scy", L"\u0441" },
-
1314 { "sdot", L"\u22c5" },
-
1315 { "sdot", L"\u0073\u0307" },
-
1316 { "sdotb", L"\u22a1" },
-
1317 { "sect", L"\u00a7" },
-
1318 { "semi", L"\u003b" },
-
1319 { "setmn", L"\u2216" },
-
1320 { "sext", L"\u2736" },
-
1321 { "sfgr", L"\u03c2" },
-
1322 { "sfrown", L"\u2322" },
-
1323 { "sgr", L"\u03c3" },
-
1324 { "sgrave", L"\u0073\u0300" },
-
1325 { "sharp", L"\u266f" },
-
1326 { "shchcy", L"\u0449" },
-
1327 { "shcy", L"\u0448" },
-
1328 { "shy", L"\u00ad" },
-
1329 { "sigma", L"\u03c3" },
-
1330 { "sigmaf", L"\u03c2" },
-
1331 { "sigmav", L"\u03c2" },
-
1332 { "sim", L"\u223c" },
-
1333 { "sime", L"\u2243" },
-
1334 { "smacr", L"\u0073\u0304" },
-
1335 { "smile", L"\u2323" },
-
1336 { "softcy", L"\u044c" },
-
1337 { "sol", L"\u002f" },
-
1338 { "spades", L"\u2660" },
-
1339 { "spar", L"\u2225" },
-
1340 { "sqcap", L"\u2293" },
-
1341 { "sqcup", L"\u2294" },
-
1342 { "sqsub", L"\u228f" },
-
1343 { "sqsube", L"\u2291" },
-
1344 { "sqsup", L"\u2290" },
-
1345 { "sqsupe", L"\u2292" },
-
1346 { "squ", L"\u25a1" },
-
1347 { "square", L"\u25a1" },
-
1348 { "squarf", L"\u25a0" },
-
1349 { "squf", L"\u25aa" },
-
1350 { "ssetmn", L"\u2216" },
-
1351 { "ssmile", L"\u2323" },
-
1352 { "sstarf", L"\u22c6" },
-
1353 { "star", L"\u2606" },
-
1354 { "starf", L"\u2605" },
-
1355 { "stilde", L"\u0073\u0303" },
-
1356 { "sub", L"\u2282" },
-
1357 { "subE", L"\u2286" },
-
1358 { "sube", L"\u2286" },
-
1359 { "subnE", L"\u228a" },
-
1360 { "subne", L"\u228a" },
-
1361 { "sum", L"\u2211" },
-
1362 { "suml", L"\u0073\u0308" },
-
1363 { "sung", L"\u266a" },
-
1364 { "sup", L"\u2283" },
-
1365 { "sup1", L"\u00b9" },
-
1366 { "sup2", L"\u00b2" },
-
1367 { "sup3", L"\u00b3" },
-
1368 { "supE", L"\u2287" },
-
1369 { "supe", L"\u2287" },
-
1370 { "supnE", L"\u228b" },
-
1371 { "supne", L"\u228b" },
-
1372 { "szlig", L"\u00df" },
-
1373 { "tacute", L"\u0074\u0301" },
-
1374 { "target", L"\u2316" },
-
1375 { "tau", L"\u03c4" },
-
1376 { "tbreve", L"\u0074\u0306" },
-
1377 { "tbring", L"\u0074\u032f" },
-
1378 { "tcaron", L"\u0165" },
-
1379 { "tcaron", L"\u0074\u030c" },
-
1380 { "tcedil", L"\u0163" },
-
1381 { "tcirc", L"\u0074\u0302" },
-
1382 { "tcy", L"\u0442" },
-
1383 { "tdot", L"\u20db" },
-
1384 { "tdot", L"\u0074\u0307" },
-
1385 { "telrec", L"\u2315" },
-
1386 { "tgr", L"\u03c4" },
-
1387 { "tgrave", L"\u0074\u0300" },
-
1388 { "there4", L"\u2234" },
-
1389 { "theta", L"\u03b8" },
-
1390 { "thetas", L"\u03b8" },
-
1391 { "thetasym", L"\u03d1" },
-
1392 { "thetav", L"\u03d1" },
-
1393 { "thgr", L"\u03b8" },
-
1394 { "thinsp", L"\u2009" },
-
1395 { "thkap", L"\u2248" },
-
1396 { "thksim", L"\u223c" },
-
1397 { "thorn", L"\u00fe" },
-
1398 { "tilde", L"\u02dc" },
-
1399 { "times", L"\u00d7" },
-
1400 { "timesb", L"\u22a0" },
-
1401 { "tmacr", L"\u0074\u0304" },
-
1402 { "top", L"\u22a4" },
-
1403 { "tprime", L"\u2034" },
-
1404 { "trade", L"\u2122" },
-
1405 { "trie", L"\u225c" },
-
1406 { "tscy", L"\u0446" },
-
1407 { "tshcy", L"\u045b" },
-
1408 { "tstrok", L"\u0167" },
-
1409 { "ttilde", L"\u0074\u0303" },
-
1410 { "tuml", L"\u0074\u0308" },
-
1411 { "twixt", L"\u226c" },
-
1412 { "uArr", L"\u21d1" },
-
1413 { "uacgr", L"\u03cd" },
-
1414 { "uacute", L"\u00fa" },
-
1415 { "uacute", L"\u0075\u0301" },
-
1416 { "uarr", L"\u2191" },
-
1417 { "uarr2", L"\u21c8" },
-
1418 { "ubrcy", L"\u045e" },
-
1419 { "ubreve", L"\u016d" },
-
1420 { "ubreve", L"\u0075\u0306" },
-
1421 { "ubring", L"\u0075\u032f" },
-
1422 { "ucaron", L"\u0075\u030c" },
-
1423 { "ucirc", L"\u00fb" },
-
1424 { "ucirc", L"\u0075\u0302" },
-
1425 { "ucy", L"\u0443" },
-
1426 { "udblac", L"\u0171" },
-
1427 { "udiagr", L"\u03b0" },
-
1428 { "udigr", L"\u03cb" },
-
1429 { "udot", L"\u0075\u0307" },
-
1430 { "ugr", L"\u03c5" },
-
1431 { "ugrave", L"\u00f9" },
-
1432 { "ugrave", L"\u0075\u0300" },
-
1433 { "uharl", L"\u21bf" },
-
1434 { "uharr", L"\u21be" },
-
1435 { "uhblk", L"\u2580" },
-
1436 { "ulcorn", L"\u231c" },
-
1437 { "ulcrop", L"\u230f" },
-
1438 { "umacr", L"\u016b" },
-
1439 { "umacr", L"\u0075\u0304" },
-
1440 { "uml", L"\u00a8" },
-
1441 { "uogon", L"\u0173" },
-
1442 { "uplus", L"\u228e" },
-
1443 { "upsi", L"\u03c5" },
-
1444 { "upsih", L"\u03d2" },
-
1445 { "upsilon", L"\u03c5" },
-
1446 { "urcorn", L"\u231d" },
-
1447 { "urcrop", L"\u230e" },
-
1448 { "uring", L"\u016f" },
-
1449 { "utilde", L"\u0169" },
-
1450 { "utilde", L"\u0075\u0303" },
-
1451 { "utri", L"\u25b5" },
-
1452 { "utrif", L"\u25b4" },
-
1453 { "uuml", L"\u00fc" },
-
1454 { "uuml", L"\u0075\u0308" },
-
1455 { "vArr", L"\u21d5" },
-
1456 { "vDash", L"\u22a8" },
-
1457 { "vacute", L"\u0076\u0301" },
-
1458 { "varr", L"\u2195" },
-
1459 { "vbreve", L"\u0076\u0306" },
-
1460 { "vbring", L"\u0076\u032f" },
-
1461 { "vcaron", L"\u0076\u030c" },
-
1462 { "vcirc", L"\u0076\u0302" },
-
1463 { "vcy", L"\u0432" },
-
1464 { "vdash", L"\u22a2" },
-
1465 { "vdot", L"\u0076\u0307" },
-
1466 { "veebar", L"\u22bb" },
-
1467 { "vellip", L"\u22ee" },
-
1468 { "verbar", L"\u007c" },
-
1469 { "vgrave", L"\u0076\u0300" },
-
1470 { "vltri", L"\u22b2" },
-
1471 { "vmacr", L"\u0076\u0304" },
-
1472 { "vprime", L"\u2032" },
-
1473 { "vprop", L"\u221d" },
-
1474 { "vrtri", L"\u22b3" },
-
1475 { "vsubnE", L"\u228a" },
-
1476 { "vsubne", L"\u228a" },
-
1477 { "vsupnE", L"\u228b" },
-
1478 { "vsupne", L"\u228b" },
-
1479 { "vtab", L"\u000b" },
-
1480 { "vtilde", L"\u0076\u0303" },
-
1481 { "vuml", L"\u0076\u0308" },
-
1482 { "wacute", L"\u0077\u0301" },
-
1483 { "wbreve", L"\u0077\u0306" },
-
1484 { "wbring", L"\u0077\u032f" },
-
1485 { "wcaron", L"\u0077\u030c" },
-
1486 { "wcirc", L"\u0175" },
-
1487 { "wcirc", L"\u0077\u0302" },
-
1488 { "wdot", L"\u0077\u0307" },
-
1489 { "wedgeq", L"\u2259" },
-
1490 { "weierp", L"\u2118" },
-
1491 { "wgrave", L"\u0077\u0300" },
-
1492 { "wmacr", L"\u0077\u0304" },
-
1493 { "wreath", L"\u2240" },
-
1494 { "wtilde", L"\u0077\u0303" },
-
1495 { "wuml", L"\u0077\u0308" },
-
1496 { "xacute", L"\u0078\u0301" },
-
1497 { "xbreve", L"\u0078\u0306" },
-
1498 { "xbring", L"\u0078\u032f" },
-
1499 { "xcaron", L"\u0078\u030c" },
-
1500 { "xcirc", L"\u25cb" },
-
1501 { "xcirc", L"\u0078\u0302" },
-
1502 { "xdot", L"\u0078\u0307" },
-
1503 { "xdtri", L"\u25bd" },
-
1504 { "xgr", L"\u03be" },
-
1505 { "xgrave", L"\u0078\u0300" },
-
1506 { "xhArr", L"\u2194" },
-
1507 { "xharr", L"\u2194" },
-
1508 { "xi", L"\u03be" },
-
1509 { "xlArr", L"\u21d0" },
-
1510 { "xmacr", L"\u0078\u0304" },
-
1511 { "xrArr", L"\u21d2" },
-
1512 { "xtilde", L"\u0078\u0303" },
-
1513 { "xuml", L"\u0078\u0308" },
-
1514 { "xutri", L"\u25b3" },
-
1515 { "yacute", L"\u00fd" },
-
1516 { "yacute", L"\u0079\u0301" },
-
1517 { "yacy", L"\u044f" },
-
1518 { "ybreve", L"\u0079\u0306" },
-
1519 { "ybring", L"\u0079\u032f" },
-
1520 { "ycaron", L"\u0079\u030c" },
-
1521 { "ycirc", L"\u0177" },
-
1522 { "ycirc", L"\u0079\u0302" },
-
1523 { "ycy", L"\u044b" },
-
1524 { "ydot", L"\u0079\u0307" },
-
1525 { "yen", L"\u00a5" },
-
1526 { "ygrave", L"\u0079\u0300" },
-
1527 { "yicy", L"\u0457" },
-
1528 { "ymacr", L"\u0079\u0304" },
-
1529 { "ytilde", L"\u0079\u0303" },
-
1530 { "yucy", L"\u044e" },
-
1531 { "yuml", L"\u00ff" },
-
1532 { "yuml", L"\u0079\u0308" },
-
1533 { "zacute", L"\u017a" },
-
1534 { "zacute", L"\u007a\u0301" },
-
1535 { "zbreve", L"\u007a\u0306" },
-
1536 { "zbring", L"\u007a\u032f" },
-
1537 { "zcaron", L"\u017e" },
-
1538 { "zcaron", L"\u007a\u030c" },
-
1539 { "zcirc", L"\u007a\u0302" },
-
1540 { "zcy", L"\u0437" },
-
1541 { "zdot", L"\u017c" },
-
1542 { "zdot", L"\u007a\u0307" },
-
1543 { "zeta", L"\u03b6" },
-
1544 { "zgr", L"\u03b6" },
-
1545 { "zgrave", L"\u007a\u0300" },
-
1546 { "zhcy", L"\u0436" },
-
1547 { "zmacr", L"\u007a\u0304" },
-
1548 { "ztilde", L"\u007a\u0303" },
-
1549 { "zuml", L"\u007a\u0308" },
-
1550 { "zwj", L"\u200d" },
-
1551 { "zwnj", L"\u200c" },
-
1552 };
-
1553
-
1554 inline const size_t unicode_sgml[] = {
-
1555 0x5b6,
-
1556 0x48d,
-
1557 0x30d,
-
1558 0x4c3,
-
1559 0x457,
-
1560 0x2d2,
-
1561 0x497,
-
1562 0x1f1,
-
1563 0x1fb,
-
1564 0x3e6,
-
1565 0x4ec,
-
1566 0x1fe,
-
1567 0x4a6,
-
1568 0x29b,
-
1569 0x36e,
-
1570 0x498,
-
1571 0x528,
-
1572 0x299,
-
1573 0x515,
-
1574 0x3f1,
-
1575 0x303,
-
1576 0x353,
-
1577 0x4c1,
-
1578 0x29c,
-
1579 0xe,
-
1580 0x3,
-
1581 0x9,
-
1582 0x15,
-
1583 0x11,
-
1584 0x5,
-
1585 0xb,
-
1586 0x17,
-
1587 0x7,
-
1588 0x6,
-
1589 0x22,
-
1590 0x18,
-
1591 0x1d,
-
1592 0x24,
-
1593 0x23,
-
1594 0x1a,
-
1595 0x1f,
-
1596 0x25,
-
1597 0x1c,
-
1598 0x1b,
-
1599 0x33,
-
1600 0x28,
-
1601 0x30,
-
1602 0x36,
-
1603 0x35,
-
1604 0x2a,
-
1605 0x32,
-
1606 0x37,
-
1607 0x2d,
-
1608 0x2b,
-
1609 0x47,
-
1610 0x3c,
-
1611 0x42,
-
1612 0x4c,
-
1613 0x48,
-
1614 0x3e,
-
1615 0x44,
-
1616 0x4d,
-
1617 0x41,
-
1618 0x3f,
-
1619 0x61,
-
1620 0x54,
-
1621 0x5a,
-
1622 0x67,
-
1623 0x63,
-
1624 0x55,
-
1625 0x5d,
-
1626 0x69,
-
1627 0x58,
-
1628 0x56,
-
1629 0x71,
-
1630 0x6a,
-
1631 0x6e,
-
1632 0x73,
-
1633 0x72,
-
1634 0x6b,
-
1635 0x70,
-
1636 0x74,
-
1637 0x6d,
-
1638 0x6c,
-
1639 0x84,
-
1640 0x76,
-
1641 0x7e,
-
1642 0x87,
-
1643 0x85,
-
1644 0x79,
-
1645 0x81,
-
1646 0x88,
-
1647 0x7b,
-
1648 0x7a,
-
1649 0x91,
-
1650 0x8a,
-
1651 0x8f,
-
1652 0x94,
-
1653 0x92,
-
1654 0x8b,
-
1655 0x90,
-
1656 0x95,
-
1657 0x8d,
-
1658 0x8c,
-
1659 0xa7,
-
1660 0x9b,
-
1661 0xa0,
-
1662 0xad,
-
1663 0xa9,
-
1664 0x9c,
-
1665 0xa4,
-
1666 0xb0,
-
1667 0x9e,
-
1668 0x9d,
-
1669 0xb9,
-
1670 0xb1,
-
1671 0xb6,
-
1672 0xbc,
-
1673 0xba,
-
1674 0xb2,
-
1675 0xb8,
-
1676 0xbe,
-
1677 0xb4,
-
1678 0xb3,
-
1679 0xcc,
-
1680 0xc2,
-
1681 0xc8,
-
1682 0xce,
-
1683 0xcd,
-
1684 0xc4,
-
1685 0xca,
-
1686 0xcf,
-
1687 0xc6,
-
1688 0xc5,
-
1689 0xde,
-
1690 0xd2,
-
1691 0xda,
-
1692 0xe4,
-
1693 0xe0,
-
1694 0xd5,
-
1695 0xdc,
-
1696 0xe5,
-
1697 0xd8,
-
1698 0xd6,
-
1699 0xee,
-
1700 0xe6,
-
1701 0xea,
-
1702 0xf0,
-
1703 0xef,
-
1704 0xe7,
-
1705 0xec,
-
1706 0xf2,
-
1707 0xe9,
-
1708 0xe8,
-
1709 0xff,
-
1710 0xf5,
-
1711 0xfb,
-
1712 0x102,
-
1713 0x100,
-
1714 0xf6,
-
1715 0xfd,
-
1716 0x104,
-
1717 0xf9,
-
1718 0xf7,
-
1719 0x117,
-
1720 0x10a,
-
1721 0x110,
-
1722 0x11e,
-
1723 0x119,
-
1724 0x10b,
-
1725 0x113,
-
1726 0x120,
-
1727 0x10e,
-
1728 0x10c,
-
1729 0x12b,
-
1730 0x123,
-
1731 0x127,
-
1732 0x131,
-
1733 0x12e,
-
1734 0x124,
-
1735 0x129,
-
1736 0x132,
-
1737 0x126,
-
1738 0x125,
-
1739 0x139,
-
1740 0x133,
-
1741 0x137,
-
1742 0x13b,
-
1743 0x13a,
-
1744 0x134,
-
1745 0x138,
-
1746 0x13c,
-
1747 0x136,
-
1748 0x135,
-
1749 0x149,
-
1750 0x13e,
-
1751 0x145,
-
1752 0x14c,
-
1753 0x14b,
-
1754 0x140,
-
1755 0x147,
-
1756 0x14d,
-
1757 0x143,
-
1758 0x141,
-
1759 0x15d,
-
1760 0x152,
-
1761 0x159,
-
1762 0x160,
-
1763 0x15f,
-
1764 0x153,
-
1765 0x15b,
-
1766 0x162,
-
1767 0x156,
-
1768 0x154,
-
1769 0x173,
-
1770 0x168,
-
1771 0x16f,
-
1772 0x177,
-
1773 0x175,
-
1774 0x16a,
-
1775 0x171,
-
1776 0x178,
-
1777 0x16d,
-
1778 0x16b,
-
1779 0x189,
-
1780 0x17b,
-
1781 0x182,
-
1782 0x191,
-
1783 0x18b,
-
1784 0x17e,
-
1785 0x186,
-
1786 0x193,
-
1787 0x180,
-
1788 0x17f,
-
1789 0x19d,
-
1790 0x194,
-
1791 0x198,
-
1792 0x19f,
-
1793 0x19e,
-
1794 0x195,
-
1795 0x19b,
-
1796 0x1a0,
-
1797 0x197,
-
1798 0x196,
-
1799 0x1a9,
-
1800 0x1a2,
-
1801 0x1a7,
-
1802 0x1ab,
-
1803 0x1aa,
-
1804 0x1a3,
-
1805 0x1a8,
-
1806 0x1ac,
-
1807 0x1a5,
-
1808 0x1a4,
-
1809 0x1b4,
-
1810 0x1ad,
-
1811 0x1b1,
-
1812 0x1b7,
-
1813 0x1b6,
-
1814 0x1ae,
-
1815 0x1b2,
-
1816 0x1b8,
-
1817 0x1b0,
-
1818 0x1af,
-
1819 0x1c5,
-
1820 0x1bd,
-
1821 0x1c2,
-
1822 0x1c7,
-
1823 0x1c6,
-
1824 0x1be,
-
1825 0x1c4,
-
1826 0x1c9,
-
1827 0x1c0,
-
1828 0x1bf,
-
1829 0x1d7,
-
1830 0x1cc,
-
1831 0x1d1,
-
1832 0x1d9,
-
1833 0x1d8,
-
1834 0x1cd,
-
1835 0x1d4,
-
1836 0x1da,
-
1837 0x1d0,
-
1838 0x1ce,
-
1839 0x3ed,
-
1840 0x275,
-
1841 0x500,
-
1842 0x4ef,
-
1843 0x3e2,
-
1844 0x350,
-
1845 0x1ea,
-
1846 0x1dd,
-
1847 0x1e3,
-
1848 0x201,
-
1849 0x1ef,
-
1850 0x1df,
-
1851 0x1e6,
-
1852 0x203,
-
1853 0x1e1,
-
1854 0x1e0,
-
1855 0x23f,
-
1856 0x22f,
-
1857 0x234,
-
1858 0x276,
-
1859 0x245,
-
1860 0x231,
-
1861 0x237,
-
1862 0x278,
-
1863 0x233,
-
1864 0x232,
-
1865 0x28b,
-
1866 0x27c,
-
1867 0x286,
-
1868 0x2a6,
-
1869 0x298,
-
1870 0x280,
-
1871 0x288,
-
1872 0x2aa,
-
1873 0x283,
-
1874 0x281,
-
1875 0x2c4,
-
1876 0x2b2,
-
1877 0x2be,
-
1878 0x2d9,
-
1879 0x2d1,
-
1880 0x2ba,
-
1881 0x2c0,
-
1882 0x2dc,
-
1883 0x2bd,
-
1884 0x2bb,
-
1885 0x2f3,
-
1886 0x2e1,
-
1887 0x2e8,
-
1888 0x309,
-
1889 0x2f8,
-
1890 0x2e2,
-
1891 0x2ec,
-
1892 0x30b,
-
1893 0x2e5,
-
1894 0x2e3,
-
1895 0x31a,
-
1896 0x30f,
-
1897 0x313,
-
1898 0x333,
-
1899 0x31e,
-
1900 0x310,
-
1901 0x315,
-
1902 0x334,
-
1903 0x312,
-
1904 0x311,
-
1905 0x348,
-
1906 0x337,
-
1907 0x340,
-
1908 0x354,
-
1909 0x34c,
-
1910 0x33b,
-
1911 0x343,
-
1912 0x355,
-
1913 0x33d,
-
1914 0x33c,
-
1915 0x367,
-
1916 0x358,
-
1917 0x363,
-
1918 0x36b,
-
1919 0x368,
-
1920 0x35f,
-
1921 0x364,
-
1922 0x36c,
-
1923 0x361,
-
1924 0x360,
-
1925 0x380,
-
1926 0x371,
-
1927 0x376,
-
1928 0x391,
-
1929 0x383,
-
1930 0x372,
-
1931 0x37a,
-
1932 0x394,
-
1933 0x374,
-
1934 0x373,
-
1935 0x39d,
-
1936 0x395,
-
1937 0x39a,
-
1938 0x3a0,
-
1939 0x39e,
-
1940 0x396,
-
1941 0x39c,
-
1942 0x3a2,
-
1943 0x398,
-
1944 0x397,
-
1945 0x3ae,
-
1946 0x3a3,
-
1947 0x3aa,
-
1948 0x3b4,
-
1949 0x3b3,
-
1950 0x3a6,
-
1951 0x3ac,
-
1952 0x3b5,
-
1953 0x3a8,
-
1954 0x3a7,
-
1955 0x3d7,
-
1956 0x3ba,
-
1957 0x3ca,
-
1958 0x3f3,
-
1959 0x3dc,
-
1960 0x3c4,
-
1961 0x3ce,
-
1962 0x3f8,
-
1963 0x3c7,
-
1964 0x3c5,
-
1965 0x408,
-
1966 0x3fb,
-
1967 0x403,
-
1968 0x412,
-
1969 0x40f,
-
1970 0x400,
-
1971 0x406,
-
1972 0x415,
-
1973 0x402,
-
1974 0x401,
-
1975 0x430,
-
1976 0x41a,
-
1977 0x424,
-
1978 0x455,
-
1979 0x43e,
-
1980 0x41e,
-
1981 0x428,
-
1982 0x459,
-
1983 0x422,
-
1984 0x41f,
-
1985 0x474,
-
1986 0x461,
-
1987 0x469,
-
1988 0x488,
-
1989 0x47b,
-
1990 0x463,
-
1991 0x46e,
-
1992 0x48b,
-
1993 0x466,
-
1994 0x464,
-
1995 0x49c,
-
1996 0x48c,
-
1997 0x494,
-
1998 0x4b5,
-
1999 0x4aa,
-
2000 0x491,
-
2001 0x496,
-
2002 0x4b6,
-
2003 0x493,
-
2004 0x492,
-
2005 0x4be,
-
2006 0x4b8,
-
2007 0x4bc,
-
2008 0x4c0,
-
2009 0x4bf,
-
2010 0x4b9,
-
2011 0x4bd,
-
2012 0x4c2,
-
2013 0x4bb,
-
2014 0x4ba,
-
2015 0x4e2,
-
2016 0x4c7,
-
2017 0x4d7,
-
2018 0x4f3,
-
2019 0x4eb,
-
2020 0x4d1,
-
2021 0x4da,
-
2022 0x4f8,
-
2023 0x4d4,
-
2024 0x4d2,
-
2025 0x51b,
-
2026 0x4fb,
-
2027 0x50d,
-
2028 0x53a,
-
2029 0x525,
-
2030 0x4fe,
-
2031 0x512,
-
2032 0x541,
-
2033 0x503,
-
2034 0x4ff,
-
2035 0x55a,
-
2036 0x54c,
-
2037 0x554,
-
2038 0x570,
-
2039 0x568,
-
2040 0x54f,
-
2041 0x557,
-
2042 0x571,
-
2043 0x552,
-
2044 0x550,
-
2045 0x587,
-
2046 0x576,
-
2047 0x57f,
-
2048 0x599,
-
2049 0x58e,
-
2050 0x57b,
-
2051 0x584,
-
2052 0x59d,
-
2053 0x57d,
-
2054 0x57c,
-
2055 0x5ac,
-
2056 0x5a0,
-
2057 0x5a5,
-
2058 0x5b7,
-
2059 0x5ae,
-
2060 0x5a2,
-
2061 0x5a8,
-
2062 0x5b8,
-
2063 0x5a4,
-
2064 0x5a3,
-
2065 0x5c2,
-
2066 0x5b9,
-
2067 0x5be,
-
2068 0x5c5,
-
2069 0x5c3,
-
2070 0x5ba,
-
2071 0x5bf,
-
2072 0x5c6,
-
2073 0x5bc,
-
2074 0x5bb,
-
2075 0x5d0,
-
2076 0x5c7,
-
2077 0x5cc,
-
2078 0x5d7,
-
2079 0x5d5,
-
2080 0x5c8,
-
2081 0x5cd,
-
2082 0x5d8,
-
2083 0x5ca,
-
2084 0x5c9,
-
2085 0x5e5,
-
2086 0x5db,
-
2087 0x5e1,
-
2088 0x5e8,
-
2089 0x5e7,
-
2090 0x5dd,
-
2091 0x5e3,
-
2092 0x5eb,
-
2093 0x5df,
-
2094 0x5de,
-
2095 0x5f8,
-
2096 0x5ed,
-
2097 0x5f2,
-
2098 0x5fb,
-
2099 0x5fa,
-
2100 0x5ee,
-
2101 0x5f5,
-
2102 0x5fc,
-
2103 0x5f1,
-
2104 0x5ef,
-
2105 0x3cb,
-
2106 0x5ab,
-
2107 0x4d8,
-
2108 0x420,
-
2109 0x37c,
-
2110 0x28a,
-
2111 0x4ab,
-
2112 0x2ae,
-
2113 0x5e4,
-
2114 0x272,
-
2115 0x514,
-
2116 0x49,
-
2117 0x2ca,
-
2118 0x58f,
-
2119 0x2a2,
-
2120 0x483,
-
2121 0x3be,
-
2122 0x440,
-
2123 0x51f,
-
2124 0x4df,
-
2125 0x3fa,
-
2126 0x2c1,
-
2127 0x4a9,
-
2128 0x545,
-
2129 0x546,
-
2130 0x1e4,
-
2131 0x409,
-
2132 0x48f,
-
2133 0x40b,
-
2134 0x289,
-
2135 0x544,
-
2136 0x484,
-
2137 0x4ca,
-
2138 0x324,
-
2139 0x322,
-
2140 0x35a,
-
2141 0x32a,
-
2142 0x38e,
-
2143 0xd,
-
2144 0x2,
-
2145 0x8,
-
2146 0x14,
-
2147 0x16,
-
2148 0x13,
-
2149 0x0,
-
2150 0x2e,
-
2151 0x60,
-
2152 0x53,
-
2153 0x59,
-
2154 0x68,
-
2155 0xa6,
-
2156 0x9a,
-
2157 0x9f,
-
2158 0xaf,
-
2159 0x51,
-
2160 0x101,
-
2161 0x116,
-
2162 0x109,
-
2163 0x10f,
-
2164 0x11d,
-
2165 0x11f,
-
2166 0x566,
-
2167 0x11c,
-
2168 0x188,
-
2169 0x17a,
-
2170 0x181,
-
2171 0x192,
-
2172 0x1bc,
-
2173 0x164,
-
2174 0x54b,
-
2175 0x1e9,
-
2176 0x1dc,
-
2177 0x1e2,
-
2178 0x200,
-
2179 0x202,
-
2180 0x1fd,
-
2181 0x1e7,
-
2182 0x284,
-
2183 0x2f2,
-
2184 0x2e0,
-
2185 0x2e7,
-
2186 0x30a,
-
2187 0x37f,
-
2188 0x370,
-
2189 0x375,
-
2190 0x393,
-
2191 0x308,
-
2192 0x454,
-
2193 0x473,
-
2194 0x460,
-
2195 0x468,
-
2196 0x487,
-
2197 0x48a,
-
2198 0x2cb,
-
2199 0x485,
-
2200 0x586,
-
2201 0x575,
-
2202 0x57e,
-
2203 0x59c,
-
2204 0x5da,
-
2205 0x564,
-
2206 0x5ea,
-
2207 0x10,
-
2208 0x1ee,
-
2209 0x4,
-
2210 0x1de,
-
2211 0x12,
-
2212 0x1f8,
-
2213 0x27,
-
2214 0x27b,
-
2215 0x2f,
-
2216 0x285,
-
2217 0x31,
-
2218 0x287,
-
2219 0x2c,
-
2220 0x282,
-
2221 0x40,
-
2222 0x2bc,
-
2223 0x4b,
-
2224 0x2d8,
-
2225 0x62,
-
2226 0x2f7,
-
2227 0x5c,
-
2228 0x2eb,
-
2229 0x64,
-
2230 0x2ff,
-
2231 0x57,
-
2232 0x2e4,
-
2233 0x7d,
-
2234 0x33f,
-
2235 0x78,
-
2236 0x33a,
-
2237 0x80,
-
2238 0x342,
-
2239 0x7c,
-
2240 0x33e,
-
2241 0x8e,
-
2242 0x362,
-
2243 0x93,
-
2244 0x36a,
-
2245 0xac,
-
2246 0x390,
-
2247 0xa8,
-
2248 0x382,
-
2249 0xaa,
-
2250 0x38c,
-
2251 0xa3,
-
2252 0x387,
-
2253 0x388,
-
2254 0x97,
-
2255 0x381,
-
2256 0xb5,
-
2257 0x399,
-
2258 0xc7,
-
2259 0x3a9,
-
2260 0x3af,
-
2261 0xd1,
-
2262 0x3b9,
-
2263 0xd9,
-
2264 0x3c8,
-
2265 0xd7,
-
2266 0x3c6,
-
2267 0xe1,
-
2268 0x3dd,
-
2269 0xe2,
-
2270 0x3f0,
-
2271 0xf4,
-
2272 0x419,
-
2273 0xfa,
-
2274 0x423,
-
2275 0xf8,
-
2276 0x421,
-
2277 0x41c,
-
2278 0x50,
-
2279 0x2fd,
-
2280 0x118,
-
2281 0x47a,
-
2282 0x112,
-
2283 0x46c,
-
2284 0x105,
-
2285 0x470,
-
2286 0x13d,
-
2287 0x4c6,
-
2288 0x144,
-
2289 0x4d5,
-
2290 0x142,
-
2291 0x4d3,
-
2292 0x151,
-
2293 0x4fa,
-
2294 0x158,
-
2295 0x50c,
-
2296 0x157,
-
2297 0x506,
-
2298 0x155,
-
2299 0x502,
-
2300 0x16e,
-
2301 0x553,
-
2302 0x16c,
-
2303 0x551,
-
2304 0x176,
-
2305 0x56f,
-
2306 0x190,
-
2307 0x598,
-
2308 0x18a,
-
2309 0x58d,
-
2310 0x17d,
-
2311 0x57a,
-
2312 0x18f,
-
2313 0x597,
-
2314 0x184,
-
2315 0x581,
-
2316 0x18c,
-
2317 0x590,
-
2318 0x1a6,
-
2319 0x5bd,
-
2320 0x1c1,
-
2321 0x5e0,
-
2322 0x1c8,
-
2323 0x1cb,
-
2324 0x5ec,
-
2325 0x1d3,
-
2326 0x5f4,
-
2327 0x1cf,
-
2328 0x5f0,
-
2329 0x31f,
-
2330 0x10d,
-
2331 0x465,
-
2332 0x336,
-
2333 0x507,
-
2334 0x50a,
-
2335 0x508,
-
2336 0x50b,
-
2337 0x509,
-
2338 0x1fc,
-
2339 0x290,
-
2340 0x27f,
-
2341 0x271,
-
2342 0x2d3,
-
2343 0x4e7,
-
2344 0x471,
-
2345 0x565,
-
2346 0x2b9,
-
2347 0x1,
-
2348 0x52,
-
2349 0x4e,
-
2350 0x99,
-
2351 0x108,
-
2352 0x179,
-
2353 0x106,
-
2354 0x378,
-
2355 0xc,
-
2356 0xf,
-
2357 0x20,
-
2358 0x21,
-
2359 0x77,
-
2360 0x83,
-
2361 0x205,
-
2362 0x45,
-
2363 0x46,
-
2364 0x204,
-
2365 0x5f,
-
2366 0x65,
-
2367 0x1d5,
-
2368 0x1d6,
-
2369 0x4f,
-
2370 0x66,
-
2371 0x165,
-
2372 0x174,
-
2373 0x20c,
-
2374 0xa5,
-
2375 0xab,
-
2376 0xc3,
-
2377 0xcb,
-
2378 0xd3,
-
2379 0xdd,
-
2380 0x206,
-
2381 0xed,
-
2382 0xf1,
-
2383 0xfe,
-
2384 0x103,
-
2385 0x1b3,
-
2386 0x1b5,
-
2387 0x20e,
-
2388 0x115,
-
2389 0x11b,
-
2390 0x12a,
-
2391 0x12d,
-
2392 0x209,
-
2393 0x148,
-
2394 0x14a,
-
2395 0x15c,
-
2396 0x15e,
-
2397 0x20b,
-
2398 0x169,
-
2399 0x172,
-
2400 0x187,
-
2401 0x18d,
-
2402 0x18e,
-
2403 0x20d,
-
2404 0x121,
-
2405 0x12c,
-
2406 0x208,
-
2407 0x34,
-
2408 0xc0,
-
2409 0x122,
-
2410 0x130,
-
2411 0x20a,
-
2412 0x107,
-
2413 0x11a,
-
2414 0x207,
-
2415 0xa2,
-
2416 0x185,
-
2417 0x1db,
-
2418 0x2df,
-
2419 0x2ee,
-
2420 0x36f,
-
2421 0x582,
-
2422 0x1e8,
-
2423 0x1ed,
-
2424 0x20f,
-
2425 0x210,
-
2426 0x23c,
-
2427 0x23e,
-
2428 0x217,
-
2429 0x338,
-
2430 0x347,
-
2431 0x212,
-
2432 0x2c2,
-
2433 0x2c3,
-
2434 0x213,
-
2435 0x214,
-
2436 0x215,
-
2437 0x2f1,
-
2438 0x300,
-
2439 0x301,
-
2440 0x22e,
-
2441 0x5f6,
-
2442 0x5f7,
-
2443 0x216,
-
2444 0x2ef,
-
2445 0x307,
-
2446 0x22a,
-
2447 0x55c,
-
2448 0x55d,
-
2449 0x560,
-
2450 0x219,
-
2451 0x37e,
-
2452 0x38d,
-
2453 0x21a,
-
2454 0x3a4,
-
2455 0x3ad,
-
2456 0x21c,
-
2457 0x3bc,
-
2458 0x3d6,
-
2459 0x21d,
-
2460 0x407,
-
2461 0x413,
-
2462 0x21e,
-
2463 0x42f,
-
2464 0x456,
-
2465 0x22d,
-
2466 0x5cf,
-
2467 0x5d3,
-
2468 0x472,
-
2469 0x47d,
-
2470 0x222,
-
2471 0x49b,
-
2472 0x4a3,
-
2473 0x225,
-
2474 0x4e1,
-
2475 0x4e5,
-
2476 0x228,
-
2477 0x518,
-
2478 0x521,
-
2479 0x522,
-
2480 0x227,
-
2481 0x51a,
-
2482 0x520,
-
2483 0x229,
-
2484 0x54e,
-
2485 0x559,
-
2486 0x22c,
-
2487 0x585,
-
2488 0x592,
-
2489 0x594,
-
2490 0x220,
-
2491 0x49d,
-
2492 0x49e,
-
2493 0x49f,
-
2494 0x211,
-
2495 0x28e,
-
2496 0x3b1,
-
2497 0x224,
-
2498 0x4b3,
-
2499 0x4b4,
-
2500 0x476,
-
2501 0x47c,
-
2502 0x379,
-
2503 0x583,
-
2504 0x45f,
-
2505 0x574,
-
2506 0x21f,
-
2507 0x475,
-
2508 0x22b,
-
2509 0x55e,
-
2510 0x55f,
-
2511 0x593,
-
2512 0x221,
-
2513 0x4a0,
-
2514 0x223,
-
2515 0x4a4,
-
2516 0x218,
-
2517 0x339,
-
2518 0x21b,
-
2519 0x3a5,
-
2520 0x226,
-
2521 0x4e6,
-
2522 0x98,
-
2523 0x39,
-
2524 0x75,
-
2525 0xbd,
-
2526 0x3a,
-
2527 0xae,
-
2528 0x1ba,
-
2529 0xbb,
-
2530 0xd0,
-
2531 0xf3,
-
2532 0x166,
-
2533 0xc1,
-
2534 0x17c,
-
2535 0x3b,
-
2536 0xa,
-
2537 0x1e,
-
2538 0x199,
-
2539 0x7f,
-
2540 0x43,
-
2541 0x96,
-
2542 0x1ca,
-
2543 0x1d2,
-
2544 0xa1,
-
2545 0xb7,
-
2546 0xc9,
-
2547 0xdb,
-
2548 0xeb,
-
2549 0xfc,
-
2550 0x111,
-
2551 0x128,
-
2552 0x146,
-
2553 0x15a,
-
2554 0x170,
-
2555 0x183,
-
2556 0x6f,
-
2557 0xbf,
-
2558 0x167,
-
2559 0x26,
-
2560 0x14f,
-
2561 0x14e,
-
2562 0x89,
-
2563 0x1c3,
-
2564 0x150,
-
2565 0x5b,
-
2566 0x1bb,
-
2567 0x1b9,
-
2568 0x1e5,
-
2569 0x236,
-
2570 0x5a6,
-
2571 0x341,
-
2572 0x2bf,
-
2573 0x37b,
-
2574 0x5f9,
-
2575 0x5f3,
-
2576 0x377,
-
2577 0x39b,
-
2578 0x3ab,
-
2579 0x3cc,
-
2580 0x404,
-
2581 0x426,
-
2582 0x46a,
-
2583 0x495,
-
2584 0x4d9,
-
2585 0x510,
-
2586 0x555,
-
2587 0x580,
-
2588 0x314,
-
2589 0x3b0,
-
2590 0x56d,
-
2591 0x28c,
-
2592 0x51e,
-
2593 0x51d,
-
2594 0x35c,
-
2595 0x5e2,
-
2596 0x527,
-
2597 0x2ea,
-
2598 0x5e9,
-
2599 0x5dc,
-
2600 0x38b,
-
2601 0x2cd,
-
2602 0x34a,
-
2603 0x3a1,
-
2604 0x2d7,
-
2605 0x392,
-
2606 0x5e6,
-
2607 0x39f,
-
2608 0x3db,
-
2609 0x435,
-
2610 0x56e,
-
2611 0x3b2,
-
2612 0x579,
-
2613 0x2dd,
-
2614 0x5e,
-
2615 0x2ed,
-
2616 0x114,
-
2617 0x46f,
-
2618 0x2fe,
-
2619 0x2fa,
-
2620 0x2fb,
-
2621 0x2fc,
-
2622 0x45a,
-
2623 0x4b7,
-
2624 0x561,
-
2625 0x359,
-
2626 0x5fe,
-
2627 0x5fd,
-
2628 0x3e9,
-
2629 0x4ea,
-
2630 0x2b7,
-
2631 0x427,
-
2632 0x405,
-
2633 0x369,
-
2634 0x19c,
-
2635 0x3ee,
-
2636 0x4f1,
-
2637 0x4f0,
-
2638 0x3ef,
-
2639 0x4fd,
-
2640 0x3cf,
-
2641 0x4dc,
-
2642 0x4db,
-
2643 0x238,
-
2644 0x3d0,
-
2645 0x2b3,
-
2646 0x3d,
-
2647 0x277,
-
2648 0x438,
-
2649 0x366,
-
2650 0x40e,
-
2651 0x499,
-
2652 0x4ae,
-
2653 0x5af,
-
2654 0x12f,
-
2655 0x56a,
-
2656 0x270,
-
2657 0x3ea,
-
2658 0x4ed,
-
2659 0x479,
-
2660 0x27e,
-
2661 0x36d,
-
2662 0x331,
-
2663 0x30c,
-
2664 0x556,
-
2665 0x4a,
-
2666 0x385,
-
2667 0x35b,
-
2668 0x4a5,
-
2669 0x384,
-
2670 0x3bb,
-
2671 0x2f5,
-
2672 0x458,
-
2673 0x2a3,
-
2674 0x5c1,
-
2675 0x4dd,
-
2676 0x4f9,
-
2677 0x56b,
-
2678 0x477,
-
2679 0x1f7,
-
2680 0x23b,
-
2681 0x4a1,
-
2682 0x482,
-
2683 0x1eb,
-
2684 0x1ec,
-
2685 0x23d,
-
2686 0x349,
-
2687 0x2b4,
-
2688 0x323,
-
2689 0x328,
-
2690 0x325,
-
2691 0x329,
-
2692 0x32b,
-
2693 0x32d,
-
2694 0x326,
-
2695 0x32e,
-
2696 0x327,
-
2697 0x32c,
-
2698 0x32f,
-
2699 0x330,
-
2700 0x3bf,
-
2701 0x577,
-
2702 0x4cb,
-
2703 0x2b5,
-
2704 0x35d,
-
2705 0x5d1,
-
2706 0x5d2,
-
2707 0x5a1,
-
2708 0x45d,
-
2709 0x42a,
-
2710 0x2d4,
-
2711 0x2ce,
-
2712 0x437,
-
2713 0x446,
-
2714 0x4d0,
-
2715 0xd4,
-
2716 0x13f,
-
2717 0x3c3,
-
2718 0x4cf,
-
2719 0x3fe,
-
2720 0x3c1,
-
2721 0x4cd,
-
2722 0x3c2,
-
2723 0x4ce,
-
2724 0x35e,
-
2725 0x433,
-
2726 0x3eb,
-
2727 0x4ee,
-
2728 0x2a4,
-
2729 0x2a9,
-
2730 0x2ad,
-
2731 0x478,
-
2732 0x481,
-
2733 0x3d9,
-
2734 0x3d8,
-
2735 0x589,
-
2736 0x588,
-
2737 0x4e4,
-
2738 0x4e3,
-
2739 0x2c6,
-
2740 0x2c5,
-
2741 0x4e8,
-
2742 0x3e7,
-
2743 0x3c0,
-
2744 0x578,
-
2745 0x4cc,
-
2746 0x2b6,
-
2747 0x3e8,
-
2748 0x4e9,
-
2749 0x436,
-
2750 0x432,
-
2751 0x445,
-
2752 0x3b7,
-
2753 0x5d4,
-
2754 0x573,
-
2755 0x4c5,
-
2756 0x5d6,
-
2757 0x2b1,
-
2758 0x357,
-
2759 0x37d,
-
2760 0x59e,
-
2761 0x3b6,
-
2762 0x4c4,
-
2763 0x320,
-
2764 0x29d,
-
2765 0x490,
-
2766 0x30e,
-
2767 0x42c,
-
2768 0x2f9,
-
2769 0x418,
-
2770 0x38f,
-
2771 0x441,
-
2772 0x302,
-
2773 0x434,
-
2774 0x23a,
-
2775 0x4b0,
-
2776 0x1f0,
-
2777 0x2a1,
-
2778 0x4fc,
-
2779 0x540,
-
2780 0x40c,
-
2781 0x410,
-
2782 0x4a8,
-
2783 0x516,
-
2784 0x535,
-
2785 0x3e1,
-
2786 0x29e,
-
2787 0x4c8,
-
2788 0x4b1,
-
2789 0x5b0,
-
2790 0x386,
-
2791 0x1f4,
-
2792 0x1f3,
-
2793 0x1f5,
-
2794 0x1f6,
-
2795 0x40a,
-
2796 0x43f,
-
2797 0x48e,
-
2798 0x52a,
-
2799 0x442,
-
2800 0x44d,
-
2801 0x1f2,
-
2802 0x480,
-
2803 0x27d,
-
2804 0x2ab,
-
2805 0x389,
-
2806 0x2a0,
-
2807 0x55b,
-
2808 0x239,
-
2809 0x523,
-
2810 0x563,
-
2811 0x273,
-
2812 0x5c4,
-
2813 0x44b,
-
2814 0x524,
-
2815 0x44c,
-
2816 0x29f,
-
2817 0x425,
-
2818 0x1f9,
-
2819 0x1ff,
-
2820 0x562,
-
2821 0x41b,
-
2822 0x1fa,
-
2823 0x235,
-
2824 0x279,
-
2825 0x27a,
-
2826 0x306,
-
2827 0x2de,
-
2828 0x2f0,
-
2829 0x305,
-
2830 0x29a,
-
2831 0x2e9,
-
2832 0x2e6,
-
2833 0x296,
-
2834 0x5c0,
-
2835 0x56c,
-
2836 0x429,
-
2837 0x304,
-
2838 0x42b,
-
2839 0x3d1,
-
2840 0x3d3,
-
2841 0x344,
-
2842 0x346,
-
2843 0x3b8,
-
2844 0x335,
-
2845 0x3de,
-
2846 0x3df,
-
2847 0x3f9,
-
2848 0x34d,
-
2849 0x34e,
-
2850 0x356,
-
2851 0xe3,
-
2852 0x86,
-
2853 0x572,
-
2854 0x43b,
-
2855 0x431,
-
2856 0x439,
-
2857 0x43a,
-
2858 0x42d,
-
2859 0x42e,
-
2860 0x3ec,
-
2861 0x352,
-
2862 0x3d5,
-
2863 0x34b,
-
2864 0x4ac,
-
2865 0x501,
-
2866 0x2ac,
-
2867 0x4ad,
-
2868 0x504,
-
2869 0x505,
-
2870 0x4b2,
-
2871 0x50f,
-
2872 0x443,
-
2873 0x449,
-
2874 0x53b,
-
2875 0x543,
-
2876 0x44e,
-
2877 0x451,
-
2878 0x53c,
-
2879 0x53d,
-
2880 0x547,
-
2881 0x548,
-
2882 0x44f,
-
2883 0x450,
-
2884 0x452,
-
2885 0x453,
-
2886 0x53e,
-
2887 0x53f,
-
2888 0x5b2,
-
2889 0x5b3,
-
2890 0x549,
-
2891 0x54a,
-
2892 0x5b4,
-
2893 0x5b5,
-
2894 0x591,
-
2895 0x52d,
-
2896 0x52f,
-
2897 0x52e,
-
2898 0x530,
-
2899 0x52b,
-
2900 0x52c,
-
2901 0x47f,
-
2902 0x47e,
-
2903 0x489,
-
2904 0x486,
-
2905 0x46d,
-
2906 0x467,
-
2907 0x462,
-
2908 0x46b,
-
2909 0x4a7,
-
2910 0x40d,
-
2911 0x567,
-
2912 0x513,
-
2913 0x5a7,
-
2914 0x2b8,
-
2915 0x569,
-
2916 0x246,
-
2917 0x49a,
-
2918 0x411,
-
2919 0x59f,
-
2920 0x19a,
-
2921 0x1a1,
-
2922 0x45c,
-
2923 0x45b,
-
2924 0x417,
-
2925 0x416,
-
2926 0x5ad,
-
2927 0x5b1,
-
2928 0x3f6,
-
2929 0x4f6,
-
2930 0x414,
-
2931 0x38a,
-
2932 0x5a9,
-
2933 0x230,
-
2934 0x2c7,
-
2935 0x511,
-
2936 0x537,
-
2937 0x2cc,
-
2938 0x247,
-
2939 0x3f4,
-
2940 0x4f4,
-
2941 0x3f2,
-
2942 0x4f2,
-
2943 0x274,
-
2944 0x2af,
-
2945 0x2b0,
-
2946 0x161,
-
2947 0x163,
-
2948 0x29,
-
2949 0x38,
-
2950 0x321,
-
2951 0x3cd,
-
2952 0x351,
-
2953 0xdf,
-
2954 0x82,
-
2955 0x3d2,
-
2956 0x345,
-
2957 0x2f6,
-
2958 0x2f4,
-
2959 0x2a7,
-
2960 0x2a8,
-
2961 0x444,
-
2962 0x44a,
-
2963 0x3e0,
-
2964 0x34f,
-
2965 0x4af,
-
2966 0x50e,
-
2967 0x43c,
-
2968 0x447,
-
2969 0x43d,
-
2970 0x448,
-
2971 0x5aa,
-
2972 0x19,
-
2973 0x3c9,
-
2974 0x4d6,
-
2975 0x3d4,
-
2976 0x4e0,
-
2977 0x2d6,
-
2978 0x2d0,
-
2979 0x596,
-
2980 0x58c,
-
2981 0x558,
-
2982 0x54d,
-
2983 0x58b,
-
2984 0x595,
-
2985 0x2cf,
-
2986 0x2d5,
-
2987 0x332,
-
2988 0x519,
-
2989 0x526,
-
2990 0x536,
-
2991 0x3bd,
-
2992 0x4c9,
-
2993 0x240,
-
2994 0x45e,
-
2995 0x260,
-
2996 0x269,
-
2997 0x25f,
-
2998 0x25e,
-
2999 0x268,
-
3000 0x267,
-
3001 0x26f,
-
3002 0x26e,
-
3003 0x263,
-
3004 0x264,
-
3005 0x26d,
-
3006 0x24c,
-
3007 0x255,
-
3008 0x25d,
-
3009 0x24b,
-
3010 0x249,
-
3011 0x25c,
-
3012 0x24a,
-
3013 0x248,
-
3014 0x266,
-
3015 0x254,
-
3016 0x252,
-
3017 0x265,
-
3018 0x253,
-
3019 0x251,
-
3020 0x26c,
-
3021 0x25b,
-
3022 0x258,
-
3023 0x26b,
-
3024 0x25a,
-
3025 0x257,
-
3026 0x24f,
-
3027 0x261,
-
3028 0x24d,
-
3029 0x250,
-
3030 0x262,
-
3031 0x24e,
-
3032 0x26a,
-
3033 0x259,
-
3034 0x256,
-
3035 0x58a,
-
3036 0x3da,
-
3037 0x244,
-
3038 0x242,
-
3039 0x241,
-
3040 0x243,
-
3041 0x533,
-
3042 0x531,
-
3043 0x532,
-
3044 0x534,
-
3045 0x4de,
-
3046 0x3ff,
-
3047 0x5d9,
-
3048 0x59b,
-
3049 0x59a,
-
3050 0x4f7,
-
3051 0x4f5,
-
3052 0x5ce,
-
3053 0x2db,
-
3054 0x2da,
-
3055 0x3f7,
-
3056 0x3f5,
-
3057 0x2c8,
-
3058 0x3e3,
-
3059 0x28f,
-
3060 0x5cb,
-
3061 0x291,
-
3062 0x293,
-
3063 0x294,
-
3064 0x292,
-
3065 0x295,
-
3066 0x539,
-
3067 0x538,
-
3068 0x4a2,
-
3069 0x316,
-
3070 0x3fc,
-
3071 0x529,
-
3072 0x297,
-
3073 0x365,
-
3074 0x2c9,
-
3075 0x542,
-
3076 0x31c,
-
3077 0x41d,
-
3078 0x51c,
-
3079 0x28d,
-
3080 0x2a5,
-
3081 0x3fd,
-
3082 0x3e5,
-
3083 0x3e4,
-
3084 0x517,
-
3085 0x318,
-
3086 0x31b,
-
3087 0x31d,
-
3088 0x317,
-
3089 0x319,
-
3090 };
-
3092}
+
8#include "string.hpp"
+
9
+
10namespace stdex
+
11{
+
13 struct sgml_unicode_pair {
+
14 char sgml[12];
+
15 utf32_t unicode[3];
+
16 };
+
17
+
18 inline const sgml_unicode_pair sgml_unicode[] = {
+
19 { "AElig", U"\u00c6" },
+
20 { "Aacgr", U"\u0386" },
+
21 { "Aacute", U"\u00c1" },
+
22 { "Aacute", U"\u0041\u0301" },
+
23 { "Abreve", U"\u0102" },
+
24 { "Abreve", U"\u0041\u0306" },
+
25 { "Abring", U"\u0041\u032f" },
+
26 { "Acaron", U"\u0041\u030c" },
+
27 { "Acirc", U"\u00c2" },
+
28 { "Acirc", U"\u0041\u0302" },
+
29 { "Acy", U"\u0410" },
+
30 { "Adot", U"\u0041\u0307" },
+
31 { "Agr", U"\u0391" },
+
32 { "Agrave", U"\u00c0" },
+
33 { "Agrave", U"\u0041\u0300" },
+
34 { "Alpha", U"\u0391" },
+
35 { "Amacr", U"\u0100" },
+
36 { "Amacr", U"\u0041\u0304" },
+
37 { "Aogon", U"\u0104" },
+
38 { "Aring", U"\u00c5" },
+
39 { "Atilde", U"\u00c3" },
+
40 { "Atilde", U"\u0041\u0303" },
+
41 { "Auml", U"\u00c4" },
+
42 { "Auml", U"\u0041\u0308" },
+
43 { "Bacute", U"\u0042\u0301" },
+
44 { "Barwed", U"\u2306" },
+
45 { "Bbreve", U"\u0042\u0306" },
+
46 { "Bbring", U"\u0042\u032f" },
+
47 { "Bcaron", U"\u0042\u030c" },
+
48 { "Bcirc", U"\u0042\u0302" },
+
49 { "Bcy", U"\u0411" },
+
50 { "Bdot", U"\u0042\u0307" },
+
51 { "Beta", U"\u0392" },
+
52 { "Bgr", U"\u0392" },
+
53 { "Bgrave", U"\u0042\u0300" },
+
54 { "Bmacr", U"\u0042\u0304" },
+
55 { "Btilde", U"\u0042\u0303" },
+
56 { "Buml", U"\u0042\u0308" },
+
57 { "CHcy", U"\u0427" },
+
58 { "Cacute", U"\u0106" },
+
59 { "Cacute", U"\u0043\u0301" },
+
60 { "Cap", U"\u22d2" },
+
61 { "Cbreve", U"\u0043\u0306" },
+
62 { "Cbring", U"\u0043\u032f" },
+
63 { "Ccaron", U"\u010c" },
+
64 { "Ccaron", U"\u0043\u030c" },
+
65 { "Ccedil", U"\u00c7" },
+
66 { "Ccirc", U"\u0108" },
+
67 { "Ccirc", U"\u0043\u0302" },
+
68 { "Cdot", U"\u010a" },
+
69 { "Cdot", U"\u0043\u0307" },
+
70 { "Cgrave", U"\u0043\u0300" },
+
71 { "Chi", U"\u03a7" },
+
72 { "Cmacr", U"\u0043\u0304" },
+
73 { "Ctilde", U"\u0043\u0303" },
+
74 { "Cuml", U"\u0043\u0308" },
+
75 { "Cup", U"\u22d3" },
+
76 { "DJcy", U"\u0402" },
+
77 { "DScy", U"\u0405" },
+
78 { "DZcy", U"\u040f" },
+
79 { "Dacute", U"\u0044\u0301" },
+
80 { "Dagger", U"\u2021" },
+
81 { "Dbreve", U"\u0044\u0306" },
+
82 { "Dbring", U"\u0044\u032f" },
+
83 { "Dcaron", U"\u010e" },
+
84 { "Dcaron", U"\u0044\u030c" },
+
85 { "Dcirc", U"\u0044\u0302" },
+
86 { "Dcy", U"\u0414" },
+
87 { "Ddot", U"\u0044\u0307" },
+
88 { "Delta", U"\u0394" },
+
89 { "Dgr", U"\u0394" },
+
90 { "Dgrave", U"\u0044\u0300" },
+
91 { "Dmacr", U"\u0044\u0304" },
+
92 { "Dot", U"\u00a8" },
+
93 { "DotDot", U"\u20dc" },
+
94 { "Dstrok", U"\u0110" },
+
95 { "Dtilde", U"\u0044\u0303" },
+
96 { "Duml", U"\u0044\u0308" },
+
97 { "EEacgr", U"\u0389" },
+
98 { "EEgr", U"\u0397" },
+
99 { "ENG", U"\u014a" },
+
100 { "ETH", U"\u00d0" },
+
101 { "Eacgr", U"\u0388" },
+
102 { "Eacute", U"\u00c9" },
+
103 { "Eacute", U"\u0045\u0301" },
+
104 { "Ebreve", U"\u0045\u0306" },
+
105 { "Ebring", U"\u0045\u032f" },
+
106 { "Ecaron", U"\u011a" },
+
107 { "Ecaron", U"\u0045\u030c" },
+
108 { "Ecirc", U"\u00ca" },
+
109 { "Ecirc", U"\u0045\u0302" },
+
110 { "Ecy", U"\u042d" },
+
111 { "Edot", U"\u0116" },
+
112 { "Edot", U"\u0045\u0307" },
+
113 { "Edotb", U"\u1eb8" },
+
114 { "Egr", U"\u0395" },
+
115 { "Egrave", U"\u00c8" },
+
116 { "Egrave", U"\u0045\u0300" },
+
117 { "Emacr", U"\u0112" },
+
118 { "Emacr", U"\u0045\u0304" },
+
119 { "Eogon", U"\u0118" },
+
120 { "Epsilon", U"\u0395" },
+
121 { "Eta", U"\u0397" },
+
122 { "Etilde", U"\u0045\u0303" },
+
123 { "Euml", U"\u00cb" },
+
124 { "Euml", U"\u0045\u0308" },
+
125 { "Facute", U"\u0046\u0301" },
+
126 { "Fbreve", U"\u0046\u0306" },
+
127 { "Fbring", U"\u0046\u032f" },
+
128 { "Fcaron", U"\u0046\u030c" },
+
129 { "Fcirc", U"\u0046\u0302" },
+
130 { "Fcy", U"\u0424" },
+
131 { "Fdot", U"\u0046\u0307" },
+
132 { "Fgrave", U"\u0046\u0300" },
+
133 { "Fmacr", U"\u0046\u0304" },
+
134 { "Ftilde", U"\u0046\u0303" },
+
135 { "Fuml", U"\u0046\u0308" },
+
136 { "GJcy", U"\u0403" },
+
137 { "Gacute", U"\u0047\u0301" },
+
138 { "Gamma", U"\u0393" },
+
139 { "Gbreve", U"\u011e" },
+
140 { "Gbreve", U"\u0047\u0306" },
+
141 { "Gbring", U"\u0047\u032f" },
+
142 { "Gcaron", U"\u0047\u030c" },
+
143 { "Gcedil", U"\u0122" },
+
144 { "Gcirc", U"\u011c" },
+
145 { "Gcirc", U"\u0047\u0302" },
+
146 { "Gcy", U"\u0413" },
+
147 { "Gdot", U"\u0120" },
+
148 { "Gdot", U"\u0047\u0307" },
+
149 { "Gg", U"\u22d9" },
+
150 { "Ggr", U"\u0393" },
+
151 { "Ggrave", U"\u0047\u0300" },
+
152 { "Gmacr", U"\u0047\u0304" },
+
153 { "Gt", U"\u226b" },
+
154 { "Gtilde", U"\u0047\u0303" },
+
155 { "Guml", U"\u0047\u0308" },
+
156 { "HARDcy", U"\u042a" },
+
157 { "Hacute", U"\u0048\u0301" },
+
158 { "Hbreve", U"\u0048\u0306" },
+
159 { "Hbring", U"\u0048\u032f" },
+
160 { "Hcaron", U"\u0048\u030c" },
+
161 { "Hcirc", U"\u0124" },
+
162 { "Hcirc", U"\u0048\u0302" },
+
163 { "Hdot", U"\u0048\u0307" },
+
164 { "Hgrave", U"\u0048\u0300" },
+
165 { "Hmacr", U"\u0048\u0304" },
+
166 { "Hstrok", U"\u0126" },
+
167 { "Htilde", U"\u0048\u0303" },
+
168 { "Huml", U"\u0048\u0308" },
+
169 { "IEcy", U"\u0415" },
+
170 { "IJlig", U"\u0132" },
+
171 { "IOcy", U"\u0401" },
+
172 { "Iacgr", U"\u038a" },
+
173 { "Iacute", U"\u00cd" },
+
174 { "Iacute", U"\u0049\u0301" },
+
175 { "Ibreve", U"\u0049\u0306" },
+
176 { "Ibring", U"\u0049\u032f" },
+
177 { "Icaron", U"\u0049\u030c" },
+
178 { "Icirc", U"\u00ce" },
+
179 { "Icirc", U"\u0049\u0302" },
+
180 { "Icy", U"\u0418" },
+
181 { "Idigr", U"\u03aa" },
+
182 { "Idot", U"\u0130" },
+
183 { "Idot", U"\u0049\u0307" },
+
184 { "Igr", U"\u0399" },
+
185 { "Igrave", U"\u00cc" },
+
186 { "Igrave", U"\u0049\u0300" },
+
187 { "Imacr", U"\u012a" },
+
188 { "Imacr", U"\u0049\u0304" },
+
189 { "Iogon", U"\u012e" },
+
190 { "Iota", U"\u0399" },
+
191 { "Itilde", U"\u0128" },
+
192 { "Itilde", U"\u0049\u0303" },
+
193 { "Iukcy", U"\u0406" },
+
194 { "Iuml", U"\u00cf" },
+
195 { "Iuml", U"\u0049\u0308" },
+
196 { "Jacute", U"\u004a\u0301" },
+
197 { "Jbreve", U"\u004a\u0306" },
+
198 { "Jbring", U"\u004a\u032f" },
+
199 { "Jcaron", U"\u004a\u030c" },
+
200 { "Jcirc", U"\u0134" },
+
201 { "Jcirc", U"\u004a\u0302" },
+
202 { "Jcy", U"\u0419" },
+
203 { "Jdot", U"\u004a\u0307" },
+
204 { "Jgrave", U"\u004a\u0300" },
+
205 { "Jmacr", U"\u004a\u0304" },
+
206 { "Jsercy", U"\u0408" },
+
207 { "Jtilde", U"\u004a\u0303" },
+
208 { "Jukcy", U"\u0404" },
+
209 { "Juml", U"\u004a\u0308" },
+
210 { "KHcy", U"\u0425" },
+
211 { "KHgr", U"\u03a7" },
+
212 { "KJcy", U"\u040c" },
+
213 { "Kacute", U"\u004b\u0301" },
+
214 { "Kappa", U"\u039a" },
+
215 { "Kbreve", U"\u004b\u0306" },
+
216 { "Kbring", U"\u004b\u032f" },
+
217 { "Kcaron", U"\u004b\u030c" },
+
218 { "Kcedil", U"\u0136" },
+
219 { "Kcirc", U"\u004b\u0302" },
+
220 { "Kcy", U"\u041a" },
+
221 { "Kdot", U"\u004b\u0307" },
+
222 { "Kgr", U"\u039a" },
+
223 { "Kgrave", U"\u004b\u0300" },
+
224 { "Kmacr", U"\u004b\u0304" },
+
225 { "Ktilde", U"\u004b\u0303" },
+
226 { "Kuml", U"\u004b\u0308" },
+
227 { "LJcy", U"\u0409" },
+
228 { "Lacute", U"\u0139" },
+
229 { "Lacute", U"\u004c\u0301" },
+
230 { "Lambda", U"\u039b" },
+
231 { "Larr", U"\u219e" },
+
232 { "Lbreve", U"\u004c\u0306" },
+
233 { "Lbring", U"\u004c\u032f" },
+
234 { "Lcaron", U"\u013d" },
+
235 { "Lcaron", U"\u004c\u030c" },
+
236 { "Lcedil", U"\u013b" },
+
237 { "Lcirc", U"\u004c\u0302" },
+
238 { "Lcy", U"\u041b" },
+
239 { "Ldot", U"\u004c\u0307" },
+
240 { "Lgr", U"\u039b" },
+
241 { "Lgrave", U"\u004c\u0300" },
+
242 { "Ll", U"\u22d8" },
+
243 { "Lmacr", U"\u004c\u0304" },
+
244 { "Lmidot", U"\u013f" },
+
245 { "Lstrok", U"\u0141" },
+
246 { "Lt", U"\u226a" },
+
247 { "Ltilde", U"\u004c\u0303" },
+
248 { "Luml", U"\u004c\u0308" },
+
249 { "Macute", U"\u004d\u0301" },
+
250 { "Mbreve", U"\u004d\u0306" },
+
251 { "Mbring", U"\u004d\u032f" },
+
252 { "Mcaron", U"\u004d\u030c" },
+
253 { "Mcirc", U"\u004d\u0302" },
+
254 { "Mcy", U"\u041c" },
+
255 { "Mdot", U"\u004d\u0307" },
+
256 { "Mgr", U"\u039c" },
+
257 { "Mgrave", U"\u004d\u0300" },
+
258 { "Mmacr", U"\u004d\u0304" },
+
259 { "Mtilde", U"\u004d\u0303" },
+
260 { "Mu", U"\u039c" },
+
261 { "Muml", U"\u004d\u0308" },
+
262 { "NJcy", U"\u040a" },
+
263 { "Nacute", U"\u0143" },
+
264 { "Nacute", U"\u004e\u0301" },
+
265 { "Nbreve", U"\u004e\u0306" },
+
266 { "Nbring", U"\u004e\u032f" },
+
267 { "Ncaron", U"\u0147" },
+
268 { "Ncaron", U"\u004e\u030c" },
+
269 { "Ncedil", U"\u0145" },
+
270 { "Ncirc", U"\u004e\u0302" },
+
271 { "Ncy", U"\u041d" },
+
272 { "Ndot", U"\u004e\u0307" },
+
273 { "Ngr", U"\u039d" },
+
274 { "Ngrave", U"\u004e\u0300" },
+
275 { "Nmacr", U"\u004e\u0304" },
+
276 { "Ntilde", U"\u00d1" },
+
277 { "Ntilde", U"\u004e\u0303" },
+
278 { "Nu", U"\u039d" },
+
279 { "Numl", U"\u004e\u0308" },
+
280 { "OElig", U"\u0152" },
+
281 { "OHacgr", U"\u038f" },
+
282 { "OHgr", U"\u03a9" },
+
283 { "Oacgr", U"\u038c" },
+
284 { "Oacute", U"\u00d3" },
+
285 { "Oacute", U"\u004f\u0301" },
+
286 { "Obreve", U"\u004f\u0306" },
+
287 { "Obring", U"\u004f\u032f" },
+
288 { "Ocaron", U"\u01d1" },
+
289 { "Ocaron", U"\u004f\u030c" },
+
290 { "Ocirc", U"\u00d4" },
+
291 { "Ocirc", U"\u004f\u0302" },
+
292 { "Ocy", U"\u041e" },
+
293 { "Odblac", U"\u0150" },
+
294 { "Odot", U"\u004f\u0307" },
+
295 { "Odotb", U"\u1ecc" },
+
296 { "Ogr", U"\u039f" },
+
297 { "Ograve", U"\u00d2" },
+
298 { "Ograve", U"\u004f\u0300" },
+
299 { "Omacr", U"\u014c" },
+
300 { "Omacr", U"\u004f\u0304" },
+
301 { "Omega", U"\u03a9" },
+
302 { "Omicron", U"\u039f" },
+
303 { "Oslash", U"\u00d8" },
+
304 { "Otilde", U"\u00d5" },
+
305 { "Otilde", U"\u004f\u0303" },
+
306 { "Ouml", U"\u00d6" },
+
307 { "Ouml", U"\u004f\u0308" },
+
308 { "PHgr", U"\u03a6" },
+
309 { "PSgr", U"\u03a8" },
+
310 { "Pacute", U"\u0050\u0301" },
+
311 { "Pbreve", U"\u0050\u0306" },
+
312 { "Pbring", U"\u0050\u032f" },
+
313 { "Pcaron", U"\u0050\u030c" },
+
314 { "Pcirc", U"\u0050\u0302" },
+
315 { "Pcy", U"\u041f" },
+
316 { "Pdot", U"\u0050\u0307" },
+
317 { "Pgr", U"\u03a0" },
+
318 { "Pgrave", U"\u0050\u0300" },
+
319 { "Phi", U"\u03a6" },
+
320 { "Pi", U"\u03a0" },
+
321 { "Pmacr", U"\u0050\u0304" },
+
322 { "Prime", U"\u2033" },
+
323 { "Psi", U"\u03a8" },
+
324 { "Ptilde", U"\u0050\u0303" },
+
325 { "Puml", U"\u0050\u0308" },
+
326 { "Qacute", U"\u0051\u0301" },
+
327 { "Qbreve", U"\u0051\u0306" },
+
328 { "Qbring", U"\u0051\u032f" },
+
329 { "Qcaron", U"\u0051\u030c" },
+
330 { "Qcirc", U"\u0051\u0302" },
+
331 { "Qdot", U"\u0051\u0307" },
+
332 { "Qgrave", U"\u0051\u0300" },
+
333 { "Qmacr", U"\u0051\u0304" },
+
334 { "Qtilde", U"\u0051\u0303" },
+
335 { "Quml", U"\u0051\u0308" },
+
336 { "Racute", U"\u0154" },
+
337 { "Racute", U"\u0052\u0301" },
+
338 { "Rarr", U"\u21a0" },
+
339 { "Rbreve", U"\u0052\u0306" },
+
340 { "Rbring", U"\u0052\u032f" },
+
341 { "Rcaron", U"\u0158" },
+
342 { "Rcaron", U"\u0052\u030c" },
+
343 { "Rcedil", U"\u0156" },
+
344 { "Rcirc", U"\u0052\u0302" },
+
345 { "Rcy", U"\u0420" },
+
346 { "Rdot", U"\u0052\u0307" },
+
347 { "Rgr", U"\u03a1" },
+
348 { "Rgrave", U"\u0052\u0300" },
+
349 { "Rho", U"\u03a1" },
+
350 { "Rmacr", U"\u0052\u0304" },
+
351 { "Rtilde", U"\u0052\u0303" },
+
352 { "Ruml", U"\u0052\u0308" },
+
353 { "SHCHcy", U"\u0429" },
+
354 { "SHcy", U"\u0428" },
+
355 { "SOFTcy", U"\u042c" },
+
356 { "Sacute", U"\u015a" },
+
357 { "Sacute", U"\u0053\u0301" },
+
358 { "Sbreve", U"\u0053\u0306" },
+
359 { "Sbring", U"\u0053\u032f" },
+
360 { "Scaron", U"\u0160" },
+
361 { "Scaron", U"\u0053\u030c" },
+
362 { "Scedil", U"\u015e" },
+
363 { "Scirc", U"\u015c" },
+
364 { "Scirc", U"\u0053\u0302" },
+
365 { "Scy", U"\u0421" },
+
366 { "Sdot", U"\u0053\u0307" },
+
367 { "Sgr", U"\u03a3" },
+
368 { "Sgrave", U"\u0053\u0300" },
+
369 { "Sigma", U"\u03a3" },
+
370 { "Smacr", U"\u0053\u0304" },
+
371 { "Stilde", U"\u0053\u0303" },
+
372 { "Sub", U"\u22d0" },
+
373 { "Suml", U"\u0053\u0308" },
+
374 { "Sup", U"\u22d1" },
+
375 { "THORN", U"\u00de" },
+
376 { "THgr", U"\u0398" },
+
377 { "TSHcy", U"\u040b" },
+
378 { "TScy", U"\u0426" },
+
379 { "Tacute", U"\u0054\u0301" },
+
380 { "Tau", U"\u03a4" },
+
381 { "Tbreve", U"\u0054\u0306" },
+
382 { "Tbring", U"\u0054\u032f" },
+
383 { "Tcaron", U"\u0164" },
+
384 { "Tcaron", U"\u0054\u030c" },
+
385 { "Tcedil", U"\u0162" },
+
386 { "Tcirc", U"\u0054\u0302" },
+
387 { "Tcy", U"\u0422" },
+
388 { "Tdot", U"\u0054\u0307" },
+
389 { "Tgr", U"\u03a4" },
+
390 { "Tgrave", U"\u0054\u0300" },
+
391 { "Theta", U"\u0398" },
+
392 { "Tmacr", U"\u0054\u0304" },
+
393 { "Tstrok", U"\u0166" },
+
394 { "Ttilde", U"\u0054\u0303" },
+
395 { "Tuml", U"\u0054\u0308" },
+
396 { "Uacgr", U"\u038e" },
+
397 { "Uacute", U"\u00da" },
+
398 { "Uacute", U"\u0055\u0301" },
+
399 { "Ubrcy", U"\u040e" },
+
400 { "Ubreve", U"\u016c" },
+
401 { "Ubreve", U"\u0055\u0306" },
+
402 { "Ubring", U"\u0055\u032f" },
+
403 { "Ucaron", U"\u0055\u030c" },
+
404 { "Ucirc", U"\u00db" },
+
405 { "Ucirc", U"\u0055\u0302" },
+
406 { "Ucy", U"\u0423" },
+
407 { "Udblac", U"\u0170" },
+
408 { "Udigr", U"\u03ab" },
+
409 { "Udot", U"\u0055\u0307" },
+
410 { "Ugr", U"\u03a5" },
+
411 { "Ugrave", U"\u00d9" },
+
412 { "Ugrave", U"\u0055\u0300" },
+
413 { "Umacr", U"\u016a" },
+
414 { "Umacr", U"\u0055\u0304" },
+
415 { "Uogon", U"\u0172" },
+
416 { "Upsi", U"\u03a5" },
+
417 { "Upsilon", U"\u03a5" },
+
418 { "Uring", U"\u016e" },
+
419 { "Utilde", U"\u0168" },
+
420 { "Utilde", U"\u0055\u0303" },
+
421 { "Uuml", U"\u00dc" },
+
422 { "Uuml", U"\u0055\u0308" },
+
423 { "Vacute", U"\u0056\u0301" },
+
424 { "Vbreve", U"\u0056\u0306" },
+
425 { "Vbring", U"\u0056\u032f" },
+
426 { "Vcaron", U"\u0056\u030c" },
+
427 { "Vcirc", U"\u0056\u0302" },
+
428 { "Vcy", U"\u0412" },
+
429 { "Vdash", U"\u22a9" },
+
430 { "Vdot", U"\u0056\u0307" },
+
431 { "Verbar", U"\u2016" },
+
432 { "Vgrave", U"\u0056\u0300" },
+
433 { "Vmacr", U"\u0056\u0304" },
+
434 { "Vtilde", U"\u0056\u0303" },
+
435 { "Vuml", U"\u0056\u0308" },
+
436 { "Vvdash", U"\u22aa" },
+
437 { "Wacute", U"\u0057\u0301" },
+
438 { "Wbreve", U"\u0057\u0306" },
+
439 { "Wbring", U"\u0057\u032f" },
+
440 { "Wcaron", U"\u0057\u030c" },
+
441 { "Wcirc", U"\u0174" },
+
442 { "Wcirc", U"\u0057\u0302" },
+
443 { "Wdot", U"\u0057\u0307" },
+
444 { "Wgrave", U"\u0057\u0300" },
+
445 { "Wmacr", U"\u0057\u0304" },
+
446 { "Wtilde", U"\u0057\u0303" },
+
447 { "Wuml", U"\u0057\u0308" },
+
448 { "Xacute", U"\u0058\u0301" },
+
449 { "Xbreve", U"\u0058\u0306" },
+
450 { "Xbring", U"\u0058\u032f" },
+
451 { "Xcaron", U"\u0058\u030c" },
+
452 { "Xcirc", U"\u0058\u0302" },
+
453 { "Xdot", U"\u0058\u0307" },
+
454 { "Xgr", U"\u039e" },
+
455 { "Xgrave", U"\u0058\u0300" },
+
456 { "Xi", U"\u039e" },
+
457 { "Xmacr", U"\u0058\u0304" },
+
458 { "Xtilde", U"\u0058\u0303" },
+
459 { "Xuml", U"\u0058\u0308" },
+
460 { "YAcy", U"\u042f" },
+
461 { "YIcy", U"\u0407" },
+
462 { "YUcy", U"\u042e" },
+
463 { "Yacute", U"\u00dd" },
+
464 { "Yacute", U"\u0059\u0301" },
+
465 { "Ybreve", U"\u0059\u0306" },
+
466 { "Ybring", U"\u0059\u032f" },
+
467 { "Ycaron", U"\u0059\u030c" },
+
468 { "Ycirc", U"\u0176" },
+
469 { "Ycirc", U"\u0059\u0302" },
+
470 { "Ycy", U"\u042b" },
+
471 { "Ydot", U"\u0059\u0307" },
+
472 { "Ygrave", U"\u0059\u0300" },
+
473 { "Ymacr", U"\u0059\u0304" },
+
474 { "Ytilde", U"\u0059\u0303" },
+
475 { "Yuml", U"\u0178" },
+
476 { "Yuml", U"\u0059\u0308" },
+
477 { "ZHcy", U"\u0416" },
+
478 { "Zacute", U"\u0179" },
+
479 { "Zacute", U"\u005a\u0301" },
+
480 { "Zbreve", U"\u005a\u0306" },
+
481 { "Zbring", U"\u005a\u032f" },
+
482 { "Zcaron", U"\u017d" },
+
483 { "Zcaron", U"\u005a\u030c" },
+
484 { "Zcirc", U"\u005a\u0302" },
+
485 { "Zcy", U"\u0417" },
+
486 { "Zdot", U"\u017b" },
+
487 { "Zdot", U"\u005a\u0307" },
+
488 { "Zeta", U"\u0396" },
+
489 { "Zgr", U"\u0396" },
+
490 { "Zgrave", U"\u005a\u0300" },
+
491 { "Zmacr", U"\u005a\u0304" },
+
492 { "Ztilde", U"\u005a\u0303" },
+
493 { "Zuml", U"\u005a\u0308" },
+
494 { "aacgr", U"\u03ac" },
+
495 { "aacute", U"\u00e1" },
+
496 { "aacute", U"\u0061\u0301" },
+
497 { "abreve", U"\u0103" },
+
498 { "abreve", U"\u0061\u0306" },
+
499 { "abring", U"\u0061\u032f" },
+
500 { "acaron", U"\u0061\u030c" },
+
501 { "acirc", U"\u00e2" },
+
502 { "acirc", U"\u0061\u0302" },
+
503 { "acute", U"\u00b4" },
+
504 { "acy", U"\u0430" },
+
505 { "adot", U"\u0061\u0307" },
+
506 { "aelig", U"\u00e6" },
+
507 { "agr", U"\u03b1" },
+
508 { "agrave", U"\u00e0" },
+
509 { "agrave", U"\u0061\u0300" },
+
510 { "alefsym", U"\u2135" },
+
511 { "aleph", U"\u2135" },
+
512 { "alpha", U"\u03b1" },
+
513 { "amacr", U"\u0101" },
+
514 { "amacr", U"\u0061\u0304" },
+
515 { "amalg", U"\u2210" },
+
516 { "amp", U"\u0026" },
+
517 { "and", U"\u2227" },
+
518 { "ang", U"\u2220" },
+
519 { "ang90", U"\u221f" },
+
520 { "angmsd", U"\u2221" },
+
521 { "angsph", U"\u2222" },
+
522 { "angst", U"\u212b" },
+
523 { "aogon", U"\u0105" },
+
524 { "ap", U"\u2248" },
+
525 { "ape", U"\u224a" },
+
526 { "apos", U"\u0027" },
+
527 { "apos", U"\u02bc" },
+
528 { "aring", U"\u00e5" },
+
529 { "ast", U"\u002a" },
+
530 { "asymp", U"\u2248" },
+
531 { "atilde", U"\u00e3" },
+
532 { "atilde", U"\u0061\u0303" },
+
533 { "auml", U"\u00e4" },
+
534 { "auml", U"\u0061\u0308" },
+
535 { "b.Delta", U"\u0394" },
+
536 { "b.Gamma", U"\u0393" },
+
537 { "b.Lambda", U"\u039b" },
+
538 { "b.Omega", U"\u03a9" },
+
539 { "b.Phi", U"\u03a6" },
+
540 { "b.Pi", U"\u03a0" },
+
541 { "b.Psi", U"\u03a8" },
+
542 { "b.Sigma", U"\u03a3" },
+
543 { "b.Theta", U"\u0398" },
+
544 { "b.Upsi", U"\u03a5" },
+
545 { "b.Xi", U"\u039e" },
+
546 { "b.alpha", U"\u03b1" },
+
547 { "b.beta", U"\u03b2" },
+
548 { "b.chi", U"\u03c7" },
+
549 { "b.delta", U"\u03b4" },
+
550 { "b.epsi", U"\u03b5" },
+
551 { "b.epsis", U"\u03b5" },
+
552 { "b.epsiv", U"\u03b5" },
+
553 { "b.eta", U"\u03b7" },
+
554 { "b.gamma", U"\u03b3" },
+
555 { "b.gammad", U"\u03dc" },
+
556 { "b.iota", U"\u03b9" },
+
557 { "b.kappa", U"\u03ba" },
+
558 { "b.kappav", U"\u03f0" },
+
559 { "b.lambda", U"\u03bb" },
+
560 { "b.mu", U"\u03bc" },
+
561 { "b.nu", U"\u03bd" },
+
562 { "b.omega", U"\u03ce" },
+
563 { "b.phis", U"\u03c6" },
+
564 { "b.phiv", U"\u03d5" },
+
565 { "b.pi", U"\u03c0" },
+
566 { "b.piv", U"\u03d6" },
+
567 { "b.psi", U"\u03c8" },
+
568 { "b.rho", U"\u03c1" },
+
569 { "b.rhov", U"\u03f1" },
+
570 { "b.sigma", U"\u03c3" },
+
571 { "b.sigmav", U"\u03c2" },
+
572 { "b.tau", U"\u03c4" },
+
573 { "b.thetas", U"\u03b8" },
+
574 { "b.thetav", U"\u03d1" },
+
575 { "b.upsi", U"\u03c5" },
+
576 { "b.xi", U"\u03be" },
+
577 { "b.zeta", U"\u03b6" },
+
578 { "bacute", U"\u0062\u0301" },
+
579 { "barwed", U"\u22bc" },
+
580 { "bbreve", U"\u0062\u0306" },
+
581 { "bbring", U"\u0062\u032f" },
+
582 { "bcaron", U"\u0062\u030c" },
+
583 { "bcirc", U"\u0062\u0302" },
+
584 { "bcong", U"\u224c" },
+
585 { "bcy", U"\u0431" },
+
586 { "bdot", U"\u0062\u0307" },
+
587 { "bdquo", U"\u201e" },
+
588 { "becaus", U"\u2235" },
+
589 { "bepsi", U"\u220d" },
+
590 { "bernou", U"\u212c" },
+
591 { "beta", U"\u03b2" },
+
592 { "beth", U"\u2136" },
+
593 { "bgr", U"\u03b2" },
+
594 { "bgrave", U"\u0062\u0300" },
+
595 { "blank", U"\u2423" },
+
596 { "blk12", U"\u2592" },
+
597 { "blk14", U"\u2591" },
+
598 { "blk34", U"\u2593" },
+
599 { "block", U"\u2588" },
+
600 { "bmacr", U"\u0062\u0304" },
+
601 { "bottom", U"\u22a5" },
+
602 { "bowtie", U"\u22c8" },
+
603 { "boxDL", U"\u2557" },
+
604 { "boxDR", U"\u2554" },
+
605 { "boxDl", U"\u2556" },
+
606 { "boxDr", U"\u2553" },
+
607 { "boxH", U"\u2550" },
+
608 { "boxHD", U"\u2566" },
+
609 { "boxHU", U"\u2569" },
+
610 { "boxHd", U"\u2564" },
+
611 { "boxHu", U"\u2567" },
+
612 { "boxUL", U"\u255d" },
+
613 { "boxUR", U"\u255a" },
+
614 { "boxUl", U"\u255c" },
+
615 { "boxUr", U"\u2559" },
+
616 { "boxV", U"\u2551" },
+
617 { "boxVH", U"\u256c" },
+
618 { "boxVL", U"\u2563" },
+
619 { "boxVR", U"\u2560" },
+
620 { "boxVh", U"\u256b" },
+
621 { "boxVl", U"\u2562" },
+
622 { "boxVr", U"\u255f" },
+
623 { "boxdL", U"\u2555" },
+
624 { "boxdR", U"\u2552" },
+
625 { "boxdl", U"\u2510" },
+
626 { "boxdr", U"\u250c" },
+
627 { "boxh", U"\u2500" },
+
628 { "boxhD", U"\u2565" },
+
629 { "boxhU", U"\u2568" },
+
630 { "boxhd", U"\u252c" },
+
631 { "boxhu", U"\u2534" },
+
632 { "boxuL", U"\u255b" },
+
633 { "boxuR", U"\u2558" },
+
634 { "boxul", U"\u2518" },
+
635 { "boxur", U"\u2514" },
+
636 { "boxv", U"\u2502" },
+
637 { "boxvH", U"\u256a" },
+
638 { "boxvL", U"\u2561" },
+
639 { "boxvR", U"\u255e" },
+
640 { "boxvh", U"\u253c" },
+
641 { "boxvl", U"\u2524" },
+
642 { "boxvr", U"\u251c" },
+
643 { "bprime", U"\u2035" },
+
644 { "breve", U"\u02d8" },
+
645 { "brvbar", U"\u00a6" },
+
646 { "bsim", U"\u223d" },
+
647 { "bsime", U"\u22cd" },
+
648 { "bsol", U"\u005c" },
+
649 { "btilde", U"\u0062\u0303" },
+
650 { "bull", U"\u2022" },
+
651 { "buml", U"\u0062\u0308" },
+
652 { "bump", U"\u224e" },
+
653 { "bumpe", U"\u224f" },
+
654 { "cacute", U"\u0107" },
+
655 { "cacute", U"\u0063\u0301" },
+
656 { "cap", U"\u2229" },
+
657 { "caret", U"\u2041" },
+
658 { "caron", U"\u02c7" },
+
659 { "cbreve", U"\u0063\u0306" },
+
660 { "cbring", U"\u0063\u032f" },
+
661 { "ccaron", U"\u010d" },
+
662 { "ccaron", U"\u0063\u030c" },
+
663 { "ccedil", U"\u00e7" },
+
664 { "ccirc", U"\u0109" },
+
665 { "ccirc", U"\u0063\u0302" },
+
666 { "cdot", U"\u010b" },
+
667 { "cdot", U"\u0063\u0307" },
+
668 { "cedil", U"\u00b8" },
+
669 { "cent", U"\u00a2" },
+
670 { "cgrave", U"\u0063\u0300" },
+
671 { "chcy", U"\u0447" },
+
672 { "check", U"\u2713" },
+
673 { "chi", U"\u03c7" },
+
674 { "cir", U"\u25cb" },
+
675 { "circ", U"\u02c6" },
+
676 { "circlef", U"\u25cf" },
+
677 { "circlefb", U"\u25d2" },
+
678 { "circlefl", U"\u25d0" },
+
679 { "circlefr", U"\u25d1" },
+
680 { "circleft", U"\u25d3" },
+
681 { "cire", U"\u2257" },
+
682 { "clubs", U"\u2663" },
+
683 { "cmacr", U"\u0063\u0304" },
+
684 { "colon", U"\u003a" },
+
685 { "colone", U"\u2254" },
+
686 { "comma", U"\u002c" },
+
687 { "commat", U"\u0040" },
+
688 { "comp", U"\u2201" },
+
689 { "compfn", U"\u2218" },
+
690 { "cong", U"\u2245" },
+
691 { "conint", U"\u222e" },
+
692 { "coprod", U"\u2210" },
+
693 { "copy", U"\u00a9" },
+
694 { "copysr", U"\u2117" },
+
695 { "crarr", U"\u21b5" },
+
696 { "cross", U"\u2717" },
+
697 { "ctilde", U"\u0063\u0303" },
+
698 { "cuepr", U"\u22de" },
+
699 { "cuesc", U"\u22df" },
+
700 { "cularr", U"\u21b6" },
+
701 { "cuml", U"\u0063\u0308" },
+
702 { "cup", U"\u222a" },
+
703 { "cupre", U"\u227c" },
+
704 { "curarr", U"\u21b7" },
+
705 { "curren", U"\u00a4" },
+
706 { "cuvee", U"\u22ce" },
+
707 { "cuwed", U"\u22cf" },
+
708 { "dArr", U"\u21d3" },
+
709 { "dacute", U"\u0064\u0301" },
+
710 { "dagger", U"\u2020" },
+
711 { "daleth", U"\u2138" },
+
712 { "darr", U"\u2193" },
+
713 { "darr2", U"\u21ca" },
+
714 { "dash", U"\u2010" },
+
715 { "dashv", U"\u22a3" },
+
716 { "dblac", U"\u02dd" },
+
717 { "dbreve", U"\u0064\u0306" },
+
718 { "dbring", U"\u0064\u032f" },
+
719 { "dcaron", U"\u010f" },
+
720 { "dcaron", U"\u0064\u030c" },
+
721 { "dcirc", U"\u0064\u0302" },
+
722 { "dcy", U"\u0434" },
+
723 { "ddot", U"\u0064\u0307" },
+
724 { "deg", U"\u00b0" },
+
725 { "delta", U"\u03b4" },
+
726 { "dgr", U"\u03b4" },
+
727 { "dgrave", U"\u0064\u0300" },
+
728 { "dharl", U"\u21c3" },
+
729 { "dharr", U"\u21c2" },
+
730 { "diam", U"\u22c4" },
+
731 { "diamondf", U"\u25c6" },
+
732 { "diams", U"\u2666" },
+
733 { "die", U"\u00a8" },
+
734 { "divide", U"\u00f7" },
+
735 { "divonx", U"\u22c7" },
+
736 { "djcy", U"\u0452" },
+
737 { "dlarr", U"\u2199" },
+
738 { "dlcorn", U"\u231e" },
+
739 { "dlcrop", U"\u230d" },
+
740 { "dmacr", U"\u0064\u0304" },
+
741 { "dollar", U"\u0024" },
+
742 { "dot", U"\u02d9" },
+
743 { "drarr", U"\u2198" },
+
744 { "drcorn", U"\u231f" },
+
745 { "drcrop", U"\u230c" },
+
746 { "dscy", U"\u0455" },
+
747 { "dstrok", U"\u0111" },
+
748 { "dtilde", U"\u0064\u0303" },
+
749 { "dtri", U"\u25bf" },
+
750 { "dtrif", U"\u25be" },
+
751 { "duml", U"\u0064\u0308" },
+
752 { "dzcy", U"\u045f" },
+
753 { "eDot", U"\u2251" },
+
754 { "eacgr", U"\u03ad" },
+
755 { "eacute", U"\u00e9" },
+
756 { "eacute", U"\u0065\u0301" },
+
757 { "ebreve", U"\u0065\u0306" },
+
758 { "ebring", U"\u0065\u032f" },
+
759 { "ecaron", U"\u011b" },
+
760 { "ecaron", U"\u0065\u030c" },
+
761 { "ecir", U"\u2256" },
+
762 { "ecirc", U"\u00ea" },
+
763 { "ecirc", U"\u0065\u0302" },
+
764 { "ecolon", U"\u2255" },
+
765 { "ecy", U"\u044d" },
+
766 { "edot", U"\u0117" },
+
767 { "edot", U"\u0065\u0307" },
+
768 { "edotb", U"\u1eb9" },
+
769 { "eeacgr", U"\u03ae" },
+
770 { "eegr", U"\u03b7" },
+
771 { "efDot", U"\u2252" },
+
772 { "egr", U"\u03b5" },
+
773 { "egrave", U"\u00e8" },
+
774 { "egrave", U"\u0065\u0300" },
+
775 { "egs", U"\u22dd" },
+
776 { "ell", U"\u2113" },
+
777 { "els", U"\u22dc" },
+
778 { "emacr", U"\u0113" },
+
779 { "emacr", U"\u0065\u0304" },
+
780 { "empty", U"\u2205" },
+
781 { "emsp", U"\u2003" },
+
782 { "emsp13", U"\u2004" },
+
783 { "emsp14", U"\u2005" },
+
784 { "eng", U"\u014b" },
+
785 { "ensp", U"\u2002" },
+
786 { "eogon", U"\u0119" },
+
787 { "epsi", U"\u03b5" },
+
788 { "epsilon", U"\u03b5" },
+
789 { "epsis", U"\u220a" },
+
790 { "equals", U"\u003d" },
+
791 { "equiv", U"\u2261" },
+
792 { "erDot", U"\u2253" },
+
793 { "esdot", U"\u2250" },
+
794 { "eta", U"\u03b7" },
+
795 { "eth", U"\u00f0" },
+
796 { "etilde", U"\u0065\u0303" },
+
797 { "euml", U"\u00eb" },
+
798 { "euml", U"\u0065\u0308" },
+
799 { "euro", U"\u20ac" },
+
800 { "excl", U"\u0021" },
+
801 { "exist", U"\u2203" },
+
802 { "facute", U"\u0066\u0301" },
+
803 { "fbreve", U"\u0066\u0306" },
+
804 { "fbring", U"\u0066\u032f" },
+
805 { "fcaron", U"\u0066\u030c" },
+
806 { "fcirc", U"\u0066\u0302" },
+
807 { "fcy", U"\u0444" },
+
808 { "fdot", U"\u0066\u0307" },
+
809 { "female", U"\u2640" },
+
810 { "ffilig", U"\ufb03" },
+
811 { "fflig", U"\ufb00" },
+
812 { "ffllig", U"\ufb04" },
+
813 { "fgrave", U"\u0066\u0300" },
+
814 { "filig", U"\ufb01" },
+
815 { "flat", U"\u266d" },
+
816 { "fllig", U"\ufb02" },
+
817 { "fmacr", U"\u0066\u0304" },
+
818 { "fnof", U"\u0192" },
+
819 { "forall", U"\u2200" },
+
820 { "fork", U"\u22d4" },
+
821 { "frac12", U"\u00bd" },
+
822 { "frac13", U"\u2153" },
+
823 { "frac14", U"\u00bc" },
+
824 { "frac15", U"\u2155" },
+
825 { "frac16", U"\u2159" },
+
826 { "frac18", U"\u215b" },
+
827 { "frac23", U"\u2154" },
+
828 { "frac25", U"\u2156" },
+
829 { "frac34", U"\u00be" },
+
830 { "frac35", U"\u2157" },
+
831 { "frac38", U"\u215c" },
+
832 { "frac45", U"\u2158" },
+
833 { "frac56", U"\u215a" },
+
834 { "frac58", U"\u215d" },
+
835 { "frac78", U"\u215e" },
+
836 { "frasl", U"\u2044" },
+
837 { "frown", U"\u2322" },
+
838 { "ftilde", U"\u0066\u0303" },
+
839 { "fuml", U"\u0066\u0308" },
+
840 { "gE", U"\u2267" },
+
841 { "gacute", U"\u01f5" },
+
842 { "gacute", U"\u0067\u0301" },
+
843 { "gamma", U"\u03b3" },
+
844 { "gammad", U"\u03dc" },
+
845 { "gbreve", U"\u011f" },
+
846 { "gbreve", U"\u0067\u0306" },
+
847 { "gbring", U"\u0067\u032f" },
+
848 { "gcaron", U"\u0067\u030c" },
+
849 { "gcedil", U"\u0123" },
+
850 { "gcirc", U"\u011d" },
+
851 { "gcirc", U"\u0067\u0302" },
+
852 { "gcy", U"\u0433" },
+
853 { "gdot", U"\u0121" },
+
854 { "gdot", U"\u0067\u0307" },
+
855 { "ge", U"\u2265" },
+
856 { "gel", U"\u22db" },
+
857 { "ges", U"\u2265" },
+
858 { "ggr", U"\u03b3" },
+
859 { "ggrave", U"\u0067\u0300" },
+
860 { "gimel", U"\u2137" },
+
861 { "gjcy", U"\u0453" },
+
862 { "gl", U"\u2277" },
+
863 { "gmacr", U"\u0067\u0304" },
+
864 { "gnE", U"\u2269" },
+
865 { "gne", U"\u2269" },
+
866 { "gnsim", U"\u22e7" },
+
867 { "grave", U"\u0060" },
+
868 { "gsdot", U"\u22d7" },
+
869 { "gsim", U"\u2273" },
+
870 { "gt", U"\u003e" },
+
871 { "gtilde", U"\u0067\u0303" },
+
872 { "guml", U"\u0067\u0308" },
+
873 { "gvnE", U"\u2269" },
+
874 { "hArr", U"\u21d4" },
+
875 { "hacute", U"\u0068\u0301" },
+
876 { "hairsp", U"\u200a" },
+
877 { "half", U"\u00bd" },
+
878 { "hamilt", U"\u210b" },
+
879 { "hardcy", U"\u044a" },
+
880 { "harr", U"\u2194" },
+
881 { "harrw", U"\u21ad" },
+
882 { "hbreve", U"\u0068\u0306" },
+
883 { "hbring", U"\u0068\u032f" },
+
884 { "hcaron", U"\u0068\u030c" },
+
885 { "hcirc", U"\u0125" },
+
886 { "hcirc", U"\u0068\u0302" },
+
887 { "hdot", U"\u0068\u0307" },
+
888 { "hearts", U"\u2665" },
+
889 { "hellip", U"\u2026" },
+
890 { "hgrave", U"\u0068\u0300" },
+
891 { "hmacr", U"\u0068\u0304" },
+
892 { "horbar", U"\u2015" },
+
893 { "hstrok", U"\u0127" },
+
894 { "htilde", U"\u0068\u0303" },
+
895 { "huml", U"\u0068\u0308" },
+
896 { "hybull", U"\u2043" },
+
897 { "hyphen", U"\u002d" },
+
898 { "iacgr", U"\u03af" },
+
899 { "iacute", U"\u00ed" },
+
900 { "iacute", U"\u0069\u0301" },
+
901 { "ibreve", U"\u0069\u0306" },
+
902 { "ibring", U"\u0069\u032f" },
+
903 { "icaron", U"\u0069\u030c" },
+
904 { "icirc", U"\u00ee" },
+
905 { "icirc", U"\u0069\u0302" },
+
906 { "icy", U"\u0438" },
+
907 { "idiagr", U"\u0390" },
+
908 { "idigr", U"\u03ca" },
+
909 { "idot", U"\u0069\u0307" },
+
910 { "iecy", U"\u0435" },
+
911 { "iexcl", U"\u00a1" },
+
912 { "iff", U"\u21d4" },
+
913 { "igr", U"\u03b9" },
+
914 { "igrave", U"\u00ec" },
+
915 { "igrave", U"\u0069\u0300" },
+
916 { "ijlig", U"\u0133" },
+
917 { "imacr", U"\u012b" },
+
918 { "imacr", U"\u0069\u0304" },
+
919 { "image", U"\u2111" },
+
920 { "incare", U"\u2105" },
+
921 { "infin", U"\u221e" },
+
922 { "inodot", U"\u0131" },
+
923 { "inodot", U"\u0131" },
+
924 { "int", U"\u222b" },
+
925 { "intcal", U"\u22ba" },
+
926 { "iocy", U"\u0451" },
+
927 { "iogon", U"\u012f" },
+
928 { "iota", U"\u03b9" },
+
929 { "iquest", U"\u00bf" },
+
930 { "isin", U"\u2208" },
+
931 { "itilde", U"\u0129" },
+
932 { "itilde", U"\u0069\u0303" },
+
933 { "iukcy", U"\u0456" },
+
934 { "iuml", U"\u00ef" },
+
935 { "iuml", U"\u0069\u0308" },
+
936 { "jacute", U"\u006a\u0301" },
+
937 { "jbreve", U"\u006a\u0306" },
+
938 { "jbring", U"\u006a\u032f" },
+
939 { "jcaron", U"\u006a\u030c" },
+
940 { "jcirc", U"\u0135" },
+
941 { "jcirc", U"\u006a\u0302" },
+
942 { "jcy", U"\u0439" },
+
943 { "jdot", U"\u006a\u0307" },
+
944 { "jgrave", U"\u006a\u0300" },
+
945 { "jmacr", U"\u006a\u0304" },
+
946 { "jsercy", U"\u0458" },
+
947 { "jtilde", U"\u006a\u0303" },
+
948 { "jukcy", U"\u0454" },
+
949 { "juml", U"\u006a\u0308" },
+
950 { "kacute", U"\u006b\u0301" },
+
951 { "kappa", U"\u03ba" },
+
952 { "kappav", U"\u03f0" },
+
953 { "kbreve", U"\u006b\u0306" },
+
954 { "kbring", U"\u006b\u032f" },
+
955 { "kcaron", U"\u006b\u030c" },
+
956 { "kcedil", U"\u0137" },
+
957 { "kcirc", U"\u006b\u0302" },
+
958 { "kcy", U"\u043a" },
+
959 { "kdot", U"\u006b\u0307" },
+
960 { "kgr", U"\u03ba" },
+
961 { "kgrave", U"\u006b\u0300" },
+
962 { "kgreen", U"\u0138" },
+
963 { "khcy", U"\u0445" },
+
964 { "khgr", U"\u03c7" },
+
965 { "kjcy", U"\u045c" },
+
966 { "kmacr", U"\u006b\u0304" },
+
967 { "ktilde", U"\u006b\u0303" },
+
968 { "kuml", U"\u006b\u0308" },
+
969 { "lAarr", U"\u21da" },
+
970 { "lArr", U"\u21d0" },
+
971 { "lE", U"\u2266" },
+
972 { "lacute", U"\u013a" },
+
973 { "lacute", U"\u006c\u0301" },
+
974 { "lagran", U"\u2112" },
+
975 { "lambda", U"\u03bb" },
+
976 { "lang", U"\u2329" },
+
977 { "laquo", U"\u00ab" },
+
978 { "larr", U"\u2190" },
+
979 { "larr2", U"\u21c7" },
+
980 { "larrhk", U"\u21a9" },
+
981 { "larrlp", U"\u21ab" },
+
982 { "larrtl", U"\u21a2" },
+
983 { "lbreve", U"\u006c\u0306" },
+
984 { "lbring", U"\u006c\u032f" },
+
985 { "lcaron", U"\u013e" },
+
986 { "lcaron", U"\u006c\u030c" },
+
987 { "lcedil", U"\u013c" },
+
988 { "lceil", U"\u2308" },
+
989 { "lcirc", U"\u006c\u0302" },
+
990 { "lcub", U"\u007b" },
+
991 { "lcy", U"\u043b" },
+
992 { "ldot", U"\u22d6" },
+
993 { "ldot", U"\u006c\u0307" },
+
994 { "ldquo", U"\u201c" },
+
995 { "ldquor", U"\u201e" },
+
996 { "le", U"\u2264" },
+
997 { "leg", U"\u22da" },
+
998 { "les", U"\u2264" },
+
999 { "lfloor", U"\u230a" },
+
1000 { "lg", U"\u2276" },
+
1001 { "lgr", U"\u03bb" },
+
1002 { "lgrave", U"\u006c\u0300" },
+
1003 { "lhard", U"\u21bd" },
+
1004 { "lharu", U"\u21bc" },
+
1005 { "lhblk", U"\u2584" },
+
1006 { "ljcy", U"\u0459" },
+
1007 { "lmacr", U"\u006c\u0304" },
+
1008 { "lmidot", U"\u0140" },
+
1009 { "lnE", U"\u2268" },
+
1010 { "lne", U"\u2268" },
+
1011 { "lnsim", U"\u22e6" },
+
1012 { "lowast", U"\u2217" },
+
1013 { "lowbar", U"\u005f" },
+
1014 { "loz", U"\u25ca" },
+
1015 { "loz", U"\u2727" },
+
1016 { "lozf", U"\u2726" },
+
1017 { "lpar", U"\u0028" },
+
1018 { "lrarr2", U"\u21c6" },
+
1019 { "lrhar2", U"\u21cb" },
+
1020 { "lrm", U"\u200e" },
+
1021 { "lsaquo", U"\u2039" },
+
1022 { "lsh", U"\u21b0" },
+
1023 { "lsim", U"\u2272" },
+
1024 { "lsqb", U"\u005b" },
+
1025 { "lsquo", U"\u2018" },
+
1026 { "lsquor", U"\u201a" },
+
1027 { "lstrok", U"\u0142" },
+
1028 { "lt", U"\u003c" },
+
1029 { "lthree", U"\u22cb" },
+
1030 { "ltilde", U"\u006c\u0303" },
+
1031 { "ltimes", U"\u22c9" },
+
1032 { "ltri", U"\u25c3" },
+
1033 { "ltrie", U"\u22b4" },
+
1034 { "ltrif", U"\u25c2" },
+
1035 { "luml", U"\u006c\u0308" },
+
1036 { "lvnE", U"\u2268" },
+
1037 { "macr", U"\u00af" },
+
1038 { "macute", U"\u006d\u0301" },
+
1039 { "male", U"\u2642" },
+
1040 { "malt", U"\u2720" },
+
1041 { "map", U"\u21a6" },
+
1042 { "marker", U"\u25ae" },
+
1043 { "mbreve", U"\u006d\u0306" },
+
1044 { "mbring", U"\u006d\u032f" },
+
1045 { "mcaron", U"\u006d\u030c" },
+
1046 { "mcirc", U"\u006d\u0302" },
+
1047 { "mcy", U"\u043c" },
+
1048 { "mdash", U"\u2014" },
+
1049 { "mdot", U"\u006d\u0307" },
+
1050 { "mgr", U"\u03bc" },
+
1051 { "mgrave", U"\u006d\u0300" },
+
1052 { "micro", U"\u00b5" },
+
1053 { "mid", U"\u2223" },
+
1054 { "middot", U"\u00b7" },
+
1055 { "minus", U"\u2212" },
+
1056 { "minusb", U"\u229f" },
+
1057 { "mldr", U"\u2026" },
+
1058 { "mmacr", U"\u006d\u0304" },
+
1059 { "mnplus", U"\u2213" },
+
1060 { "models", U"\u22a7" },
+
1061 { "mtilde", U"\u006d\u0303" },
+
1062 { "mu", U"\u03bc" },
+
1063 { "mumap", U"\u22b8" },
+
1064 { "muml", U"\u006d\u0308" },
+
1065 { "nVDash", U"\u22af" },
+
1066 { "nVdash", U"\u22ae" },
+
1067 { "nabla", U"\u2207" },
+
1068 { "nacute", U"\u0144" },
+
1069 { "nacute", U"\u006e\u0301" },
+
1070 { "nap", U"\u2249" },
+
1071 { "napos", U"\u0149" },
+
1072 { "natur", U"\u266e" },
+
1073 { "nbreve", U"\u006e\u0306" },
+
1074 { "nbring", U"\u006e\u032f" },
+
1075 { "nbsp", U"\u00a0" },
+
1076 { "ncaron", U"\u0148" },
+
1077 { "ncaron", U"\u006e\u030c" },
+
1078 { "ncedil", U"\u0146" },
+
1079 { "ncirc", U"\u006e\u0302" },
+
1080 { "ncong", U"\u2247" },
+
1081 { "ncy", U"\u043d" },
+
1082 { "ndash", U"\u2013" },
+
1083 { "ndot", U"\u006e\u0307" },
+
1084 { "ne", U"\u2260" },
+
1085 { "nearr", U"\u2197" },
+
1086 { "nequiv", U"\u2262" },
+
1087 { "nexist", U"\u2204" },
+
1088 { "nge", U"\u2271" },
+
1089 { "nges", U"\u2271" },
+
1090 { "ngr", U"\u03bd" },
+
1091 { "ngrave", U"\u006e\u0300" },
+
1092 { "ngt", U"\u226f" },
+
1093 { "nhArr", U"\u21ce" },
+
1094 { "nharr", U"\u21ae" },
+
1095 { "ni", U"\u220b" },
+
1096 { "njcy", U"\u045a" },
+
1097 { "nlArr", U"\u21cd" },
+
1098 { "nlarr", U"\u219a" },
+
1099 { "nldr", U"\u2025" },
+
1100 { "nle", U"\u2270" },
+
1101 { "nles", U"\u2270" },
+
1102 { "nlt", U"\u226e" },
+
1103 { "nltri", U"\u22ea" },
+
1104 { "nltrie", U"\u22ec" },
+
1105 { "nmacr", U"\u006e\u0304" },
+
1106 { "nmid", U"\u2224" },
+
1107 { "not", U"\u00ac" },
+
1108 { "notin", U"\u2209" },
+
1109 { "npar", U"\u2226" },
+
1110 { "npr", U"\u2280" },
+
1111 { "npre", U"\u22e0" },
+
1112 { "nrArr", U"\u21cf" },
+
1113 { "nrarr", U"\u219b" },
+
1114 { "nrtri", U"\u22eb" },
+
1115 { "nrtrie", U"\u22ed" },
+
1116 { "nsc", U"\u2281" },
+
1117 { "nsce", U"\u22e1" },
+
1118 { "nsim", U"\u2241" },
+
1119 { "nsime", U"\u2244" },
+
1120 { "nspar", U"\u2226" },
+
1121 { "nsub", U"\u2284" },
+
1122 { "nsubE", U"\u2288" },
+
1123 { "nsube", U"\u2288" },
+
1124 { "nsup", U"\u2285" },
+
1125 { "nsupE", U"\u2289" },
+
1126 { "nsupe", U"\u2289" },
+
1127 { "ntilde", U"\u00f1" },
+
1128 { "ntilde", U"\u006e\u0303" },
+
1129 { "nu", U"\u03bd" },
+
1130 { "num", U"\u0023" },
+
1131 { "numero", U"\u2116" },
+
1132 { "numl", U"\u006e\u0308" },
+
1133 { "numsp", U"\u2007" },
+
1134 { "nvDash", U"\u22ad" },
+
1135 { "nvdash", U"\u22ac" },
+
1136 { "nwarr", U"\u2196" },
+
1137 { "oS", U"\u24c8" },
+
1138 { "oacgr", U"\u03cc" },
+
1139 { "oacute", U"\u00f3" },
+
1140 { "oacute", U"\u006f\u0301" },
+
1141 { "oast", U"\u229b" },
+
1142 { "obreve", U"\u006f\u0306" },
+
1143 { "obring", U"\u006f\u032f" },
+
1144 { "ocaron", U"\u01d2" },
+
1145 { "ocaron", U"\u006f\u030c" },
+
1146 { "ocir", U"\u229a" },
+
1147 { "ocirc", U"\u00f4" },
+
1148 { "ocirc", U"\u006f\u0302" },
+
1149 { "ocy", U"\u043e" },
+
1150 { "odash", U"\u229d" },
+
1151 { "odblac", U"\u0151" },
+
1152 { "odot", U"\u2299" },
+
1153 { "odot", U"\u006f\u0307" },
+
1154 { "odotb", U"\u1ecd" },
+
1155 { "oelig", U"\u0153" },
+
1156 { "ogon", U"\u02db" },
+
1157 { "ogr", U"\u03bf" },
+
1158 { "ograve", U"\u00f2" },
+
1159 { "ograve", U"\u006f\u0300" },
+
1160 { "ohacgr", U"\u03ce" },
+
1161 { "ohgr", U"\u03c9" },
+
1162 { "ohm", U"\u2126" },
+
1163 { "olarr", U"\u21ba" },
+
1164 { "oline", U"\u203e" },
+
1165 { "omacr", U"\u014d" },
+
1166 { "omacr", U"\u006f\u0304" },
+
1167 { "omega", U"\u03c9" },
+
1168 { "omicron", U"\u03bf" },
+
1169 { "ominus", U"\u2296" },
+
1170 { "oplus", U"\u2295" },
+
1171 { "or", U"\u2228" },
+
1172 { "orarr", U"\u21bb" },
+
1173 { "order", U"\u2134" },
+
1174 { "ordf", U"\u00aa" },
+
1175 { "ordm", U"\u00ba" },
+
1176 { "oslash", U"\u00f8" },
+
1177 { "osol", U"\u2298" },
+
1178 { "otilde", U"\u00f5" },
+
1179 { "otilde", U"\u006f\u0303" },
+
1180 { "otimes", U"\u2297" },
+
1181 { "ouml", U"\u00f6" },
+
1182 { "ouml", U"\u006f\u0308" },
+
1183 { "pacute", U"\u0070\u0301" },
+
1184 { "page", U"\u000c" },
+
1185 { "par", U"\u2225" },
+
1186 { "para", U"\u00b6" },
+
1187 { "part", U"\u2202" },
+
1188 { "pbreve", U"\u0070\u0306" },
+
1189 { "pbring", U"\u0070\u032f" },
+
1190 { "pcaron", U"\u0070\u030c" },
+
1191 { "pcirc", U"\u0070\u0302" },
+
1192 { "pcy", U"\u043f" },
+
1193 { "pdot", U"\u0070\u0307" },
+
1194 { "percnt", U"\u0025" },
+
1195 { "period", U"\u002e" },
+
1196 { "permil", U"\u2030" },
+
1197 { "perp", U"\u22a5" },
+
1198 { "pgr", U"\u03c0" },
+
1199 { "pgrave", U"\u0070\u0300" },
+
1200 { "phgr", U"\u03c6" },
+
1201 { "phi", U"\u03c6" },
+
1202 { "phis", U"\u03c6" },
+
1203 { "phiv", U"\u03d5" },
+
1204 { "phmmat", U"\u2133" },
+
1205 { "phone", U"\u260e" },
+
1206 { "pi", U"\u03c0" },
+
1207 { "piv", U"\u03d6" },
+
1208 { "planck", U"\u210f" },
+
1209 { "plus", U"\u002b" },
+
1210 { "plusb", U"\u229e" },
+
1211 { "plusdo", U"\u2214" },
+
1212 { "plusmn", U"\u00b1" },
+
1213 { "pmacr", U"\u0070\u0304" },
+
1214 { "pound", U"\u00a3" },
+
1215 { "pr", U"\u227a" },
+
1216 { "pre", U"\u227c" },
+
1217 { "prime", U"\u2032" },
+
1218 { "prnsim", U"\u22e8" },
+
1219 { "prod", U"\u220f" },
+
1220 { "prop", U"\u221d" },
+
1221 { "prsim", U"\u227e" },
+
1222 { "psgr", U"\u03c8" },
+
1223 { "psi", U"\u03c8" },
+
1224 { "ptilde", U"\u0070\u0303" },
+
1225 { "puml", U"\u0070\u0308" },
+
1226 { "puncsp", U"\u2008" },
+
1227 { "qacute", U"\u0071\u0301" },
+
1228 { "qbreve", U"\u0071\u0306" },
+
1229 { "qbring", U"\u0071\u032f" },
+
1230 { "qcaron", U"\u0071\u030c" },
+
1231 { "qcirc", U"\u0071\u0302" },
+
1232 { "qdot", U"\u0071\u0307" },
+
1233 { "qgrave", U"\u0071\u0300" },
+
1234 { "qmacr", U"\u0071\u0304" },
+
1235 { "qtilde", U"\u0071\u0303" },
+
1236 { "quest", U"\u003f" },
+
1237 { "quml", U"\u0071\u0308" },
+
1238 { "quot", U"\u0022" },
+
1239 { "rAarr", U"\u21db" },
+
1240 { "rArr", U"\u21d2" },
+
1241 { "racute", U"\u0155" },
+
1242 { "racute", U"\u0072\u0301" },
+
1243 { "radic", U"\u221a" },
+
1244 { "rang", U"\u232a" },
+
1245 { "raquo", U"\u00bb" },
+
1246 { "rarr", U"\u2192" },
+
1247 { "rarr2", U"\u21c9" },
+
1248 { "rarrhk", U"\u21aa" },
+
1249 { "rarrlp", U"\u21ac" },
+
1250 { "rarrtl", U"\u21a3" },
+
1251 { "rarrw", U"\u219d" },
+
1252 { "rbreve", U"\u0072\u0306" },
+
1253 { "rbring", U"\u0072\u032f" },
+
1254 { "rcaron", U"\u0159" },
+
1255 { "rcaron", U"\u0072\u030c" },
+
1256 { "rcedil", U"\u0157" },
+
1257 { "rceil", U"\u2309" },
+
1258 { "rcirc", U"\u0072\u0302" },
+
1259 { "rcub", U"\u007d" },
+
1260 { "rcy", U"\u0440" },
+
1261 { "rdot", U"\u0072\u0307" },
+
1262 { "rdquo", U"\u201d" },
+
1263 { "rdquor", U"\u201c" },
+
1264 { "real", U"\u211c" },
+
1265 { "rect", U"\u25ad" },
+
1266 { "reg", U"\u00ae" },
+
1267 { "rfloor", U"\u230b" },
+
1268 { "rgr", U"\u03c1" },
+
1269 { "rgrave", U"\u0072\u0300" },
+
1270 { "rhard", U"\u21c1" },
+
1271 { "rharu", U"\u21c0" },
+
1272 { "rho", U"\u03c1" },
+
1273 { "rhov", U"\u03f1" },
+
1274 { "ring", U"\u02da" },
+
1275 { "rlarr2", U"\u21c4" },
+
1276 { "rlhar2", U"\u21cc" },
+
1277 { "rlm", U"\u200f" },
+
1278 { "rmacr", U"\u0072\u0304" },
+
1279 { "rpar", U"\u0029" },
+
1280 { "rsaquo", U"\u203a" },
+
1281 { "rsh", U"\u21b1" },
+
1282 { "rsqb", U"\u005d" },
+
1283 { "rsquo", U"\u2019" },
+
1284 { "rsquor", U"\u2018" },
+
1285 { "rthree", U"\u22cc" },
+
1286 { "rtilde", U"\u0072\u0303" },
+
1287 { "rtimes", U"\u22ca" },
+
1288 { "rtri", U"\u25b9" },
+
1289 { "rtrie", U"\u22b5" },
+
1290 { "rtrif", U"\u25b8" },
+
1291 { "ruml", U"\u0072\u0308" },
+
1292 { "rx", U"\u211e" },
+
1293 { "sacute", U"\u015b" },
+
1294 { "sacute", U"\u0073\u0301" },
+
1295 { "samalg", U"\u2210" },
+
1296 { "sbquo", U"\u201a" },
+
1297 { "sbreve", U"\u0073\u0306" },
+
1298 { "sbring", U"\u0073\u032f" },
+
1299 { "sbsol", U"\u005c" },
+
1300 { "sc", U"\u227b" },
+
1301 { "scaron", U"\u0161" },
+
1302 { "scaron", U"\u0073\u030c" },
+
1303 { "sccue", U"\u227d" },
+
1304 { "sce", U"\u227d" },
+
1305 { "scedil", U"\u015f" },
+
1306 { "schwa", U"\u0259" },
+
1307 { "schwaacute", U"\u0259\u0301" },
+
1308 { "schwadgrave", U"\u0259\u030f" },
+
1309 { "schwagrave", U"\u0259\u0300" },
+
1310 { "schwamacr", U"\u0259\u0304" },
+
1311 { "scirc", U"\u015d" },
+
1312 { "scirc", U"\u0073\u0302" },
+
1313 { "scnsim", U"\u22e9" },
+
1314 { "scsim", U"\u227f" },
+
1315 { "scy", U"\u0441" },
+
1316 { "sdot", U"\u22c5" },
+
1317 { "sdot", U"\u0073\u0307" },
+
1318 { "sdotb", U"\u22a1" },
+
1319 { "sect", U"\u00a7" },
+
1320 { "semi", U"\u003b" },
+
1321 { "setmn", U"\u2216" },
+
1322 { "sext", U"\u2736" },
+
1323 { "sfgr", U"\u03c2" },
+
1324 { "sfrown", U"\u2322" },
+
1325 { "sgr", U"\u03c3" },
+
1326 { "sgrave", U"\u0073\u0300" },
+
1327 { "sharp", U"\u266f" },
+
1328 { "shchcy", U"\u0449" },
+
1329 { "shcy", U"\u0448" },
+
1330 { "shy", U"\u00ad" },
+
1331 { "sigma", U"\u03c3" },
+
1332 { "sigmaf", U"\u03c2" },
+
1333 { "sigmav", U"\u03c2" },
+
1334 { "sim", U"\u223c" },
+
1335 { "sime", U"\u2243" },
+
1336 { "smacr", U"\u0073\u0304" },
+
1337 { "smile", U"\u2323" },
+
1338 { "softcy", U"\u044c" },
+
1339 { "sol", U"\u002f" },
+
1340 { "spades", U"\u2660" },
+
1341 { "spar", U"\u2225" },
+
1342 { "sqcap", U"\u2293" },
+
1343 { "sqcup", U"\u2294" },
+
1344 { "sqsub", U"\u228f" },
+
1345 { "sqsube", U"\u2291" },
+
1346 { "sqsup", U"\u2290" },
+
1347 { "sqsupe", U"\u2292" },
+
1348 { "squ", U"\u25a1" },
+
1349 { "square", U"\u25a1" },
+
1350 { "squarf", U"\u25a0" },
+
1351 { "squf", U"\u25aa" },
+
1352 { "ssetmn", U"\u2216" },
+
1353 { "ssmile", U"\u2323" },
+
1354 { "sstarf", U"\u22c6" },
+
1355 { "star", U"\u2606" },
+
1356 { "starf", U"\u2605" },
+
1357 { "stilde", U"\u0073\u0303" },
+
1358 { "sub", U"\u2282" },
+
1359 { "subE", U"\u2286" },
+
1360 { "sube", U"\u2286" },
+
1361 { "subnE", U"\u228a" },
+
1362 { "subne", U"\u228a" },
+
1363 { "sum", U"\u2211" },
+
1364 { "suml", U"\u0073\u0308" },
+
1365 { "sung", U"\u266a" },
+
1366 { "sup", U"\u2283" },
+
1367 { "sup1", U"\u00b9" },
+
1368 { "sup2", U"\u00b2" },
+
1369 { "sup3", U"\u00b3" },
+
1370 { "supE", U"\u2287" },
+
1371 { "supe", U"\u2287" },
+
1372 { "supnE", U"\u228b" },
+
1373 { "supne", U"\u228b" },
+
1374 { "szlig", U"\u00df" },
+
1375 { "tacute", U"\u0074\u0301" },
+
1376 { "target", U"\u2316" },
+
1377 { "tau", U"\u03c4" },
+
1378 { "tbreve", U"\u0074\u0306" },
+
1379 { "tbring", U"\u0074\u032f" },
+
1380 { "tcaron", U"\u0165" },
+
1381 { "tcaron", U"\u0074\u030c" },
+
1382 { "tcedil", U"\u0163" },
+
1383 { "tcirc", U"\u0074\u0302" },
+
1384 { "tcy", U"\u0442" },
+
1385 { "tdot", U"\u20db" },
+
1386 { "tdot", U"\u0074\u0307" },
+
1387 { "telrec", U"\u2315" },
+
1388 { "tgr", U"\u03c4" },
+
1389 { "tgrave", U"\u0074\u0300" },
+
1390 { "there4", U"\u2234" },
+
1391 { "theta", U"\u03b8" },
+
1392 { "thetas", U"\u03b8" },
+
1393 { "thetasym", U"\u03d1" },
+
1394 { "thetav", U"\u03d1" },
+
1395 { "thgr", U"\u03b8" },
+
1396 { "thinsp", U"\u2009" },
+
1397 { "thkap", U"\u2248" },
+
1398 { "thksim", U"\u223c" },
+
1399 { "thorn", U"\u00fe" },
+
1400 { "tilde", U"\u02dc" },
+
1401 { "times", U"\u00d7" },
+
1402 { "timesb", U"\u22a0" },
+
1403 { "tmacr", U"\u0074\u0304" },
+
1404 { "top", U"\u22a4" },
+
1405 { "tprime", U"\u2034" },
+
1406 { "trade", U"\u2122" },
+
1407 { "trie", U"\u225c" },
+
1408 { "tscy", U"\u0446" },
+
1409 { "tshcy", U"\u045b" },
+
1410 { "tstrok", U"\u0167" },
+
1411 { "ttilde", U"\u0074\u0303" },
+
1412 { "tuml", U"\u0074\u0308" },
+
1413 { "twixt", U"\u226c" },
+
1414 { "uArr", U"\u21d1" },
+
1415 { "uacgr", U"\u03cd" },
+
1416 { "uacute", U"\u00fa" },
+
1417 { "uacute", U"\u0075\u0301" },
+
1418 { "uarr", U"\u2191" },
+
1419 { "uarr2", U"\u21c8" },
+
1420 { "ubrcy", U"\u045e" },
+
1421 { "ubreve", U"\u016d" },
+
1422 { "ubreve", U"\u0075\u0306" },
+
1423 { "ubring", U"\u0075\u032f" },
+
1424 { "ucaron", U"\u0075\u030c" },
+
1425 { "ucirc", U"\u00fb" },
+
1426 { "ucirc", U"\u0075\u0302" },
+
1427 { "ucy", U"\u0443" },
+
1428 { "udblac", U"\u0171" },
+
1429 { "udiagr", U"\u03b0" },
+
1430 { "udigr", U"\u03cb" },
+
1431 { "udot", U"\u0075\u0307" },
+
1432 { "ugr", U"\u03c5" },
+
1433 { "ugrave", U"\u00f9" },
+
1434 { "ugrave", U"\u0075\u0300" },
+
1435 { "uharl", U"\u21bf" },
+
1436 { "uharr", U"\u21be" },
+
1437 { "uhblk", U"\u2580" },
+
1438 { "ulcorn", U"\u231c" },
+
1439 { "ulcrop", U"\u230f" },
+
1440 { "umacr", U"\u016b" },
+
1441 { "umacr", U"\u0075\u0304" },
+
1442 { "uml", U"\u00a8" },
+
1443 { "uogon", U"\u0173" },
+
1444 { "uplus", U"\u228e" },
+
1445 { "upsi", U"\u03c5" },
+
1446 { "upsih", U"\u03d2" },
+
1447 { "upsilon", U"\u03c5" },
+
1448 { "urcorn", U"\u231d" },
+
1449 { "urcrop", U"\u230e" },
+
1450 { "uring", U"\u016f" },
+
1451 { "utilde", U"\u0169" },
+
1452 { "utilde", U"\u0075\u0303" },
+
1453 { "utri", U"\u25b5" },
+
1454 { "utrif", U"\u25b4" },
+
1455 { "uuml", U"\u00fc" },
+
1456 { "uuml", U"\u0075\u0308" },
+
1457 { "vArr", U"\u21d5" },
+
1458 { "vDash", U"\u22a8" },
+
1459 { "vacute", U"\u0076\u0301" },
+
1460 { "varr", U"\u2195" },
+
1461 { "vbreve", U"\u0076\u0306" },
+
1462 { "vbring", U"\u0076\u032f" },
+
1463 { "vcaron", U"\u0076\u030c" },
+
1464 { "vcirc", U"\u0076\u0302" },
+
1465 { "vcy", U"\u0432" },
+
1466 { "vdash", U"\u22a2" },
+
1467 { "vdot", U"\u0076\u0307" },
+
1468 { "veebar", U"\u22bb" },
+
1469 { "vellip", U"\u22ee" },
+
1470 { "verbar", U"\u007c" },
+
1471 { "vgrave", U"\u0076\u0300" },
+
1472 { "vltri", U"\u22b2" },
+
1473 { "vmacr", U"\u0076\u0304" },
+
1474 { "vprime", U"\u2032" },
+
1475 { "vprop", U"\u221d" },
+
1476 { "vrtri", U"\u22b3" },
+
1477 { "vsubnE", U"\u228a" },
+
1478 { "vsubne", U"\u228a" },
+
1479 { "vsupnE", U"\u228b" },
+
1480 { "vsupne", U"\u228b" },
+
1481 { "vtab", U"\u000b" },
+
1482 { "vtilde", U"\u0076\u0303" },
+
1483 { "vuml", U"\u0076\u0308" },
+
1484 { "wacute", U"\u0077\u0301" },
+
1485 { "wbreve", U"\u0077\u0306" },
+
1486 { "wbring", U"\u0077\u032f" },
+
1487 { "wcaron", U"\u0077\u030c" },
+
1488 { "wcirc", U"\u0175" },
+
1489 { "wcirc", U"\u0077\u0302" },
+
1490 { "wdot", U"\u0077\u0307" },
+
1491 { "wedgeq", U"\u2259" },
+
1492 { "weierp", U"\u2118" },
+
1493 { "wgrave", U"\u0077\u0300" },
+
1494 { "wmacr", U"\u0077\u0304" },
+
1495 { "wreath", U"\u2240" },
+
1496 { "wtilde", U"\u0077\u0303" },
+
1497 { "wuml", U"\u0077\u0308" },
+
1498 { "xacute", U"\u0078\u0301" },
+
1499 { "xbreve", U"\u0078\u0306" },
+
1500 { "xbring", U"\u0078\u032f" },
+
1501 { "xcaron", U"\u0078\u030c" },
+
1502 { "xcirc", U"\u25cb" },
+
1503 { "xcirc", U"\u0078\u0302" },
+
1504 { "xdot", U"\u0078\u0307" },
+
1505 { "xdtri", U"\u25bd" },
+
1506 { "xgr", U"\u03be" },
+
1507 { "xgrave", U"\u0078\u0300" },
+
1508 { "xhArr", U"\u2194" },
+
1509 { "xharr", U"\u2194" },
+
1510 { "xi", U"\u03be" },
+
1511 { "xlArr", U"\u21d0" },
+
1512 { "xmacr", U"\u0078\u0304" },
+
1513 { "xrArr", U"\u21d2" },
+
1514 { "xtilde", U"\u0078\u0303" },
+
1515 { "xuml", U"\u0078\u0308" },
+
1516 { "xutri", U"\u25b3" },
+
1517 { "yacute", U"\u00fd" },
+
1518 { "yacute", U"\u0079\u0301" },
+
1519 { "yacy", U"\u044f" },
+
1520 { "ybreve", U"\u0079\u0306" },
+
1521 { "ybring", U"\u0079\u032f" },
+
1522 { "ycaron", U"\u0079\u030c" },
+
1523 { "ycirc", U"\u0177" },
+
1524 { "ycirc", U"\u0079\u0302" },
+
1525 { "ycy", U"\u044b" },
+
1526 { "ydot", U"\u0079\u0307" },
+
1527 { "yen", U"\u00a5" },
+
1528 { "ygrave", U"\u0079\u0300" },
+
1529 { "yicy", U"\u0457" },
+
1530 { "ymacr", U"\u0079\u0304" },
+
1531 { "ytilde", U"\u0079\u0303" },
+
1532 { "yucy", U"\u044e" },
+
1533 { "yuml", U"\u00ff" },
+
1534 { "yuml", U"\u0079\u0308" },
+
1535 { "zacute", U"\u017a" },
+
1536 { "zacute", U"\u007a\u0301" },
+
1537 { "zbreve", U"\u007a\u0306" },
+
1538 { "zbring", U"\u007a\u032f" },
+
1539 { "zcaron", U"\u017e" },
+
1540 { "zcaron", U"\u007a\u030c" },
+
1541 { "zcirc", U"\u007a\u0302" },
+
1542 { "zcy", U"\u0437" },
+
1543 { "zdot", U"\u017c" },
+
1544 { "zdot", U"\u007a\u0307" },
+
1545 { "zeta", U"\u03b6" },
+
1546 { "zgr", U"\u03b6" },
+
1547 { "zgrave", U"\u007a\u0300" },
+
1548 { "zhcy", U"\u0436" },
+
1549 { "zmacr", U"\u007a\u0304" },
+
1550 { "ztilde", U"\u007a\u0303" },
+
1551 { "zuml", U"\u007a\u0308" },
+
1552 { "zwj", U"\u200d" },
+
1553 { "zwnj", U"\u200c" },
+
1554 };
+
1555
+
1556 inline const size_t unicode_sgml[] = {
+
1557 0x5b6,
+
1558 0x48d,
+
1559 0x30d,
+
1560 0x4c3,
+
1561 0x457,
+
1562 0x2d2,
+
1563 0x497,
+
1564 0x1f1,
+
1565 0x1fb,
+
1566 0x3e6,
+
1567 0x4ec,
+
1568 0x1fe,
+
1569 0x4a6,
+
1570 0x29b,
+
1571 0x36e,
+
1572 0x498,
+
1573 0x528,
+
1574 0x299,
+
1575 0x515,
+
1576 0x3f1,
+
1577 0x303,
+
1578 0x353,
+
1579 0x4c1,
+
1580 0x29c,
+
1581 0xe,
+
1582 0x3,
+
1583 0x9,
+
1584 0x15,
+
1585 0x11,
+
1586 0x5,
+
1587 0xb,
+
1588 0x17,
+
1589 0x7,
+
1590 0x6,
+
1591 0x22,
+
1592 0x18,
+
1593 0x1d,
+
1594 0x24,
+
1595 0x23,
+
1596 0x1a,
+
1597 0x1f,
+
1598 0x25,
+
1599 0x1c,
+
1600 0x1b,
+
1601 0x33,
+
1602 0x28,
+
1603 0x30,
+
1604 0x36,
+
1605 0x35,
+
1606 0x2a,
+
1607 0x32,
+
1608 0x37,
+
1609 0x2d,
+
1610 0x2b,
+
1611 0x47,
+
1612 0x3c,
+
1613 0x42,
+
1614 0x4c,
+
1615 0x48,
+
1616 0x3e,
+
1617 0x44,
+
1618 0x4d,
+
1619 0x41,
+
1620 0x3f,
+
1621 0x61,
+
1622 0x54,
+
1623 0x5a,
+
1624 0x67,
+
1625 0x63,
+
1626 0x55,
+
1627 0x5d,
+
1628 0x69,
+
1629 0x58,
+
1630 0x56,
+
1631 0x71,
+
1632 0x6a,
+
1633 0x6e,
+
1634 0x73,
+
1635 0x72,
+
1636 0x6b,
+
1637 0x70,
+
1638 0x74,
+
1639 0x6d,
+
1640 0x6c,
+
1641 0x84,
+
1642 0x76,
+
1643 0x7e,
+
1644 0x87,
+
1645 0x85,
+
1646 0x79,
+
1647 0x81,
+
1648 0x88,
+
1649 0x7b,
+
1650 0x7a,
+
1651 0x91,
+
1652 0x8a,
+
1653 0x8f,
+
1654 0x94,
+
1655 0x92,
+
1656 0x8b,
+
1657 0x90,
+
1658 0x95,
+
1659 0x8d,
+
1660 0x8c,
+
1661 0xa7,
+
1662 0x9b,
+
1663 0xa0,
+
1664 0xad,
+
1665 0xa9,
+
1666 0x9c,
+
1667 0xa4,
+
1668 0xb0,
+
1669 0x9e,
+
1670 0x9d,
+
1671 0xb9,
+
1672 0xb1,
+
1673 0xb6,
+
1674 0xbc,
+
1675 0xba,
+
1676 0xb2,
+
1677 0xb8,
+
1678 0xbe,
+
1679 0xb4,
+
1680 0xb3,
+
1681 0xcc,
+
1682 0xc2,
+
1683 0xc8,
+
1684 0xce,
+
1685 0xcd,
+
1686 0xc4,
+
1687 0xca,
+
1688 0xcf,
+
1689 0xc6,
+
1690 0xc5,
+
1691 0xde,
+
1692 0xd2,
+
1693 0xda,
+
1694 0xe4,
+
1695 0xe0,
+
1696 0xd5,
+
1697 0xdc,
+
1698 0xe5,
+
1699 0xd8,
+
1700 0xd6,
+
1701 0xee,
+
1702 0xe6,
+
1703 0xea,
+
1704 0xf0,
+
1705 0xef,
+
1706 0xe7,
+
1707 0xec,
+
1708 0xf2,
+
1709 0xe9,
+
1710 0xe8,
+
1711 0xff,
+
1712 0xf5,
+
1713 0xfb,
+
1714 0x102,
+
1715 0x100,
+
1716 0xf6,
+
1717 0xfd,
+
1718 0x104,
+
1719 0xf9,
+
1720 0xf7,
+
1721 0x117,
+
1722 0x10a,
+
1723 0x110,
+
1724 0x11e,
+
1725 0x119,
+
1726 0x10b,
+
1727 0x113,
+
1728 0x120,
+
1729 0x10e,
+
1730 0x10c,
+
1731 0x12b,
+
1732 0x123,
+
1733 0x127,
+
1734 0x131,
+
1735 0x12e,
+
1736 0x124,
+
1737 0x129,
+
1738 0x132,
+
1739 0x126,
+
1740 0x125,
+
1741 0x139,
+
1742 0x133,
+
1743 0x137,
+
1744 0x13b,
+
1745 0x13a,
+
1746 0x134,
+
1747 0x138,
+
1748 0x13c,
+
1749 0x136,
+
1750 0x135,
+
1751 0x149,
+
1752 0x13e,
+
1753 0x145,
+
1754 0x14c,
+
1755 0x14b,
+
1756 0x140,
+
1757 0x147,
+
1758 0x14d,
+
1759 0x143,
+
1760 0x141,
+
1761 0x15d,
+
1762 0x152,
+
1763 0x159,
+
1764 0x160,
+
1765 0x15f,
+
1766 0x153,
+
1767 0x15b,
+
1768 0x162,
+
1769 0x156,
+
1770 0x154,
+
1771 0x173,
+
1772 0x168,
+
1773 0x16f,
+
1774 0x177,
+
1775 0x175,
+
1776 0x16a,
+
1777 0x171,
+
1778 0x178,
+
1779 0x16d,
+
1780 0x16b,
+
1781 0x189,
+
1782 0x17b,
+
1783 0x182,
+
1784 0x191,
+
1785 0x18b,
+
1786 0x17e,
+
1787 0x186,
+
1788 0x193,
+
1789 0x180,
+
1790 0x17f,
+
1791 0x19d,
+
1792 0x194,
+
1793 0x198,
+
1794 0x19f,
+
1795 0x19e,
+
1796 0x195,
+
1797 0x19b,
+
1798 0x1a0,
+
1799 0x197,
+
1800 0x196,
+
1801 0x1a9,
+
1802 0x1a2,
+
1803 0x1a7,
+
1804 0x1ab,
+
1805 0x1aa,
+
1806 0x1a3,
+
1807 0x1a8,
+
1808 0x1ac,
+
1809 0x1a5,
+
1810 0x1a4,
+
1811 0x1b4,
+
1812 0x1ad,
+
1813 0x1b1,
+
1814 0x1b7,
+
1815 0x1b6,
+
1816 0x1ae,
+
1817 0x1b2,
+
1818 0x1b8,
+
1819 0x1b0,
+
1820 0x1af,
+
1821 0x1c5,
+
1822 0x1bd,
+
1823 0x1c2,
+
1824 0x1c7,
+
1825 0x1c6,
+
1826 0x1be,
+
1827 0x1c4,
+
1828 0x1c9,
+
1829 0x1c0,
+
1830 0x1bf,
+
1831 0x1d7,
+
1832 0x1cc,
+
1833 0x1d1,
+
1834 0x1d9,
+
1835 0x1d8,
+
1836 0x1cd,
+
1837 0x1d4,
+
1838 0x1da,
+
1839 0x1d0,
+
1840 0x1ce,
+
1841 0x3ed,
+
1842 0x275,
+
1843 0x500,
+
1844 0x4ef,
+
1845 0x3e2,
+
1846 0x350,
+
1847 0x1ea,
+
1848 0x1dd,
+
1849 0x1e3,
+
1850 0x201,
+
1851 0x1ef,
+
1852 0x1df,
+
1853 0x1e6,
+
1854 0x203,
+
1855 0x1e1,
+
1856 0x1e0,
+
1857 0x23f,
+
1858 0x22f,
+
1859 0x234,
+
1860 0x276,
+
1861 0x245,
+
1862 0x231,
+
1863 0x237,
+
1864 0x278,
+
1865 0x233,
+
1866 0x232,
+
1867 0x28b,
+
1868 0x27c,
+
1869 0x286,
+
1870 0x2a6,
+
1871 0x298,
+
1872 0x280,
+
1873 0x288,
+
1874 0x2aa,
+
1875 0x283,
+
1876 0x281,
+
1877 0x2c4,
+
1878 0x2b2,
+
1879 0x2be,
+
1880 0x2d9,
+
1881 0x2d1,
+
1882 0x2ba,
+
1883 0x2c0,
+
1884 0x2dc,
+
1885 0x2bd,
+
1886 0x2bb,
+
1887 0x2f3,
+
1888 0x2e1,
+
1889 0x2e8,
+
1890 0x309,
+
1891 0x2f8,
+
1892 0x2e2,
+
1893 0x2ec,
+
1894 0x30b,
+
1895 0x2e5,
+
1896 0x2e3,
+
1897 0x31a,
+
1898 0x30f,
+
1899 0x313,
+
1900 0x333,
+
1901 0x31e,
+
1902 0x310,
+
1903 0x315,
+
1904 0x334,
+
1905 0x312,
+
1906 0x311,
+
1907 0x348,
+
1908 0x337,
+
1909 0x340,
+
1910 0x354,
+
1911 0x34c,
+
1912 0x33b,
+
1913 0x343,
+
1914 0x355,
+
1915 0x33d,
+
1916 0x33c,
+
1917 0x367,
+
1918 0x358,
+
1919 0x363,
+
1920 0x36b,
+
1921 0x368,
+
1922 0x35f,
+
1923 0x364,
+
1924 0x36c,
+
1925 0x361,
+
1926 0x360,
+
1927 0x380,
+
1928 0x371,
+
1929 0x376,
+
1930 0x391,
+
1931 0x383,
+
1932 0x372,
+
1933 0x37a,
+
1934 0x394,
+
1935 0x374,
+
1936 0x373,
+
1937 0x39d,
+
1938 0x395,
+
1939 0x39a,
+
1940 0x3a0,
+
1941 0x39e,
+
1942 0x396,
+
1943 0x39c,
+
1944 0x3a2,
+
1945 0x398,
+
1946 0x397,
+
1947 0x3ae,
+
1948 0x3a3,
+
1949 0x3aa,
+
1950 0x3b4,
+
1951 0x3b3,
+
1952 0x3a6,
+
1953 0x3ac,
+
1954 0x3b5,
+
1955 0x3a8,
+
1956 0x3a7,
+
1957 0x3d7,
+
1958 0x3ba,
+
1959 0x3ca,
+
1960 0x3f3,
+
1961 0x3dc,
+
1962 0x3c4,
+
1963 0x3ce,
+
1964 0x3f8,
+
1965 0x3c7,
+
1966 0x3c5,
+
1967 0x408,
+
1968 0x3fb,
+
1969 0x403,
+
1970 0x412,
+
1971 0x40f,
+
1972 0x400,
+
1973 0x406,
+
1974 0x415,
+
1975 0x402,
+
1976 0x401,
+
1977 0x430,
+
1978 0x41a,
+
1979 0x424,
+
1980 0x455,
+
1981 0x43e,
+
1982 0x41e,
+
1983 0x428,
+
1984 0x459,
+
1985 0x422,
+
1986 0x41f,
+
1987 0x474,
+
1988 0x461,
+
1989 0x469,
+
1990 0x488,
+
1991 0x47b,
+
1992 0x463,
+
1993 0x46e,
+
1994 0x48b,
+
1995 0x466,
+
1996 0x464,
+
1997 0x49c,
+
1998 0x48c,
+
1999 0x494,
+
2000 0x4b5,
+
2001 0x4aa,
+
2002 0x491,
+
2003 0x496,
+
2004 0x4b6,
+
2005 0x493,
+
2006 0x492,
+
2007 0x4be,
+
2008 0x4b8,
+
2009 0x4bc,
+
2010 0x4c0,
+
2011 0x4bf,
+
2012 0x4b9,
+
2013 0x4bd,
+
2014 0x4c2,
+
2015 0x4bb,
+
2016 0x4ba,
+
2017 0x4e2,
+
2018 0x4c7,
+
2019 0x4d7,
+
2020 0x4f3,
+
2021 0x4eb,
+
2022 0x4d1,
+
2023 0x4da,
+
2024 0x4f8,
+
2025 0x4d4,
+
2026 0x4d2,
+
2027 0x51b,
+
2028 0x4fb,
+
2029 0x50d,
+
2030 0x53a,
+
2031 0x525,
+
2032 0x4fe,
+
2033 0x512,
+
2034 0x541,
+
2035 0x503,
+
2036 0x4ff,
+
2037 0x55a,
+
2038 0x54c,
+
2039 0x554,
+
2040 0x570,
+
2041 0x568,
+
2042 0x54f,
+
2043 0x557,
+
2044 0x571,
+
2045 0x552,
+
2046 0x550,
+
2047 0x587,
+
2048 0x576,
+
2049 0x57f,
+
2050 0x599,
+
2051 0x58e,
+
2052 0x57b,
+
2053 0x584,
+
2054 0x59d,
+
2055 0x57d,
+
2056 0x57c,
+
2057 0x5ac,
+
2058 0x5a0,
+
2059 0x5a5,
+
2060 0x5b7,
+
2061 0x5ae,
+
2062 0x5a2,
+
2063 0x5a8,
+
2064 0x5b8,
+
2065 0x5a4,
+
2066 0x5a3,
+
2067 0x5c2,
+
2068 0x5b9,
+
2069 0x5be,
+
2070 0x5c5,
+
2071 0x5c3,
+
2072 0x5ba,
+
2073 0x5bf,
+
2074 0x5c6,
+
2075 0x5bc,
+
2076 0x5bb,
+
2077 0x5d0,
+
2078 0x5c7,
+
2079 0x5cc,
+
2080 0x5d7,
+
2081 0x5d5,
+
2082 0x5c8,
+
2083 0x5cd,
+
2084 0x5d8,
+
2085 0x5ca,
+
2086 0x5c9,
+
2087 0x5e5,
+
2088 0x5db,
+
2089 0x5e1,
+
2090 0x5e8,
+
2091 0x5e7,
+
2092 0x5dd,
+
2093 0x5e3,
+
2094 0x5eb,
+
2095 0x5df,
+
2096 0x5de,
+
2097 0x5f8,
+
2098 0x5ed,
+
2099 0x5f2,
+
2100 0x5fb,
+
2101 0x5fa,
+
2102 0x5ee,
+
2103 0x5f5,
+
2104 0x5fc,
+
2105 0x5f1,
+
2106 0x5ef,
+
2107 0x3cb,
+
2108 0x5ab,
+
2109 0x4d8,
+
2110 0x420,
+
2111 0x37c,
+
2112 0x28a,
+
2113 0x4ab,
+
2114 0x2ae,
+
2115 0x5e4,
+
2116 0x272,
+
2117 0x514,
+
2118 0x49,
+
2119 0x2ca,
+
2120 0x58f,
+
2121 0x2a2,
+
2122 0x483,
+
2123 0x3be,
+
2124 0x440,
+
2125 0x51f,
+
2126 0x4df,
+
2127 0x3fa,
+
2128 0x2c1,
+
2129 0x4a9,
+
2130 0x545,
+
2131 0x546,
+
2132 0x1e4,
+
2133 0x409,
+
2134 0x48f,
+
2135 0x40b,
+
2136 0x289,
+
2137 0x544,
+
2138 0x484,
+
2139 0x4ca,
+
2140 0x324,
+
2141 0x322,
+
2142 0x35a,
+
2143 0x32a,
+
2144 0x38e,
+
2145 0xd,
+
2146 0x2,
+
2147 0x8,
+
2148 0x14,
+
2149 0x16,
+
2150 0x13,
+
2151 0x0,
+
2152 0x2e,
+
2153 0x60,
+
2154 0x53,
+
2155 0x59,
+
2156 0x68,
+
2157 0xa6,
+
2158 0x9a,
+
2159 0x9f,
+
2160 0xaf,
+
2161 0x51,
+
2162 0x101,
+
2163 0x116,
+
2164 0x109,
+
2165 0x10f,
+
2166 0x11d,
+
2167 0x11f,
+
2168 0x566,
+
2169 0x11c,
+
2170 0x188,
+
2171 0x17a,
+
2172 0x181,
+
2173 0x192,
+
2174 0x1bc,
+
2175 0x164,
+
2176 0x54b,
+
2177 0x1e9,
+
2178 0x1dc,
+
2179 0x1e2,
+
2180 0x200,
+
2181 0x202,
+
2182 0x1fd,
+
2183 0x1e7,
+
2184 0x284,
+
2185 0x2f2,
+
2186 0x2e0,
+
2187 0x2e7,
+
2188 0x30a,
+
2189 0x37f,
+
2190 0x370,
+
2191 0x375,
+
2192 0x393,
+
2193 0x308,
+
2194 0x454,
+
2195 0x473,
+
2196 0x460,
+
2197 0x468,
+
2198 0x487,
+
2199 0x48a,
+
2200 0x2cb,
+
2201 0x485,
+
2202 0x586,
+
2203 0x575,
+
2204 0x57e,
+
2205 0x59c,
+
2206 0x5da,
+
2207 0x564,
+
2208 0x5ea,
+
2209 0x10,
+
2210 0x1ee,
+
2211 0x4,
+
2212 0x1de,
+
2213 0x12,
+
2214 0x1f8,
+
2215 0x27,
+
2216 0x27b,
+
2217 0x2f,
+
2218 0x285,
+
2219 0x31,
+
2220 0x287,
+
2221 0x2c,
+
2222 0x282,
+
2223 0x40,
+
2224 0x2bc,
+
2225 0x4b,
+
2226 0x2d8,
+
2227 0x62,
+
2228 0x2f7,
+
2229 0x5c,
+
2230 0x2eb,
+
2231 0x64,
+
2232 0x2ff,
+
2233 0x57,
+
2234 0x2e4,
+
2235 0x7d,
+
2236 0x33f,
+
2237 0x78,
+
2238 0x33a,
+
2239 0x80,
+
2240 0x342,
+
2241 0x7c,
+
2242 0x33e,
+
2243 0x8e,
+
2244 0x362,
+
2245 0x93,
+
2246 0x36a,
+
2247 0xac,
+
2248 0x390,
+
2249 0xa8,
+
2250 0x382,
+
2251 0xaa,
+
2252 0x38c,
+
2253 0xa3,
+
2254 0x387,
+
2255 0x388,
+
2256 0x97,
+
2257 0x381,
+
2258 0xb5,
+
2259 0x399,
+
2260 0xc7,
+
2261 0x3a9,
+
2262 0x3af,
+
2263 0xd1,
+
2264 0x3b9,
+
2265 0xd9,
+
2266 0x3c8,
+
2267 0xd7,
+
2268 0x3c6,
+
2269 0xe1,
+
2270 0x3dd,
+
2271 0xe2,
+
2272 0x3f0,
+
2273 0xf4,
+
2274 0x419,
+
2275 0xfa,
+
2276 0x423,
+
2277 0xf8,
+
2278 0x421,
+
2279 0x41c,
+
2280 0x50,
+
2281 0x2fd,
+
2282 0x118,
+
2283 0x47a,
+
2284 0x112,
+
2285 0x46c,
+
2286 0x105,
+
2287 0x470,
+
2288 0x13d,
+
2289 0x4c6,
+
2290 0x144,
+
2291 0x4d5,
+
2292 0x142,
+
2293 0x4d3,
+
2294 0x151,
+
2295 0x4fa,
+
2296 0x158,
+
2297 0x50c,
+
2298 0x157,
+
2299 0x506,
+
2300 0x155,
+
2301 0x502,
+
2302 0x16e,
+
2303 0x553,
+
2304 0x16c,
+
2305 0x551,
+
2306 0x176,
+
2307 0x56f,
+
2308 0x190,
+
2309 0x598,
+
2310 0x18a,
+
2311 0x58d,
+
2312 0x17d,
+
2313 0x57a,
+
2314 0x18f,
+
2315 0x597,
+
2316 0x184,
+
2317 0x581,
+
2318 0x18c,
+
2319 0x590,
+
2320 0x1a6,
+
2321 0x5bd,
+
2322 0x1c1,
+
2323 0x5e0,
+
2324 0x1c8,
+
2325 0x1cb,
+
2326 0x5ec,
+
2327 0x1d3,
+
2328 0x5f4,
+
2329 0x1cf,
+
2330 0x5f0,
+
2331 0x31f,
+
2332 0x10d,
+
2333 0x465,
+
2334 0x336,
+
2335 0x507,
+
2336 0x50a,
+
2337 0x508,
+
2338 0x50b,
+
2339 0x509,
+
2340 0x1fc,
+
2341 0x290,
+
2342 0x27f,
+
2343 0x271,
+
2344 0x2d3,
+
2345 0x4e7,
+
2346 0x471,
+
2347 0x565,
+
2348 0x2b9,
+
2349 0x1,
+
2350 0x52,
+
2351 0x4e,
+
2352 0x99,
+
2353 0x108,
+
2354 0x179,
+
2355 0x106,
+
2356 0x378,
+
2357 0xc,
+
2358 0xf,
+
2359 0x20,
+
2360 0x21,
+
2361 0x77,
+
2362 0x83,
+
2363 0x205,
+
2364 0x45,
+
2365 0x46,
+
2366 0x204,
+
2367 0x5f,
+
2368 0x65,
+
2369 0x1d5,
+
2370 0x1d6,
+
2371 0x4f,
+
2372 0x66,
+
2373 0x165,
+
2374 0x174,
+
2375 0x20c,
+
2376 0xa5,
+
2377 0xab,
+
2378 0xc3,
+
2379 0xcb,
+
2380 0xd3,
+
2381 0xdd,
+
2382 0x206,
+
2383 0xed,
+
2384 0xf1,
+
2385 0xfe,
+
2386 0x103,
+
2387 0x1b3,
+
2388 0x1b5,
+
2389 0x20e,
+
2390 0x115,
+
2391 0x11b,
+
2392 0x12a,
+
2393 0x12d,
+
2394 0x209,
+
2395 0x148,
+
2396 0x14a,
+
2397 0x15c,
+
2398 0x15e,
+
2399 0x20b,
+
2400 0x169,
+
2401 0x172,
+
2402 0x187,
+
2403 0x18d,
+
2404 0x18e,
+
2405 0x20d,
+
2406 0x121,
+
2407 0x12c,
+
2408 0x208,
+
2409 0x34,
+
2410 0xc0,
+
2411 0x122,
+
2412 0x130,
+
2413 0x20a,
+
2414 0x107,
+
2415 0x11a,
+
2416 0x207,
+
2417 0xa2,
+
2418 0x185,
+
2419 0x1db,
+
2420 0x2df,
+
2421 0x2ee,
+
2422 0x36f,
+
2423 0x582,
+
2424 0x1e8,
+
2425 0x1ed,
+
2426 0x20f,
+
2427 0x210,
+
2428 0x23c,
+
2429 0x23e,
+
2430 0x217,
+
2431 0x338,
+
2432 0x347,
+
2433 0x212,
+
2434 0x2c2,
+
2435 0x2c3,
+
2436 0x213,
+
2437 0x214,
+
2438 0x215,
+
2439 0x2f1,
+
2440 0x300,
+
2441 0x301,
+
2442 0x22e,
+
2443 0x5f6,
+
2444 0x5f7,
+
2445 0x216,
+
2446 0x2ef,
+
2447 0x307,
+
2448 0x22a,
+
2449 0x55c,
+
2450 0x55d,
+
2451 0x560,
+
2452 0x219,
+
2453 0x37e,
+
2454 0x38d,
+
2455 0x21a,
+
2456 0x3a4,
+
2457 0x3ad,
+
2458 0x21c,
+
2459 0x3bc,
+
2460 0x3d6,
+
2461 0x21d,
+
2462 0x407,
+
2463 0x413,
+
2464 0x21e,
+
2465 0x42f,
+
2466 0x456,
+
2467 0x22d,
+
2468 0x5cf,
+
2469 0x5d3,
+
2470 0x472,
+
2471 0x47d,
+
2472 0x222,
+
2473 0x49b,
+
2474 0x4a3,
+
2475 0x225,
+
2476 0x4e1,
+
2477 0x4e5,
+
2478 0x228,
+
2479 0x518,
+
2480 0x521,
+
2481 0x522,
+
2482 0x227,
+
2483 0x51a,
+
2484 0x520,
+
2485 0x229,
+
2486 0x54e,
+
2487 0x559,
+
2488 0x22c,
+
2489 0x585,
+
2490 0x592,
+
2491 0x594,
+
2492 0x220,
+
2493 0x49d,
+
2494 0x49e,
+
2495 0x49f,
+
2496 0x211,
+
2497 0x28e,
+
2498 0x3b1,
+
2499 0x224,
+
2500 0x4b3,
+
2501 0x4b4,
+
2502 0x476,
+
2503 0x47c,
+
2504 0x379,
+
2505 0x583,
+
2506 0x45f,
+
2507 0x574,
+
2508 0x21f,
+
2509 0x475,
+
2510 0x22b,
+
2511 0x55e,
+
2512 0x55f,
+
2513 0x593,
+
2514 0x221,
+
2515 0x4a0,
+
2516 0x223,
+
2517 0x4a4,
+
2518 0x218,
+
2519 0x339,
+
2520 0x21b,
+
2521 0x3a5,
+
2522 0x226,
+
2523 0x4e6,
+
2524 0x98,
+
2525 0x39,
+
2526 0x75,
+
2527 0xbd,
+
2528 0x3a,
+
2529 0xae,
+
2530 0x1ba,
+
2531 0xbb,
+
2532 0xd0,
+
2533 0xf3,
+
2534 0x166,
+
2535 0xc1,
+
2536 0x17c,
+
2537 0x3b,
+
2538 0xa,
+
2539 0x1e,
+
2540 0x199,
+
2541 0x7f,
+
2542 0x43,
+
2543 0x96,
+
2544 0x1ca,
+
2545 0x1d2,
+
2546 0xa1,
+
2547 0xb7,
+
2548 0xc9,
+
2549 0xdb,
+
2550 0xeb,
+
2551 0xfc,
+
2552 0x111,
+
2553 0x128,
+
2554 0x146,
+
2555 0x15a,
+
2556 0x170,
+
2557 0x183,
+
2558 0x6f,
+
2559 0xbf,
+
2560 0x167,
+
2561 0x26,
+
2562 0x14f,
+
2563 0x14e,
+
2564 0x89,
+
2565 0x1c3,
+
2566 0x150,
+
2567 0x5b,
+
2568 0x1bb,
+
2569 0x1b9,
+
2570 0x1e5,
+
2571 0x236,
+
2572 0x5a6,
+
2573 0x341,
+
2574 0x2bf,
+
2575 0x37b,
+
2576 0x5f9,
+
2577 0x5f3,
+
2578 0x377,
+
2579 0x39b,
+
2580 0x3ab,
+
2581 0x3cc,
+
2582 0x404,
+
2583 0x426,
+
2584 0x46a,
+
2585 0x495,
+
2586 0x4d9,
+
2587 0x510,
+
2588 0x555,
+
2589 0x580,
+
2590 0x314,
+
2591 0x3b0,
+
2592 0x56d,
+
2593 0x28c,
+
2594 0x51e,
+
2595 0x51d,
+
2596 0x35c,
+
2597 0x5e2,
+
2598 0x527,
+
2599 0x2ea,
+
2600 0x5e9,
+
2601 0x5dc,
+
2602 0x38b,
+
2603 0x2cd,
+
2604 0x34a,
+
2605 0x3a1,
+
2606 0x2d7,
+
2607 0x392,
+
2608 0x5e6,
+
2609 0x39f,
+
2610 0x3db,
+
2611 0x435,
+
2612 0x56e,
+
2613 0x3b2,
+
2614 0x579,
+
2615 0x2dd,
+
2616 0x5e,
+
2617 0x2ed,
+
2618 0x114,
+
2619 0x46f,
+
2620 0x2fe,
+
2621 0x2fa,
+
2622 0x2fb,
+
2623 0x2fc,
+
2624 0x45a,
+
2625 0x4b7,
+
2626 0x561,
+
2627 0x359,
+
2628 0x5fe,
+
2629 0x5fd,
+
2630 0x3e9,
+
2631 0x4ea,
+
2632 0x2b7,
+
2633 0x427,
+
2634 0x405,
+
2635 0x369,
+
2636 0x19c,
+
2637 0x3ee,
+
2638 0x4f1,
+
2639 0x4f0,
+
2640 0x3ef,
+
2641 0x4fd,
+
2642 0x3cf,
+
2643 0x4dc,
+
2644 0x4db,
+
2645 0x238,
+
2646 0x3d0,
+
2647 0x2b3,
+
2648 0x3d,
+
2649 0x277,
+
2650 0x438,
+
2651 0x366,
+
2652 0x40e,
+
2653 0x499,
+
2654 0x4ae,
+
2655 0x5af,
+
2656 0x12f,
+
2657 0x56a,
+
2658 0x270,
+
2659 0x3ea,
+
2660 0x4ed,
+
2661 0x479,
+
2662 0x27e,
+
2663 0x36d,
+
2664 0x331,
+
2665 0x30c,
+
2666 0x556,
+
2667 0x4a,
+
2668 0x385,
+
2669 0x35b,
+
2670 0x4a5,
+
2671 0x384,
+
2672 0x3bb,
+
2673 0x2f5,
+
2674 0x458,
+
2675 0x2a3,
+
2676 0x5c1,
+
2677 0x4dd,
+
2678 0x4f9,
+
2679 0x56b,
+
2680 0x477,
+
2681 0x1f7,
+
2682 0x23b,
+
2683 0x4a1,
+
2684 0x482,
+
2685 0x1eb,
+
2686 0x1ec,
+
2687 0x23d,
+
2688 0x349,
+
2689 0x2b4,
+
2690 0x323,
+
2691 0x328,
+
2692 0x325,
+
2693 0x329,
+
2694 0x32b,
+
2695 0x32d,
+
2696 0x326,
+
2697 0x32e,
+
2698 0x327,
+
2699 0x32c,
+
2700 0x32f,
+
2701 0x330,
+
2702 0x3bf,
+
2703 0x577,
+
2704 0x4cb,
+
2705 0x2b5,
+
2706 0x35d,
+
2707 0x5d1,
+
2708 0x5d2,
+
2709 0x5a1,
+
2710 0x45d,
+
2711 0x42a,
+
2712 0x2d4,
+
2713 0x2ce,
+
2714 0x437,
+
2715 0x446,
+
2716 0x4d0,
+
2717 0xd4,
+
2718 0x13f,
+
2719 0x3c3,
+
2720 0x4cf,
+
2721 0x3fe,
+
2722 0x3c1,
+
2723 0x4cd,
+
2724 0x3c2,
+
2725 0x4ce,
+
2726 0x35e,
+
2727 0x433,
+
2728 0x3eb,
+
2729 0x4ee,
+
2730 0x2a4,
+
2731 0x2a9,
+
2732 0x2ad,
+
2733 0x478,
+
2734 0x481,
+
2735 0x3d9,
+
2736 0x3d8,
+
2737 0x589,
+
2738 0x588,
+
2739 0x4e4,
+
2740 0x4e3,
+
2741 0x2c6,
+
2742 0x2c5,
+
2743 0x4e8,
+
2744 0x3e7,
+
2745 0x3c0,
+
2746 0x578,
+
2747 0x4cc,
+
2748 0x2b6,
+
2749 0x3e8,
+
2750 0x4e9,
+
2751 0x436,
+
2752 0x432,
+
2753 0x445,
+
2754 0x3b7,
+
2755 0x5d4,
+
2756 0x573,
+
2757 0x4c5,
+
2758 0x5d6,
+
2759 0x2b1,
+
2760 0x357,
+
2761 0x37d,
+
2762 0x59e,
+
2763 0x3b6,
+
2764 0x4c4,
+
2765 0x320,
+
2766 0x29d,
+
2767 0x490,
+
2768 0x30e,
+
2769 0x42c,
+
2770 0x2f9,
+
2771 0x418,
+
2772 0x38f,
+
2773 0x441,
+
2774 0x302,
+
2775 0x434,
+
2776 0x23a,
+
2777 0x4b0,
+
2778 0x1f0,
+
2779 0x2a1,
+
2780 0x4fc,
+
2781 0x540,
+
2782 0x40c,
+
2783 0x410,
+
2784 0x4a8,
+
2785 0x516,
+
2786 0x535,
+
2787 0x3e1,
+
2788 0x29e,
+
2789 0x4c8,
+
2790 0x4b1,
+
2791 0x5b0,
+
2792 0x386,
+
2793 0x1f4,
+
2794 0x1f3,
+
2795 0x1f5,
+
2796 0x1f6,
+
2797 0x40a,
+
2798 0x43f,
+
2799 0x48e,
+
2800 0x52a,
+
2801 0x442,
+
2802 0x44d,
+
2803 0x1f2,
+
2804 0x480,
+
2805 0x27d,
+
2806 0x2ab,
+
2807 0x389,
+
2808 0x2a0,
+
2809 0x55b,
+
2810 0x239,
+
2811 0x523,
+
2812 0x563,
+
2813 0x273,
+
2814 0x5c4,
+
2815 0x44b,
+
2816 0x524,
+
2817 0x44c,
+
2818 0x29f,
+
2819 0x425,
+
2820 0x1f9,
+
2821 0x1ff,
+
2822 0x562,
+
2823 0x41b,
+
2824 0x1fa,
+
2825 0x235,
+
2826 0x279,
+
2827 0x27a,
+
2828 0x306,
+
2829 0x2de,
+
2830 0x2f0,
+
2831 0x305,
+
2832 0x29a,
+
2833 0x2e9,
+
2834 0x2e6,
+
2835 0x296,
+
2836 0x5c0,
+
2837 0x56c,
+
2838 0x429,
+
2839 0x304,
+
2840 0x42b,
+
2841 0x3d1,
+
2842 0x3d3,
+
2843 0x344,
+
2844 0x346,
+
2845 0x3b8,
+
2846 0x335,
+
2847 0x3de,
+
2848 0x3df,
+
2849 0x3f9,
+
2850 0x34d,
+
2851 0x34e,
+
2852 0x356,
+
2853 0xe3,
+
2854 0x86,
+
2855 0x572,
+
2856 0x43b,
+
2857 0x431,
+
2858 0x439,
+
2859 0x43a,
+
2860 0x42d,
+
2861 0x42e,
+
2862 0x3ec,
+
2863 0x352,
+
2864 0x3d5,
+
2865 0x34b,
+
2866 0x4ac,
+
2867 0x501,
+
2868 0x2ac,
+
2869 0x4ad,
+
2870 0x504,
+
2871 0x505,
+
2872 0x4b2,
+
2873 0x50f,
+
2874 0x443,
+
2875 0x449,
+
2876 0x53b,
+
2877 0x543,
+
2878 0x44e,
+
2879 0x451,
+
2880 0x53c,
+
2881 0x53d,
+
2882 0x547,
+
2883 0x548,
+
2884 0x44f,
+
2885 0x450,
+
2886 0x452,
+
2887 0x453,
+
2888 0x53e,
+
2889 0x53f,
+
2890 0x5b2,
+
2891 0x5b3,
+
2892 0x549,
+
2893 0x54a,
+
2894 0x5b4,
+
2895 0x5b5,
+
2896 0x591,
+
2897 0x52d,
+
2898 0x52f,
+
2899 0x52e,
+
2900 0x530,
+
2901 0x52b,
+
2902 0x52c,
+
2903 0x47f,
+
2904 0x47e,
+
2905 0x489,
+
2906 0x486,
+
2907 0x46d,
+
2908 0x467,
+
2909 0x462,
+
2910 0x46b,
+
2911 0x4a7,
+
2912 0x40d,
+
2913 0x567,
+
2914 0x513,
+
2915 0x5a7,
+
2916 0x2b8,
+
2917 0x569,
+
2918 0x246,
+
2919 0x49a,
+
2920 0x411,
+
2921 0x59f,
+
2922 0x19a,
+
2923 0x1a1,
+
2924 0x45c,
+
2925 0x45b,
+
2926 0x417,
+
2927 0x416,
+
2928 0x5ad,
+
2929 0x5b1,
+
2930 0x3f6,
+
2931 0x4f6,
+
2932 0x414,
+
2933 0x38a,
+
2934 0x5a9,
+
2935 0x230,
+
2936 0x2c7,
+
2937 0x511,
+
2938 0x537,
+
2939 0x2cc,
+
2940 0x247,
+
2941 0x3f4,
+
2942 0x4f4,
+
2943 0x3f2,
+
2944 0x4f2,
+
2945 0x274,
+
2946 0x2af,
+
2947 0x2b0,
+
2948 0x161,
+
2949 0x163,
+
2950 0x29,
+
2951 0x38,
+
2952 0x321,
+
2953 0x3cd,
+
2954 0x351,
+
2955 0xdf,
+
2956 0x82,
+
2957 0x3d2,
+
2958 0x345,
+
2959 0x2f6,
+
2960 0x2f4,
+
2961 0x2a7,
+
2962 0x2a8,
+
2963 0x444,
+
2964 0x44a,
+
2965 0x3e0,
+
2966 0x34f,
+
2967 0x4af,
+
2968 0x50e,
+
2969 0x43c,
+
2970 0x447,
+
2971 0x43d,
+
2972 0x448,
+
2973 0x5aa,
+
2974 0x19,
+
2975 0x3c9,
+
2976 0x4d6,
+
2977 0x3d4,
+
2978 0x4e0,
+
2979 0x2d6,
+
2980 0x2d0,
+
2981 0x596,
+
2982 0x58c,
+
2983 0x558,
+
2984 0x54d,
+
2985 0x58b,
+
2986 0x595,
+
2987 0x2cf,
+
2988 0x2d5,
+
2989 0x332,
+
2990 0x519,
+
2991 0x526,
+
2992 0x536,
+
2993 0x3bd,
+
2994 0x4c9,
+
2995 0x240,
+
2996 0x45e,
+
2997 0x260,
+
2998 0x269,
+
2999 0x25f,
+
3000 0x25e,
+
3001 0x268,
+
3002 0x267,
+
3003 0x26f,
+
3004 0x26e,
+
3005 0x263,
+
3006 0x264,
+
3007 0x26d,
+
3008 0x24c,
+
3009 0x255,
+
3010 0x25d,
+
3011 0x24b,
+
3012 0x249,
+
3013 0x25c,
+
3014 0x24a,
+
3015 0x248,
+
3016 0x266,
+
3017 0x254,
+
3018 0x252,
+
3019 0x265,
+
3020 0x253,
+
3021 0x251,
+
3022 0x26c,
+
3023 0x25b,
+
3024 0x258,
+
3025 0x26b,
+
3026 0x25a,
+
3027 0x257,
+
3028 0x24f,
+
3029 0x261,
+
3030 0x24d,
+
3031 0x250,
+
3032 0x262,
+
3033 0x24e,
+
3034 0x26a,
+
3035 0x259,
+
3036 0x256,
+
3037 0x58a,
+
3038 0x3da,
+
3039 0x244,
+
3040 0x242,
+
3041 0x241,
+
3042 0x243,
+
3043 0x533,
+
3044 0x531,
+
3045 0x532,
+
3046 0x534,
+
3047 0x4de,
+
3048 0x3ff,
+
3049 0x5d9,
+
3050 0x59b,
+
3051 0x59a,
+
3052 0x4f7,
+
3053 0x4f5,
+
3054 0x5ce,
+
3055 0x2db,
+
3056 0x2da,
+
3057 0x3f7,
+
3058 0x3f5,
+
3059 0x2c8,
+
3060 0x3e3,
+
3061 0x28f,
+
3062 0x5cb,
+
3063 0x291,
+
3064 0x293,
+
3065 0x294,
+
3066 0x292,
+
3067 0x295,
+
3068 0x539,
+
3069 0x538,
+
3070 0x4a2,
+
3071 0x316,
+
3072 0x3fc,
+
3073 0x529,
+
3074 0x297,
+
3075 0x365,
+
3076 0x2c9,
+
3077 0x542,
+
3078 0x31c,
+
3079 0x41d,
+
3080 0x51c,
+
3081 0x28d,
+
3082 0x2a5,
+
3083 0x3fd,
+
3084 0x3e5,
+
3085 0x3e4,
+
3086 0x517,
+
3087 0x318,
+
3088 0x31b,
+
3089 0x31d,
+
3090 0x317,
+
3091 0x319,
+
3092 };
+
3094}
diff --git a/socket_8hpp_source.html b/socket_8hpp_source.html index 7535d57e0..f1dd952fb 100644 --- a/socket_8hpp_source.html +++ b/socket_8hpp_source.html @@ -115,7 +115,7 @@ $(function() { codefold.init(0); });
diff --git a/spinlock_8hpp_source.html b/spinlock_8hpp_source.html index f571f7b8e..1c7e4ea8f 100644 --- a/spinlock_8hpp_source.html +++ b/spinlock_8hpp_source.html @@ -159,7 +159,7 @@ $(function() { codefold.init(0); });
diff --git a/stream_8hpp_source.html b/stream_8hpp_source.html index 84eff3b9c..884c23e7c 100644 --- a/stream_8hpp_source.html +++ b/stream_8hpp_source.html @@ -4388,7 +4388,7 @@ $(function() { codefold.init(0); });
diff --git a/string_8hpp_source.html b/string_8hpp_source.html index 111b259a6..e414dab8e 100644 --- a/string_8hpp_source.html +++ b/string_8hpp_source.html @@ -159,13 +159,13 @@ $(function() { codefold.init(0); });
106 }
107
113 template <class T>
-
114 inline bool islbreak(_In_ T chr)
+
114 bool islbreak(_In_ T chr)
115 {
116 return chr == '\n' || chr == '\r';
117 }
118
127 template <class T>
-
128 inline size_t islbreak(_In_reads_or_z_opt_(count) const T* chr, _In_ size_t count)
+
128 size_t islbreak(_In_reads_or_z_opt_(count) const T* chr, _In_ size_t count)
129 {
130 _Assume_(chr || !count);
131 if (count >= 2 && ((chr[0] == '\r' && chr[1] == '\n') || (chr[0] == '\n' && chr[1] == '\r')))
@@ -176,1836 +176,1885 @@ $(function() { codefold.init(0); });
136 }
137
143 template <class T>
-
144 inline bool isspace(_In_ T chr)
+
144 bool isspace(_In_ T chr)
145 {
146 return chr == ' ' || chr == '\t' || chr == '\n' || chr == '\r' || chr == '\v' || chr == '\f';
147 }
148
154 template <class T>
-
155 inline bool islower(_In_ T chr)
+
155 bool islower(_In_ T chr)
156 {
157 return 'a' <= chr && chr <= 'z';
158 }
159
165 template <class T>
-
166 inline bool isupper(_In_ T chr)
+
166 bool isupper(_In_ T chr)
167 {
168 return 'A' <= chr && chr <= 'Z';
169 }
170
176 template <class T>
-
177 inline bool isdigit(_In_ T chr)
+
177 bool isdigit(_In_ T chr)
178 {
179 return '0' <= chr && chr <= '9';
180 }
181
187 template <class T>
-
188 inline bool isalpha(_In_ T chr)
+
188 bool isalpha(_In_ T chr)
189 {
190 return islower(chr) || isupper(chr);
191 }
192
198 template <class T>
-
199 inline bool is7bit(_In_ T chr)
+
199 bool is7bit(_In_ T chr)
200 {
201 return '\x00' <= chr && chr <= '\x7f';
202 }
203
-
210 inline size_t glyphlen(_In_reads_or_z_opt_(count) const wchar_t* glyph, _In_ size_t count)
+
210 inline size_t glyphlen(_In_reads_or_z_opt_(count) const utf16_t* glyph, _In_ size_t count)
211 {
212 _Assume_(glyph || !count);
213 if (count) {
-
214#ifdef _WIN32
-
215 size_t i = count < 2 || !is_surrogate_pair(glyph) ? 1 : 2;
-
216#else
-
217 size_t i = 1;
-
218#endif
-
219 for (; i < count && iscombining(glyph[i]); ++i);
-
220 return i;
-
221 }
-
222 return 0;
-
223 }
-
224
-
231 inline size_t glyphrlen(_In_reads_or_z_opt_(count) const wchar_t* str, _In_ size_t count)
-
232 {
-
233 _Assume_(count && str && str[count - 1]);
-
234 for (size_t i = count; i--;) {
-
235 if (!iscombining(str[i])) {
-
236#ifdef _WIN32
-
237 return count - (!is_low_surrogate(str[i]) || i == 0 || !is_high_surrogate(str[i - 1]) ? i : i - 1);
-
238#else
-
239 return count - i;
-
240#endif
-
241 }
-
242 }
-
243 return count;
-
244 }
-
245
-
253 template <class T>
-
254 inline T tolower(_In_ T chr)
-
255 {
-
256 return isupper(chr) ? chr | 0x20 : chr;
-
257 }
-
258
-
266 template <class T>
-
267 inline T toupper(_In_ T chr)
-
268 {
-
269 return islower(chr) ? chr | ~0x20 : chr;
-
270 }
-
271
-
279 template <class T>
-
280 inline size_t strlen(_In_z_ const T* str)
-
281 {
-
282 _Assume_(str);
-
283 size_t i;
-
284 for (i = 0; str[i]; ++i);
-
285 return i;
-
286 }
-
287
-
296 template <class T>
-
297 inline size_t strnlen(_In_reads_or_z_opt_(count) const T* str, _In_ size_t count)
-
298 {
-
299 _Assume_(str || !count);
-
300 size_t i;
-
301 for (i = 0; i < count && str[i]; ++i);
-
302 return i;
-
303 }
-
304
-
312 template <class T, size_t N>
-
313 inline size_t strnlen(_In_ const T (&str)[N])
-
314 {
-
315 return strnlen(str, N);
-
316 }
-
317
-
318 constexpr auto npos{ static_cast<size_t>(-1) };
-
319
-
328 template <class T>
-
329 inline size_t strchr(_In_z_ const T* str, _In_ T chr)
-
330 {
-
331 _Assume_(str);
-
332 for (size_t i = 0; str[i]; ++i)
-
333 if (str[i] == chr) return i;
-
334 return npos;
-
335 }
-
336
-
346 template <class T>
-
347 inline size_t strnchr(
-
348 _In_reads_or_z_opt_(count) const T* str,
-
349 _In_ size_t count,
-
350 _In_ T chr)
-
351 {
-
352 _Assume_(str || !count);
-
353 for (size_t i = 0; i < count && str[i]; ++i)
-
354 if (str[i] == chr) return i;
-
355 return npos;
-
356 }
-
357
-
366 template <class T, size_t N>
-
367 inline size_t strnchr(
-
368 _In_ const T (&str)[N],
-
369 _In_ T chr)
-
370 {
-
371 return strnchr(str, N, chr);
-
372 }
-
373
-
382 template <class T>
-
383 inline size_t strrchr(
-
384 _In_z_ const T* str,
-
385 _In_ T chr)
-
386 {
-
387 _Assume_(str);
-
388 size_t z = npos;
-
389 for (size_t i = 0; str[i]; ++i)
-
390 if (str[i] == chr) z = i;
-
391 return z;
-
392 }
-
393
-
403 template <class T>
-
404 inline size_t strrnchr(
-
405 _In_reads_or_z_opt_(count) const T* str,
-
406 _In_ size_t count,
-
407 _In_ T chr)
-
408 {
-
409 _Assume_(str || !count);
-
410 size_t z = npos;
-
411 for (size_t i = 0; i < count && str[i]; ++i)
-
412 if (str[i] == chr) z = i;
-
413 return z;
-
414 }
-
415
-
424 template <class T, size_t N>
-
425 inline size_t strrnchr(
-
426 _In_ const T (&str)[N],
-
427 _In_ T chr)
-
428 {
-
429 return strrnchr(str, N, chr);
-
430 }
-
431
-
440 template <class T>
-
441 inline size_t strichr(
-
442 _In_z_ const T* str,
-
443 _In_ T chr)
-
444 {
-
445 _Assume_(str);
-
446 chr = tolower(chr);
-
447 for (size_t i = 0; str[i]; ++i)
-
448 if (tolower(str[i]) == chr) return i;
-
449 return npos;
-
450 }
-
451
-
461 template <class T>
-
462 inline size_t strichr(
-
463 _In_z_ const T* str,
-
464 _In_ T chr,
-
465 _In_ const std::locale& locale)
-
466 {
-
467 _Assume_(str);
-
468 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
469 chr = ctype.tolower(chr);
-
470 for (size_t i = 0; str[i]; ++i)
-
471 if (ctype.tolower(str[i]) == chr) return i;
-
472 return npos;
-
473 }
-
474
-
484 template <class T>
-
485 inline size_t strnichr(
-
486 _In_reads_or_z_opt_(count) const T* str,
-
487 _In_ size_t count,
-
488 _In_ T chr)
-
489 {
-
490 _Assume_(str || !count);
-
491 chr = tolower(chr);
-
492 for (size_t i = 0; i < count && str[i]; ++i)
-
493 if (tolower(str[i]) == chr) return i;
-
494 return npos;
-
495 }
-
496
-
507 template <class T>
-
508 inline size_t strnichr(
-
509 _In_reads_or_z_opt_(count) const T* str,
-
510 _In_ size_t count,
-
511 _In_ T chr,
-
512 _In_ const std::locale& locale)
+
214 size_t i = count < 2 || !is_surrogate_pair(glyph) ? 1 : 2;
+
215 for (; i < count && iscombining(glyph[i]); ++i);
+
216 return i;
+
217 }
+
218 return 0;
+
219 }
+
220
+
227 inline size_t glyphlen(_In_reads_or_z_opt_(count) const utf32_t* glyph, _In_ size_t count)
+
228 {
+
229 _Assume_(glyph || !count);
+
230 if (count) {
+
231 size_t i = 1;
+
232 for (; i < count && iscombining(glyph[i]); ++i);
+
233 return i;
+
234 }
+
235 return 0;
+
236 }
+
237
+
244 inline size_t glyphrlen(_In_reads_or_z_opt_(count) const utf16_t* str, _In_ size_t count)
+
245 {
+
246 _Assume_(count && str && str[count - 1]);
+
247 for (size_t i = count; i--;) {
+
248 if (!iscombining(str[i]))
+
249 return count - (!is_low_surrogate(str[i]) || i == 0 || !is_high_surrogate(str[i - 1]) ? i : i - 1);
+
250 }
+
251 return count;
+
252 }
+
253
+
260 inline size_t glyphrlen(_In_reads_or_z_opt_(count) const utf32_t* str, _In_ size_t count)
+
261 {
+
262 _Assume_(count && str && str[count - 1]);
+
263 for (size_t i = count; i--;) {
+
264 if (!iscombining(str[i]))
+
265 return count - (i == 0 ? i : i - 1);
+
266 }
+
267 return count;
+
268 }
+
269
+
277 template <class T>
+
278 T tolower(_In_ T chr)
+
279 {
+
280 return isupper(chr) ? chr | 0x20 : chr;
+
281 }
+
282
+
290 template <class T>
+
291 T toupper(_In_ T chr)
+
292 {
+
293 return islower(chr) ? chr | ~0x20 : chr;
+
294 }
+
295
+
303 template <class T>
+
304 size_t strlen(_In_z_ const T* str)
+
305 {
+
306 _Assume_(str);
+
307 size_t i;
+
308 for (i = 0; str[i]; ++i);
+
309 return i;
+
310 }
+
311
+
320 template <class T>
+
321 size_t strnlen(_In_reads_or_z_opt_(count) const T* str, _In_ size_t count)
+
322 {
+
323 _Assume_(str || !count);
+
324 size_t i;
+
325 for (i = 0; i < count && str[i]; ++i);
+
326 return i;
+
327 }
+
328
+
336 template <class T, size_t N>
+
337 size_t strnlen(_In_ const T (&str)[N])
+
338 {
+
339 return strnlen(str, N);
+
340 }
+
341
+
342 constexpr auto npos{ static_cast<size_t>(-1) };
+
343
+
352 template <class T>
+
353 size_t strchr(_In_z_ const T* str, _In_ T chr)
+
354 {
+
355 _Assume_(str);
+
356 for (size_t i = 0; str[i]; ++i)
+
357 if (str[i] == chr) return i;
+
358 return npos;
+
359 }
+
360
+
370 template <class T>
+
371 size_t strnchr(
+
372 _In_reads_or_z_opt_(count) const T* str,
+
373 _In_ size_t count,
+
374 _In_ T chr)
+
375 {
+
376 _Assume_(str || !count);
+
377 for (size_t i = 0; i < count && str[i]; ++i)
+
378 if (str[i] == chr) return i;
+
379 return npos;
+
380 }
+
381
+
390 template <class T, size_t N>
+
391 size_t strnchr(
+
392 _In_ const T (&str)[N],
+
393 _In_ T chr)
+
394 {
+
395 return strnchr(str, N, chr);
+
396 }
+
397
+
406 template <class T>
+
407 size_t strrchr(
+
408 _In_z_ const T* str,
+
409 _In_ T chr)
+
410 {
+
411 _Assume_(str);
+
412 size_t z = npos;
+
413 for (size_t i = 0; str[i]; ++i)
+
414 if (str[i] == chr) z = i;
+
415 return z;
+
416 }
+
417
+
427 template <class T>
+
428 size_t strrnchr(
+
429 _In_reads_or_z_opt_(count) const T* str,
+
430 _In_ size_t count,
+
431 _In_ T chr)
+
432 {
+
433 _Assume_(str || !count);
+
434 size_t z = npos;
+
435 for (size_t i = 0; i < count && str[i]; ++i)
+
436 if (str[i] == chr) z = i;
+
437 return z;
+
438 }
+
439
+
448 template <class T, size_t N>
+
449 size_t strrnchr(
+
450 _In_ const T (&str)[N],
+
451 _In_ T chr)
+
452 {
+
453 return strrnchr(str, N, chr);
+
454 }
+
455
+
464 template <class T>
+
465 size_t strichr(
+
466 _In_z_ const T* str,
+
467 _In_ T chr)
+
468 {
+
469 _Assume_(str);
+
470 chr = tolower(chr);
+
471 for (size_t i = 0; str[i]; ++i)
+
472 if (tolower(str[i]) == chr) return i;
+
473 return npos;
+
474 }
+
475
+
485 template <class T>
+
486 size_t strichr(
+
487 _In_z_ const T* str,
+
488 _In_ T chr,
+
489 _In_ const std::locale& locale)
+
490 {
+
491 _Assume_(str);
+
492 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
493 chr = ctype.tolower(chr);
+
494 for (size_t i = 0; str[i]; ++i)
+
495 if (ctype.tolower(str[i]) == chr) return i;
+
496 return npos;
+
497 }
+
498
+
508 template <class T>
+
509 size_t strnichr(
+
510 _In_reads_or_z_opt_(count) const T* str,
+
511 _In_ size_t count,
+
512 _In_ T chr)
513 {
514 _Assume_(str || !count);
-
515 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
516 chr = ctype.tolower(chr);
-
517 for (size_t i = 0; i < count && str[i]; ++i)
-
518 if (ctype.tolower(str[i]) == chr) return i;
-
519 return npos;
-
520 }
-
521
-
530 template <class T, size_t N>
-
531 inline size_t strnichr(
-
532 _In_ const T (&str)[N],
-
533 _In_ T chr)
-
534 {
-
535 return strnichr(str, N, chr);
-
536 }
-
537
-
547 template <class T, size_t N>
-
548 inline size_t strnichr(
-
549 _In_ const T (&str)[N],
-
550 _In_ T chr,
-
551 _In_ const std::locale& locale)
-
552 {
-
553 return strnichr(str, N, chr, locale);
-
554 }
-
555
-
564 template <class T>
-
565 inline size_t strrichr(
-
566 _In_z_ const T* str,
-
567 _In_ T chr)
-
568 {
-
569 _Assume_(str);
-
570 chr = tolower(chr);
-
571 size_t z = npos;
-
572 for (size_t i = 0; str[i]; ++i)
-
573 if (tolower(str[i]) == chr) z = i;
-
574 return z;
-
575 }
-
576
-
586 template <class T>
-
587 inline size_t strrichr(
-
588 _In_reads_or_z_opt_(count) const T* str,
-
589 _In_ T chr,
-
590 _In_ const std::locale& locale)
-
591 {
-
592 _Assume_(str);
-
593 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
594 chr = ctype.tolower(chr);
+
515 chr = tolower(chr);
+
516 for (size_t i = 0; i < count && str[i]; ++i)
+
517 if (tolower(str[i]) == chr) return i;
+
518 return npos;
+
519 }
+
520
+
531 template <class T>
+
532 size_t strnichr(
+
533 _In_reads_or_z_opt_(count) const T* str,
+
534 _In_ size_t count,
+
535 _In_ T chr,
+
536 _In_ const std::locale& locale)
+
537 {
+
538 _Assume_(str || !count);
+
539 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
540 chr = ctype.tolower(chr);
+
541 for (size_t i = 0; i < count && str[i]; ++i)
+
542 if (ctype.tolower(str[i]) == chr) return i;
+
543 return npos;
+
544 }
+
545
+
554 template <class T, size_t N>
+
555 size_t strnichr(
+
556 _In_ const T (&str)[N],
+
557 _In_ T chr)
+
558 {
+
559 return strnichr(str, N, chr);
+
560 }
+
561
+
571 template <class T, size_t N>
+
572 size_t strnichr(
+
573 _In_ const T (&str)[N],
+
574 _In_ T chr,
+
575 _In_ const std::locale& locale)
+
576 {
+
577 return strnichr(str, N, chr, locale);
+
578 }
+
579
+
588 template <class T>
+
589 size_t strrichr(
+
590 _In_z_ const T* str,
+
591 _In_ T chr)
+
592 {
+
593 _Assume_(str);
+
594 chr = tolower(chr);
595 size_t z = npos;
596 for (size_t i = 0; str[i]; ++i)
-
597 if (ctype.tolower(str[i]) == chr) z = i;
+
597 if (tolower(str[i]) == chr) z = i;
598 return z;
599 }
600
610 template <class T>
-
611 inline size_t strrnichr(
+
611 size_t strrichr(
612 _In_reads_or_z_opt_(count) const T* str,
-
613 _In_ size_t count,
-
614 _In_ T chr)
+
613 _In_ T chr,
+
614 _In_ const std::locale& locale)
615 {
-
616 _Assume_(str || !count);
-
617 chr = tolower(chr);
-
618 size_t z = npos;
-
619 for (size_t i = 0; i < count && str[i]; ++i)
-
620 if (tolower(str[i]) == chr) z = i;
-
621 return z;
-
622 }
-
623
+
616 _Assume_(str);
+
617 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
618 chr = ctype.tolower(chr);
+
619 size_t z = npos;
+
620 for (size_t i = 0; str[i]; ++i)
+
621 if (ctype.tolower(str[i]) == chr) z = i;
+
622 return z;
+
623 }
+
624
634 template <class T>
-
635 inline size_t strrnichr(
+
635 size_t strrnichr(
636 _In_reads_or_z_opt_(count) const T* str,
637 _In_ size_t count,
-
638 _In_ T chr,
-
639 _In_ const std::locale& locale)
-
640 {
-
641 _Assume_(str || !count);
-
642 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
643 chr = ctype.tolower(chr);
-
644 size_t z = npos;
-
645 for (size_t i = 0; i < count && str[i]; ++i)
-
646 if (ctype.tolower(str[i]) == chr) z = i;
-
647 return z;
-
648 }
-
649
-
658 template <class T, size_t N>
-
659 inline size_t strrnichr(
-
660 _In_ const T (&str)[N],
-
661 _In_ T chr)
-
662 {
-
663 return strrnichr(str, N, chr);
-
664 }
-
665
-
675 template <class T, size_t N>
-
676 inline size_t strrnichr(
-
677 _In_ const T (&str)[N],
-
678 _In_ T chr,
-
679 _In_ const std::locale& locale)
-
680 {
-
681 return strrnichr(str, N, chr, locale);
-
682 }
-
683
-
691 //template <class T>
-
692 //inline bool isblank(_In_z_ const T* str)
-
693 //{
-
694 // _Assume_(str);
-
695 // for (size_t i = 0; str[i]; ++i)
-
696 // if (!isspace(str[i]))
-
697 // return false;
-
698 // return true;
-
699 //}
-
700
-
709 //template <class T>
-
710 //inline bool isblank(
-
711 // _In_z_ const T* str,
-
712 // _In_ const std::locale& locale)
-
713 //{
-
714 // _Assume_(str);
-
715 // const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
716 // for (size_t i = 0; str[i]; ++i)
-
717 // if (!ctype.is(ctype.space, str[i]))
-
718 // return false;
-
719 // return true;
-
720 //}
-
721
-
730 template <class T>
-
731 inline bool isblank(
-
732 _In_reads_or_z_opt_(count) const T* str,
-
733 _In_ size_t count)
-
734 {
-
735 _Assume_(str || !count);
-
736 for (size_t i = 0; i < count && str[i]; ++i)
-
737 if (!isspace(str[i]))
-
738 return false;
-
739 return true;
-
740 }
-
741
-
751 template <class T>
-
752 inline bool isblank(
-
753 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
-
754 _In_ const std::locale& locale)
-
755 {
-
756 _Assume_(str || !count);
-
757 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
758 for (size_t i = 0; i < count && str[i]; ++i)
-
759 if (!ctype.is(ctype.space, str[i]))
-
760 return false;
-
761 return true;
-
762 }
-
763
-
771 template <class T, size_t N>
-
772 inline bool isblank(_In_ const T (&str)[N])
-
773 {
-
774 return isblank(str, N);
-
775 }
-
776
-
785 template <class T, size_t N>
-
786 inline bool isblank(
-
787 _In_ const T (&str)[N],
-
788 _In_ const std::locale& locale)
-
789 {
-
790 return isblank(str, N, locale);
-
791 }
-
792
-
793 // ///
-
794 // /// Checks if string contains all-ASCII characters
-
795 // ///
-
796 // /// \param[in] str String
-
797 // ///
-
798 // /// \return `true` if all characters are ASCII or `false` when any non-ASCII character is found in string.
-
799 // ///
-
800 // template <class T>
-
801 // inline bool is7bit(_In_z_ const T* str)
-
802 // {
-
803 // _Assume_(str);
-
804 // for (size_t i = 0; str[i]; i++)
-
805 // if (!is7bit(str[i]))
-
806 // return false;
-
807 // return true;
-
808 // }
-
809
-
818 template <class T>
-
819 inline bool is7bit(_In_reads_or_z_opt_(count) const T* str, _In_ size_t count)
-
820 {
-
821 _Assume_(str || !count);
-
822 for (size_t i = 0; i < count && str[i]; i++)
-
823 if (!is7bit(str[i]))
-
824 return false;
-
825 return true;
-
826 }
-
827
-
835 template <class T, size_t N>
-
836 inline bool is7bit(_In_ const T (&str)[N])
-
837 {
-
838 return is7bit(str, N);
-
839 }
-
840
-
849 template <class T1, class T2>
-
850 inline int strcmp(_In_z_ const T1* str1, _In_z_ const T2* str2)
-
851 {
-
852 _Assume_(str1);
-
853 _Assume_(str2);
-
854 size_t i; T1 a; T2 b;
-
855 for (i = 0; (a = str1[i]) | (b = str2[i]); ++i) {
-
856 if (a > b) return +1;
-
857 if (a < b) return -1;
-
858 }
-
859 if (str1[i]) return +1;
-
860 if (str2[i]) return -1;
-
861 return 0;
-
862 }
-
863
+
638 _In_ T chr)
+
639 {
+
640 _Assume_(str || !count);
+
641 chr = tolower(chr);
+
642 size_t z = npos;
+
643 for (size_t i = 0; i < count && str[i]; ++i)
+
644 if (tolower(str[i]) == chr) z = i;
+
645 return z;
+
646 }
+
647
+
658 template <class T>
+
659 size_t strrnichr(
+
660 _In_reads_or_z_opt_(count) const T* str,
+
661 _In_ size_t count,
+
662 _In_ T chr,
+
663 _In_ const std::locale& locale)
+
664 {
+
665 _Assume_(str || !count);
+
666 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
667 chr = ctype.tolower(chr);
+
668 size_t z = npos;
+
669 for (size_t i = 0; i < count && str[i]; ++i)
+
670 if (ctype.tolower(str[i]) == chr) z = i;
+
671 return z;
+
672 }
+
673
+
682 template <class T, size_t N>
+
683 size_t strrnichr(
+
684 _In_ const T (&str)[N],
+
685 _In_ T chr)
+
686 {
+
687 return strrnichr(str, N, chr);
+
688 }
+
689
+
699 template <class T, size_t N>
+
700 size_t strrnichr(
+
701 _In_ const T (&str)[N],
+
702 _In_ T chr,
+
703 _In_ const std::locale& locale)
+
704 {
+
705 return strrnichr(str, N, chr, locale);
+
706 }
+
707
+
715 //template <class T>
+
716 //bool isblank(_In_z_ const T* str)
+
717 //{
+
718 // _Assume_(str);
+
719 // for (size_t i = 0; str[i]; ++i)
+
720 // if (!isspace(str[i]))
+
721 // return false;
+
722 // return true;
+
723 //}
+
724
+
733 //template <class T>
+
734 //bool isblank(
+
735 // _In_z_ const T* str,
+
736 // _In_ const std::locale& locale)
+
737 //{
+
738 // _Assume_(str);
+
739 // const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
740 // for (size_t i = 0; str[i]; ++i)
+
741 // if (!ctype.is(ctype.space, str[i]))
+
742 // return false;
+
743 // return true;
+
744 //}
+
745
+
754 template <class T>
+
755 bool isblank(
+
756 _In_reads_or_z_opt_(count) const T* str,
+
757 _In_ size_t count)
+
758 {
+
759 _Assume_(str || !count);
+
760 for (size_t i = 0; i < count && str[i]; ++i)
+
761 if (!isspace(str[i]))
+
762 return false;
+
763 return true;
+
764 }
+
765
+
775 template <class T>
+
776 bool isblank(
+
777 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
+
778 _In_ const std::locale& locale)
+
779 {
+
780 _Assume_(str || !count);
+
781 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
782 for (size_t i = 0; i < count && str[i]; ++i)
+
783 if (!ctype.is(ctype.space, str[i]))
+
784 return false;
+
785 return true;
+
786 }
+
787
+
795 template <class T, size_t N>
+
796 bool isblank(_In_ const T (&str)[N])
+
797 {
+
798 return isblank(str, N);
+
799 }
+
800
+
809 template <class T, size_t N>
+
810 bool isblank(
+
811 _In_ const T (&str)[N],
+
812 _In_ const std::locale& locale)
+
813 {
+
814 return isblank(str, N, locale);
+
815 }
+
816
+
817 // ///
+
818 // /// Checks if string contains all-ASCII characters
+
819 // ///
+
820 // /// \param[in] str String
+
821 // ///
+
822 // /// \return `true` if all characters are ASCII or `false` when any non-ASCII character is found in string.
+
823 // ///
+
824 // template <class T>
+
825 // bool is7bit(_In_z_ const T* str)
+
826 // {
+
827 // _Assume_(str);
+
828 // for (size_t i = 0; str[i]; i++)
+
829 // if (!is7bit(str[i]))
+
830 // return false;
+
831 // return true;
+
832 // }
+
833
+
842 template <class T>
+
843 bool is7bit(_In_reads_or_z_opt_(count) const T* str, _In_ size_t count)
+
844 {
+
845 _Assume_(str || !count);
+
846 for (size_t i = 0; i < count && str[i]; i++)
+
847 if (!is7bit(str[i]))
+
848 return false;
+
849 return true;
+
850 }
+
851
+
859 template <class T, size_t N>
+
860 bool is7bit(_In_ const T (&str)[N])
+
861 {
+
862 return is7bit(str, N);
+
863 }
+
864
873 template <class T1, class T2>
-
874 inline int strncmp(_In_reads_or_z_opt_(count) const T1* str1, _In_reads_or_z_opt_(count) const T2* str2, _In_ size_t count)
+
874 int strcmp(_In_z_ const T1* str1, _In_z_ const T2* str2)
875 {
-
876 _Assume_(str1 || !count);
-
877 _Assume_(str2 || !count);
+
876 _Assume_(str1);
+
877 _Assume_(str2);
878 size_t i; T1 a; T2 b;
-
879 for (i = 0; i < count && ((a = str1[i]) | (b = str2[i])); ++i) {
+
879 for (i = 0; (a = str1[i]) | (b = str2[i]); ++i) {
880 if (a > b) return +1;
881 if (a < b) return -1;
882 }
-
883 if (i < count && str1[i]) return +1;
-
884 if (i < count && str2[i]) return -1;
+
883 if (str1[i]) return +1;
+
884 if (str2[i]) return -1;
885 return 0;
886 }
887
-
898 template <class T1, class T2>
-
899 inline int strncmp(
-
900 _In_reads_or_z_opt_(count1) const T1* str1, _In_ size_t count1,
-
901 _In_reads_or_z_opt_(count2) const T2* str2, _In_ size_t count2)
-
902 {
-
903 _Assume_(str1 || !count1);
-
904 _Assume_(str2 || !count2);
-
905 size_t i; T1 a; T2 b;
-
906 for (i = 0; i < count1 && i < count2 && ((a = str1[i]) | (b = str2[i])); ++i) {
-
907 if (a > b) return +1;
-
908 if (a < b) return -1;
-
909 }
-
910 if (i < count1 && str1[i]) return +1;
-
911 if (i < count2 && str2[i]) return -1;
-
912 return 0;
-
913 }
-
914
-
923 template <class T1, size_t N1, class T2, size_t N2>
-
924 inline int strncmp(
-
925 _In_ const T1 (&str1)[N1],
-
926 _In_ const T2 (&str2)[N2])
-
927 {
-
928 return strncmp(str1, N1, str2, N2);
-
929 }
-
930
-
939 template <class T1, class T2>
-
940 inline int strrcmp(_In_z_ const T1* str1, _In_z_ const T2* str2)
-
941 {
-
942 size_t
-
943 i = strlen(str1),
-
944 j = strlen(str2);
-
945 _Assume_(str1 || !i);
-
946 _Assume_(str2 || !j);
-
947 size_t k; T1 a; T2 b;
-
948 for (k = 1; i && j; k++) {
-
949 i--; j--;
-
950 if ((a = str1[i]) > (b = str2[j])) return +1;
-
951 if (a < b) return -1;
-
952 }
-
953 if (i && !j) return +1;
-
954 if (!i && j) return -1;
-
955 return 0;
-
956 }
-
957
-
967 template <class T1, class T2>
-
968 inline int strrncmp(_In_reads_or_z_opt_(count) const T1* str1, _In_reads_or_z_opt_(count) const T2* str2, _In_ size_t count)
-
969 {
-
970 size_t
-
971 i = strnlen(str1, count),
-
972 j = strnlen(str2, count);
-
973 _Assume_(str1 || !i);
-
974 _Assume_(str2 || !j);
-
975 size_t k; T1 a; T2 b;
-
976 for (k = 1; i && j; k++) {
-
977 i--; j--;
-
978 if ((a = str1[i]) > (b = str2[j])) return +1;
-
979 if (a < b) return -1;
-
980 }
-
981 if (i && !j) return +1;
-
982 if (!i && j) return -1;
-
983 return 0;
-
984 }
-
985
-
996 template <class T1, class T2>
-
997 inline int strrncmp(
-
998 _In_reads_or_z_opt_(count1) const T1* str1, _In_ size_t count1,
-
999 _In_reads_or_z_opt_(count2) const T2* str2, _In_ size_t count2)
-
1000 {
-
1001 size_t
-
1002 i = strnlen(str1, count1),
-
1003 j = strnlen(str2, count2);
-
1004 _Assume_(str1 || !i);
-
1005 _Assume_(str2 || !j);
-
1006 size_t k; T1 a; T2 b;
-
1007 for (k = 1; i && j; k++) {
-
1008 i--; j--;
-
1009 if ((a = str1[i]) > (b = str2[j])) return +1;
-
1010 if (a < b) return -1;
-
1011 }
-
1012 if (i && !j) return +1;
-
1013 if (!i && j) return -1;
-
1014 return 0;
-
1015 }
-
1016
-
1025 template <class T1, size_t N1, class T2, size_t N2>
-
1026 inline int strrncmp(
-
1027 _In_ const T1 (&str1)[N1],
-
1028 _In_ const T2 (&str2)[N2])
-
1029 {
-
1030 return strrncmp(str1, N1, str2, N2);
-
1031 }
-
1032
-
1041 template <class T1, class T2>
-
1042 inline int stricmp(_In_z_ const T1* str1, _In_z_ const T2* str2)
-
1043 {
-
1044 _Assume_(str1);
-
1045 _Assume_(str2);
-
1046 size_t i; T1 a; T2 b;
-
1047 for (i = 0; (a = tolower(str1[i])) | (b = tolower(str2[i])); ++i) {
-
1048 if (a > b) return +1;
-
1049 if (a < b) return -1;
-
1050 }
-
1051 if (str1[i]) return +1;
-
1052 if (str2[i]) return -1;
-
1053 return 0;
-
1054 }
-
1055
-
1065 template <class T1, class T2>
-
1066 inline int stricmp(_In_z_ const T1* str1, _In_z_ const T2* str2, _In_ const std::locale& locale)
-
1067 {
-
1068 _Assume_(str1);
-
1069 _Assume_(str2);
-
1070 size_t i; T1 a; T2 b;
-
1071 const auto& ctype1 = std::use_facet<std::ctype<T1>>(locale);
-
1072 const auto& ctype2 = std::use_facet<std::ctype<T2>>(locale);
-
1073 for (i = 0; (a = ctype1.tolower(str1[i])) | (b = ctype2.tolower(str2[i])); ++i) {
-
1074 if (a > b) return +1;
-
1075 if (a < b) return -1;
-
1076 }
-
1077 if (str1[i]) return +1;
-
1078 if (str2[i]) return -1;
-
1079 return 0;
-
1080 }
-
1081
-
1091 template <class T1, class T2>
-
1092 inline int strnicmp(_In_reads_or_z_opt_(count) const T1* str1, _In_reads_or_z_opt_(count) const T2* str2, _In_ size_t count)
-
1093 {
-
1094 _Assume_(str1 || !count);
-
1095 _Assume_(str2 || !count);
-
1096 size_t i; T1 a; T2 b;
-
1097 for (i = 0; i < count && ((a = tolower(str1[i])) | (b = tolower(str2[i]))); ++i) {
-
1098 if (a > b) return +1;
-
1099 if (a < b) return -1;
-
1100 }
-
1101 if (i < count && str1[i]) return +1;
-
1102 if (i < count && str2[i]) return -1;
-
1103 return 0;
-
1104 }
-
1105
-
1116 template <class T1, class T2>
-
1117 inline int strnicmp(_In_reads_or_z_opt_(count) const T1* str1, _In_reads_or_z_opt_(count) const T2* str2, _In_ size_t count, _In_ const std::locale& locale)
-
1118 {
-
1119 _Assume_(str1 || !count);
-
1120 _Assume_(str2 || !count);
-
1121 size_t i; T1 a; T2 b;
-
1122 const auto& ctype1 = std::use_facet<std::ctype<T1>>(locale);
-
1123 const auto& ctype2 = std::use_facet<std::ctype<T2>>(locale);
-
1124 for (i = 0; i < count && ((a = ctype1.tolower(str1[i])) | (b = ctype2.tolower(str2[i]))); ++i) {
-
1125 if (a > b) return +1;
-
1126 if (a < b) return -1;
-
1127 }
-
1128 if (i < count && str1[i]) return +1;
-
1129 if (i < count && str2[i]) return -1;
-
1130 return 0;
-
1131 }
-
1132
-
1143 template <class T1, class T2>
-
1144 inline int strnicmp(
-
1145 _In_reads_or_z_opt_(count1) const T1* str1, _In_ size_t count1,
-
1146 _In_reads_or_z_opt_(count2) const T2* str2, _In_ size_t count2)
-
1147 {
-
1148 _Assume_(str1 || !count1);
-
1149 _Assume_(str2 || !count2);
-
1150 size_t i; T1 a; T2 b;
-
1151 for (i = 0; i < count1 && i < count2 && ((a = tolower(str1[i])) | (b = tolower(str2[i]))); ++i) {
-
1152 if (a > b) return +1;
-
1153 if (a < b) return -1;
-
1154 }
-
1155 if (i < count1 && str1[i]) return +1;
-
1156 if (i < count2 && str2[i]) return -1;
-
1157 return 0;
-
1158 }
-
1159
-
1171 template <class T1, class T2>
-
1172 inline int strnicmp(
-
1173 _In_reads_or_z_opt_(count1) const T1* str1, _In_ size_t count1,
-
1174 _In_reads_or_z_opt_(count2) const T2* str2, _In_ size_t count2,
-
1175 _In_ const std::locale& locale)
-
1176 {
-
1177 _Assume_(str1 || !count1);
-
1178 _Assume_(str2 || !count2);
-
1179 size_t i; T1 a; T2 b;
-
1180 const auto& ctype1 = std::use_facet<std::ctype<T1>>(locale);
-
1181 const auto& ctype2 = std::use_facet<std::ctype<T2>>(locale);
-
1182 for (i = 0; i < count1 && i < count2 && ((a = ctype1.tolower(str1[i])) | (b = ctype2.tolower(str2[i]))); ++i) {
-
1183 if (a > b) return +1;
-
1184 if (a < b) return -1;
-
1185 }
-
1186 if (i < count1 && str1[i]) return +1;
-
1187 if (i < count2 && str2[i]) return -1;
-
1188 return 0;
-
1189 }
-
1190
-
1199 template <class T1, size_t N1, class T2, size_t N2>
-
1200 inline int strnicmp(
-
1201 _In_ const T1 (&str1)[N1],
-
1202 _In_ const T2 (&str2)[N2])
-
1203 {
-
1204 strnicmp(str1, N1, str2, N2);
-
1205 }
-
1206
-
1216 template <class T1, size_t N1, class T2, size_t N2>
-
1217 inline int strnicmp(
-
1218 _In_ const T1 (&str1)[N1],
-
1219 _In_ const T2 (&str2)[N2],
-
1220 _In_ const std::locale& locale)
-
1221 {
-
1222 strnicmp(str1, N1, str2, N2, locale);
-
1223 }
-
1224
-
1234 template <class T>
-
1235 inline int strcoll(
-
1236 _In_z_ const T* str1,
-
1237 _In_z_ const T* str2,
-
1238 _In_ const std::locale& locale)
-
1239 {
-
1240 _Assume_(str1);
-
1241 _Assume_(str2);
-
1242 auto& collate = std::use_facet<std::collate<T>>(locale);
-
1243 return collate.compare(str1, str1 + strlen(str1), str2, str2 + strlen(str2));
-
1244 }
-
1245
-
1257 template <class T>
-
1258 inline int strncoll(
-
1259 _In_reads_or_z_opt_(count1) const T* str1, _In_ size_t count1,
-
1260 _In_reads_or_z_opt_(count2) const T* str2, _In_ size_t count2,
-
1261 _In_ const std::locale& locale)
-
1262 {
-
1263 _Assume_(str1 || !count1);
-
1264 _Assume_(str2 || !count2);
-
1265 auto& collate = std::use_facet<std::collate<T>>(locale);
-
1266 return collate.compare(str1, str1 + count1, str2, str2 + count2);
-
1267 }
-
1268
-
1278 template <class T, size_t N1, size_t N2>
-
1279 inline int strncoll(
-
1280 _In_ const T (&str1)[N1],
-
1281 _In_ const T (&str2)[N2],
-
1282 _In_ const std::locale& locale)
-
1283 {
-
1284 return strncoll(str1, N1, str2, N2, locale);
-
1285 }
-
1286
-
1295 template <class T1, class T2>
-
1296 inline size_t strstr(
-
1297 _In_z_ const T1* str,
-
1298 _In_z_ const T2* sample)
-
1299 {
-
1300 _Assume_(str);
-
1301 _Assume_(sample);
-
1302 for (size_t offset = 0;; ++offset) {
-
1303 for (size_t i = offset, j = 0;; ++i, ++j) {
-
1304 if (!sample[j])
-
1305 return offset;
-
1306 if (!str[i])
-
1307 return npos;
-
1308 if (str[i] != sample[j])
-
1309 break;
-
1310 }
-
1311 }
-
1312 }
-
1313
-
1323 template <class T1, class T2>
-
1324 inline size_t strnstr(
-
1325 _In_reads_or_z_opt_(count) const T1* str, _In_ size_t count,
-
1326 _In_z_ const T2* sample)
-
1327 {
-
1328 _Assume_(str || !count);
-
1329 _Assume_(sample);
-
1330 for (size_t offset = 0;; ++offset) {
-
1331 for (size_t i = offset, j = 0;; ++i, ++j) {
-
1332 if (!sample[j])
-
1333 return offset;
-
1334 if (i >= count || !str[i])
-
1335 return npos;
-
1336 if (str[i] != sample[j])
-
1337 break;
-
1338 }
-
1339 }
-
1340 }
-
1341
-
1350 template <class T1, size_t N1, class T2>
-
1351 inline size_t strnstr(
-
1352 _In_ const T1 (&str)[N1],
-
1353 _In_z_ const T2* sample)
-
1354 {
-
1355 return strnstr(str, N1, sample);
-
1356 }
-
1357
-
1366 template <class T1, class T2>
-
1367 inline size_t stristr(
-
1368 _In_z_ const T1* str,
-
1369 _In_z_ const T2* sample)
-
1370 {
-
1371 _Assume_(str);
-
1372 _Assume_(sample);
-
1373 for (size_t offset = 0;; ++offset) {
-
1374 for (size_t i = offset, j = 0;; ++i, ++j) {
-
1375 if (!sample[j])
-
1376 return offset;
-
1377 if (!str[i])
-
1378 return npos;
-
1379 if (tolower(str[i]) != tolower(sample[j]))
-
1380 break;
-
1381 }
-
1382 }
-
1383 }
-
1384
-
1394 template <class T1, class T2>
-
1395 inline size_t stristr(
-
1396 _In_z_ const T1* str,
-
1397 _In_z_ const T2* sample,
-
1398 _In_ const std::locale& locale)
-
1399 {
-
1400 _Assume_(str);
-
1401 _Assume_(sample);
-
1402 const auto& ctype1 = std::use_facet<std::ctype<T1>>(locale);
-
1403 const auto& ctype2 = std::use_facet<std::ctype<T2>>(locale);
-
1404 for (size_t offset = 0;; ++offset) {
-
1405 for (size_t i = offset, j = 0;; ++i, ++j) {
-
1406 if (!sample[j])
-
1407 return offset;
-
1408 if (!str[i])
-
1409 return npos;
-
1410 if (ctype1.tolower(str[i]) != ctype2.tolower(sample[j]))
-
1411 break;
-
1412 }
-
1413 }
-
1414 }
-
1415
-
1425 template <class T1, class T2>
-
1426 inline size_t strnistr(
-
1427 _In_reads_or_z_opt_(count) const T1* str,
-
1428 _In_ size_t count,
-
1429 _In_z_ const T2* sample)
-
1430 {
-
1431 _Assume_(str || !count);
-
1432 _Assume_(sample);
-
1433 for (size_t offset = 0;; ++offset) {
-
1434 for (size_t i = offset, j = 0;; ++i, ++j) {
-
1435 if (!sample[j])
-
1436 return offset;
-
1437 if (i >= count || !str[i])
-
1438 return npos;
-
1439 if (tolower(str[i]) != tolower(sample[j]))
-
1440 break;
-
1441 }
-
1442 }
-
1443 }
-
1444
-
1455 template <class T1, class T2>
-
1456 inline size_t strnistr(
-
1457 _In_reads_or_z_opt_(count) const T1* str,
-
1458 _In_ size_t count,
-
1459 _In_z_ const T2* sample,
-
1460 _In_ const std::locale& locale)
-
1461 {
-
1462 _Assume_(str || !count);
-
1463 _Assume_(sample);
-
1464 const auto& ctype1 = std::use_facet<std::ctype<T1>>(locale);
-
1465 const auto& ctype2 = std::use_facet<std::ctype<T2>>(locale);
-
1466 for (size_t offset = 0;; ++offset) {
-
1467 for (size_t i = offset, j = 0;; ++i, ++j) {
-
1468 if (!sample[j])
-
1469 return offset;
-
1470 if (i >= count || !str[i])
-
1471 return npos;
-
1472 if (ctype1.tolower(str[i]) != ctype2.tolower(sample[j]))
-
1473 break;
-
1474 }
-
1475 }
-
1476 }
-
1477
-
1486 template <class T1, size_t N1, class T2>
-
1487 inline size_t strnistr(
-
1488 _In_ const T1 (&str)[N1],
-
1489 _In_z_ const T2* sample)
-
1490 {
-
1491 return strnistr(str, N1, sample);
-
1492 }
-
1493
-
1503 template <class T1, size_t N1, class T2>
-
1504 inline size_t strnistr(
-
1505 _In_ const T1 (&str)[N1],
-
1506 _In_z_ const T2* sample,
-
1507 _In_ const std::locale& locale)
-
1508 {
-
1509 return strnistr(str, N1, sample, locale);
-
1510 }
-
1511
-
1520 template <class T1, class T2>
-
1521 inline size_t strcpy(
-
1522 _Out_writes_z_(_String_length_(src) + 1) T1* dst,
-
1523 _In_z_ const T2* src)
-
1524 {
-
1525 _Assume_(dst);
-
1526 _Assume_(src);
-
1527 for (size_t i = 0; ; ++i) {
-
1528 if ((dst[i] = static_cast<T1>(src[i])) == 0)
-
1529 return i;
-
1530 }
-
1531 }
-
1532
-
1542 template <class T1, class T2>
-
1543 inline size_t strncpy(
-
1544 _Out_writes_(count) _Post_maybez_ T1* dst,
-
1545 _In_reads_or_z_opt_(count) const T2* src, _In_ size_t count)
-
1546 {
-
1547 _Assume_(dst || !count);
-
1548 _Assume_(src || !count);
-
1549 for (size_t i = 0; ; ++i) {
-
1550 if (i >= count)
-
1551 return i;
-
1552 if ((dst[i] = static_cast<T1>(src[i])) == 0)
-
1553 return i;
+
897 template <class T1, class T2>
+
898 int strncmp(_In_reads_or_z_opt_(count) const T1* str1, _In_reads_or_z_opt_(count) const T2* str2, _In_ size_t count)
+
899 {
+
900 _Assume_(str1 || !count);
+
901 _Assume_(str2 || !count);
+
902 size_t i; T1 a; T2 b;
+
903 for (i = 0; i < count && ((a = str1[i]) | (b = str2[i])); ++i) {
+
904 if (a > b) return +1;
+
905 if (a < b) return -1;
+
906 }
+
907 if (i < count && str1[i]) return +1;
+
908 if (i < count && str2[i]) return -1;
+
909 return 0;
+
910 }
+
911
+
922 template <class T1, class T2>
+
923 int strncmp(
+
924 _In_reads_or_z_opt_(count1) const T1* str1, _In_ size_t count1,
+
925 _In_reads_or_z_opt_(count2) const T2* str2, _In_ size_t count2)
+
926 {
+
927 _Assume_(str1 || !count1);
+
928 _Assume_(str2 || !count2);
+
929 size_t i; T1 a; T2 b;
+
930 for (i = 0; i < count1 && i < count2 && ((a = str1[i]) | (b = str2[i])); ++i) {
+
931 if (a > b) return +1;
+
932 if (a < b) return -1;
+
933 }
+
934 if (i < count1 && str1[i]) return +1;
+
935 if (i < count2 && str2[i]) return -1;
+
936 return 0;
+
937 }
+
938
+
947 template <class T1, size_t N1, class T2, size_t N2>
+
948 int strncmp(
+
949 _In_ const T1 (&str1)[N1],
+
950 _In_ const T2 (&str2)[N2])
+
951 {
+
952 return strncmp(str1, N1, str2, N2);
+
953 }
+
954
+
965 inline int strncmp(
+
966 _In_reads_or_z_opt_(count1) const utf32_t* str1, _In_ size_t count1,
+
967 _In_reads_or_z_opt_(count2) const utf16_t* str2, _In_ size_t count2)
+
968 {
+
969 _Assume_(str1 || !count1);
+
970 _Assume_(str2 || !count2);
+
971 size_t i, j, j_next; utf32_t a, b;
+
972 for (i = 0, j = 0; i < count1 && j < count2; ++i, j = j_next) {
+
973 a = str1[i];
+
974 if (!a)
+
975 break;
+
976 if (j + 1 >= count2 || !is_surrogate_pair(&str2[j])) {
+
977 b = static_cast<utf32_t>(str2[j]);
+
978 j_next = j + 1;
+
979 }
+
980 else {
+
981 b = surrogate_pair_to_ucs4(&str2[j]);
+
982 j_next = j + 2;
+
983 }
+
984 if (!b)
+
985 break;
+
986 if (a > b) return +1;
+
987 if (a < b) return -1;
+
988 }
+
989 if (i < count1 && str1[i]) return +1;
+
990 if (j < count2 && str2[j]) return -1;
+
991 return 0;
+
992 }
+
993
+
1002 template <size_t N1, size_t N2>
+
1003 int strncmp(
+
1004 _In_ const utf32_t (&str1)[N1],
+
1005 _In_ const utf16_t (&str2)[N2])
+
1006 {
+
1007 return strncmp(str1, N1, str2, N2);
+
1008 }
+
1009
+
1018 template <class T1, class T2>
+
1019 int strrcmp(_In_z_ const T1* str1, _In_z_ const T2* str2)
+
1020 {
+
1021 size_t
+
1022 i = strlen(str1),
+
1023 j = strlen(str2);
+
1024 _Assume_(str1 || !i);
+
1025 _Assume_(str2 || !j);
+
1026 size_t k; T1 a; T2 b;
+
1027 for (k = 1; i && j; k++) {
+
1028 i--; j--;
+
1029 if ((a = str1[i]) > (b = str2[j])) return +1;
+
1030 if (a < b) return -1;
+
1031 }
+
1032 if (i && !j) return +1;
+
1033 if (!i && j) return -1;
+
1034 return 0;
+
1035 }
+
1036
+
1046 template <class T1, class T2>
+
1047 int strrncmp(_In_reads_or_z_opt_(count) const T1* str1, _In_reads_or_z_opt_(count) const T2* str2, _In_ size_t count)
+
1048 {
+
1049 size_t
+
1050 i = strnlen(str1, count),
+
1051 j = strnlen(str2, count);
+
1052 _Assume_(str1 || !i);
+
1053 _Assume_(str2 || !j);
+
1054 size_t k; T1 a; T2 b;
+
1055 for (k = 1; i && j; k++) {
+
1056 i--; j--;
+
1057 if ((a = str1[i]) > (b = str2[j])) return +1;
+
1058 if (a < b) return -1;
+
1059 }
+
1060 if (i && !j) return +1;
+
1061 if (!i && j) return -1;
+
1062 return 0;
+
1063 }
+
1064
+
1075 template <class T1, class T2>
+
1076 int strrncmp(
+
1077 _In_reads_or_z_opt_(count1) const T1* str1, _In_ size_t count1,
+
1078 _In_reads_or_z_opt_(count2) const T2* str2, _In_ size_t count2)
+
1079 {
+
1080 size_t
+
1081 i = strnlen(str1, count1),
+
1082 j = strnlen(str2, count2);
+
1083 _Assume_(str1 || !i);
+
1084 _Assume_(str2 || !j);
+
1085 size_t k; T1 a; T2 b;
+
1086 for (k = 1; i && j; k++) {
+
1087 i--; j--;
+
1088 if ((a = str1[i]) > (b = str2[j])) return +1;
+
1089 if (a < b) return -1;
+
1090 }
+
1091 if (i && !j) return +1;
+
1092 if (!i && j) return -1;
+
1093 return 0;
+
1094 }
+
1095
+
1104 template <class T1, size_t N1, class T2, size_t N2>
+
1105 int strrncmp(
+
1106 _In_ const T1 (&str1)[N1],
+
1107 _In_ const T2 (&str2)[N2])
+
1108 {
+
1109 return strrncmp(str1, N1, str2, N2);
+
1110 }
+
1111
+
1120 template <class T1, class T2>
+
1121 int stricmp(_In_z_ const T1* str1, _In_z_ const T2* str2)
+
1122 {
+
1123 _Assume_(str1);
+
1124 _Assume_(str2);
+
1125 size_t i; T1 a; T2 b;
+
1126 for (i = 0; (a = tolower(str1[i])) | (b = tolower(str2[i])); ++i) {
+
1127 if (a > b) return +1;
+
1128 if (a < b) return -1;
+
1129 }
+
1130 if (str1[i]) return +1;
+
1131 if (str2[i]) return -1;
+
1132 return 0;
+
1133 }
+
1134
+
1144 template <class T1, class T2>
+
1145 int stricmp(_In_z_ const T1* str1, _In_z_ const T2* str2, _In_ const std::locale& locale)
+
1146 {
+
1147 _Assume_(str1);
+
1148 _Assume_(str2);
+
1149 size_t i; T1 a; T2 b;
+
1150 const auto& ctype1 = std::use_facet<std::ctype<T1>>(locale);
+
1151 const auto& ctype2 = std::use_facet<std::ctype<T2>>(locale);
+
1152 for (i = 0; (a = ctype1.tolower(str1[i])) | (b = ctype2.tolower(str2[i])); ++i) {
+
1153 if (a > b) return +1;
+
1154 if (a < b) return -1;
+
1155 }
+
1156 if (str1[i]) return +1;
+
1157 if (str2[i]) return -1;
+
1158 return 0;
+
1159 }
+
1160
+
1170 template <class T1, class T2>
+
1171 int strnicmp(_In_reads_or_z_opt_(count) const T1* str1, _In_reads_or_z_opt_(count) const T2* str2, _In_ size_t count)
+
1172 {
+
1173 _Assume_(str1 || !count);
+
1174 _Assume_(str2 || !count);
+
1175 size_t i; T1 a; T2 b;
+
1176 for (i = 0; i < count && ((a = tolower(str1[i])) | (b = tolower(str2[i]))); ++i) {
+
1177 if (a > b) return +1;
+
1178 if (a < b) return -1;
+
1179 }
+
1180 if (i < count && str1[i]) return +1;
+
1181 if (i < count && str2[i]) return -1;
+
1182 return 0;
+
1183 }
+
1184
+
1195 template <class T1, class T2>
+
1196 int strnicmp(_In_reads_or_z_opt_(count) const T1* str1, _In_reads_or_z_opt_(count) const T2* str2, _In_ size_t count, _In_ const std::locale& locale)
+
1197 {
+
1198 _Assume_(str1 || !count);
+
1199 _Assume_(str2 || !count);
+
1200 size_t i; T1 a; T2 b;
+
1201 const auto& ctype1 = std::use_facet<std::ctype<T1>>(locale);
+
1202 const auto& ctype2 = std::use_facet<std::ctype<T2>>(locale);
+
1203 for (i = 0; i < count && ((a = ctype1.tolower(str1[i])) | (b = ctype2.tolower(str2[i]))); ++i) {
+
1204 if (a > b) return +1;
+
1205 if (a < b) return -1;
+
1206 }
+
1207 if (i < count && str1[i]) return +1;
+
1208 if (i < count && str2[i]) return -1;
+
1209 return 0;
+
1210 }
+
1211
+
1222 template <class T1, class T2>
+
1223 int strnicmp(
+
1224 _In_reads_or_z_opt_(count1) const T1* str1, _In_ size_t count1,
+
1225 _In_reads_or_z_opt_(count2) const T2* str2, _In_ size_t count2)
+
1226 {
+
1227 _Assume_(str1 || !count1);
+
1228 _Assume_(str2 || !count2);
+
1229 size_t i; T1 a; T2 b;
+
1230 for (i = 0; i < count1 && i < count2 && ((a = tolower(str1[i])) | (b = tolower(str2[i]))); ++i) {
+
1231 if (a > b) return +1;
+
1232 if (a < b) return -1;
+
1233 }
+
1234 if (i < count1 && str1[i]) return +1;
+
1235 if (i < count2 && str2[i]) return -1;
+
1236 return 0;
+
1237 }
+
1238
+
1250 template <class T1, class T2>
+
1251 int strnicmp(
+
1252 _In_reads_or_z_opt_(count1) const T1* str1, _In_ size_t count1,
+
1253 _In_reads_or_z_opt_(count2) const T2* str2, _In_ size_t count2,
+
1254 _In_ const std::locale& locale)
+
1255 {
+
1256 _Assume_(str1 || !count1);
+
1257 _Assume_(str2 || !count2);
+
1258 size_t i; T1 a; T2 b;
+
1259 const auto& ctype1 = std::use_facet<std::ctype<T1>>(locale);
+
1260 const auto& ctype2 = std::use_facet<std::ctype<T2>>(locale);
+
1261 for (i = 0; i < count1 && i < count2 && ((a = ctype1.tolower(str1[i])) | (b = ctype2.tolower(str2[i]))); ++i) {
+
1262 if (a > b) return +1;
+
1263 if (a < b) return -1;
+
1264 }
+
1265 if (i < count1 && str1[i]) return +1;
+
1266 if (i < count2 && str2[i]) return -1;
+
1267 return 0;
+
1268 }
+
1269
+
1278 template <class T1, size_t N1, class T2, size_t N2>
+
1279 int strnicmp(
+
1280 _In_ const T1 (&str1)[N1],
+
1281 _In_ const T2 (&str2)[N2])
+
1282 {
+
1283 strnicmp(str1, N1, str2, N2);
+
1284 }
+
1285
+
1295 template <class T1, size_t N1, class T2, size_t N2>
+
1296 int strnicmp(
+
1297 _In_ const T1 (&str1)[N1],
+
1298 _In_ const T2 (&str2)[N2],
+
1299 _In_ const std::locale& locale)
+
1300 {
+
1301 strnicmp(str1, N1, str2, N2, locale);
+
1302 }
+
1303
+
1313 template <class T>
+
1314 int strcoll(
+
1315 _In_z_ const T* str1,
+
1316 _In_z_ const T* str2,
+
1317 _In_ const std::locale& locale)
+
1318 {
+
1319 _Assume_(str1);
+
1320 _Assume_(str2);
+
1321 auto& collate = std::use_facet<std::collate<T>>(locale);
+
1322 return collate.compare(str1, str1 + strlen(str1), str2, str2 + strlen(str2));
+
1323 }
+
1324
+
1336 template <class T>
+
1337 int strncoll(
+
1338 _In_reads_or_z_opt_(count1) const T* str1, _In_ size_t count1,
+
1339 _In_reads_or_z_opt_(count2) const T* str2, _In_ size_t count2,
+
1340 _In_ const std::locale& locale)
+
1341 {
+
1342 _Assume_(str1 || !count1);
+
1343 _Assume_(str2 || !count2);
+
1344 auto& collate = std::use_facet<std::collate<T>>(locale);
+
1345 return collate.compare(str1, str1 + count1, str2, str2 + count2);
+
1346 }
+
1347
+
1357 template <class T, size_t N1, size_t N2>
+
1358 int strncoll(
+
1359 _In_ const T (&str1)[N1],
+
1360 _In_ const T (&str2)[N2],
+
1361 _In_ const std::locale& locale)
+
1362 {
+
1363 return strncoll(str1, N1, str2, N2, locale);
+
1364 }
+
1365
+
1374 template <class T1, class T2>
+
1375 size_t strstr(
+
1376 _In_z_ const T1* str,
+
1377 _In_z_ const T2* sample)
+
1378 {
+
1379 _Assume_(str);
+
1380 _Assume_(sample);
+
1381 for (size_t offset = 0;; ++offset) {
+
1382 for (size_t i = offset, j = 0;; ++i, ++j) {
+
1383 if (!sample[j])
+
1384 return offset;
+
1385 if (!str[i])
+
1386 return npos;
+
1387 if (str[i] != sample[j])
+
1388 break;
+
1389 }
+
1390 }
+
1391 }
+
1392
+
1402 template <class T1, class T2>
+
1403 size_t strnstr(
+
1404 _In_reads_or_z_opt_(count) const T1* str, _In_ size_t count,
+
1405 _In_z_ const T2* sample)
+
1406 {
+
1407 _Assume_(str || !count);
+
1408 _Assume_(sample);
+
1409 for (size_t offset = 0;; ++offset) {
+
1410 for (size_t i = offset, j = 0;; ++i, ++j) {
+
1411 if (!sample[j])
+
1412 return offset;
+
1413 if (i >= count || !str[i])
+
1414 return npos;
+
1415 if (str[i] != sample[j])
+
1416 break;
+
1417 }
+
1418 }
+
1419 }
+
1420
+
1429 template <class T1, size_t N1, class T2>
+
1430 size_t strnstr(
+
1431 _In_ const T1 (&str)[N1],
+
1432 _In_z_ const T2* sample)
+
1433 {
+
1434 return strnstr(str, N1, sample);
+
1435 }
+
1436
+
1445 template <class T1, class T2>
+
1446 size_t stristr(
+
1447 _In_z_ const T1* str,
+
1448 _In_z_ const T2* sample)
+
1449 {
+
1450 _Assume_(str);
+
1451 _Assume_(sample);
+
1452 for (size_t offset = 0;; ++offset) {
+
1453 for (size_t i = offset, j = 0;; ++i, ++j) {
+
1454 if (!sample[j])
+
1455 return offset;
+
1456 if (!str[i])
+
1457 return npos;
+
1458 if (tolower(str[i]) != tolower(sample[j]))
+
1459 break;
+
1460 }
+
1461 }
+
1462 }
+
1463
+
1473 template <class T1, class T2>
+
1474 size_t stristr(
+
1475 _In_z_ const T1* str,
+
1476 _In_z_ const T2* sample,
+
1477 _In_ const std::locale& locale)
+
1478 {
+
1479 _Assume_(str);
+
1480 _Assume_(sample);
+
1481 const auto& ctype1 = std::use_facet<std::ctype<T1>>(locale);
+
1482 const auto& ctype2 = std::use_facet<std::ctype<T2>>(locale);
+
1483 for (size_t offset = 0;; ++offset) {
+
1484 for (size_t i = offset, j = 0;; ++i, ++j) {
+
1485 if (!sample[j])
+
1486 return offset;
+
1487 if (!str[i])
+
1488 return npos;
+
1489 if (ctype1.tolower(str[i]) != ctype2.tolower(sample[j]))
+
1490 break;
+
1491 }
+
1492 }
+
1493 }
+
1494
+
1504 template <class T1, class T2>
+
1505 size_t strnistr(
+
1506 _In_reads_or_z_opt_(count) const T1* str,
+
1507 _In_ size_t count,
+
1508 _In_z_ const T2* sample)
+
1509 {
+
1510 _Assume_(str || !count);
+
1511 _Assume_(sample);
+
1512 for (size_t offset = 0;; ++offset) {
+
1513 for (size_t i = offset, j = 0;; ++i, ++j) {
+
1514 if (!sample[j])
+
1515 return offset;
+
1516 if (i >= count || !str[i])
+
1517 return npos;
+
1518 if (tolower(str[i]) != tolower(sample[j]))
+
1519 break;
+
1520 }
+
1521 }
+
1522 }
+
1523
+
1534 template <class T1, class T2>
+
1535 size_t strnistr(
+
1536 _In_reads_or_z_opt_(count) const T1* str,
+
1537 _In_ size_t count,
+
1538 _In_z_ const T2* sample,
+
1539 _In_ const std::locale& locale)
+
1540 {
+
1541 _Assume_(str || !count);
+
1542 _Assume_(sample);
+
1543 const auto& ctype1 = std::use_facet<std::ctype<T1>>(locale);
+
1544 const auto& ctype2 = std::use_facet<std::ctype<T2>>(locale);
+
1545 for (size_t offset = 0;; ++offset) {
+
1546 for (size_t i = offset, j = 0;; ++i, ++j) {
+
1547 if (!sample[j])
+
1548 return offset;
+
1549 if (i >= count || !str[i])
+
1550 return npos;
+
1551 if (ctype1.tolower(str[i]) != ctype2.tolower(sample[j]))
+
1552 break;
+
1553 }
1554 }
1555 }
1556
-
1567 template <class T1, class T2>
-
1568 inline size_t strncpy(
-
1569 _Out_writes_(count_dst) _Post_maybez_ T1* dst, _In_ size_t count_dst,
-
1570 _In_reads_or_z_opt_(count_src) const T2* src, _In_ size_t count_src)
-
1571 {
-
1572 _Assume_(dst || !count_dst);
-
1573 _Assume_(src || !count_src);
-
1574 for (size_t i = 0; ; ++i)
-
1575 {
-
1576 if (i >= count_dst)
-
1577 return i;
-
1578 if (i >= count_src) {
-
1579 dst[i] = 0;
-
1580 return i;
-
1581 }
-
1582 if ((dst[i] = static_cast<T1>(src[i])) == 0)
-
1583 return i;
-
1584 }
-
1585 }
-
1586
-
1595 template <class T1, size_t N1, class T2, size_t N2>
-
1596 inline size_t strncpy(
-
1597 _Out_ _Post_maybez_ T1 (&dst)[N1],
-
1598 _In_ const T2 (&src)[N2])
-
1599 {
-
1600 return strncpy(dst, N1, src, N2);
-
1601 }
-
1602
-
1611 template <class T1, class T2>
-
1612 inline size_t strcat(
-
1613 _In_z_ _Out_writes_z_(_String_length_(dst) + _String_length_(src) + 1) T1* dst,
-
1614 _In_z_ const T2* src)
-
1615 {
-
1616 _Assume_(dst);
-
1617 _Assume_(src);
-
1618 for (size_t i = 0, j = stdex::strlen<T1>(dst); ; ++i, ++j) {
-
1619 if ((dst[j] = static_cast<T1>(src[i])) == 0)
-
1620 return j;
-
1621 }
-
1622 }
-
1623
-
1633 template <class T1, class T2>
-
1634 inline size_t strncat(
-
1635 _Inout_z_ T1* dst,
-
1636 _In_reads_or_z_opt_(count) const T2* src, _In_ size_t count)
-
1637 {
-
1638 _Assume_(dst || !count);
-
1639 _Assume_(src || !count);
-
1640 for (size_t i = 0, j = stdex::strlen<T1>(dst); ; ++i, ++j) {
-
1641 if (i >= count)
-
1642 return j;
-
1643 if ((dst[j] = static_cast<T1>(src[i])) == 0)
-
1644 return j;
-
1645 }
-
1646 }
-
1647
-
1658 template <class T1, class T2>
-
1659 inline size_t strncat(
-
1660 _Out_writes_(count_dst) _Post_maybez_ T1* dst, _In_ size_t count_dst,
-
1661 _In_reads_or_z_opt_(count_src) const T2* src, _In_ size_t count_src)
-
1662 {
-
1663 _Assume_(dst || !count_dst);
-
1664 _Assume_(src || !count_src);
-
1665 for (size_t i = 0, j = stdex::strnlen<T1>(dst, count_dst); ; ++i, ++j)
-
1666 {
-
1667 if (j >= count_dst)
-
1668 return j;
-
1669 if (i >= count_src) {
-
1670 dst[j] = 0;
-
1671 return j;
-
1672 }
-
1673 if ((dst[j] = static_cast<T1>(src[i])) == 0)
-
1674 return j;
-
1675 }
-
1676 }
-
1677
-
1688 template <class T>
-
1689 inline _Check_return_ _Ret_maybenull_z_ T* strdup(_In_opt_z_ const T* str)
-
1690 {
-
1691 if (!str) _Unlikely_
-
1692 return nullptr;
-
1693 size_t count = strlen(str) + 1;
-
1694 T* dst = new T[count];
-
1695 strncpy(dst, count, str, SIZE_MAX);
-
1696 return dst;
-
1697 }
-
1698
-
1710 template <class T>
-
1711 inline _Ret_z_ T* strndup(
-
1712 _In_reads_or_z_opt_(count) const T* str,
-
1713 _In_ size_t count)
-
1714 {
-
1715 T* dst = new T[count];
-
1716 strncpy(dst, count, str, SIZE_MAX);
-
1717 return dst;
-
1718 }
-
1719
-
1730 template <class T, size_t N>
-
1731 inline _Check_return_ _Ret_maybenull_z_ T* strndup(_In_ const T (&str)[N])
-
1732 {
-
1733 return strndup(str, N);
-
1734 }
-
1735
-
1745 template <class T>
-
1746 inline size_t crlf2nl(_Out_writes_z_(_String_length_(src) + 1) T* dst, _In_z_ const T* src)
-
1747 {
-
1748 _Assume_(dst);
-
1749 _Assume_(src);
-
1750 size_t i, j;
-
1751 for (i = j = 0; src[j];) {
-
1752 if (src[j] != '\r' || src[j + 1] != '\n')
-
1753 dst[i++] = src[j++];
-
1754 else {
-
1755 dst[i++] = '\n';
-
1756 j += 2;
-
1757 }
-
1758 }
-
1759 dst[i] = 0;
-
1760 return i;
-
1761 }
-
1762
-
1769 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
1770 inline void crlf2nl(_Inout_ std::basic_string<T, TR, AX>& dst, _In_z_ const T* src)
-
1771 {
-
1772 _Assume_(src);
-
1773 _Assume_(src != dst.data());
-
1774 dst.clear();
-
1775 dst.reserve(strlen(src));
-
1776 for (size_t j = 0; src[j];) {
-
1777 if (src[j] != '\r' || src[j + 1] != '\n')
-
1778 dst += src[j++];
-
1779 else {
-
1780 dst += '\n';
-
1781 j += 2;
-
1782 }
-
1783 }
-
1784 }
-
1785
-
1791 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
1792 inline void crlf2nl(_Inout_ std::basic_string<T, TR, AX>& str)
+
1565 template <class T1, size_t N1, class T2>
+
1566 size_t strnistr(
+
1567 _In_ const T1 (&str)[N1],
+
1568 _In_z_ const T2* sample)
+
1569 {
+
1570 return strnistr(str, N1, sample);
+
1571 }
+
1572
+
1582 template <class T1, size_t N1, class T2>
+
1583 size_t strnistr(
+
1584 _In_ const T1 (&str)[N1],
+
1585 _In_z_ const T2* sample,
+
1586 _In_ const std::locale& locale)
+
1587 {
+
1588 return strnistr(str, N1, sample, locale);
+
1589 }
+
1590
+
1599 template <class T1, class T2>
+
1600 size_t strcpy(
+
1601 _Out_writes_z_(_String_length_(src) + 1) T1* dst,
+
1602 _In_z_ const T2* src)
+
1603 {
+
1604 _Assume_(dst);
+
1605 _Assume_(src);
+
1606 for (size_t i = 0; ; ++i) {
+
1607 if ((dst[i] = static_cast<T1>(src[i])) == 0)
+
1608 return i;
+
1609 }
+
1610 }
+
1611
+
1621 template <class T1, class T2>
+
1622 size_t strncpy(
+
1623 _Out_writes_(count) _Post_maybez_ T1* dst,
+
1624 _In_reads_or_z_opt_(count) const T2* src, _In_ size_t count)
+
1625 {
+
1626 _Assume_(dst || !count);
+
1627 _Assume_(src || !count);
+
1628 for (size_t i = 0; ; ++i) {
+
1629 if (i >= count)
+
1630 return i;
+
1631 if ((dst[i] = static_cast<T1>(src[i])) == 0)
+
1632 return i;
+
1633 }
+
1634 }
+
1635
+
1646 template <class T1, class T2>
+
1647 size_t strncpy(
+
1648 _Out_writes_(count_dst) _Post_maybez_ T1* dst, _In_ size_t count_dst,
+
1649 _In_reads_or_z_opt_(count_src) const T2* src, _In_ size_t count_src)
+
1650 {
+
1651 _Assume_(dst || !count_dst);
+
1652 _Assume_(src || !count_src);
+
1653 for (size_t i = 0; ; ++i)
+
1654 {
+
1655 if (i >= count_dst)
+
1656 return i;
+
1657 if (i >= count_src) {
+
1658 dst[i] = 0;
+
1659 return i;
+
1660 }
+
1661 if ((dst[i] = static_cast<T1>(src[i])) == 0)
+
1662 return i;
+
1663 }
+
1664 }
+
1665
+
1674 template <class T1, size_t N1, class T2, size_t N2>
+
1675 size_t strncpy(
+
1676 _Out_ _Post_maybez_ T1 (&dst)[N1],
+
1677 _In_ const T2 (&src)[N2])
+
1678 {
+
1679 return strncpy(dst, N1, src, N2);
+
1680 }
+
1681
+
1690 template <class T1, class T2>
+
1691 size_t strcat(
+
1692 _In_z_ _Out_writes_z_(_String_length_(dst) + _String_length_(src) + 1) T1* dst,
+
1693 _In_z_ const T2* src)
+
1694 {
+
1695 _Assume_(dst);
+
1696 _Assume_(src);
+
1697 for (size_t i = 0, j = stdex::strlen<T1>(dst); ; ++i, ++j) {
+
1698 if ((dst[j] = static_cast<T1>(src[i])) == 0)
+
1699 return j;
+
1700 }
+
1701 }
+
1702
+
1712 template <class T1, class T2>
+
1713 size_t strncat(
+
1714 _Inout_z_ T1* dst,
+
1715 _In_reads_or_z_opt_(count) const T2* src, _In_ size_t count)
+
1716 {
+
1717 _Assume_(dst || !count);
+
1718 _Assume_(src || !count);
+
1719 for (size_t i = 0, j = stdex::strlen<T1>(dst); ; ++i, ++j) {
+
1720 if (i >= count)
+
1721 return j;
+
1722 if ((dst[j] = static_cast<T1>(src[i])) == 0)
+
1723 return j;
+
1724 }
+
1725 }
+
1726
+
1737 template <class T1, class T2>
+
1738 size_t strncat(
+
1739 _Out_writes_(count_dst) _Post_maybez_ T1* dst, _In_ size_t count_dst,
+
1740 _In_reads_or_z_opt_(count_src) const T2* src, _In_ size_t count_src)
+
1741 {
+
1742 _Assume_(dst || !count_dst);
+
1743 _Assume_(src || !count_src);
+
1744 for (size_t i = 0, j = stdex::strnlen<T1>(dst, count_dst); ; ++i, ++j)
+
1745 {
+
1746 if (j >= count_dst)
+
1747 return j;
+
1748 if (i >= count_src) {
+
1749 dst[j] = 0;
+
1750 return j;
+
1751 }
+
1752 if ((dst[j] = static_cast<T1>(src[i])) == 0)
+
1753 return j;
+
1754 }
+
1755 }
+
1756
+
1767 template <class T>
+
1768 _Check_return_ _Ret_maybenull_z_ T* strdup(_In_opt_z_ const T* str)
+
1769 {
+
1770 if (!str) _Unlikely_
+
1771 return nullptr;
+
1772 size_t count = strlen(str) + 1;
+
1773 T* dst = new T[count];
+
1774 strncpy(dst, count, str, SIZE_MAX);
+
1775 return dst;
+
1776 }
+
1777
+
1789 template <class T>
+
1790 _Ret_z_ T* strndup(
+
1791 _In_reads_or_z_opt_(count) const T* str,
+
1792 _In_ size_t count)
1793 {
-
1794 size_t i, j, n;
-
1795 for (i = j = 0, n = str.size(); j < n;) {
-
1796 if (str[j] != '\r' || str[j + 1] != '\n')
-
1797 str[i++] = str[j++];
-
1798 else {
-
1799 str[i++] = '\n';
-
1800 j += 2;
-
1801 }
-
1802 }
-
1803 str.resize(i);
-
1804 }
-
1805
-
1807 template <class T, class T_bin>
-
1808 inline T_bin strtoint(
-
1809 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
-
1810 _Out_opt_ size_t* end,
-
1811 _In_ int radix,
-
1812 _Out_ uint8_t& flags)
-
1813 {
-
1814 _Assume_(str || !count);
-
1815 _Assume_(radix == 0 || 2 <= radix && radix <= 36);
-
1816
-
1817 size_t i = 0;
-
1818 T_bin value = 0, digit,
-
1819 max_ui = (T_bin)-1,
-
1820 max_ui_pre1, max_ui_pre2;
-
1821
-
1822 flags = 0;
-
1823
-
1824 // Skip leading spaces.
-
1825 for (;; ++i) {
-
1826 if (i >= count || !str[i]) goto error;
-
1827 if (!isspace(str[i])) break;
-
1828 }
-
1829
-
1830 // Read the sign.
-
1831 if (str[i] == '+') {
-
1832 flags &= ~0x01;
-
1833 ++i;
-
1834 if (i >= count || !str[i]) goto error;
-
1835 }
-
1836 else if (str[i] == '-') {
-
1837 flags |= 0x01;
-
1838 ++i;
-
1839 if (i >= count || !str[i]) goto error;
-
1840 }
+
1794 T* dst = new T[count];
+
1795 strncpy(dst, count, str, SIZE_MAX);
+
1796 return dst;
+
1797 }
+
1798
+
1809 template <class T, size_t N>
+
1810 _Check_return_ _Ret_maybenull_z_ T* strndup(_In_ const T (&str)[N])
+
1811 {
+
1812 return strndup(str, N);
+
1813 }
+
1814
+
1824 template <class T>
+
1825 size_t crlf2nl(_Out_writes_z_(_String_length_(src) + 1) T* dst, _In_z_ const T* src)
+
1826 {
+
1827 _Assume_(dst);
+
1828 _Assume_(src);
+
1829 size_t i, j;
+
1830 for (i = j = 0; src[j];) {
+
1831 if (src[j] != '\r' || src[j + 1] != '\n')
+
1832 dst[i++] = src[j++];
+
1833 else {
+
1834 dst[i++] = '\n';
+
1835 j += 2;
+
1836 }
+
1837 }
+
1838 dst[i] = 0;
+
1839 return i;
+
1840 }
1841
-
1842 if (radix == 16) {
-
1843 // On hexadecimal, allow leading 0x.
-
1844 if (str[i] == '0' && i + 1 < count && (str[i + 1] == 'x' || str[i + 1] == 'X')) {
-
1845 i += 2;
-
1846 if (i >= count || !str[i]) goto error;
-
1847 }
-
1848 }
-
1849 else if (!radix) {
-
1850 // Autodetect radix.
-
1851 if (str[i] == '0') {
-
1852 ++i;
-
1853 if (i >= count || !str[i]) goto error;
-
1854 if (str[i] == 'x' || str[i] == 'X') {
-
1855 radix = 16;
-
1856 ++i;
-
1857 if (i >= count || !str[i]) goto error;
-
1858 }
-
1859 else
-
1860 radix = 8;
+
1848 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
1849 void crlf2nl(_Inout_ std::basic_string<T, TR, AX>& dst, _In_z_ const T* src)
+
1850 {
+
1851 _Assume_(src);
+
1852 _Assume_(src != dst.data());
+
1853 dst.clear();
+
1854 dst.reserve(strlen(src));
+
1855 for (size_t j = 0; src[j];) {
+
1856 if (src[j] != '\r' || src[j + 1] != '\n')
+
1857 dst += src[j++];
+
1858 else {
+
1859 dst += '\n';
+
1860 j += 2;
1861 }
-
1862 else
-
1863 radix = 10;
-
1864 }
-
1865
-
1866 // We have the radix.
-
1867 max_ui_pre1 = max_ui / (T_bin)radix;
-
1868 max_ui_pre2 = max_ui % (T_bin)radix;
-
1869 for (;;) {
-
1870 if ('0' <= str[i] && str[i] <= '9')
-
1871 digit = (T_bin)str[i] - '0';
-
1872 else if ('A' <= str[i] && str[i] <= 'Z')
-
1873 digit = (T_bin)str[i] - 'A' + '\x0a';
-
1874 else if ('a' <= str[i] && str[i] <= 'z')
-
1875 digit = (T_bin)str[i] - 'a' + '\x0a';
-
1876 else
-
1877 goto error;
-
1878 if (digit >= (T_bin)radix)
-
1879 goto error;
-
1880
-
1881 if (value < max_ui_pre1 || // Multiplication nor addition will not overflow.
-
1882 (value == max_ui_pre1 && digit <= max_ui_pre2)) // Small digits will not overflow.
-
1883 value = value * (T_bin)radix + digit;
-
1884 else {
-
1885 // Overflow!
-
1886 flags |= 0x02;
-
1887 }
-
1888
-
1889 ++i;
-
1890 if (i >= count || !str[i])
-
1891 goto error;
-
1892 }
-
1893
-
1894 error:
-
1895 if (end) *end = i;
-
1896 return value;
-
1897 }
-
1899
-
1910 template <class T, class T_bin>
-
1911 T_bin strtoint(
-
1912 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
-
1913 _Out_opt_ size_t* end,
-
1914 _In_ int radix)
-
1915 {
-
1916 uint8_t flags;
-
1917 T_bin value;
-
1918
-
1919 switch (sizeof(T_bin)) {
-
1920 case 1:
-
1921 value = (T_bin)strtoint<T, uint8_t>(str, count, end, radix, flags);
-
1922 if ((flags & 0x01) && (value & 0x80)) {
-
1923 // Sign bit is 1 => overflow.
-
1924 flags |= 0x02;
-
1925 }
-
1926 return (flags & 0x02) ?
-
1927 (flags & 0x01) ? (T_bin)0x80 : (T_bin)0x7f :
-
1928 (flags & 0x01) ? -value : value;
-
1929
-
1930 case 2:
-
1931 value = (T_bin)strtoint<T, uint16_t>(str, count, end, radix, flags);
-
1932 if ((flags & 0x01) && (value & 0x8000)) {
-
1933 // Sign bit is 1 => overflow.
-
1934 flags |= 0x02;
-
1935 }
-
1936 return (flags & 0x02) ?
-
1937 (flags & 0x01) ? (T_bin)0x8000 : (T_bin)0x7fff :
-
1938 (flags & 0x01) ? -value : value;
-
1939
-
1940 case 4:
-
1941 value = (T_bin)strtoint<T, uint32_t>(str, count, end, radix, flags);
-
1942 if ((flags & 0x01) && (value & 0x80000000)) {
-
1943 // Sign bit is 1 => overflow.
-
1944 flags |= 0x02;
-
1945 }
-
1946 return (flags & 0x02) ?
-
1947 (flags & 0x01) ? (T_bin)0x80000000 : (T_bin)0x7fffffff :
-
1948 (flags & 0x01) ? -value : value;
-
1949
-
1950 case 8:
-
1951 value = (T_bin)strtoint<T, uint64_t>(str, count, end, radix, flags);
-
1952 if ((flags & 0x01) && (value & 0x8000000000000000)) {
-
1953 // Sign bit is 1 => overflow.
-
1954 flags |= 0x02;
-
1955 }
-
1956 return (flags & 0x02) ?
-
1957 (flags & 0x01) ? (T_bin)0x8000000000000000 : (T_bin)0x7fffffffffffffff :
-
1958 (flags & 0x01) ? -value : value;
+
1862 }
+
1863 }
+
1864
+
1870 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
1871 void crlf2nl(_Inout_ std::basic_string<T, TR, AX>& str)
+
1872 {
+
1873 size_t i, j, n;
+
1874 for (i = j = 0, n = str.size(); j < n;) {
+
1875 if (str[j] != '\r' || str[j + 1] != '\n')
+
1876 str[i++] = str[j++];
+
1877 else {
+
1878 str[i++] = '\n';
+
1879 j += 2;
+
1880 }
+
1881 }
+
1882 str.resize(i);
+
1883 }
+
1884
+
1886 template <class T, class T_bin>
+
1887 T_bin strtoint(
+
1888 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
+
1889 _Out_opt_ size_t* end,
+
1890 _In_ int radix,
+
1891 _Out_ uint8_t& flags)
+
1892 {
+
1893 _Assume_(str || !count);
+
1894 _Assume_(radix == 0 || 2 <= radix && radix <= 36);
+
1895
+
1896 size_t i = 0;
+
1897 T_bin value = 0, digit,
+
1898 max_ui = (T_bin)-1,
+
1899 max_ui_pre1, max_ui_pre2;
+
1900
+
1901 flags = 0;
+
1902
+
1903 // Skip leading spaces.
+
1904 for (;; ++i) {
+
1905 if (i >= count || !str[i]) goto error;
+
1906 if (!isspace(str[i])) break;
+
1907 }
+
1908
+
1909 // Read the sign.
+
1910 if (str[i] == '+') {
+
1911 flags &= ~0x01;
+
1912 ++i;
+
1913 if (i >= count || !str[i]) goto error;
+
1914 }
+
1915 else if (str[i] == '-') {
+
1916 flags |= 0x01;
+
1917 ++i;
+
1918 if (i >= count || !str[i]) goto error;
+
1919 }
+
1920
+
1921 if (radix == 16) {
+
1922 // On hexadecimal, allow leading 0x.
+
1923 if (str[i] == '0' && i + 1 < count && (str[i + 1] == 'x' || str[i + 1] == 'X')) {
+
1924 i += 2;
+
1925 if (i >= count || !str[i]) goto error;
+
1926 }
+
1927 }
+
1928 else if (!radix) {
+
1929 // Autodetect radix.
+
1930 if (str[i] == '0') {
+
1931 ++i;
+
1932 if (i >= count || !str[i]) goto error;
+
1933 if (str[i] == 'x' || str[i] == 'X') {
+
1934 radix = 16;
+
1935 ++i;
+
1936 if (i >= count || !str[i]) goto error;
+
1937 }
+
1938 else
+
1939 radix = 8;
+
1940 }
+
1941 else
+
1942 radix = 10;
+
1943 }
+
1944
+
1945 // We have the radix.
+
1946 max_ui_pre1 = max_ui / (T_bin)radix;
+
1947 max_ui_pre2 = max_ui % (T_bin)radix;
+
1948 for (;;) {
+
1949 if ('0' <= str[i] && str[i] <= '9')
+
1950 digit = (T_bin)str[i] - '0';
+
1951 else if ('A' <= str[i] && str[i] <= 'Z')
+
1952 digit = (T_bin)str[i] - 'A' + '\x0a';
+
1953 else if ('a' <= str[i] && str[i] <= 'z')
+
1954 digit = (T_bin)str[i] - 'a' + '\x0a';
+
1955 else
+
1956 goto error;
+
1957 if (digit >= (T_bin)radix)
+
1958 goto error;
1959
-
1960 default:
-
1961 throw std::invalid_argument("Unsupported bit length");
-
1962 }
-
1963 }
-
1964
-
1974 template <class T, size_t N, class T_bin>
-
1975 T_bin strtoint(
-
1976 _In_ const T (&str)[N],
-
1977 _Out_opt_ size_t* end,
-
1978 _In_ int radix)
-
1979 {
-
1980 return strtoint<T, T_bin>(str, N, end, radix);
-
1981 }
-
1982
-
1993 template <class T, class T_bin>
-
1994 inline T_bin strtouint(
-
1995 _In_reads_or_z_opt_(count) const T* str,
-
1996 _In_ size_t count,
-
1997 _Out_opt_ size_t* end,
-
1998 _In_ int radix)
-
1999 {
-
2000 uint8_t flags;
-
2001 T_bin value;
-
2002
-
2003 switch (sizeof(T_bin)) {
-
2004 case 1: value = (T_bin)strtoint<T, uint8_t>(str, count, end, radix, flags); break;
-
2005 case 2: value = (T_bin)strtoint<T, uint16_t>(str, count, end, radix, flags); break;
-
2006 case 4: value = (T_bin)strtoint<T, uint32_t>(str, count, end, radix, flags); break;
-
2007 case 8: value = (T_bin)strtoint<T, uint64_t>(str, count, end, radix, flags); break;
-
2008 default: throw std::invalid_argument("Unsupported bit length");
-
2009 }
-
2010
-
2011 return (flags & 0x02) ?
-
2012 (flags & 0x01) ? (T_bin)0 : (T_bin)-1 :
-
2013 (flags & 0x01) ? ~value : value;
-
2014 }
-
2015
-
2025 template <class T, size_t N, class T_bin>
-
2026 inline T_bin strtouint(
-
2027 _In_ const T (&str)[N],
-
2028 _Out_opt_ size_t* end,
-
2029 _In_ int radix)
-
2030 {
-
2031 return strtouint<T, T_bin>(str, N, end, radix);
-
2032 }
-
2033
-
2044 template <class T>
-
2045 inline int32_t strto32(
-
2046 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
-
2047 _Out_opt_ size_t* end,
-
2048 _In_ int radix)
-
2049 {
-
2050 return strtoint<T, int32_t>(str, count, end, radix);
-
2051 }
-
2052
-
2062 template <class T, size_t N>
-
2063 inline int32_t strto32(
-
2064 _In_ const T (&str)[N],
-
2065 _Out_opt_ size_t* end,
-
2066 _In_ int radix)
-
2067 {
-
2068 return strto32<T>(str, N, end, radix);
-
2069 }
-
2070
-
2081 template <class T>
-
2082 inline int64_t strto64(
-
2083 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
-
2084 _Out_opt_ size_t* end,
-
2085 _In_ int radix)
-
2086 {
-
2087 return strtoint<T, int64_t>(str, count, end, radix);
-
2088 }
+
1960 if (value < max_ui_pre1 || // Multiplication nor addition will not overflow.
+
1961 (value == max_ui_pre1 && digit <= max_ui_pre2)) // Small digits will not overflow.
+
1962 value = value * (T_bin)radix + digit;
+
1963 else {
+
1964 // Overflow!
+
1965 flags |= 0x02;
+
1966 }
+
1967
+
1968 ++i;
+
1969 if (i >= count || !str[i])
+
1970 goto error;
+
1971 }
+
1972
+
1973 error:
+
1974 if (end) *end = i;
+
1975 return value;
+
1976 }
+
1978
+
1989 template <class T, class T_bin>
+
1990 T_bin strtoint(
+
1991 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
+
1992 _Out_opt_ size_t* end,
+
1993 _In_ int radix)
+
1994 {
+
1995 uint8_t flags;
+
1996 T_bin value;
+
1997
+
1998 switch (sizeof(T_bin)) {
+
1999 case 1:
+
2000 value = (T_bin)strtoint<T, uint8_t>(str, count, end, radix, flags);
+
2001 if ((flags & 0x01) && (value & 0x80)) {
+
2002 // Sign bit is 1 => overflow.
+
2003 flags |= 0x02;
+
2004 }
+
2005 return (flags & 0x02) ?
+
2006 (flags & 0x01) ? (T_bin)0x80 : (T_bin)0x7f :
+
2007 (flags & 0x01) ? -value : value;
+
2008
+
2009 case 2:
+
2010 value = (T_bin)strtoint<T, uint16_t>(str, count, end, radix, flags);
+
2011 if ((flags & 0x01) && (value & 0x8000)) {
+
2012 // Sign bit is 1 => overflow.
+
2013 flags |= 0x02;
+
2014 }
+
2015 return (flags & 0x02) ?
+
2016 (flags & 0x01) ? (T_bin)0x8000 : (T_bin)0x7fff :
+
2017 (flags & 0x01) ? -value : value;
+
2018
+
2019 case 4:
+
2020 value = (T_bin)strtoint<T, uint32_t>(str, count, end, radix, flags);
+
2021 if ((flags & 0x01) && (value & 0x80000000)) {
+
2022 // Sign bit is 1 => overflow.
+
2023 flags |= 0x02;
+
2024 }
+
2025 return (flags & 0x02) ?
+
2026 (flags & 0x01) ? (T_bin)0x80000000 : (T_bin)0x7fffffff :
+
2027 (flags & 0x01) ? -value : value;
+
2028
+
2029 case 8:
+
2030 value = (T_bin)strtoint<T, uint64_t>(str, count, end, radix, flags);
+
2031 if ((flags & 0x01) && (value & 0x8000000000000000)) {
+
2032 // Sign bit is 1 => overflow.
+
2033 flags |= 0x02;
+
2034 }
+
2035 return (flags & 0x02) ?
+
2036 (flags & 0x01) ? (T_bin)0x8000000000000000 : (T_bin)0x7fffffffffffffff :
+
2037 (flags & 0x01) ? -value : value;
+
2038
+
2039 default:
+
2040 throw std::invalid_argument("Unsupported bit length");
+
2041 }
+
2042 }
+
2043
+
2053 template <class T, size_t N, class T_bin>
+
2054 T_bin strtoint(
+
2055 _In_ const T (&str)[N],
+
2056 _Out_opt_ size_t* end,
+
2057 _In_ int radix)
+
2058 {
+
2059 return strtoint<T, T_bin>(str, N, end, radix);
+
2060 }
+
2061
+
2072 template <class T, class T_bin>
+
2073 T_bin strtouint(
+
2074 _In_reads_or_z_opt_(count) const T* str,
+
2075 _In_ size_t count,
+
2076 _Out_opt_ size_t* end,
+
2077 _In_ int radix)
+
2078 {
+
2079 uint8_t flags;
+
2080 T_bin value;
+
2081
+
2082 switch (sizeof(T_bin)) {
+
2083 case 1: value = (T_bin)strtoint<T, uint8_t>(str, count, end, radix, flags); break;
+
2084 case 2: value = (T_bin)strtoint<T, uint16_t>(str, count, end, radix, flags); break;
+
2085 case 4: value = (T_bin)strtoint<T, uint32_t>(str, count, end, radix, flags); break;
+
2086 case 8: value = (T_bin)strtoint<T, uint64_t>(str, count, end, radix, flags); break;
+
2087 default: throw std::invalid_argument("Unsupported bit length");
+
2088 }
2089
-
2099 template <class T, size_t N>
-
2100 inline int64_t strto64(
-
2101 _In_ const T (&str)[N],
-
2102 _Out_opt_ size_t* end,
-
2103 _In_ int radix)
-
2104 {
-
2105 return strto64<T>(str, N, end, radix);
-
2106 }
-
2107
-
2119 template <class T>
-
2120 inline ptrdiff_t strtoi(
-
2121 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
-
2122 _Out_opt_ size_t* end,
-
2123 _In_ int radix)
-
2124 {
-
2125#if defined(_WIN64) || defined(__LP64__)
-
2126 return static_cast<ptrdiff_t>(strto64(str, count, end, radix));
-
2127#else
-
2128 return static_cast<ptrdiff_t>(strto32(str, count, end, radix));
-
2129#endif
+
2090 return (flags & 0x02) ?
+
2091 (flags & 0x01) ? (T_bin)0 : (T_bin)-1 :
+
2092 (flags & 0x01) ? ~value : value;
+
2093 }
+
2094
+
2104 template <class T, size_t N, class T_bin>
+
2105 T_bin strtouint(
+
2106 _In_ const T (&str)[N],
+
2107 _Out_opt_ size_t* end,
+
2108 _In_ int radix)
+
2109 {
+
2110 return strtouint<T, T_bin>(str, N, end, radix);
+
2111 }
+
2112
+
2123 template <class T>
+
2124 int32_t strto32(
+
2125 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
+
2126 _Out_opt_ size_t* end,
+
2127 _In_ int radix)
+
2128 {
+
2129 return strtoint<T, int32_t>(str, count, end, radix);
2130 }
2131
-
2142 template <class T, size_t N>
-
2143 inline ptrdiff_t strtoi(
-
2144 _In_ const T (&str)[N],
-
2145 _Out_opt_ size_t* end,
-
2146 _In_ int radix)
-
2147 {
-
2148 return strtoi<T>(str, N, end, radix);
-
2149 }
-
2150
-
2161 template <class T>
-
2162 inline uint32_t strtou32(
-
2163 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
-
2164 _Out_opt_ size_t* end,
-
2165 _In_ int radix)
-
2166 {
-
2167 return strtouint<T, uint32_t>(str, count, end, radix);
-
2168 }
-
2169
-
2179 template <class T, size_t N>
-
2180 inline uint32_t strtou32(
-
2181 _In_ const T (&str)[N],
-
2182 _Out_opt_ size_t* end,
-
2183 _In_ int radix)
-
2184 {
-
2185 return strtou32(str, N, end, radix);
-
2186 }
-
2187
+
2141 template <class T, size_t N>
+
2142 int32_t strto32(
+
2143 _In_ const T (&str)[N],
+
2144 _Out_opt_ size_t* end,
+
2145 _In_ int radix)
+
2146 {
+
2147 return strto32<T>(str, N, end, radix);
+
2148 }
+
2149
+
2160 template <class T>
+
2161 int64_t strto64(
+
2162 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
+
2163 _Out_opt_ size_t* end,
+
2164 _In_ int radix)
+
2165 {
+
2166 return strtoint<T, int64_t>(str, count, end, radix);
+
2167 }
+
2168
+
2178 template <class T, size_t N>
+
2179 int64_t strto64(
+
2180 _In_ const T (&str)[N],
+
2181 _Out_opt_ size_t* end,
+
2182 _In_ int radix)
+
2183 {
+
2184 return strto64<T>(str, N, end, radix);
+
2185 }
+
2186
2198 template <class T>
-
2199 inline uint64_t strtou64(
+
2199 ptrdiff_t strtoi(
2200 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
2201 _Out_opt_ size_t* end,
2202 _In_ int radix)
2203 {
-
2204 return strtouint<T, uint64_t>(str, count, end, radix);
-
2205 }
-
2206
-
2216 template <class T, size_t N>
-
2217 inline uint64_t strtou64(
-
2218 _In_ const T (&str)[N],
-
2219 _Out_opt_ size_t* end,
-
2220 _In_ int radix)
-
2221 {
-
2222 return strtou64<T>(str, N, end, radix);
-
2223 }
-
2224
-
2236 template <class T>
-
2237 inline size_t strtoui(
-
2238 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
-
2239 _Out_opt_ size_t* end,
-
2240 _In_ int radix)
-
2241 {
-
2242#if defined(_WIN64) || defined(__LP64__)
-
2243 return static_cast<size_t>(strtou64(str, count, end, radix));
-
2244#else
-
2245 return static_cast<size_t>(strtou32(str, count, end, radix));
-
2246#endif
+
2204#if defined(_WIN64) || defined(__LP64__)
+
2205 return static_cast<ptrdiff_t>(strto64(str, count, end, radix));
+
2206#else
+
2207 return static_cast<ptrdiff_t>(strto32(str, count, end, radix));
+
2208#endif
+
2209 }
+
2210
+
2221 template <class T, size_t N>
+
2222 ptrdiff_t strtoi(
+
2223 _In_ const T (&str)[N],
+
2224 _Out_opt_ size_t* end,
+
2225 _In_ int radix)
+
2226 {
+
2227 return strtoi<T>(str, N, end, radix);
+
2228 }
+
2229
+
2240 template <class T>
+
2241 uint32_t strtou32(
+
2242 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
+
2243 _Out_opt_ size_t* end,
+
2244 _In_ int radix)
+
2245 {
+
2246 return strtouint<T, uint32_t>(str, count, end, radix);
2247 }
2248
-
2259 template <class T, size_t N>
-
2260 inline size_t strtoui(
-
2261 _In_ const T (&str)[N],
-
2262 _Out_opt_ size_t* end,
-
2263 _In_ int radix)
-
2264 {
-
2265 return strtoui<T>(str, N, end, radix);
-
2266 }
-
2267
-
2278 inline double strtod(
-
2279 _In_reads_or_z_opt_(count) const char* str, _In_ size_t count,
+
2258 template <class T, size_t N>
+
2259 uint32_t strtou32(
+
2260 _In_ const T (&str)[N],
+
2261 _Out_opt_ size_t* end,
+
2262 _In_ int radix)
+
2263 {
+
2264 return strtou32(str, N, end, radix);
+
2265 }
+
2266
+
2277 template <class T>
+
2278 uint64_t strtou64(
+
2279 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
2280 _Out_opt_ size_t* end,
-
2281 _In_opt_ locale_t locale)
+
2281 _In_ int radix)
2282 {
-
2283 count = strnlen(str, count);
-
2284 _Assume_(str || !count);
-
2285 std::string tmp(str, count);
-
2286 char* _end;
-
2287 double r;
-
2288#if _WIN32
-
2289 r = _strtod_l(tmp.c_str(), &_end, locale);
-
2290#else
-
2291 r = strtod_l(tmp.c_str(), &_end, locale);
-
2292#endif
-
2293 if (end) *end = (size_t)(_end - tmp.c_str());
-
2294 return r;
-
2295 }
-
2296
-
2307 inline double strtod(
-
2308 _In_reads_or_z_opt_(count) const wchar_t* str, _In_ size_t count,
-
2309 _Out_opt_ size_t* end,
-
2310 _In_opt_ locale_t locale)
-
2311 {
-
2312 count = strnlen(str, count);
-
2313 _Assume_(str || !count);
-
2314 std::wstring tmp(str, count);
-
2315 wchar_t* _end;
-
2316 double r;
-
2317#if _WIN32
-
2318 r = _wcstod_l(tmp.c_str(), &_end, locale);
-
2319#else
-
2320 r = wcstod_l(tmp.c_str(), &_end, locale);
-
2321#endif
-
2322 if (end) *end = (size_t)(_end - tmp.c_str());
-
2323 return r;
-
2324 }
-
2325
-
2327 inline int vsnprintf(_Out_z_cap_(capacity) char* str, _In_ size_t capacity, _In_z_ _Printf_format_string_params_(2) const char* format, _In_opt_ locale_t locale, _In_ va_list arg)
-
2328 {
-
2329#ifdef _WIN32
-
2330#pragma warning(suppress: 4996)
-
2331 return _vsnprintf_l(str, capacity, format, locale, arg);
-
2332#else
-
2333 va_list arg_mutable;
-
2334 va_copy(arg_mutable, arg);
-
2335 return ::vsnprintf_l(str, capacity, locale, format, arg_mutable);
-
2336#endif
-
2337 }
-
2338
-
2339 inline int vsnprintf(_Out_z_cap_(capacity) wchar_t* str, _In_ size_t capacity, _In_z_ _Printf_format_string_params_(2) const wchar_t* format, _In_opt_ locale_t locale, _In_ va_list arg)
-
2340 {
-
2341#ifdef _WIN32
-
2342#pragma warning(suppress: 4996)
-
2343 return _vsnwprintf_l(str, capacity, format, locale, arg);
-
2344#else
-
2345 va_list arg_mutable;
-
2346 va_copy(arg_mutable, arg);
-
2347 return ::vswprintf_l(str, capacity, locale, format, arg_mutable);
-
2348#endif
-
2349 }
-
2351
-
2362 template<class T, class TR, class AX>
-
2363 inline size_t vappendf(_Inout_ std::basic_string<T, TR, AX>& str, _In_z_ _Printf_format_string_params_(2) const T* format, _In_opt_ locale_t locale, _In_ va_list arg)
-
2364 {
-
2365 T buf[1024 / sizeof(T)];
-
2366
-
2367 // Try with stack buffer first.
-
2368 int count = vsnprintf(buf, _countof(buf), format, locale, arg);
-
2369 if (0 <= count && static_cast<size_t>(count) <= _countof(buf)) {
-
2370 // Copy from stack.
-
2371 str.append(buf, static_cast<size_t>(count));
-
2372 return static_cast<size_t>(count);
-
2373 }
-
2374#ifdef _WIN32
-
2375 if (count < 0) {
-
2376 switch (errno) {
-
2377 case 0:
-
2378 count = vsnprintf(NULL, 0, format, locale, arg);
-
2379 _Assume_(count >= 0);
-
2380 break;
-
2381 case EINVAL: throw std::invalid_argument("invalid vsnprintf arguments");
-
2382 case EILSEQ: throw std::runtime_error("encoding error");
-
2383 default: throw std::runtime_error("failed to format string");
-
2384 }
-
2385 }
-
2386 size_t offset = str.size();
-
2387 str.resize(offset + count);
-
2388 if (vsnprintf(&str[offset], count + 1, format, locale, arg) != count) _Unlikely_
-
2389 throw std::runtime_error("failed to format string");
-
2390#else
-
2391 size_t offset = str.size();
-
2392 for (size_t capacity = 2 * 1024 / sizeof(T);; capacity *= 2) {
-
2393 switch (errno) {
-
2394 case EOVERFLOW:
-
2395 // Allocate on heap and retry.
-
2396 str.resize(offset + capacity);
-
2397 count = vsnprintf(&str[offset], capacity, format, locale, arg);
-
2398 if (0 <= count && static_cast<size_t>(count) <= capacity) {
-
2399 str.resize(offset + static_cast<size_t>(count));
-
2400 return static_cast<size_t>(count);
-
2401 }
-
2402 break;
-
2403 case EINVAL: throw std::invalid_argument("invalid vsnprintf arguments");
-
2404 case EILSEQ: throw std::runtime_error("encoding error");
-
2405 default: throw std::runtime_error("failed to format string");
-
2406 }
-
2407 }
-
2408#endif
-
2409 return static_cast<size_t>(count);
-
2410 }
-
2411
-
2421 template<class T, class TR, class AX>
-
2422 inline size_t appendf(_Inout_ std::basic_string<T, TR, AX>& str, _In_z_ _Printf_format_string_params_(2) const T* format, _In_opt_ locale_t locale, ...)
-
2423 {
-
2424 va_list arg;
-
2425 va_start(arg, locale);
-
2426 size_t n = vappendf(str, format, locale, arg);
-
2427 va_end(arg);
-
2428 return n;
-
2429 }
+
2283 return strtouint<T, uint64_t>(str, count, end, radix);
+
2284 }
+
2285
+
2295 template <class T, size_t N>
+
2296 uint64_t strtou64(
+
2297 _In_ const T (&str)[N],
+
2298 _Out_opt_ size_t* end,
+
2299 _In_ int radix)
+
2300 {
+
2301 return strtou64<T>(str, N, end, radix);
+
2302 }
+
2303
+
2315 template <class T>
+
2316 size_t strtoui(
+
2317 _In_reads_or_z_opt_(count) const T* str, _In_ size_t count,
+
2318 _Out_opt_ size_t* end,
+
2319 _In_ int radix)
+
2320 {
+
2321#if defined(_WIN64) || defined(__LP64__)
+
2322 return static_cast<size_t>(strtou64(str, count, end, radix));
+
2323#else
+
2324 return static_cast<size_t>(strtou32(str, count, end, radix));
+
2325#endif
+
2326 }
+
2327
+
2338 template <class T, size_t N>
+
2339 size_t strtoui(
+
2340 _In_ const T (&str)[N],
+
2341 _Out_opt_ size_t* end,
+
2342 _In_ int radix)
+
2343 {
+
2344 return strtoui<T>(str, N, end, radix);
+
2345 }
+
2346
+
2357 inline double strtod(
+
2358 _In_reads_or_z_opt_(count) const char* str, _In_ size_t count,
+
2359 _Out_opt_ size_t* end,
+
2360 _In_opt_ locale_t locale)
+
2361 {
+
2362 count = strnlen(str, count);
+
2363 _Assume_(str || !count);
+
2364 std::string tmp(str, count);
+
2365 char* _end;
+
2366 double r;
+
2367#if _WIN32
+
2368 r = _strtod_l(tmp.c_str(), &_end, locale);
+
2369#else
+
2370 r = strtod_l(tmp.c_str(), &_end, locale);
+
2371#endif
+
2372 if (end) *end = (size_t)(_end - tmp.c_str());
+
2373 return r;
+
2374 }
+
2375
+
2386 inline double strtod(
+
2387 _In_reads_or_z_opt_(count) const wchar_t* str, _In_ size_t count,
+
2388 _Out_opt_ size_t* end,
+
2389 _In_opt_ locale_t locale)
+
2390 {
+
2391 count = strnlen(str, count);
+
2392 _Assume_(str || !count);
+
2393 std::wstring tmp(str, count);
+
2394 wchar_t* _end;
+
2395 double r;
+
2396#if _WIN32
+
2397 r = _wcstod_l(tmp.c_str(), &_end, locale);
+
2398#else
+
2399 r = wcstod_l(tmp.c_str(), &_end, locale);
+
2400#endif
+
2401 if (end) *end = (size_t)(_end - tmp.c_str());
+
2402 return r;
+
2403 }
+
2404
+
2406 inline int vsnprintf(_Out_z_cap_(capacity) char* str, _In_ size_t capacity, _In_z_ _Printf_format_string_params_(2) const char* format, _In_opt_ locale_t locale, _In_ va_list arg)
+
2407 {
+
2408#ifdef _WIN32
+
2409#pragma warning(suppress: 4996)
+
2410 return _vsnprintf_l(str, capacity, format, locale, arg);
+
2411#else
+
2412 va_list arg_mutable;
+
2413 va_copy(arg_mutable, arg);
+
2414 return ::vsnprintf_l(str, capacity, locale, format, arg_mutable);
+
2415#endif
+
2416 }
+
2417
+
2418 inline int vsnprintf(_Out_z_cap_(capacity) wchar_t* str, _In_ size_t capacity, _In_z_ _Printf_format_string_params_(2) const wchar_t* format, _In_opt_ locale_t locale, _In_ va_list arg)
+
2419 {
+
2420#ifdef _WIN32
+
2421#pragma warning(suppress: 4996)
+
2422 return _vsnwprintf_l(str, capacity, format, locale, arg);
+
2423#else
+
2424 va_list arg_mutable;
+
2425 va_copy(arg_mutable, arg);
+
2426 return ::vswprintf_l(str, capacity, locale, format, arg_mutable);
+
2427#endif
+
2428 }
2430
-
2439 template<class T, class TR, class AX>
-
2440 inline void vsprintf(_Inout_ std::basic_string<T, TR, AX>& str, _In_z_ _Printf_format_string_params_(2) const T* format, _In_opt_ locale_t locale, _In_ va_list arg)
-
2441 {
-
2442 str.clear();
-
2443 vappendf(str, format, locale, arg);
-
2444 }
+
2441 template<class T, class TR, class AX>
+
2442 size_t vappendf(_Inout_ std::basic_string<T, TR, AX>& str, _In_z_ _Printf_format_string_params_(2) const T* format, _In_opt_ locale_t locale, _In_ va_list arg)
+
2443 {
+
2444 T buf[1024 / sizeof(T)];
2445
-
2453 template<class T, class TR, class AX>
-
2454 inline void sprintf(_Inout_ std::basic_string<T, TR, AX>& str, _In_z_ _Printf_format_string_params_(2) const T* format, _In_opt_ locale_t locale, ...)
-
2455 {
-
2456 va_list arg;
-
2457 va_start(arg, locale);
-
2458 vsprintf(str, format, locale, arg);
-
2459 va_end(arg);
-
2460 }
-
2461
-
2471 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
2472 inline std::basic_string<T, TR, AX> vsprintf(_In_z_ _Printf_format_string_params_(2) const T* format, _In_opt_ locale_t locale, _In_ va_list arg)
-
2473 {
-
2474 std::basic_string<T, TR, AX> str;
-
2475 vappendf(str, format, locale, arg);
-
2476 return str;
-
2477 }
-
2478
-
2487 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
2488 inline std::basic_string<T, TR, AX> sprintf(_In_z_ _Printf_format_string_params_(2) const T* format, _In_opt_ locale_t locale, ...)
-
2489 {
-
2490 va_list arg;
-
2491 va_start(arg, locale);
-
2492 auto str = vsprintf(format, locale, arg);
-
2493 va_end(arg);
-
2494 return str;
-
2495 }
-
2496
-
2498 inline size_t strftime(_Out_z_cap_(capacity) char* str, _In_ size_t capacity, _In_z_ _Printf_format_string_ const char* format, _In_ const struct tm* time, _In_opt_ locale_t locale)
-
2499 {
-
2500#ifdef _WIN32
-
2501 return _strftime_l(str, capacity, format, time, locale);
-
2502#else
-
2503 return strftime_l(str, capacity, format, time, locale);
-
2504#endif
-
2505 }
-
2506
-
2507 inline size_t strftime(_Out_z_cap_(capacity) wchar_t* str, _In_ size_t capacity, _In_z_ _Printf_format_string_ const wchar_t* format, _In_ const struct tm* time, _In_opt_ locale_t locale)
-
2508 {
-
2509#ifdef _WIN32
-
2510 return _wcsftime_l(str, capacity, format, time, locale);
-
2511#else
-
2512 return wcsftime_l(str, capacity, format, time, locale);
-
2513#endif
-
2514 }
-
2516
-
2525 template<class T, class TR, class AX>
-
2526 inline void strcatftime(_Inout_ std::basic_string<T, TR, AX>& str, _In_z_ _Printf_format_string_ const T* format, _In_ const struct tm* time, _In_opt_ locale_t locale)
-
2527 {
-
2528 T buf[1024 / sizeof(T)];
-
2529
-
2530 // Try with stack buffer first.
-
2531 size_t count = strftime(buf, _countof(buf), format, time, locale);
-
2532 if (count) {
-
2533 // Copy from stack.
-
2534 str.append(buf, count);
-
2535 return;
-
2536 }
-
2537 size_t offset = str.size();
-
2538 for (size_t capacity = 2 * 1024 / sizeof(T);; capacity *= 2) {
-
2539 // Allocate on heap and retry.
-
2540 str.resize(offset + capacity);
-
2541 count = strftime(&str[offset], capacity + 1, format, time, locale);
-
2542 if (count) {
-
2543 str.resize(offset + count);
-
2544 return;
-
2545 }
-
2546 }
-
2547 }
-
2548
-
2557 template<class T, class TR, class AX>
-
2558 inline void strftime(_Inout_ std::basic_string<T, TR, AX>& str, _In_z_ _Printf_format_string_ const T* format, _In_ const struct tm* time, _In_opt_ locale_t locale)
-
2559 {
-
2560 str.clear();
-
2561 strcatftime(str, format, time, locale);
-
2562 }
-
2563
-
2573 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
2574 inline std::basic_string<T, TR, AX> strftime(_In_z_ _Printf_format_string_ const T* format, _In_ const struct tm* time, _In_opt_ locale_t locale)
-
2575 {
-
2576 std::basic_string<T, TR, AX> str;
-
2577 strcatftime(str, format, time, locale);
-
2578 return str;
-
2579 }
-
2580
-
2586 //template<class T>
-
2587 //inline void strlwr(_Inout_z_ T* str)
-
2588 //{
-
2589 // _Assume_(str);
-
2590 // for (size_t i = 0; str[i]; ++i)
-
2591 // str[i] = tolower(str[i]);
-
2592 //}
-
2593
-
2600 //template<class T>
-
2601 //inline void strlwr(_Inout_z_ T* str, _In_ const std::locale& locale)
-
2602 //{
-
2603 // _Assume_(str);
-
2604 // const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
2605 // for (size_t i = 0; str[i]; ++i)
-
2606 // str[i] = ctype.tolower(str[i]);
-
2607 //}
+
2446 // Try with stack buffer first.
+
2447 int count = vsnprintf(buf, _countof(buf), format, locale, arg);
+
2448 if (0 <= count && static_cast<size_t>(count) <= _countof(buf)) {
+
2449 // Copy from stack.
+
2450 str.append(buf, static_cast<size_t>(count));
+
2451 return static_cast<size_t>(count);
+
2452 }
+
2453#ifdef _WIN32
+
2454 if (count < 0) {
+
2455 switch (errno) {
+
2456 case 0:
+
2457 count = vsnprintf(NULL, 0, format, locale, arg);
+
2458 _Assume_(count >= 0);
+
2459 break;
+
2460 case EINVAL: throw std::invalid_argument("invalid vsnprintf arguments");
+
2461 case EILSEQ: throw std::runtime_error("encoding error");
+
2462 default: throw std::runtime_error("failed to format string");
+
2463 }
+
2464 }
+
2465 size_t offset = str.size();
+
2466 str.resize(offset + count);
+
2467 if (vsnprintf(&str[offset], count + 1, format, locale, arg) != count) _Unlikely_
+
2468 throw std::runtime_error("failed to format string");
+
2469#else
+
2470 size_t offset = str.size();
+
2471 for (size_t capacity = 2 * 1024 / sizeof(T);; capacity *= 2) {
+
2472 switch (errno) {
+
2473 case EOVERFLOW:
+
2474 // Allocate on heap and retry.
+
2475 str.resize(offset + capacity);
+
2476 count = vsnprintf(&str[offset], capacity, format, locale, arg);
+
2477 if (0 <= count && static_cast<size_t>(count) <= capacity) {
+
2478 str.resize(offset + static_cast<size_t>(count));
+
2479 return static_cast<size_t>(count);
+
2480 }
+
2481 break;
+
2482 case EINVAL: throw std::invalid_argument("invalid vsnprintf arguments");
+
2483 case EILSEQ: throw std::runtime_error("encoding error");
+
2484 default: throw std::runtime_error("failed to format string");
+
2485 }
+
2486 }
+
2487#endif
+
2488 return static_cast<size_t>(count);
+
2489 }
+
2490
+
2500 template<class T, class TR, class AX>
+
2501 size_t appendf(_Inout_ std::basic_string<T, TR, AX>& str, _In_z_ _Printf_format_string_params_(2) const T* format, _In_opt_ locale_t locale, ...)
+
2502 {
+
2503 va_list arg;
+
2504 va_start(arg, locale);
+
2505 size_t n = vappendf(str, format, locale, arg);
+
2506 va_end(arg);
+
2507 return n;
+
2508 }
+
2509
+
2518 template<class T, class TR, class AX>
+
2519 void vsprintf(_Inout_ std::basic_string<T, TR, AX>& str, _In_z_ _Printf_format_string_params_(2) const T* format, _In_opt_ locale_t locale, _In_ va_list arg)
+
2520 {
+
2521 str.clear();
+
2522 vappendf(str, format, locale, arg);
+
2523 }
+
2524
+
2532 template<class T, class TR, class AX>
+
2533 void sprintf(_Inout_ std::basic_string<T, TR, AX>& str, _In_z_ _Printf_format_string_params_(2) const T* format, _In_opt_ locale_t locale, ...)
+
2534 {
+
2535 va_list arg;
+
2536 va_start(arg, locale);
+
2537 vsprintf(str, format, locale, arg);
+
2538 va_end(arg);
+
2539 }
+
2540
+
2550 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
2551 std::basic_string<T, TR, AX> vsprintf(_In_z_ _Printf_format_string_params_(2) const T* format, _In_opt_ locale_t locale, _In_ va_list arg)
+
2552 {
+
2553 std::basic_string<T, TR, AX> str;
+
2554 vappendf(str, format, locale, arg);
+
2555 return str;
+
2556 }
+
2557
+
2566 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
2567 std::basic_string<T, TR, AX> sprintf(_In_z_ _Printf_format_string_params_(2) const T* format, _In_opt_ locale_t locale, ...)
+
2568 {
+
2569 va_list arg;
+
2570 va_start(arg, locale);
+
2571 auto str = vsprintf(format, locale, arg);
+
2572 va_end(arg);
+
2573 return str;
+
2574 }
+
2575
+
2577 inline size_t strftime(_Out_z_cap_(capacity) char* str, _In_ size_t capacity, _In_z_ _Printf_format_string_ const char* format, _In_ const struct tm* time, _In_opt_ locale_t locale)
+
2578 {
+
2579#ifdef _WIN32
+
2580 return _strftime_l(str, capacity, format, time, locale);
+
2581#else
+
2582 return strftime_l(str, capacity, format, time, locale);
+
2583#endif
+
2584 }
+
2585
+
2586 inline size_t strftime(_Out_z_cap_(capacity) wchar_t* str, _In_ size_t capacity, _In_z_ _Printf_format_string_ const wchar_t* format, _In_ const struct tm* time, _In_opt_ locale_t locale)
+
2587 {
+
2588#ifdef _WIN32
+
2589 return _wcsftime_l(str, capacity, format, time, locale);
+
2590#else
+
2591 return wcsftime_l(str, capacity, format, time, locale);
+
2592#endif
+
2593 }
+
2595
+
2604 template<class T, class TR, class AX>
+
2605 void strcatftime(_Inout_ std::basic_string<T, TR, AX>& str, _In_z_ _Printf_format_string_ const T* format, _In_ const struct tm* time, _In_opt_ locale_t locale)
+
2606 {
+
2607 T buf[1024 / sizeof(T)];
2608
-
2615 template<class T>
-
2616 inline void strlwr(_Inout_updates_z_(count) T* str, _In_ size_t count)
-
2617 {
-
2618 _Assume_(str || !count);
-
2619 for (size_t i = 0; i < count && str[i]; ++i)
-
2620 str[i] = tolower(str[i]);
-
2621 }
-
2622
-
2630 template<class T>
-
2631 inline void strlwr(_Inout_updates_z_(count) T* str, _In_ size_t count, _In_ const std::locale& locale)
-
2632 {
-
2633 _Assume_(str || !count);
-
2634 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
2635 for (size_t i = 0; i < count && str[i]; ++i)
-
2636 str[i] = ctype.tolower(str[i]);
-
2637 }
-
2638
-
2644 template<class T, size_t N>
-
2645 inline void strlwr(_Inout_ T (&str)[N])
-
2646 {
-
2647 strlwr(str, N);
-
2648 }
-
2649
-
2656 template<class T, size_t N>
-
2657 inline void strlwr(_Inout_ T (&str)[N], _In_ const std::locale& locale)
-
2658 {
-
2659 strlwr(str, N, locale);
-
2660 }
-
2661
-
2667 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
2668 inline void strlwr(_Inout_ std::basic_string<T, TR, AX>& str)
-
2669 {
-
2670 for (auto& c : str)
-
2671 c = tolower(c);
-
2672 }
-
2673
-
2680 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
2681 inline void strlwr(_Inout_ std::basic_string<T, TR, AX>& str, _In_ const std::locale& locale)
-
2682 {
-
2683 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
2684 for (auto& c : str)
-
2685 c = ctype.tolower(c);
-
2686 }
+
2609 // Try with stack buffer first.
+
2610 size_t count = strftime(buf, _countof(buf), format, time, locale);
+
2611 if (count) {
+
2612 // Copy from stack.
+
2613 str.append(buf, count);
+
2614 return;
+
2615 }
+
2616 size_t offset = str.size();
+
2617 for (size_t capacity = 2 * 1024 / sizeof(T);; capacity *= 2) {
+
2618 // Allocate on heap and retry.
+
2619 str.resize(offset + capacity);
+
2620 count = strftime(&str[offset], capacity + 1, format, time, locale);
+
2621 if (count) {
+
2622 str.resize(offset + count);
+
2623 return;
+
2624 }
+
2625 }
+
2626 }
+
2627
+
2636 template<class T, class TR, class AX>
+
2637 void strftime(_Inout_ std::basic_string<T, TR, AX>& str, _In_z_ _Printf_format_string_ const T* format, _In_ const struct tm* time, _In_opt_ locale_t locale)
+
2638 {
+
2639 str.clear();
+
2640 strcatftime(str, format, time, locale);
+
2641 }
+
2642
+
2652 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
2653 std::basic_string<T, TR, AX> strftime(_In_z_ _Printf_format_string_ const T* format, _In_ const struct tm* time, _In_opt_ locale_t locale)
+
2654 {
+
2655 std::basic_string<T, TR, AX> str;
+
2656 strcatftime(str, format, time, locale);
+
2657 return str;
+
2658 }
+
2659
+
2665 //template<class T>
+
2666 //void strlwr(_Inout_z_ T* str)
+
2667 //{
+
2668 // _Assume_(str);
+
2669 // for (size_t i = 0; str[i]; ++i)
+
2670 // str[i] = tolower(str[i]);
+
2671 //}
+
2672
+
2679 //template<class T>
+
2680 //void strlwr(_Inout_z_ T* str, _In_ const std::locale& locale)
+
2681 //{
+
2682 // _Assume_(str);
+
2683 // const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
2684 // for (size_t i = 0; str[i]; ++i)
+
2685 // str[i] = ctype.tolower(str[i]);
+
2686 //}
2687
-
2693 //template<class T>
-
2694 //inline void strupr(_Inout_z_ T* str)
-
2695 //{
-
2696 // _Assume_(str);
-
2697 // for (size_t i = 0; str[i]; ++i)
-
2698 // str[i] = toupper(str[i]);
-
2699 //}
-
2700
-
2707 //template<class T>
-
2708 //inline void strupr(_Inout_z_ T* str, _In_ const std::locale& locale)
-
2709 //{
-
2710 // _Assume_(str);
-
2711 // const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
2712 // for (size_t i = 0; str[i]; ++i)
-
2713 // str[i] = ctype.toupper(str[i]);
-
2714 //}
-
2715
-
2722 template<class T>
-
2723 inline void strupr(_Inout_updates_z_(count) T* str, _In_ size_t count)
-
2724 {
-
2725 _Assume_(str || !count);
-
2726 for (size_t i = 0; i < count && str[i]; ++i)
-
2727 str[i] = toupper(str[i]);
-
2728 }
-
2729
-
2737 template<class T>
-
2738 inline void strupr(_Inout_updates_z_(count) T* str, _In_ size_t count, _In_ const std::locale& locale)
-
2739 {
-
2740 _Assume_(str || !count);
-
2741 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
2742 for (size_t i = 0; i < count && str[i]; ++i)
-
2743 str[i] = ctype.toupper(str[i]);
-
2744 }
-
2745
-
2751 template<class T, size_t N>
-
2752 inline void strupr(_Inout_ T (&str)[N])
-
2753 {
-
2754 return strupr(str, N);
-
2755 }
-
2756
-
2763 template<class T, size_t N>
-
2764 inline void strupr(_Inout_ T (&str)[N], _In_ const std::locale& locale)
-
2765 {
-
2766 return strupr(str, N, locale);
-
2767 }
-
2768
-
2774 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
2775 inline void strupr(_Inout_ std::basic_string<T, TR, AX>& str)
-
2776 {
-
2777 for (auto& c : str)
-
2778 c = toupper(c);
-
2779 }
-
2780
-
2787 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
2788 inline void strupr(_Inout_ std::basic_string<T, TR, AX>& str, _In_ const std::locale& locale)
-
2789 {
-
2790 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
2791 for (auto& c : str)
-
2792 c = ctype.toupper(c);
-
2793 }
+
2694 template<class T>
+
2695 void strlwr(_Inout_updates_z_(count) T* str, _In_ size_t count)
+
2696 {
+
2697 _Assume_(str || !count);
+
2698 for (size_t i = 0; i < count && str[i]; ++i)
+
2699 str[i] = tolower(str[i]);
+
2700 }
+
2701
+
2709 template<class T>
+
2710 void strlwr(_Inout_updates_z_(count) T* str, _In_ size_t count, _In_ const std::locale& locale)
+
2711 {
+
2712 _Assume_(str || !count);
+
2713 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
2714 for (size_t i = 0; i < count && str[i]; ++i)
+
2715 str[i] = ctype.tolower(str[i]);
+
2716 }
+
2717
+
2723 template<class T, size_t N>
+
2724 void strlwr(_Inout_ T (&str)[N])
+
2725 {
+
2726 strlwr(str, N);
+
2727 }
+
2728
+
2735 template<class T, size_t N>
+
2736 void strlwr(_Inout_ T (&str)[N], _In_ const std::locale& locale)
+
2737 {
+
2738 strlwr(str, N, locale);
+
2739 }
+
2740
+
2746 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
2747 void strlwr(_Inout_ std::basic_string<T, TR, AX>& str)
+
2748 {
+
2749 for (auto& c : str)
+
2750 c = tolower(c);
+
2751 }
+
2752
+
2759 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
2760 void strlwr(_Inout_ std::basic_string<T, TR, AX>& str, _In_ const std::locale& locale)
+
2761 {
+
2762 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
2763 for (auto& c : str)
+
2764 c = ctype.tolower(c);
+
2765 }
+
2766
+
2772 //template<class T>
+
2773 //void strupr(_Inout_z_ T* str)
+
2774 //{
+
2775 // _Assume_(str);
+
2776 // for (size_t i = 0; str[i]; ++i)
+
2777 // str[i] = toupper(str[i]);
+
2778 //}
+
2779
+
2786 //template<class T>
+
2787 //void strupr(_Inout_z_ T* str, _In_ const std::locale& locale)
+
2788 //{
+
2789 // _Assume_(str);
+
2790 // const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
2791 // for (size_t i = 0; str[i]; ++i)
+
2792 // str[i] = ctype.toupper(str[i]);
+
2793 //}
2794
-
2803 template<class T>
-
2804 inline size_t ltrim(
-
2805 _Inout_z_count_(count) T* str, _In_ size_t count)
-
2806 {
-
2807 for (size_t i = 0;; ++i) {
-
2808 if (i >= count) {
-
2809 if (count) str[0] = 0;
-
2810 return 0;
-
2811 }
-
2812 if (!str[i]) {
-
2813 str[0] = 0;
-
2814 return 0;
-
2815 }
-
2816 if (!isspace(str[i])) {
-
2817 if (!i)
-
2818 return strnlen(str, count);
-
2819 size_t n = count != SIZE_MAX ? strncpy(str, str + i, count - i) : strcpy(str, str + i);
-
2820 str[n] = 0;
-
2821 return n;
-
2822 }
-
2823 }
-
2824 }
-
2825
-
2835 template<class T>
-
2836 inline size_t ltrim(
-
2837 _Inout_z_count_(count) T* str, _In_ size_t count,
-
2838 _In_ const std::locale& locale)
-
2839 {
-
2840 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
2841 for (size_t i = 0;; ++i) {
-
2842 if (i >= count) {
-
2843 if (count) str[0] = 0;
-
2844 return 0;
-
2845 }
-
2846 if (!str[i]) {
-
2847 str[0] = 0;
-
2848 return 0;
-
2849 }
-
2850 if (!ctype.is(ctype.space, str[i])) {
-
2851 if (!i)
-
2852 return strnlen(str, count);
-
2853 size_t n = count != SIZE_MAX ? strncpy(str, str + i, count - i) : strcpy(str, str + i);
-
2854 str[n] = 0;
-
2855 return n;
-
2856 }
-
2857 }
+
2801 template<class T>
+
2802 void strupr(_Inout_updates_z_(count) T* str, _In_ size_t count)
+
2803 {
+
2804 _Assume_(str || !count);
+
2805 for (size_t i = 0; i < count && str[i]; ++i)
+
2806 str[i] = toupper(str[i]);
+
2807 }
+
2808
+
2816 template<class T>
+
2817 void strupr(_Inout_updates_z_(count) T* str, _In_ size_t count, _In_ const std::locale& locale)
+
2818 {
+
2819 _Assume_(str || !count);
+
2820 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
2821 for (size_t i = 0; i < count && str[i]; ++i)
+
2822 str[i] = ctype.toupper(str[i]);
+
2823 }
+
2824
+
2830 template<class T, size_t N>
+
2831 void strupr(_Inout_ T (&str)[N])
+
2832 {
+
2833 return strupr(str, N);
+
2834 }
+
2835
+
2842 template<class T, size_t N>
+
2843 void strupr(_Inout_ T (&str)[N], _In_ const std::locale& locale)
+
2844 {
+
2845 return strupr(str, N, locale);
+
2846 }
+
2847
+
2853 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
2854 void strupr(_Inout_ std::basic_string<T, TR, AX>& str)
+
2855 {
+
2856 for (auto& c : str)
+
2857 c = toupper(c);
2858 }
2859
-
2865 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
2866 inline void ltrim(_Inout_ std::basic_string<T, TR, AX>& s)
-
2867 {
-
2868 s.erase(
-
2869 s.begin(),
-
2870 std::find_if(
-
2871 s.begin(),
-
2872 s.end(),
-
2873 [&](_In_ T ch) { return !isspace(ch); }));
-
2874 }
-
2875
-
2882 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
2883 inline void ltrim(_Inout_ std::basic_string<T, TR, AX>& s, _In_ const std::locale& locale)
-
2884 {
-
2885 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
2886 s.erase(
-
2887 s.begin(),
-
2888 std::find_if(
-
2889 s.begin(),
-
2890 s.end(),
-
2891 [&](_In_ T ch) { return !ctype.is(ctype.space, ch); }));
-
2892 }
-
2893
-
2902 template<class T>
-
2903 inline size_t rtrim(
-
2904 _Inout_z_count_(count) T* str, _In_ size_t count)
-
2905 {
-
2906 for (size_t i = 0, j = 0;;) {
-
2907 if (i >= count || !str[i]) {
-
2908 if (j < count) str[j] = 0;
-
2909 return j;
-
2910 }
-
2911 if (!isspace(str[i]))
-
2912 j = ++i;
-
2913 else
-
2914 ++i;
-
2915 }
-
2916 }
-
2917
-
2927 template<class T>
-
2928 inline size_t rtrim(
-
2929 _Inout_z_count_(count) T* str, _In_ size_t count,
-
2930 _In_ const std::locale& locale)
-
2931 {
-
2932 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
2933 for (size_t i = 0, j = 0;;) {
-
2934 if (i >= count || !str[i]) {
-
2935 if (j < count) str[j] = 0;
-
2936 return j;
-
2937 }
-
2938 if (!ctype.is(ctype.space, str[i]))
-
2939 j = ++i;
-
2940 else
-
2941 ++i;
-
2942 }
-
2943 }
-
2944
-
2950 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
2951 static inline void rtrim(_Inout_ std::basic_string<T, TR, AX>& s)
-
2952 {
-
2953 s.erase(
-
2954 std::find_if(
-
2955 s.rbegin(),
-
2956 s.rend(),
-
2957 [&](_In_ T ch) { return !isspace(ch); }).base(),
-
2958 s.end());
-
2959 }
-
2960
-
2967 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
2968 static inline void rtrim(_Inout_ std::basic_string<T, TR, AX>& s, _In_ const std::locale& locale)
-
2969 {
-
2970 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
2971 s.erase(
-
2972 std::find_if(
-
2973 s.rbegin(),
-
2974 s.rend(),
-
2975 [&](_In_ T ch) { return !ctype.is(ctype.space, ch); }).base(),
-
2976 s.end());
-
2977 }
-
2978
-
2987 template<class T>
-
2988 inline size_t trim(
-
2989 _Inout_z_count_(count) T* str, _In_ size_t count)
-
2990 {
-
2991 return ltrim(str, rtrim(str, count));
-
2992 }
-
2993
-
3003 template<class T>
-
3004 inline size_t trim(
-
3005 _Inout_z_count_(count) T* str, _In_ size_t count,
-
3006 _In_ const std::locale& locale)
-
3007 {
-
3008 return ltrim(str, rtrim(str, count, locale), locale);
-
3009 }
-
3010
-
3016 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
3017 static inline void trim(_Inout_ std::basic_string<T, TR, AX>& s)
-
3018 {
-
3019 auto nonspace = [&](_In_ T ch) { return !isspace(ch); };
-
3020 s.erase(
-
3021 s.begin(),
-
3022 std::find_if(
-
3023 s.begin(),
-
3024 s.end(),
-
3025 nonspace));
-
3026 s.erase(
-
3027 std::find_if(
-
3028 s.rbegin(),
-
3029 s.rend(),
-
3030 nonspace).base(),
-
3031 s.end());
-
3032 }
-
3033
-
3040 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
-
3041 static inline void trim(_Inout_ std::basic_string<T, TR, AX>& s, _In_ const std::locale& locale)
-
3042 {
-
3043 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
-
3044 auto nonspace = [&](_In_ T ch) { return !ctype.is(ctype.space, ch); };
-
3045 s.erase(
-
3046 s.begin(),
-
3047 std::find_if(
-
3048 s.begin(),
-
3049 s.end(),
-
3050 nonspace));
-
3051 s.erase(
-
3052 std::find_if(
-
3053 s.rbegin(),
-
3054 s.rend(),
-
3055 nonspace).base(),
-
3056 s.end());
-
3057 }
-
3058}
+
2866 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
2867 void strupr(_Inout_ std::basic_string<T, TR, AX>& str, _In_ const std::locale& locale)
+
2868 {
+
2869 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
2870 for (auto& c : str)
+
2871 c = ctype.toupper(c);
+
2872 }
+
2873
+
2882 template<class T>
+
2883 size_t ltrim(
+
2884 _Inout_z_count_(count) T* str, _In_ size_t count)
+
2885 {
+
2886 for (size_t i = 0;; ++i) {
+
2887 if (i >= count) {
+
2888 if (count) str[0] = 0;
+
2889 return 0;
+
2890 }
+
2891 if (!str[i]) {
+
2892 str[0] = 0;
+
2893 return 0;
+
2894 }
+
2895 if (!isspace(str[i])) {
+
2896 if (!i)
+
2897 return strnlen(str, count);
+
2898 size_t n = count != SIZE_MAX ? strncpy(str, str + i, count - i) : strcpy(str, str + i);
+
2899 str[n] = 0;
+
2900 return n;
+
2901 }
+
2902 }
+
2903 }
+
2904
+
2914 template<class T>
+
2915 size_t ltrim(
+
2916 _Inout_z_count_(count) T* str, _In_ size_t count,
+
2917 _In_ const std::locale& locale)
+
2918 {
+
2919 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
2920 for (size_t i = 0;; ++i) {
+
2921 if (i >= count) {
+
2922 if (count) str[0] = 0;
+
2923 return 0;
+
2924 }
+
2925 if (!str[i]) {
+
2926 str[0] = 0;
+
2927 return 0;
+
2928 }
+
2929 if (!ctype.is(ctype.space, str[i])) {
+
2930 if (!i)
+
2931 return strnlen(str, count);
+
2932 size_t n = count != SIZE_MAX ? strncpy(str, str + i, count - i) : strcpy(str, str + i);
+
2933 str[n] = 0;
+
2934 return n;
+
2935 }
+
2936 }
+
2937 }
+
2938
+
2944 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
2945 void ltrim(_Inout_ std::basic_string<T, TR, AX>& s)
+
2946 {
+
2947 s.erase(
+
2948 s.begin(),
+
2949 std::find_if(
+
2950 s.begin(),
+
2951 s.end(),
+
2952 [&](_In_ T ch) { return !isspace(ch); }));
+
2953 }
+
2954
+
2961 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
2962 void ltrim(_Inout_ std::basic_string<T, TR, AX>& s, _In_ const std::locale& locale)
+
2963 {
+
2964 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
2965 s.erase(
+
2966 s.begin(),
+
2967 std::find_if(
+
2968 s.begin(),
+
2969 s.end(),
+
2970 [&](_In_ T ch) { return !ctype.is(ctype.space, ch); }));
+
2971 }
+
2972
+
2981 template<class T>
+
2982 size_t rtrim(
+
2983 _Inout_z_count_(count) T* str, _In_ size_t count)
+
2984 {
+
2985 for (size_t i = 0, j = 0;;) {
+
2986 if (i >= count || !str[i]) {
+
2987 if (j < count) str[j] = 0;
+
2988 return j;
+
2989 }
+
2990 if (!isspace(str[i]))
+
2991 j = ++i;
+
2992 else
+
2993 ++i;
+
2994 }
+
2995 }
+
2996
+
3006 template<class T>
+
3007 size_t rtrim(
+
3008 _Inout_z_count_(count) T* str, _In_ size_t count,
+
3009 _In_ const std::locale& locale)
+
3010 {
+
3011 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
3012 for (size_t i = 0, j = 0;;) {
+
3013 if (i >= count || !str[i]) {
+
3014 if (j < count) str[j] = 0;
+
3015 return j;
+
3016 }
+
3017 if (!ctype.is(ctype.space, str[i]))
+
3018 j = ++i;
+
3019 else
+
3020 ++i;
+
3021 }
+
3022 }
+
3023
+
3029 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
3030 void rtrim(_Inout_ std::basic_string<T, TR, AX>& s)
+
3031 {
+
3032 s.erase(
+
3033 std::find_if(
+
3034 s.rbegin(),
+
3035 s.rend(),
+
3036 [&](_In_ T ch) { return !isspace(ch); }).base(),
+
3037 s.end());
+
3038 }
+
3039
+
3046 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
3047 void rtrim(_Inout_ std::basic_string<T, TR, AX>& s, _In_ const std::locale& locale)
+
3048 {
+
3049 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
3050 s.erase(
+
3051 std::find_if(
+
3052 s.rbegin(),
+
3053 s.rend(),
+
3054 [&](_In_ T ch) { return !ctype.is(ctype.space, ch); }).base(),
+
3055 s.end());
+
3056 }
+
3057
+
3066 template<class T>
+
3067 size_t trim(
+
3068 _Inout_z_count_(count) T* str, _In_ size_t count)
+
3069 {
+
3070 return ltrim(str, rtrim(str, count));
+
3071 }
+
3072
+
3082 template<class T>
+
3083 size_t trim(
+
3084 _Inout_z_count_(count) T* str, _In_ size_t count,
+
3085 _In_ const std::locale& locale)
+
3086 {
+
3087 return ltrim(str, rtrim(str, count, locale), locale);
+
3088 }
+
3089
+
3095 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
3096 void trim(_Inout_ std::basic_string<T, TR, AX>& s)
+
3097 {
+
3098 auto nonspace = [&](_In_ T ch) { return !isspace(ch); };
+
3099 s.erase(
+
3100 s.begin(),
+
3101 std::find_if(
+
3102 s.begin(),
+
3103 s.end(),
+
3104 nonspace));
+
3105 s.erase(
+
3106 std::find_if(
+
3107 s.rbegin(),
+
3108 s.rend(),
+
3109 nonspace).base(),
+
3110 s.end());
+
3111 }
+
3112
+
3119 template<class T, class TR = std::char_traits<T>, class AX = std::allocator<T>>
+
3120 void trim(_Inout_ std::basic_string<T, TR, AX>& s, _In_ const std::locale& locale)
+
3121 {
+
3122 const auto& ctype = std::use_facet<std::ctype<T>>(locale);
+
3123 auto nonspace = [&](_In_ T ch) { return !ctype.is(ctype.space, ch); };
+
3124 s.erase(
+
3125 s.begin(),
+
3126 std::find_if(
+
3127 s.begin(),
+
3128 s.end(),
+
3129 nonspace));
+
3130 s.erase(
+
3131 std::find_if(
+
3132 s.rbegin(),
+
3133 s.rend(),
+
3134 nonspace).base(),
+
3135 s.end());
+
3136 }
+
3137}
diff --git a/structstdex_1_1chrono_1_1aosn__date-members.html b/structstdex_1_1chrono_1_1aosn__date-members.html index 2b00a6464..70f6cb938 100644 --- a/structstdex_1_1chrono_1_1aosn__date-members.html +++ b/structstdex_1_1chrono_1_1aosn__date-members.html @@ -98,7 +98,7 @@ $(function() {
diff --git a/structstdex_1_1chrono_1_1aosn__date.html b/structstdex_1_1chrono_1_1aosn__date.html index 2bd6ad493..b42f6747d 100644 --- a/structstdex_1_1chrono_1_1aosn__date.html +++ b/structstdex_1_1chrono_1_1aosn__date.html @@ -154,7 +154,7 @@ static constexpr bool is_s
diff --git a/structstdex_1_1chrono_1_1aosn__timestamp-members.html b/structstdex_1_1chrono_1_1aosn__timestamp-members.html index ad43995e1..6f0b5049c 100644 --- a/structstdex_1_1chrono_1_1aosn__timestamp-members.html +++ b/structstdex_1_1chrono_1_1aosn__timestamp-members.html @@ -112,7 +112,7 @@ $(function() {
diff --git a/structstdex_1_1chrono_1_1aosn__timestamp.html b/structstdex_1_1chrono_1_1aosn__timestamp.html index 979135c7c..5bab28243 100644 --- a/structstdex_1_1chrono_1_1aosn__timestamp.html +++ b/structstdex_1_1chrono_1_1aosn__timestamp.html @@ -199,7 +199,7 @@ static constexpr rep one_w
diff --git a/structstdex_1_1free__locale__delete-members.html b/structstdex_1_1free__locale__delete-members.html index 24dc28f53..1c3d49325 100644 --- a/structstdex_1_1free__locale__delete-members.html +++ b/structstdex_1_1free__locale__delete-members.html @@ -86,7 +86,7 @@ $(function() {
diff --git a/structstdex_1_1free__locale__delete.html b/structstdex_1_1free__locale__delete.html index 2e820d0b8..9de520280 100644 --- a/structstdex_1_1free__locale__delete.html +++ b/structstdex_1_1free__locale__delete.html @@ -103,7 +103,7 @@ void operator() (local
diff --git a/structstdex_1_1html_1_1element__traits-members.html b/structstdex_1_1html_1_1element__traits-members.html index ee3255924..033dc719c 100644 --- a/structstdex_1_1html_1_1element__traits-members.html +++ b/structstdex_1_1html_1_1element__traits-members.html @@ -104,7 +104,7 @@ $(function() {
diff --git a/structstdex_1_1html_1_1element__traits.html b/structstdex_1_1html_1_1element__traits.html index d2c6459d1..f1bbeeea1 100644 --- a/structstdex_1_1html_1_1element__traits.html +++ b/structstdex_1_1html_1_1element__traits.html @@ -818,7 +818,7 @@ template<class T >
diff --git a/structstdex_1_1html_1_1entity-members.html b/structstdex_1_1html_1_1entity-members.html index 6fac8c72b..7d53b5de1 100644 --- a/structstdex_1_1html_1_1entity-members.html +++ b/structstdex_1_1html_1_1entity-members.html @@ -87,7 +87,7 @@ $(function() {
diff --git a/structstdex_1_1html_1_1entity.html b/structstdex_1_1html_1_1entity.html index 1396e2459..e22378efe 100644 --- a/structstdex_1_1html_1_1entity.html +++ b/structstdex_1_1html_1_1entity.html @@ -108,7 +108,7 @@ struct stdex::html::entity< T, TR, AX >

HTML entity.

diff --git a/structstdex_1_1html_1_1inserted__token-members.html b/structstdex_1_1html_1_1inserted__token-members.html index 70ee04b9d..242f09440 100644 --- a/structstdex_1_1html_1_1inserted__token-members.html +++ b/structstdex_1_1html_1_1inserted__token-members.html @@ -89,7 +89,7 @@ $(function() {
diff --git a/structstdex_1_1html_1_1inserted__token.html b/structstdex_1_1html_1_1inserted__token.html index 9c952a7ea..034bc5012 100644 --- a/structstdex_1_1html_1_1inserted__token.html +++ b/structstdex_1_1html_1_1inserted__token.html @@ -115,7 +115,7 @@ bool after_word diff --git a/structstdex_1_1interval-members.html b/structstdex_1_1interval-members.html index e191ce096..9cdced711 100644 --- a/structstdex_1_1interval-members.html +++ b/structstdex_1_1interval-members.html @@ -107,7 +107,7 @@ $(function() {
diff --git a/structstdex_1_1interval.html b/structstdex_1_1interval.html index 7807a3bcb..f9e0d3f21 100644 --- a/structstdex_1_1interval.html +++ b/structstdex_1_1interval.html @@ -785,7 +785,7 @@ template<class T >
diff --git a/structstdex_1_1mapping-members.html b/structstdex_1_1mapping-members.html index 8bdd16936..d1a9ef11e 100644 --- a/structstdex_1_1mapping-members.html +++ b/structstdex_1_1mapping-members.html @@ -93,7 +93,7 @@ $(function() {
diff --git a/structstdex_1_1mapping.html b/structstdex_1_1mapping.html index f511bc29b..7e25d86f2 100644 --- a/structstdex_1_1mapping.html +++ b/structstdex_1_1mapping.html @@ -314,7 +314,7 @@ template<class T >
diff --git a/structstdex_1_1no__delete-members.html b/structstdex_1_1no__delete-members.html index 5d9e4715c..549c843c1 100644 --- a/structstdex_1_1no__delete-members.html +++ b/structstdex_1_1no__delete-members.html @@ -88,7 +88,7 @@ $(function() {
diff --git a/structstdex_1_1no__delete.html b/structstdex_1_1no__delete.html index 54854b3f9..8cd877c9b 100644 --- a/structstdex_1_1no__delete.html +++ b/structstdex_1_1no__delete.html @@ -107,7 +107,7 @@ struct stdex::no_delete< T >

Noop deleter.

diff --git a/structstdex_1_1no__delete_3_01_t_0f_0e_4-members.html b/structstdex_1_1no__delete_3_01_t_0f_0e_4-members.html index 24422d5fd..32c796b02 100644 --- a/structstdex_1_1no__delete_3_01_t_0f_0e_4-members.html +++ b/structstdex_1_1no__delete_3_01_t_0f_0e_4-members.html @@ -88,7 +88,7 @@ $(function() {
diff --git a/structstdex_1_1no__delete_3_01_t_0f_0e_4.html b/structstdex_1_1no__delete_3_01_t_0f_0e_4.html index b7ebf92b5..385ec5644 100644 --- a/structstdex_1_1no__delete_3_01_t_0f_0e_4.html +++ b/structstdex_1_1no__delete_3_01_t_0f_0e_4.html @@ -108,7 +108,7 @@ struct stdex::no_delete< T[]>

Noop array deleter.

diff --git a/structstdex_1_1parser_1_1html__attribute-members.html b/structstdex_1_1parser_1_1html__attribute-members.html index 68835371d..c243de0e8 100644 --- a/structstdex_1_1parser_1_1html__attribute-members.html +++ b/structstdex_1_1parser_1_1html__attribute-members.html @@ -87,7 +87,7 @@ $(function() {
diff --git a/structstdex_1_1parser_1_1html__attribute.html b/structstdex_1_1parser_1_1html__attribute.html index d89c9a2ac..c1ee390bd 100644 --- a/structstdex_1_1parser_1_1html__attribute.html +++ b/structstdex_1_1parser_1_1html__attribute.html @@ -107,7 +107,7 @@ Public Attributes
diff --git a/structstdex_1_1parser_1_1http__factor__more-members.html b/structstdex_1_1parser_1_1http__factor__more-members.html index 0a3231625..1ef126f7b 100644 --- a/structstdex_1_1parser_1_1http__factor__more-members.html +++ b/structstdex_1_1parser_1_1http__factor__more-members.html @@ -86,7 +86,7 @@ $(function() {
diff --git a/structstdex_1_1parser_1_1http__factor__more.html b/structstdex_1_1parser_1_1http__factor__more.html index 015505994..78f431c5c 100644 --- a/structstdex_1_1parser_1_1http__factor__more.html +++ b/structstdex_1_1parser_1_1http__factor__more.html @@ -95,7 +95,7 @@ Public Member Functions
diff --git a/structstdex_1_1stream_1_1buffer_1_1buffer__t-members.html b/structstdex_1_1stream_1_1buffer_1_1buffer__t-members.html index b8be138b7..1b8b96417 100644 --- a/structstdex_1_1stream_1_1buffer_1_1buffer__t-members.html +++ b/structstdex_1_1stream_1_1buffer_1_1buffer__t-members.html @@ -91,7 +91,7 @@ $(function() {
diff --git a/structstdex_1_1stream_1_1buffer_1_1buffer__t.html b/structstdex_1_1stream_1_1buffer_1_1buffer__t.html index c89a8fc27..aa0d1b753 100644 --- a/structstdex_1_1stream_1_1buffer_1_1buffer__t.html +++ b/structstdex_1_1stream_1_1buffer_1_1buffer__t.html @@ -111,7 +111,7 @@ size_t capacity diff --git a/structstdex_1_1stream_1_1fifo_1_1node__t-members.html b/structstdex_1_1stream_1_1fifo_1_1node__t-members.html index d9bffdd25..b6947b0e0 100644 --- a/structstdex_1_1stream_1_1fifo_1_1node__t-members.html +++ b/structstdex_1_1stream_1_1fifo_1_1node__t-members.html @@ -88,7 +88,7 @@ $(function() {
diff --git a/structstdex_1_1stream_1_1fifo_1_1node__t.html b/structstdex_1_1stream_1_1fifo_1_1node__t.html index 571d31260..eca28fd31 100644 --- a/structstdex_1_1stream_1_1fifo_1_1node__t.html +++ b/structstdex_1_1stream_1_1fifo_1_1node__t.html @@ -101,7 +101,7 @@ uint8_t data [0]<
diff --git a/structstdex_1_1sys__info__t-members.html b/structstdex_1_1sys__info__t-members.html index d84d69805..762d4c78f 100644 --- a/structstdex_1_1sys__info__t-members.html +++ b/structstdex_1_1sys__info__t-members.html @@ -92,7 +92,7 @@ $(function() {
diff --git a/structstdex_1_1sys__info__t.html b/structstdex_1_1sys__info__t.html index fe3a0d24b..26f13166f 100644 --- a/structstdex_1_1sys__info__t.html +++ b/structstdex_1_1sys__info__t.html @@ -147,7 +147,7 @@ struct utsname m_utsn<
diff --git a/structstdex_1_1wav_1_1cue-members.html b/structstdex_1_1wav_1_1cue-members.html index 5051f140b..0f76bd0f0 100644 --- a/structstdex_1_1wav_1_1cue-members.html +++ b/structstdex_1_1wav_1_1cue-members.html @@ -91,7 +91,7 @@ $(function() {
diff --git a/structstdex_1_1wav_1_1cue.html b/structstdex_1_1wav_1_1cue.html index 17f58a240..40886a5e2 100644 --- a/structstdex_1_1wav_1_1cue.html +++ b/structstdex_1_1wav_1_1cue.html @@ -132,7 +132,7 @@ uint32_t block_offset
diff --git a/structstdex_1_1wav_1_1cue__ex-members.html b/structstdex_1_1wav_1_1cue__ex-members.html index f62660700..8f4a05991 100644 --- a/structstdex_1_1wav_1_1cue__ex-members.html +++ b/structstdex_1_1wav_1_1cue__ex-members.html @@ -100,7 +100,7 @@ $(function() {
diff --git a/structstdex_1_1wav_1_1cue__ex.html b/structstdex_1_1wav_1_1cue__ex.html index 483fdae81..a5b0b3183 100644 --- a/structstdex_1_1wav_1_1cue__ex.html +++ b/structstdex_1_1wav_1_1cue__ex.html @@ -169,7 +169,7 @@ uint32_t block_offset
diff --git a/structstdex_1_1wav_1_1data-members.html b/structstdex_1_1wav_1_1data-members.html index ead82bf6d..e021fb70c 100644 --- a/structstdex_1_1wav_1_1data-members.html +++ b/structstdex_1_1wav_1_1data-members.html @@ -89,7 +89,7 @@ $(function() {
diff --git a/structstdex_1_1wav_1_1data.html b/structstdex_1_1wav_1_1data.html index 78806a7b8..61afafa0b 100644 --- a/structstdex_1_1wav_1_1data.html +++ b/structstdex_1_1wav_1_1data.html @@ -120,7 +120,7 @@ Friends
diff --git a/structstdex_1_1wav_1_1format-members.html b/structstdex_1_1wav_1_1format-members.html index 294dd209c..84d31ed21 100644 --- a/structstdex_1_1wav_1_1format-members.html +++ b/structstdex_1_1wav_1_1format-members.html @@ -96,7 +96,7 @@ $(function() {
diff --git a/structstdex_1_1wav_1_1format.html b/structstdex_1_1wav_1_1format.html index fe14db488..5c90f4750 100644 --- a/structstdex_1_1wav_1_1format.html +++ b/structstdex_1_1wav_1_1format.html @@ -211,7 +211,7 @@ Friends
diff --git a/structstdex_1_1wav_1_1header-members.html b/structstdex_1_1wav_1_1header-members.html index 593e8025c..ea7ed1a2e 100644 --- a/structstdex_1_1wav_1_1header-members.html +++ b/structstdex_1_1wav_1_1header-members.html @@ -89,7 +89,7 @@ $(function() {
diff --git a/structstdex_1_1wav_1_1header.html b/structstdex_1_1wav_1_1header.html index ee6cc02d7..76cc0f2e6 100644 --- a/structstdex_1_1wav_1_1header.html +++ b/structstdex_1_1wav_1_1header.html @@ -130,7 +130,7 @@ Friends
diff --git a/structstdex_1_1wav_1_1label-members.html b/structstdex_1_1wav_1_1label-members.html index 0551c4c62..65775210b 100644 --- a/structstdex_1_1wav_1_1label-members.html +++ b/structstdex_1_1wav_1_1label-members.html @@ -90,7 +90,7 @@ $(function() {
diff --git a/structstdex_1_1wav_1_1label.html b/structstdex_1_1wav_1_1label.html index 66f8525d5..ce4e0fd1c 100644 --- a/structstdex_1_1wav_1_1label.html +++ b/structstdex_1_1wav_1_1label.html @@ -124,7 +124,7 @@ Friends
diff --git a/structstdex_1_1wav_1_1list-members.html b/structstdex_1_1wav_1_1list-members.html index e51a503ea..3a16621dd 100644 --- a/structstdex_1_1wav_1_1list-members.html +++ b/structstdex_1_1wav_1_1list-members.html @@ -87,7 +87,7 @@ $(function() {
diff --git a/structstdex_1_1wav_1_1list.html b/structstdex_1_1wav_1_1list.html index fd4cffe45..a21b8da92 100644 --- a/structstdex_1_1wav_1_1list.html +++ b/structstdex_1_1wav_1_1list.html @@ -123,7 +123,7 @@ id_t type = 0 diff --git a/structstdex_1_1wav_1_1ltxt-members.html b/structstdex_1_1wav_1_1ltxt-members.html index 9bba707e4..ea822b6ba 100644 --- a/structstdex_1_1wav_1_1ltxt-members.html +++ b/structstdex_1_1wav_1_1ltxt-members.html @@ -96,7 +96,7 @@ $(function() {
diff --git a/structstdex_1_1wav_1_1ltxt.html b/structstdex_1_1wav_1_1ltxt.html index 0469a57bc..045043af8 100644 --- a/structstdex_1_1wav_1_1ltxt.html +++ b/structstdex_1_1wav_1_1ltxt.html @@ -148,7 +148,7 @@ Friends
diff --git a/structstdex_1_1wav_1_1note-members.html b/structstdex_1_1wav_1_1note-members.html index 4c38b37e7..eca4559c5 100644 --- a/structstdex_1_1wav_1_1note-members.html +++ b/structstdex_1_1wav_1_1note-members.html @@ -90,7 +90,7 @@ $(function() {
diff --git a/structstdex_1_1wav_1_1note.html b/structstdex_1_1wav_1_1note.html index 4a16555f6..ad514ee6c 100644 --- a/structstdex_1_1wav_1_1note.html +++ b/structstdex_1_1wav_1_1note.html @@ -124,7 +124,7 @@ Friends
diff --git a/structstdex_1_1wav_1_1silence-members.html b/structstdex_1_1wav_1_1silence-members.html index ae2e9c2b5..e6eac9886 100644 --- a/structstdex_1_1wav_1_1silence-members.html +++ b/structstdex_1_1wav_1_1silence-members.html @@ -89,7 +89,7 @@ $(function() {
diff --git a/structstdex_1_1wav_1_1silence.html b/structstdex_1_1wav_1_1silence.html index 9ef255116..3d43d5f2f 100644 --- a/structstdex_1_1wav_1_1silence.html +++ b/structstdex_1_1wav_1_1silence.html @@ -120,7 +120,7 @@ Friends
diff --git a/structstdex_1_1wav_1_1wave-members.html b/structstdex_1_1wav_1_1wave-members.html index 790d8d6b7..9d1ba3719 100644 --- a/structstdex_1_1wav_1_1wave-members.html +++ b/structstdex_1_1wav_1_1wave-members.html @@ -87,7 +87,7 @@ $(function() {
diff --git a/structstdex_1_1wav_1_1wave.html b/structstdex_1_1wav_1_1wave.html index 0d03c14fb..5cc77a200 100644 --- a/structstdex_1_1wav_1_1wave.html +++ b/structstdex_1_1wav_1_1wave.html @@ -123,7 +123,7 @@ id_t type = 0 diff --git a/sys__info_8hpp_source.html b/sys__info_8hpp_source.html index 72ba38d69..982546e32 100644 --- a/sys__info_8hpp_source.html +++ b/sys__info_8hpp_source.html @@ -314,7 +314,7 @@ $(function() { codefold.init(0); });
diff --git a/system_8hpp_source.html b/system_8hpp_source.html index d154898cd..d0e869624 100644 --- a/system_8hpp_source.html +++ b/system_8hpp_source.html @@ -294,7 +294,7 @@ $(function() { codefold.init(0); });
diff --git a/unicode_8hpp_source.html b/unicode_8hpp_source.html index 5178f20d3..fa33cdb1a 100644 --- a/unicode_8hpp_source.html +++ b/unicode_8hpp_source.html @@ -823,7 +823,7 @@ $(function() { codefold.init(0); });
diff --git a/unionstdex_1_1md2__t-members.html b/unionstdex_1_1md2__t-members.html index 851420b4d..d7db1b56b 100644 --- a/unionstdex_1_1md2__t-members.html +++ b/unionstdex_1_1md2__t-members.html @@ -91,7 +91,7 @@ $(function() {
diff --git a/unionstdex_1_1md2__t.html b/unionstdex_1_1md2__t.html index 412a7128e..f6f013dbe 100644 --- a/unionstdex_1_1md2__t.html +++ b/unionstdex_1_1md2__t.html @@ -125,7 +125,7 @@ Friends
diff --git a/unionstdex_1_1sha256__t-members.html b/unionstdex_1_1sha256__t-members.html index 728cb0553..fcba2c47b 100644 --- a/unionstdex_1_1sha256__t-members.html +++ b/unionstdex_1_1sha256__t-members.html @@ -91,7 +91,7 @@ $(function() {
diff --git a/unionstdex_1_1sha256__t.html b/unionstdex_1_1sha256__t.html index 5227806e5..677bb78cf 100644 --- a/unionstdex_1_1sha256__t.html +++ b/unionstdex_1_1sha256__t.html @@ -125,7 +125,7 @@ Friends
diff --git a/unionstdex_1_1sha__t-members.html b/unionstdex_1_1sha__t-members.html index fef4277e6..22681551f 100644 --- a/unionstdex_1_1sha__t-members.html +++ b/unionstdex_1_1sha__t-members.html @@ -91,7 +91,7 @@ $(function() {
diff --git a/unionstdex_1_1sha__t.html b/unionstdex_1_1sha__t.html index da376fa92..a7b77125c 100644 --- a/unionstdex_1_1sha__t.html +++ b/unionstdex_1_1sha__t.html @@ -125,7 +125,7 @@ Friends
diff --git a/uuid_8hpp_source.html b/uuid_8hpp_source.html index 34b6f9f18..0fd87d1b0 100644 --- a/uuid_8hpp_source.html +++ b/uuid_8hpp_source.html @@ -147,7 +147,7 @@ $(function() { codefold.init(0); });
diff --git a/vector__queue_8hpp_source.html b/vector__queue_8hpp_source.html index b3191e0ad..3c3b4df12 100644 --- a/vector__queue_8hpp_source.html +++ b/vector__queue_8hpp_source.html @@ -454,7 +454,7 @@ $(function() { codefold.init(0); });
diff --git a/watchdog_8hpp_source.html b/watchdog_8hpp_source.html index 1b2d4336f..5a50074d6 100644 --- a/watchdog_8hpp_source.html +++ b/watchdog_8hpp_source.html @@ -188,7 +188,7 @@ $(function() { codefold.init(0); });
diff --git a/wav_8hpp_source.html b/wav_8hpp_source.html index c48e38352..7460ac70d 100644 --- a/wav_8hpp_source.html +++ b/wav_8hpp_source.html @@ -789,7 +789,7 @@ $(function() { codefold.init(0); }); diff --git a/windows_8h_source.html b/windows_8h_source.html index 0f66907aa..2e0bcaecb 100644 --- a/windows_8h_source.html +++ b/windows_8h_source.html @@ -111,7 +111,7 @@ $(function() { codefold.init(0); }); diff --git a/zlib_8hpp_source.html b/zlib_8hpp_source.html index b18dd2d1c..1d721173e 100644 --- a/zlib_8hpp_source.html +++ b/zlib_8hpp_source.html @@ -275,7 +275,7 @@ $(function() { codefold.init(0); });