@@ -137,31 +137,73 @@ list_pkgs_pkgdb(struct xbps_handle *xhp)
137137 return xbps_pkgdb_foreach_cb (xhp , list_pkgs_pkgdb_cb , & lpc );
138138}
139139
140- struct list_pkgdb_cb {
140+ struct list_pkgdb_ctx {
141141 struct xbps_fmt * fmt ;
142142 struct xbps_json_printer * json ;
143143 int (* filter )(xbps_object_t obj );
144144};
145145
146+ static int
147+ fmt_pkg_cb (FILE * fp , const struct xbps_fmt_var * var , void * data )
148+ {
149+ const char * pkgver = NULL ;
150+ xbps_dictionary_t pkgd = data ;
151+ xbps_object_t obj ;
152+
153+ obj = xbps_dictionary_get (pkgd , var -> name );
154+ if (obj )
155+ return xbps_fmt_print_object (var , obj , fp );
156+
157+ if (!xbps_dictionary_get_cstring_nocopy (pkgd , "pkgver" , & pkgver )) {
158+ xbps_error_printf ("invalid package: missing `pkgver`\n" );
159+ return - EINVAL ;
160+ }
161+
162+ if (strcmp (var -> name , "pkgname" ) == 0 ) {
163+ char pkgname [XBPS_NAME_SIZE ];
164+ if (xbps_pkg_name (pkgname , sizeof (pkgname ), pkgver )) {
165+ xbps_error_printf ("invalid `pkgver`: %s\n" , pkgver );
166+ return - EINVAL ;
167+ }
168+ return xbps_fmt_print_string (var , pkgname , 0 , fp );
169+ } else if (strcmp (var -> name , "version" ) == 0 ) {
170+ const char * version = xbps_pkg_version (pkgver );
171+ if (!version ) {
172+ xbps_error_printf ("invalid `pkgver`: %s\n" , pkgver );
173+ return - EINVAL ;
174+ }
175+ return xbps_fmt_print_string (var , version , 0 , fp );
176+ } else if (strcmp (var -> name , "revision" ) == 0 ) {
177+ const char * revision = xbps_pkg_revision (pkgver );
178+ if (!revision ) {
179+ xbps_error_printf ("invalid `pkgver`: %s\n" , pkgver );
180+ return - EINVAL ;
181+ }
182+ return xbps_fmt_print_string (var , revision , 0 , fp );
183+ }
184+
185+ return 0 ;
186+ }
187+
146188static int
147189list_pkgdb_cb (struct xbps_handle * xhp UNUSED , xbps_object_t obj ,
148190 const char * key UNUSED , void * arg , bool * loop_done UNUSED )
149191{
150- struct list_pkgdb_cb * ctx = arg ;
192+ struct list_pkgdb_ctx * ctx = arg ;
151193 int r ;
152194
153195 if (ctx -> filter ) {
154196 r = ctx -> filter (obj );
155- if (r < 0 )
197+ if (r <= 0 )
156198 return r ;
157- if (r == 0 )
158- return 0 ;
159199 }
160200
161201 if (ctx -> fmt ) {
162- r = xbps_fmt_dictionary (ctx -> fmt , obj , stdout );
202+ r = xbps_fmt (ctx -> fmt , & fmt_pkg_cb , obj , stdout );
163203 } else if (ctx -> json ) {
164204 r = xbps_json_print_xbps_object (ctx -> json , obj );
205+ if (r < 0 )
206+ return r ;
165207 fprintf (ctx -> json -> file , "\n" );
166208 } else {
167209 r = - ENOTSUP ;
@@ -172,7 +214,7 @@ list_pkgdb_cb(struct xbps_handle *xhp UNUSED, xbps_object_t obj,
172214int
173215list_pkgdb (struct xbps_handle * xhp , int (* filter )(xbps_object_t ), const char * format , int json )
174216{
175- struct list_pkgdb_cb ctx = {.filter = filter };
217+ struct list_pkgdb_ctx ctx = {.filter = filter };
176218 struct xbps_json_printer pr = {0 };
177219 int r ;
178220 if (json > 0 ) {
@@ -237,7 +279,7 @@ list_orphans(struct xbps_handle *xhp, const char *format)
237279 xbps_object_t obj = xbps_array_get (orphans , i );
238280 if (!obj )
239281 return - errno ;
240- r = xbps_fmt_dictionary (fmt , obj , stdout );
282+ r = xbps_fmt (fmt , & fmt_pkg_cb , obj , stdout );
241283 if (r < 0 )
242284 goto err ;
243285 }
0 commit comments