\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesExplPackage{jobname-suffix}{2022/09/17}{1.0}{Compile differently based on the filename}

\RequirePackage{expl3}
\ExplSyntaxOn

%
%  Variants
%
\cs_generate_variant:Nn \str_set:Nn {Ne}
\cs_generate_variant:Nn \str_if_eq:nnTF {nfTF}

%
% Messages
%
\msg_new:nnn {jobname-suffix} {initial-data} {
	\\
	(jobname-suffix)\ \ \ Found~jobname~~`#1'~~with~suffix~~`#2'
	\\
}
\msg_new:nnn {jobname-suffix} {override} {
	\\
	(jobname-suffix)\ \ \ Overriding~suffix~with~`#1'
	\\
}
\msg_new:nnn {jobname-suffix} {test} {
	\\
	(jobname-suffix)\ \ \ Testing~`#1'~==~`#2'
	\\
}
\msg_new:nnn {jobname-suffix} {condition} {
	\\
	(jobname-suffix)\ \ \ Condition~is~`#1'
	\\
}





\str_new:N \g__suffix_str
\str_new:N \g__jobname_str
\str_new:N \g__split_char_str
\str_set:Nn \g__split_char_str {-}
\seq_new:N \l__suffix_list_seq
\str_new:N \l__suffix_list_str





\int_new:N \l__slice_pos_int
% Slice #1 at the char indicated by #2 and store the result in #3
\cs_new_protected:Nn \__slice_at_char:NNN {
	\int_set:Nn \l__slice_pos_int {1}
	\str_map_inline:Nn #1 {
		\int_incr:N \l__slice_pos_int
		\str_if_eq:VnTF {#2} {##1} {
			\str_map_break:
		}{}
	}
	\str_set:Nx #3 {\str_range:Nnn #1 {\l__slice_pos_int}{\c_max_int}}
}


% If the string starts with a quote, trim it off.
\cs_new:Nn \__trim_quotes:N {
	\str_if_eq:nfTF {"} { \str_range:Nnn #1 {1}{1}} {
		\str_range:Nnn #1 {2}{-1+\str_count:N #1}
	}{
		#1
	}
}

% The jobname will be surrounded by quotes if there are any spaces in it,
% so we first trim it if needed.
\str_set:Nx \g__jobname_str { \__trim_quotes:N \c_sys_jobname_str }
% Find the suffix string. The result will be stored in the last argument
\__slice_at_char:NNN \g__jobname_str \g__split_char_str \g__suffix_str

\msg_term:nnxx {jobname-suffix} {initial-data} {\g__jobname_str} {\g__suffix_str}

%
% User-facing commands and environments
%

% Optional arg is a comma-separate list of suffixes. If any of the listed
% suffixes match the jobname's suffix, the true contiditon is executed. Otherwise
% the false condition is executed.
\NewDocumentCommand{\IfSuffixTF}{ o +m +m }{
	%\msg_term:nnxx {jobname-suffix} {test} {#1} {\g__suffix_str}

	\IfNoValueTF {#1} {
		%\msg_term:nnx {jobname-suffix} {condition} {FALSE}
		#3
	}{
		% We want to do string-based comparisons, so we must first
		% cast our argument list as a string (otherwise, \seq_* operations
		% won't work properly).
		\str_set:Nn \l__suffix_list_str {#1}
		\seq_set_split:NnV \l__suffix_list_seq {,} {\l__suffix_list_str}

		\seq_if_in:NVTF \l__suffix_list_seq {\g__suffix_str} {
			%\msg_term:nnx {jobname-suffix} {condition} {TRUE}
			#2
		} {
			%\msg_term:nnx {jobname-suffix} {condition} {FALSE}
			#3
		}
	}
}

\NewDocumentCommand{\IfSuffixT}{ o +m }{
	\IfSuffixTF[#1]{#2}{}
}

\NewDocumentCommand{\IfSuffixF}{ o +m }{
	\IfSuffixTF[#1]{}{#2}
}

\NewDocumentEnvironment{IfSuffix}{ o +b }{
	\IfSuffixT[#1]{#2}
}{}

\NewDocumentCommand{\OverrideSuffix}{ m }{
	\str_set:Nn \g__suffix_str {#1}
	\msg_term:nnx {jobname-suffix} {override} {\g__suffix_str}
}
\NewExpandableDocumentCommand{\JobnameSuffix}{}{
	\str_use:N \g__suffix_str
}


\ExplSyntaxOff
