char *pkg_to_str (const char *target, void *pkg, printpkgfn f, const char *format) { if (!format) return NULL; const char *c; string_t *ret = string_new(); const char *ptr = format; const char *end = &(format[strlen(format)]); while ((c = strchr (ptr, '%'))) { if (&(c[1]) == end) { break; } if (c[1] == '%' ) { ret = string_ncat (ret, ptr, (c-ptr)); ret = string_cat (ret, "%%"); } else { const char *info = NULL; if (strchr (FORMAT_LOCAL_PKG, c[1])) { info = alpm_local_pkg_get_str (f(pkg, 'n'), c[1]); } else if (c[1] == 't') { info = target; } else { info = f (pkg, c[1]); } if (c != ptr) { ret = string_ncat (ret, ptr, (c-ptr)); } if (info) { ret = string_cat (ret, info); } else { ret = string_cat (ret, "-"); } } ptr = &(c[2]); } if (ptr != end) { ret = string_ncat (ret, ptr, (end - ptr)); } return string_free2 (ret); }
void color_print_package (void * p, printpkgfn f) { string_t *cstr; static int number=0; const char *info, *lver; char *ver=NULL; int aur=(f == aur_get_str); int grp=(f == alpm_grp_get_str); cstr=string_new (); /* Numbering list */ if (config.numbering) cstr = string_fcat (cstr, "%s%d%s ", color (C_NB), ++number, color (C_NO)); /* repo/name */ if (config.aur_foreign) info = f(p, 'r'); else info = f(p, 's'); if (info) { if (config.get_res) dprintf (FD_RES, "%s/", info); cstr = string_fcat (cstr, "%s%s/%s", color_repo (info), info, color(C_NO)); } info=f(p, 'n'); if (config.get_res) dprintf (FD_RES, "%s\n", info); cstr = string_fcat (cstr, "%s%s%s ", color(C_PKG), info, color(C_NO)); if (grp) { /* no more output for groups */ fprintf (stdout, "%s\n", string_cstr (cstr)); string_free (cstr); return; } /* Version * different colors: * C_ORPHAN if package exists in AUR and is orphaned * C_OD if package exists and is out of date * C_VER otherwise */ lver = alpm_local_pkg_get_str (info, 'l'); info = f(p, (config.aur_upgrades) ? 'V' : 'v'); ver = STRDUP (info); info = (aur) ? f(p, 'm') : NULL; if (config.aur_foreign) { /* Compare foreign package with AUR */ if (aur) { const char *lver_color = NULL; if (!info) lver_color=color(C_ORPHAN); else { info = f(p, 'o'); if (info && info[0]=='1') lver_color=color(C_OD); } cstr = string_fcat (cstr, "%s%s%s", (lver_color) ? lver_color : color(C_VER), lver, color (C_NO)); if (alpm_pkg_vercmp (ver, lver)>0) cstr = string_fcat (cstr, " ( aur: %s )", ver); fprintf (stdout, "%s\n", string_cstr (cstr)); FREE (ver); } else fprintf (stdout, "%s %s%s%s\n", string_cstr (cstr), color(C_VER), lver, color(C_NO)); string_free (cstr); return; } if (aur && !info) cstr = string_fcat (cstr, "%s%s%s", color(C_ORPHAN), ver, color (C_NO)); else cstr = string_fcat (cstr, "%s%s%s", color(C_VER), ver, color (C_NO)); /* show size */ if (config.show_size) { info = f(p, 'r'); if (info) { if (strcmp (info, "aur")!=0) cstr = string_fcat (cstr, " [%.2f M]", (double) get_size_pkg (p) / (1024.0 * 1024)); } } if (config.aur_upgrades) { fprintf (stdout, "%s\n", string_cstr (cstr)); string_free (cstr); FREE (ver); return; } /* show groups */ info = f(p, 'g'); if (info) { cstr = string_fcat (cstr, " %s(%s)%s", color(C_GRP), info, color(C_NO)); } /* show install information */ if (lver) { info = f(p, 'r'); if (info && strcmp (info, "local")!=0) { cstr = string_fcat (cstr, " %s[%s", color(C_INSTALLED), _("installed")); if (strcmp (ver, lver)!=0) { cstr = string_fcat (cstr, ": %s%s%s%s", color(C_LVER), lver, color (C_NO), color(C_INSTALLED)); } cstr = string_fcat (cstr, "]%s", color(C_NO)); } } /* ver no more needed */ FREE (ver); /* Out of date status & votes */ if (aur) { info = f(p, 'o'); if (info && info[0]=='1') { cstr = string_fcat (cstr, " %s(%s)%s", color(C_OD), _("Out of Date"), color(C_NO)); } info = f(p, 'w'); if (info) { cstr = string_fcat (cstr, " %s(%s)%s", color(C_VOTES), info, color(C_NO)); } } /* Display computed string */ fprintf (stdout, "%s\n", string_cstr (cstr)); string_free (cstr); /* Description * if -Q or -Sl or -Sg <target>, don't display description */ if (config.op != OP_SEARCH && config.op != OP_LIST_REPO_S) return; fprintf (stdout, "%s", color(C_DSC)); indent (f(p, 'd')); fprintf (stdout, "%s", color(C_NO)); }
static void color_print_package (void *p, printpkgfn f) { static int number = 0; const bool aur = (f == aur_get_str); const bool grp = (f == alpm_grp_get_str); /* Numbering list */ if (config.numbering) { fprintf (stdout, "%s%d%s ", color (C_NB), ++number, color (C_NO)); } /* repo/name */ const char *info = color_print_repo (p, f); if (grp) { /* no more output for groups */ fprintf (stdout, "\n"); return; } /* Version * different colors: * C_ORPHAN if package exists in AUR and is orphaned * C_OD if package exists and is out of date * C_VER otherwise */ const char *lver = alpm_local_pkg_get_str (info, 'l'); info = f(p, (config.aur_upgrades || config.filter & F_UPGRADES) ? 'V' : 'v'); char *ver = STRDUP (info); info = (aur) ? f(p, 'm') : NULL; if (config.aur_foreign) { /* Compare foreign package with AUR */ if (aur) { info = color_print_aur_version (p, f, info, lver, ver); } else { fprintf (stdout, " %s%s%s\n", color(C_VER), lver, color(C_NO)); } FREE (ver); return; } if (aur && !info) { fprintf (stdout, "%s", color(C_ORPHAN)); } else { fprintf (stdout, "%s", color(C_VER)); } if (config.filter & F_UPGRADES) { fprintf (stdout, "%s%s -> %s%s%s", lver, color (C_NO), color(C_VER), ver, color (C_NO)); } else { fprintf (stdout, "%s%s", ver, color (C_NO)); } /* show size */ if (config.show_size) { color_print_size (p, f); } if (config.aur_upgrades || config.filter & F_UPGRADES) { fprintf (stdout, "\n"); FREE (ver); return; } /* show groups */ color_print_groups (p, f); /* show install information */ color_print_install_info (p, f, lver, ver); /* ver no more needed */ FREE (ver); /* Out of date status & votes */ if (aur) { color_print_aur_status (p, f); } /* Nothing more to display */ fprintf (stdout, "\n"); /* Description * if -Q or -Sl or -Sg <target>, don't display description */ if (config.op != OP_SEARCH && config.op != OP_LIST_REPO_S) { return; } fprintf (stdout, "%s", color(C_DSC)); indent (f(p, 'd')); fprintf (stdout, "%s", color(C_NO)); }