<commit_before>%%% -*- erlang-indent-level: 2 -*-
%%%
%%%   Copyright 2014-2022 <NAME>
%%%
%%%   Licensed under the Apache License, Version 2.0 (the "License");
%%%   you may not use this file except in compliance with the License.
%%%   You may obtain a copy of the License at
%%%
%%%       http://www.apache.org/licenses/LICENSE-2.0
%%%
%%%   Unless required by applicable law or agreed to in writing, software
%%%   distributed under the License is distributed on an "AS IS" BASIS,
%%%   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%%%   See the License for the specific language governing permissions and
%%%   limitations under the License.
%%%
%%% es_ctype.erl
%%% Character classification and manipulation for ErlScheme.
%%% This currently assumes that the range of characters is [0..255],
%%% that we represent EOF as -1, and that 7-bit ASCII is contained
%%% in the lower 7 bits of character codes.

-module(es_ctype).

-export([char_is_whitespace/1,	% [-1, 255] -> true | false
	 char_is_delimiter/1,	% [-1, 255] -> true | false
	 char_is_initial/1,	% [-1, 255] -> true | false
	 char_is_numeric/1,	% [-1, 255] -> true | false
	 char_is_subsequent/1,	% [-1, 255] -> true | false
	 char_is_eof/1,		% [-1, 255] -> true | false
	 char_value/1]).	% [-1, 255] -> [0-15, 255]

%% Character classification flag bits:
%%
%% 16#01: whitespace
%% 16#02: delimiter	(used by the reader; also allows #\[ and #\])
%% 16#04: initial
%% 16#08: numeric
%% 16#10: subsequent	(used by the reader)

char_is_type(Ch, Mask) ->
  ChTypeTab = % indexed by [-1, 255] + 1
    <<
     % EOF                                                             (-1)
     "\x02" % EOF is a delimiter but not whitespace
     % NUL SOH STX ETX EOT ENQ ACK BEL  BS  HT  LF  VT  FF  CR  SO  SI (0-15)
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x03\x03\x00\x00"
     % DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN  EM SUB ESC  FS  GS  RS  UA (16-31)
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     % SPC   !   "   #   $   %   &   '   (   )   *   +   ,   -   .   / (32-47)
     "\x03\x14\x02\x00\x14\x14\x14\x00\x02\x02\x14\x10\x00\x10\x10\x14"
     %   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ? (48-63)
     "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x14\x02\x14\x14\x14\x14"
     %   @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O (64-79)
     "\x10\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14"
     %   P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _ (80-95)
     "\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x02\x00\x02\x14\x14"
     %   `   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o (96-111)
     "\x00\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14"
     %   p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~ DEL (112-127)
     "\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x00\x00\x00\x14\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00">>,
  (binary:at(ChTypeTab, Ch + 1) band Mask) =/= 0.

char_is_whitespace(Ch) -> char_is_type(Ch, 16#01).
char_is_delimiter(Ch) -> char_is_type(Ch, 16#02).
char_is_initial(Ch) -> char_is_type(Ch, 16#04).<commit_msg>es_ctype: classify : and / as delimiters, exclude them from initial and subsequent<commit_after>%%% -*- erlang-indent-level: 2 -*-
%%%
%%%   Copyright 2014-2022 <NAME>
%%%
%%%   Licensed under the Apache License, Version 2.0 (the "License");
%%%   you may not use this file except in compliance with the License.
%%%   You may obtain a copy of the License at
%%%
%%%       http://www.apache.org/licenses/LICENSE-2.0
%%%
%%%   Unless required by applicable law or agreed to in writing, software
%%%   distributed under the License is distributed on an "AS IS" BASIS,
%%%   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%%%   See the License for the specific language governing permissions and
%%%   limitations under the License.
%%%
%%% es_ctype.erl
%%% Character classification and manipulation for ErlScheme.
%%% This currently assumes that the range of characters is [0..255],
%%% that we represent EOF as -1, and that 7-bit ASCII is contained
%%% in the lower 7 bits of character codes.
%%%
%%% Extensions:
%%% - : and / are delimiters and thus excluded from initial and subsequent

-module(es_ctype).

-export([char_is_whitespace/1,	% [-1, 255] -> true | false
	 char_is_delimiter/1,	% [-1, 255] -> true | false
	 char_is_initial/1,	% [-1, 255] -> true | false
	 char_is_numeric/1,	% [-1, 255] -> true | false
	 char_is_subsequent/1,	% [-1, 255] -> true | false
	 char_is_eof/1,		% [-1, 255] -> true | false
	 char_value/1]).	% [-1, 255] -> [0-15, 255]

%% Character classification flag bits:
%%
%% 16#01: whitespace
%% 16#02: delimiter	(used by the reader; also allows #\[ and #\])
%% 16#04: initial
%% 16#08: numeric
%% 16#10: subsequent	(used by the reader)

char_is_type(Ch, Mask) ->
  ChTypeTab = % indexed by [-1, 255] + 1
    <<
     % EOF                                                             (-1)
     "\x02" % EOF is a delimiter but not whitespace
     % NUL SOH STX ETX EOT ENQ ACK BEL  BS  HT  LF  VT  FF  CR  SO  SI (0-15)
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00\x03\x03\x00\x00"
     % DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN  EM SUB ESC  FS  GS  RS  UA (16-31)
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     % SPC   !   "   #   $   %   &   '   (   )   *   +   ,   -   .   / (32-47)
     "\x03\x14\x02\x00\x14\x14\x14\x00\x02\x02\x14\x10\x00\x10\x10\x02"
     %   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ? (48-63)
     "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x02\x02\x14\x14\x14\x14"
     %   @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O (64-79)
     "\x10\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14"
     %   P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _ (80-95)
     "\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x02\x00\x02\x14\x14"
     %   `   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o (96-111)
     "\x00\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14"
     %   p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~ DEL (112-127)
     "\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x00\x00\x00\x14\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00">>,
  (binary:at(ChTypeTab, Ch + 1) band Mask) =/= 0.

char_is_whitespace(Ch) -> char_is_type(Ch, 16#01).
char_is_delimiter(Ch) -> char_is_type(Ch, 16#02).
char_is_initial(Ch) -> char_is_type(Ch, 16#04).
{'fraction_non_alphanumeric': 0.1718832193582325, 'fraction_numerical': 0.17438190426091532, 'mean_word_length': 2.0952380952380953, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 33, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 38, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6110412', 'n_tokens_mistral': 4320, 'n_tokens_neox': 3589, 'n_words': 690}