@@ -6907,18 +6907,52 @@ stdmac_substr(const SMacro *s, Token **params, int nparams)
6907
6907
return pp_substr (expand_smacro_noreset (params [0 ]), s -> name );
6908
6908
}
6909
6909
6910
+ /* Expand a the argument and enforce it being a single quoted string */
6911
+ static Token * expand_to_string (Token * tlist , const char * dname )
6912
+ {
6913
+ Token * t = zap_white (expand_smacro_noreset (tlist ));
6914
+
6915
+ if (!tok_is (t , TOKEN_STR )) {
6916
+ nasm_nonfatal ("`%s' requires string as parameter" , dname );
6917
+ return NULL ;
6918
+ }
6919
+
6920
+ t -> next = zap_white (t -> next );
6921
+ if (t -> next ) {
6922
+ nasm_nonfatal ("`%s' requires exactly one string as parameter" , dname );
6923
+ return NULL ;
6924
+ }
6925
+
6926
+ return t ;
6927
+ }
6928
+
6929
+ /* %strlen() function */
6930
+ static Token *
6931
+ stdmac_strlen (const SMacro * s , Token * * params , int nparams )
6932
+ {
6933
+ Token * t ;
6934
+
6935
+ (void )nparams ;
6936
+
6937
+ t = expand_to_string (params [0 ], s -> name );
6938
+ if (!t )
6939
+ return NULL ;
6940
+
6941
+ unquote_token (t );
6942
+ return make_tok_num (NULL , t -> len );
6943
+ }
6944
+
6910
6945
/* %tok() function */
6911
6946
static Token *
6912
6947
stdmac_tok (const SMacro * s , Token * * params , int nparams )
6913
6948
{
6914
- Token * t = expand_smacro_noreset ( params [ 0 ]) ;
6949
+ Token * t ;
6915
6950
6916
6951
(void )nparams ;
6917
6952
6918
- if (! tok_is ( t , TOKEN_STR )) {
6919
- nasm_nonfatal ( "`%s' requires string as parameter" , s -> name );
6953
+ t = expand_to_string ( params [ 0 ], s -> name );
6954
+ if (! t )
6920
6955
return NULL ;
6921
- }
6922
6956
6923
6957
return reverse_tokens (tokenize (unquote_token_cstr (t )));
6924
6958
}
@@ -6941,6 +6975,7 @@ static void pp_add_magic_stdmac(void)
6941
6975
{ "%eval" , false, 1 , SPARM_EVAL |SPARM_VARADIC , stdmac_join },
6942
6976
{ "%str" , false, 1 , SPARM_GREEDY |SPARM_STR , stdmac_join },
6943
6977
{ "%strcat" , false, 1 , SPARM_GREEDY , stdmac_strcat },
6978
+ { "%strlen" , false, 1 , 0 , stdmac_strlen },
6944
6979
{ "%substr" , false, 1 , SPARM_GREEDY , stdmac_substr },
6945
6980
{ "%tok" , false, 1 , 0 , stdmac_tok },
6946
6981
{ NULL , false, 0 , 0 , NULL }
0 commit comments