Radix cross Linux package tools

Package Tools – is a set of utilities to create, install, and update RcL packages

3 Commits   0 Branches   2 Tags
11c606a6 (kx 2023-04-11 01:18:34 +0300    1) 
11c606a6 (kx 2023-04-11 01:18:34 +0300    2) /**********************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300    3) 
11c606a6 (kx 2023-04-11 01:18:34 +0300    4)   Copyright 2019 Andrey V.Kosteltsev
11c606a6 (kx 2023-04-11 01:18:34 +0300    5) 
11c606a6 (kx 2023-04-11 01:18:34 +0300    6)   Licensed under the Radix.pro License, Version 1.0 (the "License");
11c606a6 (kx 2023-04-11 01:18:34 +0300    7)   you may not use this file  except  in compliance with the License.
11c606a6 (kx 2023-04-11 01:18:34 +0300    8)   You may obtain a copy of the License at
11c606a6 (kx 2023-04-11 01:18:34 +0300    9) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   10)      https://radix.pro/licenses/LICENSE-1.0-en_US.txt
11c606a6 (kx 2023-04-11 01:18:34 +0300   11) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   12)   Unless required by applicable law or agreed to in writing, software
11c606a6 (kx 2023-04-11 01:18:34 +0300   13)   distributed under the License is distributed on an "AS IS" BASIS,
11c606a6 (kx 2023-04-11 01:18:34 +0300   14)   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
11c606a6 (kx 2023-04-11 01:18:34 +0300   15)   implied.
11c606a6 (kx 2023-04-11 01:18:34 +0300   16) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   17)  **********************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300   18) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   19) #include <config.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   20) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   21) #include <stdlib.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   22) #include <stdio.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   23) #include <string.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   24) #include <linux/limits.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   25) #include <libgen.h>   /* basename(3) */
11c606a6 (kx 2023-04-11 01:18:34 +0300   26) #include <unistd.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   27) #include <time.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   28) #include <math.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   29) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   30) #include <msglog.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   31) #include <wrapper.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   32) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   33) #include <make-pkglist.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   34) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   35) #include <cmpvers.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   36) #include <dlist.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   37) #include <btree.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   38) #include <jsmin.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   39) #include <pkglist.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300   40) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   41) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   42) char *htmlroot = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   43) char *hardware = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   44) int   minimize = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300   45) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   46) struct dlist *srcpkgs  = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   47) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   48) struct dlist *packages = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   49) struct dlist *tarballs = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   50) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   51) struct dlist *provides = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   52) struct dlist *extern_requires = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   53) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   54) static struct dlist *tree = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   55) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   56) static char *pkgs_fname = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300   57)             *tree_fname = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300   58)             *html_fname = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   59) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   60) static char *pkgs_min_fname = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300   61)             *tree_min_fname = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   62) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   63) static const char *tarball_suffix = "txz";
11c606a6 (kx 2023-04-11 01:18:34 +0300   64) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   65) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300   66)   tarballs List functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300   67)   =======================
11c606a6 (kx 2023-04-11 01:18:34 +0300   68) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   69)   NOTE:
11c606a6 (kx 2023-04-11 01:18:34 +0300   70)   ----
11c606a6 (kx 2023-04-11 01:18:34 +0300   71)     TARBALLS  is an optional list  created in case when we have
11c606a6 (kx 2023-04-11 01:18:34 +0300   72)     a set of PACKAGES as input of make-pkglist utility. When we
11c606a6 (kx 2023-04-11 01:18:34 +0300   73)     are working with a set of input PKGLOGs the  TARBALLS  list
11c606a6 (kx 2023-04-11 01:18:34 +0300   74)     is not chreated and pointer to the tarballs == NULL.
11c606a6 (kx 2023-04-11 01:18:34 +0300   75)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300   76) void add_tarball( char *tarball )
11c606a6 (kx 2023-04-11 01:18:34 +0300   77) {
11c606a6 (kx 2023-04-11 01:18:34 +0300   78)   tarballs = dlist_append( tarballs, (void *)xstrdup( (const char *)tarball ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300   79) }
11c606a6 (kx 2023-04-11 01:18:34 +0300   80) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   81) static void __free_tarball( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300   82) {
11c606a6 (kx 2023-04-11 01:18:34 +0300   83)   if( data ) { free( data ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300   84) }
11c606a6 (kx 2023-04-11 01:18:34 +0300   85) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   86) void free_tarballs( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300   87) {
11c606a6 (kx 2023-04-11 01:18:34 +0300   88)   if( tarballs ) { dlist_free( tarballs, __free_tarball ); tarballs = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300   89) }
11c606a6 (kx 2023-04-11 01:18:34 +0300   90) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   91) static int __compare_tarballs( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300   92) {
11c606a6 (kx 2023-04-11 01:18:34 +0300   93)   return strncmp( (const char *)a, (const char *)b, (size_t)strlen((const char *)b) );
11c606a6 (kx 2023-04-11 01:18:34 +0300   94) }
11c606a6 (kx 2023-04-11 01:18:34 +0300   95) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   96) const char *find_tarball( const char *name )
11c606a6 (kx 2023-04-11 01:18:34 +0300   97) {
11c606a6 (kx 2023-04-11 01:18:34 +0300   98)   struct dlist *node = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300   99) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  100)   if( !tarballs || !name ) return NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  101) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  102)   node = dlist_find_data( tarballs, __compare_tarballs, (const void *)name );
11c606a6 (kx 2023-04-11 01:18:34 +0300  103)   if( node )
11c606a6 (kx 2023-04-11 01:18:34 +0300  104)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  105)     return (const char *)node->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  106)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  107) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  108)   return NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  109) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  110) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  111) /*********************
11c606a6 (kx 2023-04-11 01:18:34 +0300  112)   Just for debugging:
11c606a6 (kx 2023-04-11 01:18:34 +0300  113)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300  114) static void __print_tarball( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  115) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  116)   int *counter = (int *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  117) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  118)   if( counter ) { fprintf( stdout, "tarball[%.5d]: %s\n", *counter, (char *)data ); ++(*counter); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  119)   else          { fprintf( stdout, "tarball: %s\n", (char *)data ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  120) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  121) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  122) void print_tarballs( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300  123) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  124)   int cnt = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  125)   if( tarballs ) { dlist_foreach( tarballs, __print_tarball, (void *)&cnt ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  126) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  127) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300  128)   End of tarballs List functions.
11c606a6 (kx 2023-04-11 01:18:34 +0300  129)  ***************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300  130) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  131) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  132) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  133) char *strprio( enum _priority priority, int short_name )
11c606a6 (kx 2023-04-11 01:18:34 +0300  134) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  135)   char *p = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  136) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  137)   switch( priority )
11c606a6 (kx 2023-04-11 01:18:34 +0300  138)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  139)     case REQUIRED:
11c606a6 (kx 2023-04-11 01:18:34 +0300  140)       p = ( short_name ) ? "REQ" : "REQUIRED";
11c606a6 (kx 2023-04-11 01:18:34 +0300  141)       break;
11c606a6 (kx 2023-04-11 01:18:34 +0300  142)     case RECOMMENDED:
11c606a6 (kx 2023-04-11 01:18:34 +0300  143)       p = ( short_name ) ? "REC" : "RECOMMENDED";
11c606a6 (kx 2023-04-11 01:18:34 +0300  144)       break;
11c606a6 (kx 2023-04-11 01:18:34 +0300  145)     case OPTIONAL:
11c606a6 (kx 2023-04-11 01:18:34 +0300  146)       p = ( short_name ) ? "OPT" : "OPTIONAL";
11c606a6 (kx 2023-04-11 01:18:34 +0300  147)       break;
11c606a6 (kx 2023-04-11 01:18:34 +0300  148)     case SKIP:
11c606a6 (kx 2023-04-11 01:18:34 +0300  149)       p = ( short_name ) ? "SKP" : "SKIP";
11c606a6 (kx 2023-04-11 01:18:34 +0300  150)       break;
11c606a6 (kx 2023-04-11 01:18:34 +0300  151)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  152)   return p;
11c606a6 (kx 2023-04-11 01:18:34 +0300  153) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  154) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  155) char *strproc( enum _procedure procedure )
11c606a6 (kx 2023-04-11 01:18:34 +0300  156) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  157)   char *p = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  158) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  159)   switch( procedure )
11c606a6 (kx 2023-04-11 01:18:34 +0300  160)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  161)     case INSTALL:
11c606a6 (kx 2023-04-11 01:18:34 +0300  162)       p = "install";
11c606a6 (kx 2023-04-11 01:18:34 +0300  163)       break;
11c606a6 (kx 2023-04-11 01:18:34 +0300  164)     case UPDATE:
11c606a6 (kx 2023-04-11 01:18:34 +0300  165)       p = "update";
11c606a6 (kx 2023-04-11 01:18:34 +0300  166)       break;
11c606a6 (kx 2023-04-11 01:18:34 +0300  167)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  168)   return p;
11c606a6 (kx 2023-04-11 01:18:34 +0300  169) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  170) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  171) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  172) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300  173)   PACKAGE functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300  174)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300  175) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  176) struct pkg *pkg_alloc( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300  177) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  178)   struct pkg *pkg = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  179) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  180)   pkg = (struct pkg *)malloc( sizeof( struct pkg ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  181)   if( !pkg ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  182)   bzero( (void *)pkg, sizeof( struct pkg ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  183) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  184)   return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300  185) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  186) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  187) void pkg_free( struct pkg *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300  188) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  189)   if( pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300  190)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  191)     if( pkg->group )   { free( pkg->group );   pkg->group   = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  192)     if( pkg->name )    { free( pkg->name );    pkg->name    = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  193)     if( pkg->version ) { free( pkg->version ); pkg->version = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  194) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  195)     free( pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300  196)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  197) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  198) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  199) static void __pkg_free_func( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  200) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  201)   struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  202)   if( pkg ) { pkg_free( pkg ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  203) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  204) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  205) void free_srcpkgs( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300  206) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  207)   if( srcpkgs ) { dlist_free( srcpkgs, __pkg_free_func ); srcpkgs = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  208) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  209) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  210) void add_srcpkg( struct pkg *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300  211) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  212)   srcpkgs = dlist_append( srcpkgs, (void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300  213) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  214) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  215) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  216) static struct pkginfo *__pkginfo_alloc( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300  217) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  218)   struct pkginfo *pkginfo = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  219) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  220)   pkginfo = (struct pkginfo *)malloc( sizeof( struct pkginfo ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  221)   if( !pkginfo ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  222)   bzero( (void *)pkginfo, sizeof( struct pkginfo ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  223) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  224)   return pkginfo;
11c606a6 (kx 2023-04-11 01:18:34 +0300  225) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  226) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  227) static void __pkginfo_free( struct pkginfo *pkginfo )
11c606a6 (kx 2023-04-11 01:18:34 +0300  228) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  229)   if( pkginfo )
11c606a6 (kx 2023-04-11 01:18:34 +0300  230)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  231)     if( pkginfo->name )              { free( pkginfo->name );              pkginfo->name              = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  232)     if( pkginfo->version )           { free( pkginfo->version );           pkginfo->version           = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  233)     if( pkginfo->arch )              { free( pkginfo->arch );              pkginfo->arch              = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  234)     if( pkginfo->distro_name )       { free( pkginfo->distro_name );       pkginfo->distro_name       = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  235)     if( pkginfo->distro_version )    { free( pkginfo->distro_version );    pkginfo->distro_version    = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  236)     if( pkginfo->group )             { free( pkginfo->group );             pkginfo->group             = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  237)     if( pkginfo->short_description ) { free( pkginfo->short_description ); pkginfo->short_description = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  238)     if( pkginfo->url )               { free( pkginfo->url );               pkginfo->url               = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  239)     if( pkginfo->license )           { free( pkginfo->license );           pkginfo->license           = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  240) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  241)     free( pkginfo );
11c606a6 (kx 2023-04-11 01:18:34 +0300  242)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  243) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  244) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  245) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  246) static struct references *__references_alloc( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300  247) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  248)   struct references *references = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  249) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  250)   references = (struct references *)malloc( sizeof( struct references ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  251)   if( !references ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  252)   bzero( (void *)references, sizeof( struct references ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  253) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  254)   return references;
11c606a6 (kx 2023-04-11 01:18:34 +0300  255) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  256) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  257) static void __references_free( struct references *references )
11c606a6 (kx 2023-04-11 01:18:34 +0300  258) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  259)   if( references )
11c606a6 (kx 2023-04-11 01:18:34 +0300  260)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  261)     if( references->list ) { dlist_free( references->list, __pkg_free_func ); references->list = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  262)     free( references );
11c606a6 (kx 2023-04-11 01:18:34 +0300  263)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  264) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  265) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  266) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  267) static struct requires *__requires_alloc( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300  268) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  269)   struct requires *requires = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  270) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  271)   requires = (struct requires *)malloc( sizeof( struct requires ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  272)   if( !requires ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  273)   bzero( (void *)requires, sizeof( struct requires ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  274) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  275)   return requires;
11c606a6 (kx 2023-04-11 01:18:34 +0300  276) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  277) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  278) static void __requires_free( struct requires *requires )
11c606a6 (kx 2023-04-11 01:18:34 +0300  279) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  280)   if( requires )
11c606a6 (kx 2023-04-11 01:18:34 +0300  281)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  282)     if( requires->list ) { dlist_free( requires->list, __pkg_free_func ); requires->list = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  283)     free( requires );
11c606a6 (kx 2023-04-11 01:18:34 +0300  284)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  285) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  286) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  287) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  288) static struct files *__files_alloc( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300  289) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  290)   struct files *files = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  291) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  292)   files = (struct files *)malloc( sizeof( struct files ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  293)   if( !files ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  294)   bzero( (void *)files, sizeof( struct files ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  295) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  296)   return files;
11c606a6 (kx 2023-04-11 01:18:34 +0300  297) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  298) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  299) static void __files_free_func( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  300) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  301)   if( data ) { free( data ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  302) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  303) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  304) static void __files_free( struct files *files )
11c606a6 (kx 2023-04-11 01:18:34 +0300  305) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  306)   if( files )
11c606a6 (kx 2023-04-11 01:18:34 +0300  307)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  308)     if( files->list ) { dlist_free( files->list, __files_free_func ); files->list = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  309)     free( files );
11c606a6 (kx 2023-04-11 01:18:34 +0300  310)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  311) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  312) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  313) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  314) struct package *package_alloc( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300  315) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  316)   struct package    *package    = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  317)   struct pkginfo    *pkginfo    = __pkginfo_alloc();
11c606a6 (kx 2023-04-11 01:18:34 +0300  318)   struct references *references = __references_alloc();
11c606a6 (kx 2023-04-11 01:18:34 +0300  319)   struct requires   *requires   = __requires_alloc();
11c606a6 (kx 2023-04-11 01:18:34 +0300  320)   struct files      *files      = __files_alloc();
11c606a6 (kx 2023-04-11 01:18:34 +0300  321) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  322)   package = (struct package *)malloc( sizeof( struct package ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  323)   if( !package ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  324)   bzero( (void *)package, sizeof( struct package ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  325) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  326)   package->pkginfo    = pkginfo;
11c606a6 (kx 2023-04-11 01:18:34 +0300  327)   package->references = references;
11c606a6 (kx 2023-04-11 01:18:34 +0300  328)   package->requires   = requires;
11c606a6 (kx 2023-04-11 01:18:34 +0300  329)   package->files      = files;
11c606a6 (kx 2023-04-11 01:18:34 +0300  330) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  331)   return package;
11c606a6 (kx 2023-04-11 01:18:34 +0300  332) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  333) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  334) void package_free( struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300  335) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  336)   if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300  337)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  338)     if( package->pkginfo )    {    __pkginfo_free( package->pkginfo );    package->pkginfo    = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  339)     if( package->references ) { __references_free( package->references ); package->references = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  340)     if( package->requires )   {   __requires_free( package->requires );   package->requires   = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  341)     if( package->files )      {      __files_free( package->files );      package->files      = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  342) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  343)     if( package->description )    { free( package->description );     package->description    = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  344)     if( package->restore_links )  { free( package->restore_links );   package->restore_links  = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  345)     if( package->install_script ) { free( package->install_script );  package->install_script = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  346)     if( package->hardware )       { free( package->hardware );        package->hardware       = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  347)     if( package->tarball )        { free( package->tarball );         package->tarball        = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  348) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  349)     free( package );
11c606a6 (kx 2023-04-11 01:18:34 +0300  350)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  351) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  352) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  353) static void __package_free_func( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  354) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  355)   struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  356)   if( package ) { package_free( package ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  357) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  358) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  359) void free_packages( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300  360) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  361)   if( packages ) { dlist_free( packages, __package_free_func ); packages = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  362) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  363) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  364) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  365) static int __compare_packages( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300  366) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  367)   int  ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  368) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  369)   struct package *pkg1 = (struct package *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300  370)   struct package *pkg2 = (struct package *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300  371) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  372)   if( pkg1->pkginfo->group && pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  373)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  374)     ret = strcmp( pkg1->pkginfo->group, pkg2->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300  375)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  376)   else if( !pkg1->pkginfo->group && !pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  377)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  378)     ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  379)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  380)   else if( pkg1->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  381)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  382)     ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  383)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  384) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  385)   if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300  386)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  387)     return strcmp( pkg1->pkginfo->name, pkg2->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300  388)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  389)   return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  390) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  391) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  392) static int __compare_packages_with_version( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300  393) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  394)   int  ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  395) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  396)   struct package *pkg1 = (struct package *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300  397)   struct package *pkg2 = (struct package *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300  398) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  399)   if( pkg1->pkginfo->group && pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  400)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  401)     ret = strcmp( pkg1->pkginfo->group, pkg2->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300  402)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  403)   else if( !pkg1->pkginfo->group && !pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  404)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  405)     ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  406)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  407)   else if( pkg1->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  408)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  409)     ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  410)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  411) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  412)   if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300  413)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  414)     ret = strcmp( pkg1->pkginfo->name, pkg2->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300  415)     if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300  416)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  417)       return cmp_version( (const char *)pkg1->pkginfo->version, (const char *)pkg2->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300  418)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  419)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  420)   return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  421) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  422) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  423) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  424) void add_package( struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300  425) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  426)   packages = dlist_append( packages, (void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300  427) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  428) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  429) void add_reference( struct package *package, struct pkg *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300  430) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  431)   if( package && package->references && pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300  432)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  433)     package->references->list = dlist_append( package->references->list, (void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300  434)     package->references->size = dlist_length( package->references->list );
11c606a6 (kx 2023-04-11 01:18:34 +0300  435)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  436) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  437) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  438) void add_required( struct package *package, struct pkg *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300  439) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  440)   if( package && package->requires && pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300  441)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  442)     package->requires->list = dlist_append( package->requires->list, (void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300  443)     package->requires->size = dlist_length( package->requires->list );
11c606a6 (kx 2023-04-11 01:18:34 +0300  444)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  445) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  446) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  447) void add_file( struct package *package, const char *fname )
11c606a6 (kx 2023-04-11 01:18:34 +0300  448) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  449)   if( package && package->files && fname )
11c606a6 (kx 2023-04-11 01:18:34 +0300  450)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  451)     package->files->list = dlist_append( package->files->list, (void *)xstrdup( (const char *)fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  452)     package->files->size = dlist_length( package->files->list );
11c606a6 (kx 2023-04-11 01:18:34 +0300  453)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  454) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  455) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  456) /*********************
11c606a6 (kx 2023-04-11 01:18:34 +0300  457)   Just for debugging:
11c606a6 (kx 2023-04-11 01:18:34 +0300  458)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300  459) static void __print_reference( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  460) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  461)   struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  462) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  463)   if( pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300  464)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  465)     if( pkg->group ) { fprintf( stdout, "reference: %s/%s=%s\n", pkg->group, pkg->name, pkg->version ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  466)     else             { fprintf( stdout, "reference: %s=%s\n",                pkg->name, pkg->version ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  467)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  468) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  469) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  470) void package_print_references( struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300  471) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  472)   if( !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300  473) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  474)   if( package->references->list )
11c606a6 (kx 2023-04-11 01:18:34 +0300  475)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  476)     dlist_foreach( package->references->list, __print_reference, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300  477)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  478) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  479) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  480) static void __print_required( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  481) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  482)   struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  483) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  484)   if( pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300  485)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  486)     if( pkg->group ) { fprintf( stdout, "required: %s/%s=%s\n", pkg->group, pkg->name, pkg->version ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  487)     else             { fprintf( stdout, "required: %s=%s\n",                pkg->name, pkg->version ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  488)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  489) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  490) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  491) void package_print_requires( struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300  492) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  493)   if( !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300  494) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  495)   if( package->requires->list )
11c606a6 (kx 2023-04-11 01:18:34 +0300  496)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  497)     dlist_foreach( package->requires->list, __print_required, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300  498)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  499) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  500) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  501) static void __print_file( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  502) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  503)   int *counter = (int *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  504) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  505)   if( counter ) { fprintf( stdout, "file[%.5d]: %s\n", *counter, (char *)data ); ++(*counter); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  506)   else          { fprintf( stdout, "file: %s\n", (char *)data ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  507) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  508) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  509) void package_print_files( struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300  510) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  511)   int cnt = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  512) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  513)   if( !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300  514) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  515)   if( package->files->list )
11c606a6 (kx 2023-04-11 01:18:34 +0300  516)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  517)     dlist_foreach( package->files->list, __print_file, (void *)&cnt );
11c606a6 (kx 2023-04-11 01:18:34 +0300  518)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  519) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  520) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  521) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300  522)   End of PACKAGES functions.
11c606a6 (kx 2023-04-11 01:18:34 +0300  523)  ***************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300  524) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  525) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300  526)   Extern REQUIRES list functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300  527)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300  528) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  529) static int __compare_required( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300  530) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  531)   int  ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  532) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  533)   struct pkg *pkg1 = (struct pkg *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300  534)   struct pkg *pkg2 = (struct pkg *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300  535) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  536)   if( pkg1->group && pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  537)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  538)     ret = strcmp( pkg1->group, pkg2->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300  539)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  540)   else if( !pkg1->group && !pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  541)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  542)     ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  543)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  544)   else if( pkg1->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  545)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  546)     ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  547)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  548) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  549)   if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300  550)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  551)     return strcmp( pkg1->name, pkg2->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300  552)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  553)   return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  554) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  555) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  556) static int __compare_required_with_version( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300  557) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  558)   int  ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  559) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  560)   struct pkg *pkg1 = (struct pkg *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300  561)   struct pkg *pkg2 = (struct pkg *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300  562) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  563)   if( pkg1->group && pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  564)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  565)     ret = strcmp( pkg1->group, pkg2->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300  566)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  567)   else if( !pkg1->group && !pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  568)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  569)     ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  570)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  571)   else if( pkg1->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  572)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  573)     ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  574)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  575) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  576)   if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300  577)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  578)     ret = strcmp( pkg1->name, pkg2->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300  579)     if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300  580)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  581)       return cmp_version( (const char *)pkg1->version, (const char *)pkg2->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300  582)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  583)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  584)   return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  585) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  586) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  587) static void __add_unique_required( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  588) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  589)   struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  590) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  591)   if( pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300  592)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  593)     struct dlist *found = dlist_find_data( extern_requires, __compare_required, (const void *)data );
11c606a6 (kx 2023-04-11 01:18:34 +0300  594) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  595)     if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300  596)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  597)       if( cmp_version( (const char *)((struct pkg *)found->data)->version, (const char *)pkg->version ) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  598)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  599)         char *s = ((struct pkg *)found->data)->version;
11c606a6 (kx 2023-04-11 01:18:34 +0300  600)         ((struct pkg *)found->data)->version =
11c606a6 (kx 2023-04-11 01:18:34 +0300  601)            xstrdup( (const char *)max_version( (const char *)((struct pkg *)found->data)->version,
11c606a6 (kx 2023-04-11 01:18:34 +0300  602)                                                (const char *)pkg->version ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  603)         free( s );
11c606a6 (kx 2023-04-11 01:18:34 +0300  604)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  605)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  606)     else
11c606a6 (kx 2023-04-11 01:18:34 +0300  607)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  608)       struct pkg *req = pkg_alloc();
11c606a6 (kx 2023-04-11 01:18:34 +0300  609)       if( req )
11c606a6 (kx 2023-04-11 01:18:34 +0300  610)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  611)         if( pkg->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  612)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300  613)           req->group = xstrdup( (const char *)pkg->group   );
11c606a6 (kx 2023-04-11 01:18:34 +0300  614)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300  615)         req->name    = xstrdup( (const char *)pkg->name    );
11c606a6 (kx 2023-04-11 01:18:34 +0300  616)         req->version = xstrdup( (const char *)pkg->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300  617) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  618)         extern_requires = dlist_append( extern_requires, (void *)req );
11c606a6 (kx 2023-04-11 01:18:34 +0300  619)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  620)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  621)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  622) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  623) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  624) static void __fill_extern_requires( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  625) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  626)   struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  627) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  628)   if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300  629)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  630)     struct pkg *provide = pkg_alloc();
11c606a6 (kx 2023-04-11 01:18:34 +0300  631) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  632)     if( provide )
11c606a6 (kx 2023-04-11 01:18:34 +0300  633)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  634)       if( package->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  635)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  636)         provide->group = xstrdup( (const char *)package->pkginfo->group   );
11c606a6 (kx 2023-04-11 01:18:34 +0300  637)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  638)       provide->name    = xstrdup( (const char *)package->pkginfo->name    );
11c606a6 (kx 2023-04-11 01:18:34 +0300  639)       provide->version = xstrdup( (const char *)package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300  640) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  641)       provides = dlist_append( provides, (void *)provide );
11c606a6 (kx 2023-04-11 01:18:34 +0300  642)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  643) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  644)     if( package->requires->list )
11c606a6 (kx 2023-04-11 01:18:34 +0300  645)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  646)       dlist_foreach( package->requires->list, __add_unique_required, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300  647)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  648)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  649) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  650) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  651) static void __clean_extern_requires( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  652) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  653)   if( data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  654)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  655)     extern_requires = dlist_remove_data( extern_requires, __compare_required_with_version, __pkg_free_func, (const void *)data );
11c606a6 (kx 2023-04-11 01:18:34 +0300  656)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  657) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  658) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  659) static int __compare_provided_old_package( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300  660) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  661)   int  ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  662) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  663)   struct package *pkg1 = (struct package *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300  664)   struct     pkg *pkg2 = (struct     pkg *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300  665) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  666)   if( pkg1->pkginfo->group && pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  667)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  668)     ret = strcmp( pkg1->pkginfo->group, pkg2->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300  669)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  670)   else if( !pkg1->pkginfo->group && !pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  671)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  672)     ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  673)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  674)   else if( pkg1->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  675)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  676)     ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  677)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  678) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  679)   if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300  680)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  681)     ret = strcmp( pkg1->pkginfo->name, pkg2->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300  682)     if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300  683)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  684)       pkg2->procedure = UPDATE; /* mark as too old */
11c606a6 (kx 2023-04-11 01:18:34 +0300  685)       return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  686)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  687)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  688)   return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  689) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  690) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  691) static void __remove_old_package( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  692) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  693)   packages = dlist_remove_data( packages, __compare_provided_old_package, __package_free_func, (const void *)data );
11c606a6 (kx 2023-04-11 01:18:34 +0300  694) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  695) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  696) static void remove_old_packages( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300  697) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  698)   dlist_foreach( extern_requires, __remove_old_package, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300  699) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  700) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300  701)   End of Extern REQUIRES list functions.
11c606a6 (kx 2023-04-11 01:18:34 +0300  702)  ***************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300  703) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  704) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  705) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300  706)   Check REQUIRES functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300  707)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300  708) static int __compare_provided( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300  709) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  710)   int  ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  711) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  712)   struct package *pkg1 = (struct package *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300  713)   struct     pkg *pkg2 = (struct     pkg *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300  714) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  715)   if( pkg1->pkginfo->group && pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  716)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  717)     ret = strcmp( pkg1->pkginfo->group, pkg2->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300  718)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  719)   else if( !pkg1->pkginfo->group && !pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  720)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  721)     ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  722)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  723)   else if( pkg1->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  724)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  725)     ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  726)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  727) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  728)   if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300  729)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  730)     return strcmp( pkg1->pkginfo->name, pkg2->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300  731)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  732)   return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  733) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  734) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  735) static int __compare_packages_by_name( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300  736) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  737)   int  ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  738) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  739)   struct package *pkg1 = (struct package *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300  740)   struct package *pkg2 = (struct package *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300  741) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  742)   if( !strcmp( pkg1->pkginfo->name, pkg2->pkginfo->name ) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  743)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  744)     if( pkg1->pkginfo->group && pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  745)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  746)       ret = strcmp( pkg1->pkginfo->group, pkg2->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300  747)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  748)     else if( !pkg1->pkginfo->group && !pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  749)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  750)       ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  751)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  752)     else if( pkg1->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300  753)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  754)       ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  755)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  756) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  757)     /* returns equal only if groups are not equal */
11c606a6 (kx 2023-04-11 01:18:34 +0300  758)     if( ret ) return 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  759)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  760) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  761)   return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  762) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  763) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  764) static int check_dependencies( struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300  765) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  766)   struct dlist *list = NULL, *next = NULL, *update = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  767)   int    depended    = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  768) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  769)   if( !package ) return depended;
11c606a6 (kx 2023-04-11 01:18:34 +0300  770)   depended = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  771) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  772)   if( !(list = package->requires->list) ) return depended;
11c606a6 (kx 2023-04-11 01:18:34 +0300  773) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  774)   while( list )
11c606a6 (kx 2023-04-11 01:18:34 +0300  775)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  776)     next = dlist_next( list );
11c606a6 (kx 2023-04-11 01:18:34 +0300  777)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  778)       int has_extern_dependencies = 0, already_provided = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  779) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  780)       struct pkg   *pkg   = (struct pkg *)list->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  781)       struct dlist *found = dlist_find_data( extern_requires, __compare_required, (const void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300  782) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  783)       if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300  784)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  785)         if( cmp_version( (const char *)((struct pkg *)found->data)->version, (const char *)pkg->version ) >= 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  786)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300  787)           /* required package is found in the extern_requires list */
11c606a6 (kx 2023-04-11 01:18:34 +0300  788)           has_extern_dependencies += 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  789)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300  790)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  791) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  792)       found = dlist_find_data( provides, __compare_provided, (const void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300  793)       if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300  794)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  795)         if( cmp_version( (const char *)((struct package *)found->data)->pkginfo->version, (const char *)pkg->version ) >= 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  796)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300  797)           /* required package is found in the extern_requires list */
11c606a6 (kx 2023-04-11 01:18:34 +0300  798)           already_provided += 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  799)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300  800)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  801) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  802)       if( !already_provided && !has_extern_dependencies ) depended += 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300  803)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  804)     list = next;
11c606a6 (kx 2023-04-11 01:18:34 +0300  805)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  806) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  807)   /* Check if the package with the same name already exists in the provides list */
11c606a6 (kx 2023-04-11 01:18:34 +0300  808)   update = dlist_find_data( provides, __compare_packages_by_name, (const void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300  809)   if( update )
11c606a6 (kx 2023-04-11 01:18:34 +0300  810)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  811)     /* Set install procedure to UPDATE: */
11c606a6 (kx 2023-04-11 01:18:34 +0300  812)     package->procedure = UPDATE;
11c606a6 (kx 2023-04-11 01:18:34 +0300  813)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  814) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  815)   return depended;
11c606a6 (kx 2023-04-11 01:18:34 +0300  816) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  817) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300  818)   End of Check REQUIRES functions.
11c606a6 (kx 2023-04-11 01:18:34 +0300  819)  ***************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300  820) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  821) static void __fill_provides_list( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  822) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  823)   struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  824) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  825)   if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300  826)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  827)     if( !check_dependencies( package ) )
11c606a6 (kx 2023-04-11 01:18:34 +0300  828)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  829)       /* move independed package to the provides list */
11c606a6 (kx 2023-04-11 01:18:34 +0300  830)       packages = dlist_remove( packages, (const void *)data );
11c606a6 (kx 2023-04-11 01:18:34 +0300  831)       provides = dlist_append( provides, (void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300  832)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  833)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  834) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  835) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  836) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  837) static void __print_extern_package( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  838) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  839)   FILE *output = (FILE *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  840)   struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  841) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  842)   if( pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300  843)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  844)     if( pkg->group ) { fprintf( output, "# required: %s/%s=%s\n", pkg->group, pkg->name, pkg->version ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  845)     else             { fprintf( output, "# required: %s=%s\n",                pkg->name, pkg->version ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  846)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  847) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  848) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  849) static void __print_provided_package( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  850) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  851)   FILE *output = (FILE *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  852)   struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  853) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  854)   if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300  855)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  856)     fprintf( output, "%s:",  package->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300  857)     fprintf( output, "%s:",  package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300  858)     fprintf( output, "%s:",  package->pkginfo->short_description );
11c606a6 (kx 2023-04-11 01:18:34 +0300  859)     if( package->tarball )
11c606a6 (kx 2023-04-11 01:18:34 +0300  860)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  861)       fprintf( output, "%s:",  package->tarball );
11c606a6 (kx 2023-04-11 01:18:34 +0300  862)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  863)     else
11c606a6 (kx 2023-04-11 01:18:34 +0300  864)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  865)       if( package->pkginfo->group ) fprintf( output, "%s/", package->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300  866) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  867)       fprintf( output, "%s-", package->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300  868)       fprintf( output, "%s-", package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300  869)       fprintf( output, "%s-", package->pkginfo->arch );
11c606a6 (kx 2023-04-11 01:18:34 +0300  870)       fprintf( output, "%s-", package->pkginfo->distro_name );
11c606a6 (kx 2023-04-11 01:18:34 +0300  871)       fprintf( output, "%s.", package->pkginfo->distro_version );
11c606a6 (kx 2023-04-11 01:18:34 +0300  872)       fprintf( output, "%s:", tarball_suffix ); /* default is '.txz' */
11c606a6 (kx 2023-04-11 01:18:34 +0300  873)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  874)     fprintf( output, "%s:",  strproc( package->procedure ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  875)     fprintf( output, "%s\n", strprio( package->priority, 0 ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  876)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  877) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  878) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  879) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  880) static void __reduce_packages_list( struct pkg *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300  881) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  882)   struct package *package = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  883)   struct dlist   *found   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  884) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  885)   if( !pkg ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300  886) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  887)   found = dlist_find_data( packages, __compare_provided, (const void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300  888)   if( found && found->data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  889)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  890)     struct dlist *list = NULL, *next = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  891) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  892)     package = (struct package *)found->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  893) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  894)     packages = dlist_remove( packages, (const void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300  895)     provides = dlist_append( provides, (void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300  896) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  897)     if( !(list = package->requires->list) ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300  898) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  899)     while( list )
11c606a6 (kx 2023-04-11 01:18:34 +0300  900)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300  901)       next = dlist_next( list );
11c606a6 (kx 2023-04-11 01:18:34 +0300  902)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300  903)         __reduce_packages_list( (struct pkg *)list->data );
11c606a6 (kx 2023-04-11 01:18:34 +0300  904)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300  905)       list = next;
11c606a6 (kx 2023-04-11 01:18:34 +0300  906)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300  907)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  908) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  909) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  910) static void __reduce_packages_list_single( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300  911) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  912)   struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300  913) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  914)   if( pkg ) { __reduce_packages_list( pkg ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300  915) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  916) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  917) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  918) static void reduce_packages_list( struct dlist *srcpkgs )
11c606a6 (kx 2023-04-11 01:18:34 +0300  919) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  920)   if( ! srcpkgs ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300  921) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  922)   dlist_foreach( srcpkgs, __reduce_packages_list_single, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300  923) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  924)   dlist_free( packages, __package_free_func );
11c606a6 (kx 2023-04-11 01:18:34 +0300  925)   if( dlist_length( provides ) != 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  926)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  927)     packages = provides;
11c606a6 (kx 2023-04-11 01:18:34 +0300  928)     provides = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  929)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  930) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  931) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  932) int create_provides_list( struct dlist *srcpkgs )
11c606a6 (kx 2023-04-11 01:18:34 +0300  933) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  934)   int ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300  935) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  936)   if( !packages ) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300  937) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  938)   if( srcpkgs && dlist_length( srcpkgs ) > 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  939)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  940)     /******************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300  941)       Reduce packages list to the list of requires of source packages:
11c606a6 (kx 2023-04-11 01:18:34 +0300  942)      */
11c606a6 (kx 2023-04-11 01:18:34 +0300  943)     reduce_packages_list( srcpkgs );
11c606a6 (kx 2023-04-11 01:18:34 +0300  944)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  945) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  946)   /* Fill two lists: provides and extern_requires: */
11c606a6 (kx 2023-04-11 01:18:34 +0300  947)   dlist_foreach( packages, __fill_extern_requires, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300  948) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  949)   /* Remove packages from extern_requires list which present in the provides list: */
11c606a6 (kx 2023-04-11 01:18:34 +0300  950)   dlist_foreach( provides, __clean_extern_requires, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300  951) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  952)   /* Now we don't need previous contents of provides list: */
11c606a6 (kx 2023-04-11 01:18:34 +0300  953)   dlist_free( provides, __pkg_free_func );
11c606a6 (kx 2023-04-11 01:18:34 +0300  954)   provides = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  955) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  956)   /* Remove old packages if required new version of them */
11c606a6 (kx 2023-04-11 01:18:34 +0300  957)   remove_old_packages();
11c606a6 (kx 2023-04-11 01:18:34 +0300  958) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  959)   /* move packages into provides list in order of installation: */
11c606a6 (kx 2023-04-11 01:18:34 +0300  960)   while( dlist_length( packages ) != 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300  961)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  962)     dlist_foreach( packages, __fill_provides_list, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300  963)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  964) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  965)   return dlist_length( extern_requires );
11c606a6 (kx 2023-04-11 01:18:34 +0300  966) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  967) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  968) void free_provides_list( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300  969) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  970)   if( htmlroot ) { free( htmlroot ); htmlroot = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  971)   if( hardware ) { free( hardware ); hardware = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300  972) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  973)   dlist_free( extern_requires, __pkg_free_func );
11c606a6 (kx 2023-04-11 01:18:34 +0300  974)   dlist_free( provides, __package_free_func );
11c606a6 (kx 2023-04-11 01:18:34 +0300  975) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  976) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  977) void print_provides_list( const char *plist_fname )
11c606a6 (kx 2023-04-11 01:18:34 +0300  978) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  979)   FILE *plist = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  980) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  981)   if( !plist_fname || !provides ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300  982) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  983)   plist = fopen( plist_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  984)   if( !plist )
11c606a6 (kx 2023-04-11 01:18:34 +0300  985)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  986)     FATAL_ERROR( "Cannot create output %s file", basename( (char *)plist_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300  987)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  988) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  989)   fprintf( plist, "#\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  990)   fprintf( plist, "# file format:\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  991)   fprintf( plist, "# ===========\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  992)   fprintf( plist, "#\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  993)   fprintf( plist, "# Each line contains six fields separated by colon symbol ':' like following.\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  994)   fprintf( plist, "#\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  995)   fprintf( plist, "# pkgname:version:description:tarball:procedure:priority\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  996)   fprintf( plist, "#\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  997)   fprintf( plist, "# where:\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  998)   fprintf( plist, "#\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300  999)   fprintf( plist, "#   pkgname     - should be the same as the value of pkgname  in the '.DESCRIPTION' file;\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1000)   fprintf( plist, "#   version     - package version for showing in check list  dialog box  if this file is\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1001)   fprintf( plist, "#                 used to complete common check dialog for installing group  of packages;\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1002)   fprintf( plist, "#   description - short description for showing in check list dialog box if this file is\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1003)   fprintf( plist, "#                 used to complete common check dialog for installing  group of packages;\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1004)   fprintf( plist, "#   tarball     - should end in '.txz';\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1005)   fprintf( plist, "#   procedure   - installation procedure {install | update}:\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1006)   fprintf( plist, "#                  * 'install' - if package requires normal installation,\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1007)   fprintf( plist, "#                  * 'update'  - if already installed package should be updated by this\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1008)   fprintf( plist, "#                                package archive;\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1009)   fprintf( plist, "#   priority    - { REQUIRED|RECOMMENDED|OPTIONAL|SKIP }\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1010)   fprintf( plist, "#                  synonims:\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1011)   fprintf( plist, "#                    { REQUIRED    | required    | REQ | req }\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1012)   fprintf( plist, "#                    { RECOMMENDED | recommended | REC | rec }\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1013)   fprintf( plist, "#                    { OPTIONAL    | optional    | OPT | opt }\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1014)   fprintf( plist, "#                    { SKIP        | skip        | SKP | skp }\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1015)   fprintf( plist, "#\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1016) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1017)   if( extern_requires )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1018)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1019)     dlist_foreach( extern_requires, __print_extern_package, plist );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1020)     fprintf( plist, "#\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1021)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1022)   dlist_foreach( provides, __print_provided_package, plist );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1023) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1024)   fflush( plist );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1025)   fclose( plist );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1026) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1027) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1028) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1029) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1030)   Requires TREE functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1031)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1032) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1033) struct _ctx
11c606a6 (kx 2023-04-11 01:18:34 +0300 1034) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1035)   FILE *output;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1036)   int   index, size, depth;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1037) };
11c606a6 (kx 2023-04-11 01:18:34 +0300 1038) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1039) /**************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1040)   HTML Template Variables:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1041)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1042) static char *root       = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1043) static char *bug_url    = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1044) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1045) static int   svg_width  = 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1046) static int   svg_height = 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1047) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1048) static char *json_pkgs_file = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1049) static char *json_tree_file = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1050) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1051) static char *copying = "Radix cross Linux";
11c606a6 (kx 2023-04-11 01:18:34 +0300 1052) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1053) #define max(a,b) ({ typeof (a) _a = (a); typeof (b) _b = (b); _a > _b ? _a : _b; })
11c606a6 (kx 2023-04-11 01:18:34 +0300 1054) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1055) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 1056)   формирование имен файлов для вывода REQUIRES tree:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1057) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1058)    json_fname              | last argument of make-pkglist | last argument type
11c606a6 (kx 2023-04-11 01:18:34 +0300 1059)   -------------------------+-------------------------------+--------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1060)    './a.txt'               | a.txt                         | regular file
11c606a6 (kx 2023-04-11 01:18:34 +0300 1061)    './a.json'              | a.json                        | regular file
11c606a6 (kx 2023-04-11 01:18:34 +0300 1062)    './.json'               | .json                         | regular file
11c606a6 (kx 2023-04-11 01:18:34 +0300 1063)    './khadas-vim.json'     | .                             | directory
11c606a6 (kx 2023-04-11 01:18:34 +0300 1064)    './tmp/khadas-vim.json' | tmp                           | directory
11c606a6 (kx 2023-04-11 01:18:34 +0300 1065)   -------------------------+-------------------------------+--------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1066) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1067)    - если есть основное базовое имя файла и расширение,  то расширение
11c606a6 (kx 2023-04-11 01:18:34 +0300 1068)      заменяем на: '.pkgs.json', '.tree.json', '.tree.html';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1069) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1070)    - если есть основное базовое имя файла без расширения, то добавляем
11c606a6 (kx 2023-04-11 01:18:34 +0300 1071)      расширение: '.pkgs.json', '.tree.json', '.tree.html';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1072) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1073)    - если основное базовое имя файла начинается с точки, то расширение
11c606a6 (kx 2023-04-11 01:18:34 +0300 1074)      заменяем на: 'pkgs.json', 'tree.json', 'tree.html'.
11c606a6 (kx 2023-04-11 01:18:34 +0300 1075) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1076) static void allocate_fnames( const char *json_fname )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1077) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1078)   char *p, *e, *f = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1079)   char *buf = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1080) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1081)   buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1082)   if( !buf ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1083)   bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1084) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1085)   (void)sprintf( &buf[0], "%s", json_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1086)   p = rindex( (const char *)&buf[0], '/' );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1087)   if( p )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1088)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1089)     if( p != &buf[0] ) f = ++p;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1090)     else               f = &buf[0];
11c606a6 (kx 2023-04-11 01:18:34 +0300 1091)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1092)   e = rindex( (const char *)f, '.' );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1093)   if( e )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1094)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1095)     if( e != f )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1096)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1097)       (void)sprintf( e, ".pkgs.json" ); pkgs_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1098)       (void)sprintf( e, ".tree.json" ); tree_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1099)       (void)sprintf( e, ".tree.html" ); html_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1100) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1101)       (void)sprintf( e, ".pkgs.min.json" ); pkgs_min_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1102)       (void)sprintf( e, ".tree.min.json" ); tree_min_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1103)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1104)     else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1105)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1106)       (void)sprintf( e, "pkgs.json" ); pkgs_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1107)       (void)sprintf( e, "tree.json" ); tree_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1108)       (void)sprintf( e, "tree.html" ); html_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1109) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1110)       (void)sprintf( e, "pkgs.min.json" ); pkgs_min_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1111)       (void)sprintf( e, "tree.min.json" ); tree_min_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1112)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1113)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1114)   else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1115)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1116)     e = f + strlen( f );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1117) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1118)     (void)sprintf( e, ".pkgs.json" ); pkgs_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1119)     (void)sprintf( e, ".tree.json" ); tree_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1120)     (void)sprintf( e, ".tree.html" ); html_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1121) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1122)     (void)sprintf( e, ".pkgs.min.json" ); pkgs_min_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1123)     (void)sprintf( e, ".tree.min.json" ); tree_min_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1124)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1125) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1126)   if( minimize )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1127)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1128)     json_pkgs_file = xstrdup( (const char *)basename( pkgs_min_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1129)     json_tree_file = xstrdup( (const char *)basename( tree_min_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1130)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1131)   else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1132)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1133)     json_pkgs_file = xstrdup( (const char *)basename( pkgs_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1134)     json_tree_file = xstrdup( (const char *)basename( tree_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1135)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1136) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1137)   free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1138) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1139) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1140) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1141) /*******************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1142)   find_pkg():
11c606a6 (kx 2023-04-11 01:18:34 +0300 1143)   ----------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1144)     Returns package found in packages list coresponded to pkg.
11c606a6 (kx 2023-04-11 01:18:34 +0300 1145)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1146) static struct package *find_pkg( struct dlist *list, struct pkg *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1147) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1148)   struct package *package = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1149)   struct dlist   *found   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1150) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1151)   if( !pkg ) return package;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1152) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1153)   found = dlist_find_data( list, __compare_provided, (const void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1154)   if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1155)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1156)     return (struct package *)found->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1157)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1158) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1159)   return package;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1160) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1161) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1162) /*******************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1163)   find_package():
11c606a6 (kx 2023-04-11 01:18:34 +0300 1164)   --------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1165)     Returns package found in packages list coresponded to package.
11c606a6 (kx 2023-04-11 01:18:34 +0300 1166)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1167) static struct package *find_package( struct dlist *list, struct package *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1168) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1169)   struct package *package = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1170)   struct dlist   *found   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1171) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1172)   if( !pkg ) return package;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1173) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1174)   found = dlist_find_data( list, __compare_packages, (const void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1175)   if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1176)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1177)     return (struct package *)found->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1178)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1179) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1180)   return package;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1181) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1182) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1183) static void __print_package_data( FILE *output, struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1184) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1185)   if( !output || !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1186) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1187)   /* "id": "net:bind-9.10.1", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1188)   if( package->pkginfo->group ) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1189)     fprintf( output, "  \"id\": \"%s:%s-%s\",\n", package->pkginfo->group,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1190)                                                   package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1191)                                                   package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1192)   } else {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1193)     fprintf( output, "  \"id\": \"%s-%s\",\n", package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1194)                                                package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1195)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1196)   /* "name": "bind", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1197)   fprintf( output, "  \"name\": \"%s\",\n", package->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1198)   /* "version": "9.10.1", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1199)   fprintf( output, "  \"version\": \"%s\",\n", package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1200)   /* "group": "net", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1201)   if( package->pkginfo->group ) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1202)     fprintf( output, "  \"group\": \"%s\",\n", package->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1203)   } else {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1204)     fprintf( output, "  \"group\": \"\",\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1205)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1206)   /* "arch": "omap543x-eglibc", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1207)   fprintf( output, "  \"arch\": \"%s\",\n", package->pkginfo->arch );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1208)   /* "hardware": "omap5uevm", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1209)   fprintf( output, "  \"hardware\": \"%s\",\n", hardware );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1210)   /* "license": "custom", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1211)   fprintf( output, "  \"license\": \"%s\",\n", package->pkginfo->license );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1212)   /* "description": "bind 9.10.1 (DNS server and utilities)", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1213)   fprintf( output, "  \"description\": \"%s %s (%s)\",\n", package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1214)                                                            package->pkginfo->version,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1215)                                                            package->pkginfo->short_description );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1216)   /* "uncompressed_size": "17M", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1217)   fprintf( output, "  \"uncompressed_size\": \"" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1218)   if( package->pkginfo->uncompressed_size > 1048576 ) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1219)     fprintf( output, "%ldG\",\n", package->pkginfo->uncompressed_size / 1048576 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1220)   } else if( package->pkginfo->uncompressed_size > 1024 ) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1221)     fprintf( output, "%ldM\",\n", package->pkginfo->uncompressed_size / 1024 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1222)   } else {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1223)     fprintf( output, "%ldK\",\n", package->pkginfo->uncompressed_size );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1224)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1225)   /* "total_files": "421" */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1226)   fprintf( output, "  \"total_files\": \"%d\"\n", package->pkginfo->total_files );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1227) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1228) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1229) static void __print_pkgs_node( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1230) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1231)   struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1232)   struct _ctx    *ctx     = (struct _ctx *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1233) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1234)   if( !package || !ctx ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1235) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1236)   if( ctx->index != 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1237)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1238)     fprintf( ctx->output, " },\n {\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1239)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1240)   __print_package_data( ctx->output, package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1241)   ++ctx->index;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1242) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1243) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1244) static void print_pkgs_json( FILE *output, struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1245) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1246)   struct _ctx ctx;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1247) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1248)   if( !output ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1249) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1250)   bzero( (void *)&ctx, sizeof(struct _ctx) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1251) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1252)   ctx.output = output;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1253)   ctx.index  = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1254) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1255)   fprintf( output, "[{\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1256) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1257)   dlist_foreach( list, __print_pkgs_node, (void *)&ctx );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1258) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1259)   fprintf( output, " }]\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1260) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1261) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1262) static void __remove_required_package( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1263) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1264)   struct package *package = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1265)   struct pkg     *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1266) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1267)   if( pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1268)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1269)     package = find_pkg( tree, pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1270)     if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1271)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1272)       /*******************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1273)         if package reqired for some other package
11c606a6 (kx 2023-04-11 01:18:34 +0300 1274)         we have to remove it from tree list:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1275)        */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1276)       tree = dlist_remove_data( tree, __compare_packages, NULL, (const void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1277)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1278)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1279) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1280) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1281) static void __remove_required_packages( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1282) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1283)   struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1284)   struct dlist   *list = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1285) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1286)   if( !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1287) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1288)   if( !(list = package->requires->list) ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1289) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1290)   dlist_foreach( list, __remove_required_package, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1291) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1292) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1293) static void remove_required_packages( struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1294) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1295)   dlist_foreach( list, __remove_required_packages, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1296) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1297) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1298) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1299) static void __check_pkg_requires( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1300) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1301)   struct pkg *pkg     = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1302)   int        *counter = (int *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1303) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1304)   if( pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1305)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1306)     struct package *package = find_pkg( provides, pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1307)     if( package ) { ++(*counter); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1308)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1309) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1310) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1311) static int check_pkg_requires( struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1312) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1313)   int cnt = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1314)   dlist_foreach( list, __check_pkg_requires, (void *)&cnt );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1315)   return cnt;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1316) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1317) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1318) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1319) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1320)   Sort Requires Tree functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1321)   ----------------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1322) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1323)   NOTE:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1324)     Requires sorted in reverse installation order according to
11c606a6 (kx 2023-04-11 01:18:34 +0300 1325)     provides list.
11c606a6 (kx 2023-04-11 01:18:34 +0300 1326)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1327) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1328) static int __install_pkg_index( struct dlist *list, struct pkg *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1329) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1330)   int index = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1331) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1332)   if( !pkg ) return index;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1333) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1334)   if( list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1335)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1336)     struct package *package = find_pkg( list, pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1337) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1338)     index = dlist_index( list, package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1339)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1340) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1341)   return index;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1342) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1343) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1344) static int __install_package_index( struct dlist *list, struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1345) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1346)   int index = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1347) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1348)   if( !package ) return index;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1349) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1350)   if( list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1351)     index = dlist_index( list, package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1352) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1353)   return index;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1354) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1355) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1356) static int __compare_pkg_order( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1357) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1358)   int  ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1359)   int  ia = -1, ib = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1360) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1361)   ia = __install_pkg_index( provides, (struct pkg *)a );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1362)   ib = __install_pkg_index( provides, (struct pkg *)b );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1363) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1364)   if( ia < ib ) ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1365)   if( ia > ib ) ret =  1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1366) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1367)   return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1368) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1369) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1370) static int __compare_package_order( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1371) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1372)   int  ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1373)   int  ia = -1, ib = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1374) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1375)   ia = __install_package_index( provides, (struct package *)a );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1376)   ib = __install_package_index( provides, (struct package *)b );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1377) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1378)   if( ia < ib ) ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1379)   if( ia > ib ) ret =  1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1380) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1381)   return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1382) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1383) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1384) static void __sort_requires( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1385) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1386)   struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1387)   struct dlist   *reqs    = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1388) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1389)   if( !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1390) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1391)   if( (reqs = package->requires->list) && check_pkg_requires( reqs ) > 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1392)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1393)     package->requires->list = reqs = dlist_sort( reqs, __compare_pkg_order );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1394)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1395) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1396) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1397) static struct dlist *sort_requires_tree( struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1398) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1399)   int lenght = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1400) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1401)   if( !list ) return list;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1402) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1403)   lenght = dlist_length( list );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1404) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1405)   if( lenght > 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1406)     list = dlist_sort( list, __compare_package_order );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1407) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1408)   return list;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1409) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1410) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1411) static void sort_requires( struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1412) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1413)   int lenght = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1414) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1415)   if( !list ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1416) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1417)   dlist_foreach( list, __sort_requires, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1418) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1419) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 1420)   End of Sort Requires Tree functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1421)  ***************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300 1422) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1423) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1424)   Binary Tree functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1425)   ---------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1426)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1427) static struct dlist *pkgs  = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1428) static struct btree *btree = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1429) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1430) static struct pkg *duplicate_pkg( struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1431) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1432)   struct pkg *pkg = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1433) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1434)   if( !package ) return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1435) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1436)   pkg = pkg_alloc();
11c606a6 (kx 2023-04-11 01:18:34 +0300 1437)   pkg->name      = xstrdup( (const char *)package->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1438)   pkg->group     = xstrdup( (const char *)package->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1439)   pkg->version   = xstrdup( (const char *)package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1440)   pkg->procedure = package->procedure;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1441) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1442)   return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1443) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1444) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1445) static void __fill_pkgs_list( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1446) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1447)   struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1448)   struct pkg     *pkg     = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1449) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1450)   if( !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1451) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1452)   pkg  = duplicate_pkg( package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1453)   pkgs = dlist_append( pkgs, (void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1454) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1455) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1456) /*******************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1457)    create_pkgs_list():
11c606a6 (kx 2023-04-11 01:18:34 +0300 1458)    ------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1459)      Creates pkgs list from provides list.
11c606a6 (kx 2023-04-11 01:18:34 +0300 1460)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1461) static void create_pkgs_list( struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1462) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1463)   if( !list ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1464) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1465)   dlist_foreach( list, __fill_pkgs_list, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1466) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1467) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1468) static void free_pkgs_list()
11c606a6 (kx 2023-04-11 01:18:34 +0300 1469) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1470)   if( pkgs )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1471)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1472)     dlist_free( pkgs, __pkg_free_func );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1473)     pkgs = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1474)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1475) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1476) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1477) static int __compare_pkg( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1478) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1479)   int  ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1480) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1481)   struct pkg *pkg1 = (struct pkg *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1482)   struct pkg *pkg2 = (struct pkg *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1483) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1484)   if( pkg1->group && pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1485)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1486)     ret = strcmp( pkg1->group, pkg2->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1487)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1488)   else if( !pkg1->group && !pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1489)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1490)     ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1491)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1492)   else if( pkg1->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1493)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1494)     ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1495)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1496) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1497)   if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1498)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1499)     return strcmp( pkg1->name, pkg2->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1500)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1501)   return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1502) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1503) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1504) static struct pkg *__find_pkg( struct dlist *list, struct pkg *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1505) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1506)   struct pkg   *pkg   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1507)   struct dlist *found = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1508) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1509)   if( !package ) return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1510) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1511)   found = dlist_find_data( list, __compare_pkg, (const void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1512)   if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1513)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1514)     return (struct pkg *)found->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1515)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1516) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1517)   return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1518) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1519) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1520) static int __compare_pkg_with_package( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1521) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1522)   int  ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1523) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1524)   struct     pkg *pkg1 = (struct     pkg *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1525)   struct package *pkg2 = (struct package *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1526) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1527)   if( pkg1->group && pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1528)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1529)     ret = strcmp( pkg1->group, pkg2->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1530)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1531)   else if( !pkg1->group && !pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1532)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1533)     ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1534)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1535)   else if( pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1536)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1537)     ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1538)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1539) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1540)   if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1541)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1542)     return strcmp( pkg1->name, pkg2->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1543)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1544)   return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1545) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1546) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1547) static struct pkg *__find_pkg_by_package( struct dlist *list, struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1548) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1549)   struct pkg   *pkg   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1550)   struct dlist *found = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1551) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1552)   if( !package ) return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1553) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1554)   found = dlist_find_data( list, __compare_pkg_with_package, (const void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1555)   if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1556)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1557)     return (struct pkg *)found->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1558)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1559) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1560)   return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1561) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1562) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1563) static struct pkg *__find_pkg_by_pkg( struct dlist *list, struct pkg *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1564) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1565)   struct pkg   *pkg   = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1566)   struct dlist *found = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1567) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1568)   if( !package ) return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1569) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1570)   found = dlist_find_data( list, __compare_pkg, (const void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1571)   if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1572)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1573)     return (struct pkg *)found->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1574)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1575) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1576)   return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1577) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1578) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1579) static void __btree_add_requires( struct btree *tree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1580) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1581) static struct btree *__btree_add_left( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1582) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1583)   struct btree   *tree = (struct btree *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1584)   struct pkg     *left = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1585)   struct pkg     *pkg  = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1586)   struct btree   *node = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1587) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1588)   if( !tree || !left ) return node;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1589) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1590)   pkg = __find_pkg_by_pkg( pkgs, left );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1591) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1592)   node = btree_insert_left( tree, __btree_alloc( (void *)pkg ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1593)   __btree_add_requires( node );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1594) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1595)   return node;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1596) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1597) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1598) static void __btree_add_right( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1599) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1600)   struct btree   *tree  = *((struct btree **)user_data);
11c606a6 (kx 2023-04-11 01:18:34 +0300 1601)   struct pkg     *right = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1602)   struct pkg     *pkg  = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1603)   struct btree   *node  = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1604) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1605)   if( !tree || !right ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1606) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1607)   pkg = __find_pkg_by_pkg( pkgs, right );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1608) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1609)   node = btree_insert_right( tree, __btree_alloc( (void *)pkg ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1610)   __btree_add_requires( node );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1611) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1612)   *((struct btree **)user_data) = node;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1613) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1614) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1615) static void __btree_add_requires( struct btree *tree )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1616) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1617)   struct package *package = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1618) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1619)   if( !tree ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1620) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1621)   package = find_pkg( provides, (struct pkg *)tree->data );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1622)   if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1623)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1624)     struct dlist *list = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1625) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1626)     if( (list = package->requires->list) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1627)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1628)       struct pkg   *pkg  = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1629)       struct btree *node = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1630) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1631)       pkg = __find_pkg_by_pkg( pkgs, (struct pkg *)list->data );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1632) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1633)       node = __btree_add_left( (void *)pkg, (void *)tree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1634) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1635)       if( dlist_length( list ) > 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1636)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1637)         dlist_foreach( list->next, __btree_add_right, (void *)&node );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1638)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1639)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1640)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1641) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1642) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1643) static void __fill_btree( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1644) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1645)   struct btree   *tree    = *((struct btree **)user_data);
11c606a6 (kx 2023-04-11 01:18:34 +0300 1646)   struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1647)   struct pkg     *pkg     = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1648)   struct btree   *node    = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1649) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1650)   if( !tree || !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1651) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1652)   pkg = __find_pkg_by_package( pkgs, package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1653) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1654)   node = btree_insert_right( tree, __btree_alloc( (void *)pkg ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1655)   __btree_add_requires( node );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1656) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1657)   *((struct btree **)user_data) = node;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1658) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1659) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1660) /*******************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1661)   __print_btree_pkg():
11c606a6 (kx 2023-04-11 01:18:34 +0300 1662)   -------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1663)     Print out package "group/name-version". Used for debuging only.
11c606a6 (kx 2023-04-11 01:18:34 +0300 1664)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1665) static void __print_btree_pkg( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1666) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1667)   struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1668) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1669)   if( !pkg ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1670) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1671)   fprintf( stdout, "%s/%s-%s\n", pkg->group, pkg->name, pkg->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1672) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1673) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1674) /*****************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1675)   __print_btree_node():
11c606a6 (kx 2023-04-11 01:18:34 +0300 1676)   --------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1677)     Print out package in JSON format. Used by btree_print_json().
11c606a6 (kx 2023-04-11 01:18:34 +0300 1678)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1679) static void __print_btree_node( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1680) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1681)   struct pkg   *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1682)   struct _bctx *ctx = (struct _bctx *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1683) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1684)   char *p, buf[PATH_MAX*2];
11c606a6 (kx 2023-04-11 01:18:34 +0300 1685)   int   depth = 0, max_depth = PATH_MAX + PATH_MAX / 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1686) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1687)   if( !pkg || !ctx ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1688) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1689)   buf[0] = ' ';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1690)   buf[1] = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1691) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1692)   p = (char *)&buf[1];
11c606a6 (kx 2023-04-11 01:18:34 +0300 1693)   depth = ctx->indent;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1694) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1695)   if( depth < 1 ) depth = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1696)   if( depth > max_depth ) depth = max_depth;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1697) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1698)   while( depth )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1699)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1700)     (void)sprintf( p, " " ); --depth; ++p; *p = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1701)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1702) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1703)   if( pkg->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1704)     (void)sprintf( p, "\"name\": \"%s:%s-%s\"", pkg->group,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1705)                                                 pkg->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1706)                                                 pkg->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1707)   else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1708)     (void)sprintf( p, "\"name\": \"%s-%s\"", pkg->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1709)                                              pkg->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1710) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1711)   fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1712) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1713) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1714) static int __width_factor( int width )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1715) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1716)   double w, x = (double)width;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1717) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1718)   if( width < 2 ) return 48;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1719) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1720)   if( width > 1 && width < 150 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1721)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1722)     w = floor( (38.399 - 7.4262 * log( x )) + 8.0 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1723) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1724)     return (int)w;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1725)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1726)   else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1727)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1728)     return 8;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1729)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1730) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1731) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1732) /*******************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1733)   __print_btree_header():
11c606a6 (kx 2023-04-11 01:18:34 +0300 1734)   ----------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1735)     Print out Binary Tree Header.
11c606a6 (kx 2023-04-11 01:18:34 +0300 1736)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1737) static void __print_btree_header( FILE *fp, struct btree *btree, struct dlist *tree )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1738) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1739)   struct package *package = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1740) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1741)   if( !fp || !btree || !tree ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1742) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1743)   package = find_pkg( provides, (struct pkg *)btree->data );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1744) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1745)   if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1746)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1747)     char *buf = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1748) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1749)     if( dlist_length( tree ) > 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1750)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1751)       buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1752)       if( !buf ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1753)       bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1754) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1755)       (void)sprintf( &buf[0], "%s", htmlroot );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1756)       root = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1757)       (void)sprintf( &buf[0], "%s", package->pkginfo->url );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1758)       bug_url = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1759)       free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1760)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1761)     else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1762)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1763)       buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1764)       if( !buf ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1765)       bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1766) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1767)       if( package->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1768)         (void)sprintf( &buf[0], "%s/%s-%s", package->pkginfo->group,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1769)                                             package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1770)                                             package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1771)       else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1772)         (void)sprintf( &buf[0], "%s-%s", package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1773)                                          package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1774) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1775)       root = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1776)       (void)sprintf( &buf[0], "%s", package->pkginfo->url );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1777)       bug_url = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1778)       free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1779)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1780) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1781)     fprintf( fp, " \"distro\": [ \"%s\", \"%s\", \"%s\" ],\n",
11c606a6 (kx 2023-04-11 01:18:34 +0300 1782)                                    package->pkginfo->distro_name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1783)                                            package->pkginfo->distro_version,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1784)                                                     package->pkginfo->url );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1785)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1786) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1787) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1788) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1789) /***************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1790)   create_btree():
11c606a6 (kx 2023-04-11 01:18:34 +0300 1791)   --------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1792)     Creates btree from tree list (DAG).
11c606a6 (kx 2023-04-11 01:18:34 +0300 1793)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1794) static void create_btree( struct dlist *dag, struct dlist *install )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1795) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1796)   struct pkg     *pkg        = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1797)   struct package *package    = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1798)   struct dlist   *list       = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1799)   struct btree   *node       = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1800) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1801)   if( !dag || !install ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1802) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1803)   /* first package: */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1804)   package = (struct package *)dag->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1805)   pkg     = __find_pkg_by_package( pkgs, package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1806) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1807)   node = btree = __btree_alloc( (void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1808) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1809)   __btree_add_requires( node );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1810) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1811)   if( dlist_length( dag ) > 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1812)     dlist_foreach( dag->next, __fill_btree, (void *)&node );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1813) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1814)   btree_reduce( btree, __compare_pkg, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1815) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1816) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 1817)   End of Binary Tree functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1818)  ***************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300 1819) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1820) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1821) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1822)   Print json format of DAG functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1823)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1824) static void __print_pkg_tree( struct _ctx *ctx, struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1825) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1826)   struct dlist *next = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1827) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1828)   if( !ctx || !list ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1829) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1830)   ctx->depth += 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1831)   svg_width = max( svg_width, ctx->depth );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1832) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1833)   while( list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1834)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1835)     next = dlist_next( list );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1836)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1837)       struct pkg     *pkg     = (struct pkg *)list->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1838)       struct package *package = find_pkg( provides, pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1839) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1840)       if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1841)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1842)         char *p, *buf = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1843)         int   depth = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1844) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1845)         struct dlist *reqs = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1846) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1847)         buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1848)         if( !buf ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1849)         bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1850) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1851)         buf[0] = ' ';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1852)         buf[1] = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1853) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1854)         p = (char *)&buf[1];
11c606a6 (kx 2023-04-11 01:18:34 +0300 1855)         depth = ctx->depth;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1856) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1857)         while( depth ) { (void)sprintf( p, " " ); --depth; ++p; *p = '\0'; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1858) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1859)         (void)sprintf( p - 1, "{\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1860)         fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1861)         *(p - 1) = ' '; *p = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1862) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1863)         if( pkg->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1864)           (void)sprintf( p, "\"name\": \"%s:%s-%s\"", pkg->group,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1865)                                                       pkg->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1866)                                                       pkg->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1867)         else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1868)           (void)sprintf( p, "\"name\": \"%s-%s\"", pkg->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1869)                                                    pkg->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1870) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1871)         fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1872) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1873)         if( (reqs = package->requires->list) && check_pkg_requires( reqs ) > 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1874)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1875)           fprintf( ctx->output, ",\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1876) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1877)           (void)sprintf( p, "\"children\": [\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1878)           fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1879) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1880)           __print_pkg_tree( ctx, reqs );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1881) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1882)           (void)sprintf( p, "]\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1883)           fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1884)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1885)         else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1886)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1887)           fprintf( ctx->output, "\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1888)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1889) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1890)         (void)sprintf( p - 1, "}" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1891)         fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1892)         *(p - 1) = ' '; *p = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1893) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1894)         if( next ) { fprintf( ctx->output, ",\n" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1895)         else       { fprintf( ctx->output, "\n" );  }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1896) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1897)         free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1898)       } /* End if( package )  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1899)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1900)     list = next;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1901)   } /* End of while( list ) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1902) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1903)   ctx->depth -= 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1904) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1905) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1906) static void __print_package_node( struct _ctx *ctx, struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1907) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1908)   char *p, *buf = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1909)   int   depth = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1910) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1911)   struct dlist *list = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1912) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1913)   if( !package || !ctx ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1914) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1915)   buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1916)   if( !buf ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1917)   bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1918) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1919)   buf[0] = ' ';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1920)   buf[1] = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1921) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1922)   p = (char *)&buf[1];
11c606a6 (kx 2023-04-11 01:18:34 +0300 1923)   depth = ctx->depth;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1924) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1925)   while( depth ) { (void)sprintf( p, " " ); --depth; ++p; *p = '\0'; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1926) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1927)   (void)sprintf( p - 1, "{\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1928)   fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1929)   *(p - 1) = ' '; *p = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1930) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1931)   if( package->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1932)     (void)sprintf( p, "\"name\": \"%s:%s-%s\"", package->pkginfo->group,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1933)                                                 package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1934)                                                 package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1935)   else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1936)     (void)sprintf( p, "\"name\": \"%s-%s\"", package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1937)                                              package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1938) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1939)   fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1940) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1941)   if( (list = package->requires->list) && check_pkg_requires( list ) > 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1942)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1943)     fprintf( ctx->output, ",\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1944) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1945)     (void)sprintf( p, "\"children\": [\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1946)     fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1947) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1948)     __print_pkg_tree( ctx, list );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1949) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1950)     (void)sprintf( p, "]\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1951)     fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1952)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1953)   else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1954)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1955)     fprintf( ctx->output, "\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1956)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1957) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1958)   (void)sprintf( p - 1, "}" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1959)   fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1960)   *(p - 1) = ' '; *p = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1961) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1962)   free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1963) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1964) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1965) static void __print_tree_node( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1966) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1967)   struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1968)   struct _ctx    *ctx     = (struct _ctx *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1969) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1970)   if( !package || !ctx ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1971) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1972)   if( ctx->size > 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1973)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1974)     if( ctx->index == 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1975)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1976)       char *buf = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1977) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1978)       buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1979)       if( !buf ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1980)       bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1981) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1982)       (void)sprintf( &buf[0], "%s", htmlroot );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1983)       root = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1984)       (void)sprintf( &buf[0], "%s", package->pkginfo->url );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1985)       bug_url = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1986)       free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1987) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1988)       fprintf( ctx->output, " \"distro\": [ \"%s\", \"%s\", \"%s\" ],\n",
11c606a6 (kx 2023-04-11 01:18:34 +0300 1989)                                               package->pkginfo->distro_name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1990)                                                       package->pkginfo->distro_version,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1991)                                                                package->pkginfo->url );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1992)       fprintf( ctx->output, " \"name\": \"%s\",\n", htmlroot );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1993)       fprintf( ctx->output, " \"children\": [\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1994)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1995) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1996) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 1997)     __print_package_node( ctx, package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1998)     svg_height += 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1999) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2000) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2001)     if( ctx->index < ctx->size - 1 ) fprintf( ctx->output, "," );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2002)     else                             fprintf( ctx->output, "\n ]" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2003) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2004)     fprintf( ctx->output, "\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2005)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2006)   else
11c606a6 (kx 2023-04-11 01:18:34 +0300 2007)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2008)     struct dlist *reqs = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2009)     char *buf = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2010) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2011)     buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2012)     if( !buf ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2013)     bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2014) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2015)     if( package->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2016)       (void)sprintf( &buf[0], "%s/%s-%s", package->pkginfo->group,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2017)                                           package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2018)                                           package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2019)     else
11c606a6 (kx 2023-04-11 01:18:34 +0300 2020)       (void)sprintf( &buf[0], "%s-%s", package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2021)                                        package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2022) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2023)     root = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2024)     (void)sprintf( &buf[0], "%s", package->pkginfo->url );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2025)     bug_url = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2026)     free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2027) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2028)     fprintf( ctx->output, " \"distro\": [ \"%s\", \"%s\", \"%s\" ],\n",
11c606a6 (kx 2023-04-11 01:18:34 +0300 2029)                                             package->pkginfo->distro_name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2030)                                                     package->pkginfo->distro_version,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2031)                                                              package->pkginfo->url );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2032)     if( package->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2033)       fprintf( ctx->output, " \"name\": \"%s:%s-%s\"", package->pkginfo->group,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2034)                                                        package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2035)                                                        package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2036)     else
11c606a6 (kx 2023-04-11 01:18:34 +0300 2037)       fprintf( ctx->output, " \"name\": \"%s-%s\"", package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2038)                                                     package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2039) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2040) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2041)     svg_height += 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2042)     ctx->depth  -=2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2043) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2044)     if( (reqs = package->requires->list) && check_pkg_requires( reqs ) > 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2045)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2046)       fprintf( ctx->output, ",\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2047) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2048)       fprintf( ctx->output, " \"children\": [\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2049) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2050)       __print_pkg_tree( ctx, reqs );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2051) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2052)       fprintf( ctx->output, " ]\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2053)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2054) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2055)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2056) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2057)   ++ctx->index;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2058) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2059) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2060) static void print_tree_json( FILE *output, struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2061) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2062)   struct _ctx ctx;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2063) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2064)   if( !output || !list ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2065) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2066)   bzero( (void *)&ctx, sizeof(struct _ctx) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2067) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2068)   ctx.output = output;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2069)   ctx.index  = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2070)   ctx.size   = dlist_length( list );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2071)   ctx.depth  = 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2072) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2073)   fprintf( output, "{\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2074)   dlist_foreach( list, __print_tree_node, (void *)&ctx );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2075)   fprintf( output, "}\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2076) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2077)   svg_height += svg_width / 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2078) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2079)   svg_width  = (svg_width  + 4) * 160;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2080)   svg_height = (svg_height + 4) * 24;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2081) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2082) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 2083)   End of print json format of DAG functions.
11c606a6 (kx 2023-04-11 01:18:34 +0300 2084)  ***************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300 2085) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2086) #include <pkglist.html.c>
11c606a6 (kx 2023-04-11 01:18:34 +0300 2087) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2088) void print_provides_tree( const char *json_fname, enum _tree_format tree_format )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2089) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2090)   FILE *pkgs_fp = NULL, *tree_fp = NULL, *html_fp = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2091) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2092)   allocate_fnames( json_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2093) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2094)   pkgs_fp = fopen( (const char *)pkgs_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2095)   if( !pkgs_fp ) { FATAL_ERROR( "Cannot create %s file", basename( pkgs_fname ) ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2096)   tree_fp = fopen( (const char *)tree_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2097)   if( !tree_fp ) { FATAL_ERROR( "Cannot create %s file", basename( tree_fname ) ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2098)   html_fp = fopen( (const char *)html_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2099)   if( !html_fp ) { FATAL_ERROR( "Cannot create %s file", basename( html_fname ) ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2100) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2101)   tree = dlist_copy( provides );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2102) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2103)   /*****************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 2104)     print out the array of all packages in JSON format:
11c606a6 (kx 2023-04-11 01:18:34 +0300 2105)    */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2106)   print_pkgs_json( pkgs_fp, provides );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2107)   fflush( pkgs_fp ); fclose( pkgs_fp );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2108) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2109)   provides = dlist_reverse( provides );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2110)   sort_requires( provides ); /* sort requires in reverse installation order */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2111) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2112)   /********************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 2113)     Sort the REQUIRES TREE in reverse installation order.
11c606a6 (kx 2023-04-11 01:18:34 +0300 2114)    */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2115)   tree = sort_requires_tree( tree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2116) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2117)   /********************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 2118)     remove unneded packages from tree list to leave the
11c606a6 (kx 2023-04-11 01:18:34 +0300 2119)     last installation layer of packages presented in DAG:
11c606a6 (kx 2023-04-11 01:18:34 +0300 2120)    */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2121)   remove_required_packages( provides );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2122) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2123) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2124)   if( tree_format == TFMT_BIN )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2125)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2126)     int width = 0, height = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2127) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2128)     /********************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 2129)       print out the REQUIRES TREE in JSON format as reduced binary tree:
11c606a6 (kx 2023-04-11 01:18:34 +0300 2130)      */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2131)     create_pkgs_list( provides );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2132)     create_btree( tree, provides );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2133) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2134)     width  =  btree_width( btree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2135)     height = btree_height( btree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2136) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2137)     svg_width  = (height + 4) * 240;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2138)     svg_height =  (width + 4) * __width_factor( width );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2139) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2140)     fprintf( tree_fp, "{\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2141)     __print_btree_header( tree_fp, btree, tree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2142)     btree_print_json( tree_fp, btree, __print_btree_node );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2143)     fprintf( tree_fp, "}\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2144) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2145)     __btree_free( btree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2146)     free_pkgs_list();
11c606a6 (kx 2023-04-11 01:18:34 +0300 2147)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2148)   else
11c606a6 (kx 2023-04-11 01:18:34 +0300 2149)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2150)     /****************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 2151)       print out the REQUIRES TREE in JSON format as DAG:
11c606a6 (kx 2023-04-11 01:18:34 +0300 2152)      */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2153)     print_tree_json( tree_fp, tree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2154)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2155) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2156)   fflush( tree_fp ); fclose( tree_fp );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2157) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2158)   if( minimize )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2159)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2160)     if( minimize_json( (const char *)pkgs_fname, (const char *)pkgs_min_fname ) < 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2161)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2162)       (void)unlink( (const char *)pkgs_min_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2163)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2164)     if( minimize_json( (const char *)tree_fname, (const char *)tree_min_fname ) < 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2165)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2166)       (void)unlink( (const char *)tree_min_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2167)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2168)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2169) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2170) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2171)   /***********************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 2172)     print out the HTML to view REQIIRES TREE:
11c606a6 (kx 2023-04-11 01:18:34 +0300 2173)    */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2174)   print_tree_html( html_fp );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2175)   fflush( html_fp ); fclose( html_fp );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2176) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2177) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2178)   /*****************
11c606a6 (kx 2023-04-11 01:18:34 +0300 2179)     free resources:
11c606a6 (kx 2023-04-11 01:18:34 +0300 2180)    */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2181)   if( root )    { free( root );       root = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2182)   if( bug_url ) { free( bug_url ); bug_url = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2183) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2184)   if( pkgs_fname ) { free( pkgs_fname ); pkgs_fname = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2185)   if( tree_fname ) { free( tree_fname ); tree_fname = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2186)   if( html_fname ) { free( html_fname ); html_fname = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2187) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2188)   if( pkgs_min_fname ) { free( pkgs_min_fname ); pkgs_min_fname = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2189)   if( tree_min_fname ) { free( tree_min_fname ); tree_min_fname = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2190) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2191)   if( json_pkgs_file ) { free( json_pkgs_file ); json_pkgs_file = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2192)   if( json_tree_file ) { free( json_tree_file ); json_tree_file = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2193) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 2194)   __dlist_free( tree ); /* do not free node data */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2195) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2196) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 2197)   End of Requires TREE functions.
11c606a6 (kx 2023-04-11 01:18:34 +0300 2198)  ***************************************************************/