[v0.99][ARM] Fix compilation due to new logos in ARM, but needs refactoring and review

This commit is contained in:
Dr-Noob
2021-08-09 13:35:00 +02:00
parent 42149b8dff
commit 5e3be4c45f

View File

@@ -261,6 +261,21 @@ struct ascii* set_ascii(VENDOR vendor, STYLE style, struct color** cs) {
return art; return art;
} }
void parse_print_color(struct ascii* art, uint32_t* logo_pos) {
struct ascii_logo* logo = art->art;
char color_id_str = logo->art[*logo_pos + 2];
if(color_id_str == 'R') {
printf("%s", art->reset);
}
else {
int color_id = (color_id_str - '0') - 1;
printf("%s", logo->color_ascii[color_id]);
}
*logo_pos+=3;
}
bool ascii_fits_screen(int termw, struct ascii_logo logo, int lf) { bool ascii_fits_screen(int termw, struct ascii_logo logo, int lf) {
return termw - ((int) logo.width + lf) >= 0; return termw - ((int) logo.width + lf) >= 0;
} }
@@ -268,13 +283,13 @@ bool ascii_fits_screen(int termw, struct ascii_logo logo, int lf) {
void choose_ascii_art(struct ascii* art, struct terminal* term, int lf) { void choose_ascii_art(struct ascii* art, struct terminal* term, int lf) {
#ifdef ARCH_X86 #ifdef ARCH_X86
if(art->vendor == CPU_VENDOR_INTEL) { if(art->vendor == CPU_VENDOR_INTEL) {
if(ascii_fits_screen(term->w, logo_intel_l, lf)) if(term != NULL && ascii_fits_screen(term->w, logo_intel_l, lf))
art->art = &logo_intel_l; art->art = &logo_intel_l;
else else
art->art = &logo_intel; art->art = &logo_intel;
} }
else if(art->vendor == CPU_VENDOR_AMD) { else if(art->vendor == CPU_VENDOR_AMD) {
if(ascii_fits_screen(term->w, logo_amd_l, lf)) if(term != NULL && ascii_fits_screen(term->w, logo_amd_l, lf))
art->art = &logo_amd_l; art->art = &logo_amd_l;
else else
art->art = &logo_amd; art->art = &logo_amd;
@@ -283,7 +298,7 @@ void choose_ascii_art(struct ascii* art, struct terminal* term, int lf) {
art->art = &logo_unknown; art->art = &logo_unknown;
} }
#elif ARCH_PPC #elif ARCH_PPC
if(ascii_fits_screen(term->w, logo_ibm_l, lf)) if(term != NULL && ascii_fits_screen(term->w, logo_ibm_l, lf))
art->art = &logo_ibm_l; art->art = &logo_ibm_l;
else else
art->art = &logo_ibm; art->art = &logo_ibm;
@@ -299,14 +314,12 @@ void choose_ascii_art(struct ascii* art, struct terminal* term, int lf) {
else if(art->vendor == SOC_VENDOR_BROADCOM) else if(art->vendor == SOC_VENDOR_BROADCOM)
art->art = &logo_broadcom; art->art = &logo_broadcom;
else { else {
if(ascii_fits_screen(term->w, logo_arm_l, lf)) if(term != NULL && ascii_fits_screen(term->w, logo_arm_l, lf))
art->art = &logo_arm_l; art->art = &logo_arm_l;
else else
art->art = &logo_arm; art->art = &logo_arm;
} }
#endif #endif
// change
art->art = &logo_ibm_l;
} }
uint32_t longest_attribute_length(struct ascii* art) { uint32_t longest_attribute_length(struct ascii* art) {
@@ -340,21 +353,6 @@ uint32_t longest_field_length(struct ascii* art, int la) {
} }
#ifdef ARCH_X86 #ifdef ARCH_X86
void parse_print_color(struct ascii* art, uint32_t* logo_pos) {
struct ascii_logo* logo = art->art;
char color_id_str = logo->art[*logo_pos + 2];
if(color_id_str == 'R') {
printf("%s", art->reset);
}
else {
int color_id = (color_id_str - '0') - 1;
printf("%s", logo->color_ascii[color_id]);
}
*logo_pos+=3;
}
void print_ascii_x86(struct ascii* art, uint32_t la) { void print_ascii_x86(struct ascii* art, uint32_t la) {
struct ascii_logo* logo = art->art; struct ascii_logo* logo = art->art;
int attr_to_print = 0; int attr_to_print = 0;
@@ -377,7 +375,7 @@ void print_ascii_x86(struct ascii* art, uint32_t la) {
if(logo->replace_blocks && logo->art[logo_pos] != ' ') { if(logo->replace_blocks && logo->art[logo_pos] != ' ') {
if(logo->art[logo_pos] == '#') printf("%s%c%s", logo->color_ascii[0], ' ', art->reset); if(logo->art[logo_pos] == '#') printf("%s%c%s", logo->color_ascii[0], ' ', art->reset);
else if(logo->art[logo_pos] == '@') printf("%s%c%s", logo->color_ascii[1], ' ', art->reset); else if(logo->art[logo_pos] == '@') printf("%s%c%s", logo->color_ascii[1], ' ', art->reset);
else printBug("ASCII art with replace_blocks has invalid character: '%c'", logo->art[logo_pos]); else printf("%c", logo->art[logo_pos]);
} }
else else
printf("%c", logo->art[logo_pos]); printf("%c", logo->art[logo_pos]);
@@ -519,11 +517,10 @@ void print_ascii_ppc(struct ascii* art, uint32_t la) {
printf("\n"); printf("\n");
} }
void print_ascii(struct ascii* art) { /*void print_ascii(struct ascii* art) {
uint32_t longest_attribute = longest_attribute_length(art); uint32_t longest_attribute = longest_attribute_length(art);
print_ascii_ppc(art, longest_attribute); print_ascii_ppc(art, longest_attribute);
} }*/
bool print_cpufetch_ppc(struct cpuInfo* cpu, STYLE s, struct color** cs) { bool print_cpufetch_ppc(struct cpuInfo* cpu, STYLE s, struct color** cs) {
struct ascii* art = set_ascii(get_cpu_vendor(cpu), s, cs); struct ascii* art = set_ascii(get_cpu_vendor(cpu), s, cs);
@@ -581,72 +578,58 @@ bool print_cpufetch_ppc(struct cpuInfo* cpu, STYLE s, struct color** cs) {
#endif #endif
#ifdef ARCH_ARM #ifdef ARCH_ARM
void print_algorithm_snapd_mtk(struct ascii* art, int n) {
for(int i=0; i < LINE_SIZE; i++) {
if(art->art[n][i] == '@')
printf("%s%c%s", art->color1_ascii, art->ascii_chars[0], art->reset);
else if(art->art[n][i] == '#')
printf("%s%c%s", art->color2_ascii, art->ascii_chars[1], art->reset);
else
printf("%c",art->art[n][i]);
}
}
void print_algorithm_samsung(struct ascii* art, int n) {
int y_margin = 2;
int x_margin = 2 * y_margin;
for(int i=0; i < LINE_SIZE; i++) {
if(art->art[n][i] == '#') {
printf("%s%c%s", art->color1_ascii, art->ascii_chars[0], art->reset);
}
else if((n >= y_margin && n < NUMBER_OF_LINES-y_margin) && (i >= x_margin && i < LINE_SIZE-x_margin)) {
if(art->art[n][i] == '#')
printf("%s%c%s", art->color1_ascii, art->ascii_chars[0], art->reset);
else
printf("%s%c%s","\x1b[48;2;10;10;10m" COLOR_FG_WHITE, art->art[n][i], art->reset);
}
else
printf("%c", art->art[n][i]);
}
}
void print_algorithm_arm(struct ascii* art, int n) { void print_algorithm_arm(struct ascii* art, int n) {
for(int i=0; i < LINE_SIZE; i++) {
if(art->art[n][i] == '#')
printf("%s%c%s", art->color1_ascii, art->ascii_chars[0], art->reset);
else
printf("%c",art->art[n][i]);
}
} }
void print_ascii_arm(struct ascii* art, uint32_t la, void (*callback_print_algorithm)(struct ascii* art, int n)) { void print_ascii_arm(struct ascii* art, uint32_t la, void (*callback_print_algorithm)(struct ascii* art, int n)) {
struct ascii_logo* logo = art->art;
int attr_to_print = 0; int attr_to_print = 0;
int attr_type; int attr_type;
char* attr_value; char* attr_value;
uint32_t limit_up; int32_t limit_up;
uint32_t limit_down; int32_t limit_down;
uint32_t logo_pos = 0;
uint32_t space_right; uint32_t space_right;
uint32_t space_up = (NUMBER_OF_LINES - art->n_attributes_set)/2; int32_t space_up = ((int)logo->height - (int)art->n_attributes_set)/2;
uint32_t space_down = NUMBER_OF_LINES - art->n_attributes_set - space_up; int32_t space_down = (int)logo->height - (int)art->n_attributes_set - (int)space_up;
if(art->n_attributes_set > NUMBER_OF_LINES) {
if(art->n_attributes_set > logo->height) {
limit_up = 0; limit_up = 0;
limit_down = art->n_attributes_set; limit_down = art->n_attributes_set;
} }
else { else {
limit_up = space_up; limit_up = space_up;
limit_down = NUMBER_OF_LINES-space_down; limit_down = logo->height - space_down;
} }
bool add_space = false; bool add_space = false;
uint32_t len = max(art->n_attributes_set, NUMBER_OF_LINES); int32_t iters = max(logo->height, art->n_attributes_set);
for(uint32_t n=0; n < len; n++) { for(int32_t n=0; n < iters; n++) {
if(n >= art->additional_spaces && n < NUMBER_OF_LINES + art->additional_spaces) // 1. Print logo
callback_print_algorithm(art, n - art->additional_spaces); if(n >= (int) art->additional_spaces && n < (int) logo->height + (int) art->additional_spaces) {
for(uint32_t i=0; i < logo->width; i++) {
if(logo->art[logo_pos] == '$' && logo->art[logo_pos+1] == 'C') {
parse_print_color(art, &logo_pos);
}
if(logo->replace_blocks && logo->art[logo_pos] != ' ') {
if(logo->art[logo_pos] == '#') printf("%s%c%s", logo->color_ascii[0], ' ', art->reset);
else if(logo->art[logo_pos] == '@') printf("%s%c%s", logo->color_ascii[1], ' ', art->reset);
else printf("%c", logo->art[logo_pos]);
}
else else
printf("%*s", LINE_SIZE, ""); printf("%c", logo->art[logo_pos]);
logo_pos++;
}
printf("%s", art->reset);
}
else {
// If logo should not be printed, fill with spaces
printf("%*c", logo->width, ' ');
}
// 2. Print text
if(n >= limit_up && n < limit_down) { if(n >= limit_up && n < limit_down) {
attr_type = art->attributes[attr_to_print]->type; attr_type = art->attributes[attr_to_print]->type;
attr_value = art->attributes[attr_to_print]->value; attr_value = art->attributes[attr_to_print]->value;
@@ -656,17 +639,17 @@ void print_ascii_arm(struct ascii* art, uint32_t la, void (*callback_print_algor
add_space = false; add_space = false;
} }
if(attr_type == ATTRIBUTE_CPU_NUM) { if(attr_type == ATTRIBUTE_CPU_NUM) {
printf("%s%s%s\n", art->color1_text, attr_value, art->reset); printf("%s%s%s\n", logo->color_text[0], attr_value, art->reset);
add_space = true; add_space = true;
} }
else { else {
if(add_space) { if(add_space) {
space_right = 1 + (la - strlen(ATTRIBUTE_FIELDS[attr_type])); space_right = 1 + (la - strlen(ATTRIBUTE_FIELDS[attr_type]));
printf(" %s%s%s%*s%s%s%s\n", art->color1_text, ATTRIBUTE_FIELDS[attr_type], art->reset, space_right, "", art->color2_text, attr_value, art->reset); printf(" %s%s%s%*s%s%s%s\n", logo->color_text[0], ATTRIBUTE_FIELDS[attr_type], art->reset, space_right, "", logo->color_text[1], attr_value, art->reset);
} }
else { else {
space_right = 2 + 1 + (la - strlen(ATTRIBUTE_FIELDS[attr_type])); space_right = 2 + 1 + (la - strlen(ATTRIBUTE_FIELDS[attr_type]));
printf("%s%s%s%*s%s%s%s\n", art->color1_text, ATTRIBUTE_FIELDS[attr_type], art->reset, space_right, "", art->color2_text, attr_value, art->reset); printf("%s%s%s%*s%s%s%s\n", logo->color_text[0], ATTRIBUTE_FIELDS[attr_type], art->reset, space_right, "", logo->color_text[1], attr_value, art->reset);
} }
} }
} }
@@ -675,22 +658,19 @@ void print_ascii_arm(struct ascii* art, uint32_t la, void (*callback_print_algor
} }
void print_ascii(struct ascii* art) { void print_ascii(struct ascii* art, uint32_t longest_attribute) {
uint32_t longest_attribute = longest_attribute_length(art);
if(art->vendor == SOC_VENDOR_SNAPDRAGON || art->vendor == SOC_VENDOR_MEDIATEK || art->vendor == SOC_VENDOR_KIRIN || art->vendor == SOC_VENDOR_BROADCOM) if(art->vendor == SOC_VENDOR_SNAPDRAGON || art->vendor == SOC_VENDOR_MEDIATEK || art->vendor == SOC_VENDOR_KIRIN || art->vendor == SOC_VENDOR_BROADCOM)
print_ascii_arm(art, longest_attribute, &print_algorithm_snapd_mtk); print_ascii_arm(art, longest_attribute, &print_algorithm_arm);
else if(art->vendor == SOC_VENDOR_EXYNOS) else if(art->vendor == SOC_VENDOR_EXYNOS)
print_ascii_arm(art, longest_attribute, &print_algorithm_samsung); print_ascii_arm(art, longest_attribute, &print_algorithm_arm);
else { else {
if(art->vendor != SOC_VENDOR_UNKNOWN) if(art->vendor != SOC_VENDOR_UNKNOWN)
printWarn("Invalid SOC vendor: %d\n", art->vendor); printWarn("Invalid SOC vendor: %d\n", art->vendor);
print_ascii_arm(art, longest_attribute, &print_algorithm_arm); print_ascii_arm(art, longest_attribute, &print_algorithm_arm);
} }
} }
bool print_cpufetch_arm(struct cpuInfo* cpu, STYLE s, struct color** cs) { bool print_cpufetch_arm(struct cpuInfo* cpu, STYLE s, struct color** cs, struct terminal* term) {
struct ascii* art = set_ascii(get_soc_vendor(cpu->soc), s, cs); struct ascii* art = set_ascii(get_soc_vendor(cpu->soc), s, cs);
if(art == NULL) if(art == NULL)
return false; return false;
@@ -751,14 +731,20 @@ bool print_cpufetch_arm(struct cpuInfo* cpu, STYLE s, struct color** cs) {
} }
char* pp = get_str_peak_performance(cpu->peak_performance); char* pp = get_str_peak_performance(cpu->peak_performance);
setAttribute(art,ATTRIBUTE_PEAK,pp); setAttribute(art,ATTRIBUTE_PEAK,pp);
if(cpu->hv->present) {
if(art->n_attributes_set > NUMBER_OF_LINES) {
art->additional_spaces = (art->n_attributes_set - NUMBER_OF_LINES) / 2;
}
if(cpu->hv->present)
setAttribute(art, ATTRIBUTE_HYPERVISOR, cpu->hv->hv_name); setAttribute(art, ATTRIBUTE_HYPERVISOR, cpu->hv->hv_name);
}
print_ascii(art); uint32_t longest_attribute = longest_attribute_length(art);
uint32_t longest_field = longest_field_length(art, longest_attribute);
choose_ascii_art(art, term, longest_field);
struct ascii_logo* logo = art->art;
if(art->n_attributes_set > logo->height) {
art->additional_spaces = (art->n_attributes_set - logo->height) / 2;
}
print_ascii(art, longest_attribute);
free(manufacturing_process); free(manufacturing_process);
free(pp); free(pp);