/* -------------------------------------------------------- rtcmix_warn --- */ void rtcmix_warn(const char *inst_name, const char *format, ...) { if (get_print_option() >= MMP_WARN) { char buf[BUFSIZE]; va_list args; va_start(args, format); vsnprintf(buf, BUFSIZE, format, args); va_end(args); #ifndef MAXMSP if (inst_name) fprintf(stderr, "\n" PREFIX "WARNING [%s]: %s\n\n", inst_name, buf); else fprintf(stderr, "\n" PREFIX "WARNING: %s\n\n", buf); #else // MAXMSP if (inst_name) { int nchars = sprintf(get_mm_print_ptr(), "WARNING [%s]: %s\n", inst_name, buf); set_mm_print_ptr(nchars+1); } else { int nchars = sprintf(get_mm_print_ptr(), "WARNING: %s\n", buf); set_mm_print_ptr(nchars+1); } #endif // MAXMSP } }
/* -------------------------------------------------------- rtcmix_advise --- */ void rtcmix_advise(const char *inst_name, const char *format, ...) { if (get_print_option() >= MMP_ADVISE) { char buf[BUFSIZE]; va_list args; va_start(args, format); vsnprintf(buf, BUFSIZE, format, args); va_end(args); #ifndef MAXMSP if (inst_name) printf("%s: %s\n", inst_name, buf); else printf("%s\n", buf); #else // MAXMSP if (inst_name) { int nchars = sprintf(get_mm_print_ptr(), "ADVISE [%s]: %s\n", inst_name, buf); set_mm_print_ptr(nchars+1); } else { int nchars = sprintf(get_mm_print_ptr(), "ADVISE: %s\n", buf); set_mm_print_ptr(nchars+1); } #endif // MAXMSP } }
/* -------------------------------------------------------------- rterror --- */ void rterror(const char *inst_name, const char *format, ...) { char buf[BUFSIZE]; va_list args; if (get_print_option() < MMP_RTERRORS) return; va_start(args, format); vsnprintf(buf, BUFSIZE, format, args); va_end(args); #ifndef MAXMSP if (inst_name) fprintf(stderr, PREFIX "ERROR [%s]: %s\n", inst_name, buf); else fprintf(stderr, PREFIX "ERROR: %s\n", buf); #else // MAXMSP if (inst_name) { int nchars = sprintf(get_mm_print_ptr(), "ERROR [%s]: %s\n", inst_name, buf); set_mm_print_ptr(nchars+1); } else { int nchars = sprintf(get_mm_print_ptr(), "ERROR: %s\n", buf); set_mm_print_ptr(nchars+1); } #endif // MAXMSP }
/* ------------------------------------------------------------------ die --- */ int die(const char *inst_name, const char *format, ...) { char buf[BUFSIZE]; va_list args; va_start(args, format); vsnprintf(buf, BUFSIZE, format, args); va_end(args); #ifndef MAXMSP if (inst_name) fprintf(stderr, PREFIX "FATAL ERROR [%s]: %s\n", inst_name, buf); else fprintf(stderr, PREFIX "FATAL ERROR: %s\n", buf); #else // MAXMSP if (inst_name) { int nchars = sprintf(get_mm_print_ptr(), "FATAL ERROR [%s]: %s\n", inst_name, buf); set_mm_print_ptr(nchars+1); } else { int nchars = sprintf(get_mm_print_ptr(), "FATAL ERROR: %s\n", buf); } #endif // MAXMSP if (get_bool_option(kOptionExitOnError)) { if (!rtsetparams_was_called()) closesf_noexit(); exit(1); return 0; /*NOTREACHED*/ } else return DONT_SCHEDULE; }
MincFloat _minc_printf(const MincValue args[], const int nargs) { int n; const char *p; int nchars; if (get_print_option() < MMP_PRINTS) return 0.0; if (args[0].dataType() != MincStringType) { minc_warn("printf: first argument must be format string"); goto err; } n = 1; p = (MincString) args[0]; while (*p) { switch (*p) { case '%': p++; if (n >= nargs) { minc_warn("printf: not enough arguments for format string"); goto err; } switch (*p) { case 'd': /* print float object as integer */ if (args[n].dataType() != MincFloatType) { minc_warn("printf: wrong argument type for format"); goto err; } nchars = snprintf(get_mm_print_ptr(), get_mm_print_space(), "%d", (int) (MincFloat)args[n]); break; case 'f': /* print float object */ if (args[n].dataType() != MincFloatType) { minc_warn("printf: wrong argument type for format"); goto err; } nchars = snprintf(get_mm_print_ptr(), get_mm_print_space(), "%.12g", (MincFloat)args[n]); break; case 'l': /* print list object */ if (args[n].dataType() != MincListType) { minc_warn("printf: wrong argument type for format"); goto err; } nchars = snprintf(get_mm_print_ptr(), get_mm_print_space(), "%s", "["); set_mm_print_ptr(nchars); _do_print(((MincList *)args[n])->data, ((MincList *)args[n])->len); nchars = snprintf(get_mm_print_ptr(), get_mm_print_space(), "%s", "]"); set_mm_print_ptr(nchars); break; case 's': /* print string object */ if (args[n].dataType() != MincStringType) { minc_warn("printf: wrong argument type for format"); goto err; } nchars = snprintf(get_mm_print_ptr(), get_mm_print_space(), "%s", (MincString)args[n]); break; case 't': /* print type of object */ { char *tstr = (char *) _make_type_string(args[n].dataType()); nchars = snprintf(get_mm_print_ptr(), get_mm_print_space(), "%s", tstr); free(tstr); } break; case 'z': /* print as appropriate for type */ _do_print(&args[n], 1); break; case '\0': minc_warn("printf: premature end of format string"); goto err; break; default: minc_warn("printf: invalid format specifier"); goto err; break; } n++; p++; break; case '\\': p++; switch (*p) { case 'n': nchars = snprintf(get_mm_print_ptr(), get_mm_print_space(), "\n"); break; case 't': nchars = snprintf(get_mm_print_ptr(), get_mm_print_space(), "\t"); break; //FIXME: currently, minc.l can't handle escaped quotes in strings case '\'': nchars = snprintf(get_mm_print_ptr(), get_mm_print_space(), "'"); break; case '"': nchars = snprintf(get_mm_print_ptr(), get_mm_print_space(), "\""); break; case '\0': minc_warn("printf: premature end of format string"); goto err; break; default: minc_warn("printf: invalid escape character"); goto err; break; } p++; break; default: nchars = snprintf(get_mm_print_ptr(), get_mm_print_space(), "%.1s", p); p++; break; } set_mm_print_ptr(nchars); } set_mm_print_ptr(1); return 0.0; err: nchars = snprintf(get_mm_print_ptr(), get_mm_print_space(), "\n"); set_mm_print_ptr(nchars+1); return -1.0; }