@@ -344,6 +344,22 @@ static gboolean _is_number(char *str)
344344 return TRUE;
345345}
346346
347+ static uint8_t _get_var_parameter (char * * variable , int default_value )
348+ {
349+ uint8_t val = default_value ;
350+ if (* variable [0 ] == '[' )
351+ {
352+ char * parameters [1 ] = { NULL };
353+ const int num = _get_parameters (variable , parameters , 1 );
354+ if (num == 1 && _is_number (parameters [0 ]))
355+ {
356+ val = (uint8_t )strtol (parameters [0 ], NULL , 10 );
357+ }
358+ g_free (parameters [0 ]);
359+ }
360+ return val ;
361+ }
362+
347363static char * _get_base_value (dt_variables_params_t * params , char * * variable )
348364{
349365 char * result = NULL ;
@@ -558,8 +574,28 @@ static char *_get_base_value(dt_variables_params_t *params, char **variable)
558574 result = g_strdup (params -> data -> camera_alias );
559575 else if (_has_prefix (variable , "EXIF.LENS" ) || _has_prefix (variable , "LENS" ))
560576 result = g_strdup (params -> data -> exif_lens );
577+ else if (_has_prefix (variable , "IMAGE.ID.NEXT" ))
578+ {
579+ dt_imgid_t highest_id = 0 ;
580+ sqlite3_stmt * stmt ;
581+ // clang-format off
582+ DT_DEBUG_SQLITE3_PREPARE_V2 (dt_database_get (darktable .db ),
583+ "SELECT MAX(id) FROM main.images" ,
584+ -1 , & stmt , NULL );
585+ // clang-format on
586+ if (sqlite3_step (stmt ) == SQLITE_ROW )
587+ highest_id = sqlite3_column_int (stmt , 0 );
588+ sqlite3_finalize (stmt );
589+ // determine how many zero-padded digits to use with an optional parameter: $(IMAGE.ID.NEXT[n]), default n=1
590+ uint8_t nb_digit = _get_var_parameter (variable , 1 );
591+ result = g_strdup_printf ("%0*u" , nb_digit , highest_id + 1 );
592+ }
561593 else if (_has_prefix (variable , "ID" ) || _has_prefix (variable , "IMAGE.ID" ))
562- result = g_strdup_printf ("%u" , params -> imgid );
594+ {
595+ // determine how many zero-padded digits to use with an optional parameter: $(IMAGE.ID[n]), default n=1
596+ uint8_t nb_digit = _get_var_parameter (variable , 1 );
597+ result = g_strdup_printf ("%0*u" , nb_digit , params -> imgid );
598+ }
563599 else if (_has_prefix (variable , "IMAGE.EXIF" ))
564600 {
565601 gchar buffer [1024 ];
@@ -667,7 +703,7 @@ static char *_get_base_value(dt_variables_params_t *params, char **variable)
667703 (* variable ) ++ ;
668704 }
669705 // new $(SEQUENCE[n,m]) syntax
670- // allows \[[0-9]+,[0-9]+] (PCER )
706+ // allows \[[0-9]+,[0-9]+] (PCRE )
671707 // everything else will be ignored
672708 else if (* variable [0 ] == '[' )
673709 {
@@ -681,6 +717,8 @@ static char *_get_base_value(dt_variables_params_t *params, char **variable)
681717 shift = (gint ) strtol (parameters [1 ], NULL , 10 );
682718 }
683719 }
720+ if (num == 2 )
721+ g_free (parameters [1 ]);
684722 g_free (parameters [0 ]);
685723 }
686724 result = g_strdup_printf ("%.*u" , nb_digit ,
0 commit comments