//! //! Main entry point of the application //! //! @param[in] argc the number of parameter passed on the command line //! @param[in] argv the list of arguments //! //! @return EUCA_OK on success or EUCA_ERROR on failure. //! int main(int argc, char **argv) { char *c_s1_sub = NULL; char *c_s2_sub = NULL; char *c_s3_sub = NULL; wchar_t *s1_sub = NULL; wchar_t *s2_sub = NULL; wchar_t *s3_sub = NULL; setlocale(LC_ALL, "en_US.UTF-8"); m = varmap_alloc(NULL, L"color", L"brown"); m = varmap_alloc(m, L"subject", L"føx"); m = varmap_alloc(m, L"øbject", L"dog"); printf(" nice string: %ls\n", s1); s1_sub = varsub(s1, (const wchar_map **)m); assert(s1_sub != NULL); printf("nice string subbed: %ls\n", s1_sub); EUCA_FREE(s1_sub); printf(" ugly string: %ls\n", s2); s2_sub = varsub(s2, (const wchar_map **)m); assert(s2_sub != NULL); printf("ugly string subbed: %ls\n", s2_sub); EUCA_FREE(s2_sub); printf(" unsubbable string: %ls\n", s3); assert(varsub(s3, (const wchar_map **)m) == NULL); varmap_free(m); printf(" sending null map: %ls\n", s3); // Reuse s3 s3_sub = varsub(s3, NULL); printf("returned from null: %ls\n", s3_sub); EUCA_FREE(s3_sub); // Now do it again, this time non-widechar c_m = c_varmap_alloc(NULL, "colorxxxxxx", "brown"); //! @todo This matches c_m = c_varmap_alloc(c_m, "subject", "fox"); c_m = c_varmap_alloc(c_m, "object", "dog"); printf(" nice string: %s\n", c_s1); c_s1_sub = c_varsub(c_s1, (const char_map **)c_m); printf("nice string subbed: %s\n", c_s1_sub); assert(c_s1_sub != NULL); EUCA_FREE(c_s1_sub); printf(" ugly string: %s\n", c_s2); c_s2_sub = c_varsub(c_s2, (const char_map **)c_m); assert(c_s2_sub != NULL); printf("ugly string subbed: %s\n", c_s2_sub); EUCA_FREE(c_s2_sub); printf(" unsubbable string: %s\n", c_s3); c_s3_sub = c_varsub(c_s3, (const char_map **)c_m); printf(" unsubbed string: %s\n", c_s3_sub); assert(!strcmp(c_s3, c_s3_sub)); EUCA_FREE(c_s3_sub); c_varmap_free(c_m); printf(" sending null map: %s\n", c_s3); // Reuse s3 c_s3_sub = c_varsub(c_s3, NULL); printf("returned from null: %s\n", c_s3_sub); assert(!strcmp(c_s3, c_s3_sub)); EUCA_FREE(c_s3_sub); }
/* * Formats fault-log output and sends to fault log (or stdout/stderr). */ static boolean format_eucafault (const char *fault_id, const char_map **map) { static int max_label_len = 0; char *fault_var = NULL; time_t secs; struct tm lt; xmlNode *fault_node = get_eucafault (fault_id, NULL); if (fault_node == NULL) { logprintfl (EUCAERROR, "Fault %s detected, could not find fault id in registry.\n", fault_id); return FALSE; } // Determine label alignment. (Only needs to be done once.) if (!max_label_len) { for (int i = 0; fault_labels[i]; i++) { int label_len = 0; int w_label_len = 0; char *label = get_common_var (fault_labels[i]); label_len = strlen (label); w_label_len = utf8_to_wchar (label, label_len, NULL, 0, 0); free (label); if (w_label_len > max_label_len) { max_label_len = w_label_len; } } } // Top border. fprintf (faultlog, "%s\n", STARS); // Get time. secs = time (NULL); if (gmtime_r (&secs, <) == NULL) { // Someone call Dr. Who. lt.tm_year = lt.tm_mon = lt.tm_mday = 0; lt.tm_hour = lt.tm_min = lt.tm_sec = 0; } else { // Account for implied offsets in struct. lt.tm_year += 1900; lt.tm_mon += 1; } // Construct timestamped fault header. fprintf (faultlog, " ERR-%s %04d-%02d-%02d %02d:%02d:%02dZ ", fault_id, lt.tm_year, lt.tm_mon, lt.tm_mday, lt.tm_hour, lt.tm_min, lt.tm_sec); if ((fault_var = get_fault_var ("fault", fault_node)) != NULL) { char *fault_subbed = NULL; if ((fault_subbed = c_varsub (fault_var, map)) != NULL) { fprintf (faultlog, "%s\n\n", fault_subbed); } else { fprintf (faultlog, "%s\n\n", fault_var); } free (fault_subbed); free (fault_var); } else { char *common_var = get_common_var ("unknown"); fprintf (faultlog, "%s\n\n", common_var); free (common_var); } // Construct fault information lines. for (int i = 0; fault_labels[i]; i++) { int w_common_var_len = 0; int common_var_len = 0; int padding = 0; char *common_var = get_common_var (fault_labels[i]); common_var_len = strlen (common_var); w_common_var_len = utf8_to_wchar (common_var, common_var_len, NULL, 0, 0); padding = max_label_len - w_common_var_len + 1; fprintf (faultlog, "%s%*s %s: ", BARS, padding, " ", common_var); free (common_var); if ((fault_var = get_fault_var (fault_labels[i], fault_node)) != NULL) { char *fault_subbed = NULL; if ((fault_subbed = c_varsub (fault_var, map)) != NULL) { fprintf (faultlog, "%s", fault_subbed); } else { fprintf (faultlog, "%s", fault_var); } free (fault_subbed); free (fault_var); } else { common_var = get_common_var ("unknown"); fprintf (faultlog, "%s", common_var); free (common_var); } fprintf (faultlog, "\n"); } // Bottom border. fprintf (faultlog, "%s\n\n", STARS); fflush (faultlog); return TRUE; }