/* * generate a number */ char * outnum(char *p, int n) { #ifdef __appleiigs__ int i, m; char *q = p; /* find out how many decimal places there are */ m = n; i = 1; while ((m / 10) != 0) { i++; m /= 10; } p += i; m = n; do { *p = m%10 + '0'; m = m/10; --p; --i; } while (i > 0); assert(q == p); #else if (n>=10) p = outnum(p, n/10); *p++ = n%10 + '0'; #endif return p; }
/* * expand a builtin name */ void builtin(Tokenrow *trp, int biname) { char *op; Token *tp; Source *s; tp = trp->tp; trp->tp++; /* need to find the real source */ s = cursource; while (s && s->fd==-1) s = s->next; if (s==NULL) s = cursource; /* most are strings */ tp->type = STRING; if (tp->wslen) { *outp++ = ' '; tp->wslen = 1; } op = outp; *op++ = '"'; switch (biname) { case KLINENO: tp->type = NUMBER; op = outnum(op-1, s->line); break; case KFILE: { char *src = s->filename; while ((*op++ = *src++) != 0) if (src[-1] == '\\') *op++ = '\\'; op--; break; } case KDATE: strncpy(op, curtime+4, 7); strncpy(op+7, curtime+20, 4); op += 11; break; case KTIME: strncpy(op, curtime+11, 8); op += 8; break; default: error(ERROR, "cpp botch: unknown internal macro"); return; } if (tp->type==STRING) *op++ = '"'; tp->t = (uchar*)outp; tp->len = op - outp; outp = op; }
/* * Generate a line directive for cursource */ void genline(void) { static Token ta = { UNCLASS, NULL, 0, 0 }; static Tokenrow tr = { &ta, &ta, &ta+1, 1 }; uchar *p; if(nolineinfo) return; ta.t = p = (uchar*)outp; strcpy((char*)p, "#line "); p += sizeof("#line ")-1; p = (uchar*)outnum((char*)p, cursource->line); *p++ = ' '; *p++ = '"'; if (cursource->filename[0]!='/' && wd[0]) { strcpy((char*)p, wd); p += strlen(wd); *p++ = '/'; } strcpy((char*)p, cursource->filename); p += strlen((char*)p); *p++ = '"'; *p++ = '\n'; ta.len = (char*)p-outp; outp = (char*)p; tr.tp = tr.bp; puttokens(&tr); }
/* * generate a number */ char * outnum(char *p, int n) { if (n>=10) p = outnum(p, n/10); *p++ = n%10 + '0'; return p; }
/* * Generate a line directive for cursource */ void genline(void) { static Token ta = { UNCLASS }; static Tokenrow tr = { &ta, &ta, &ta+1, 1 }; uchar *p; ta.t = p = (uchar*)xoutp; strcpy((char*)p, "#line "); p += sizeof("#line ")-1; p = (uchar*)outnum((char*)p, cursource->line); *p++ = ' '; *p++ = '"'; strcpy((char*)p, cursource->filename); p += strlen((char*)p); *p++ = '"'; *p++ = '\n'; ta.len = (char*)p-xoutp; xoutp = (char*)p; tr.tp = tr.bp; puttokens(&tr); }
int cgetchar_timed(int secs) { struct dostime_t start; struct dostime_t now; start.second = 60; /* force decrement secs first time in loop */ ++secs; while(!keypressed()) { _dos_gettime(&now); if(now.second != start.second) { if(!--secs) return 0; memcpy(&start, &now, sizeof(now)); outnum(secs); } delay(100); } /* Because "keypressed()" returned true, getchar() does not block */ return cgetchar(); }
/** * 为当前输入源产生一个行控制指令信息 * Generate a line directive for cursource * TODO: 一般来说像gcc或者tcc之类的编译器产生的行控制指令是类似如下这样的: * # 3 "cpp_line_control.c" 2 * 而像lcc这样的编译器产生的行控制指令是类似如下这样的: * #line 2 "cpp_line_control.c" * 也就是说lcc产生的行控制信息中多了一个 line (而这其实是可选的单词)而且也少了flag信息,具体请参考testprog/c预处理小知识.txt一文 */ void genline(void) { static Token ta = { UNCLASS }; static Tokenrow tr = { &ta, &ta, &ta + 1, 1 }; uchar *p; ta.t = p = (uchar*) outp; strcpy((char*) p, "#line "); /* 将“#line ”复制到输出缓冲区 */ p += sizeof("#line ") - 1; p = (uchar*) outnum((char*) p, cursource->line); /* 输出当前文件的行号 */ *p++ = ' '; *p++ = '"'; strcpy((char*) p, cursource->filename); /* 输出当前文件的文件名 */ p += strlen((char*) p); *p++ = '"'; *p++ = '\n'; ta.len = (char*) p - outp; outp = (char*) p; /* 更新输出缓冲区的当前指针 */ tr.tp = tr.bp; /* 将当前token设置为token row中的第一个token的首地址,以便接下来调用puttokens函数输出token row */ puttokens(&tr); /* 输出 token row */ }
/* void esp_printf( const func_ptr f_ptr, const charptr ctrl1, ...) */ void xil_printf( const char8 *ctrl1, ...) { s32 Check; s32 long_flag; s32 dot_flag; params_t par; char8 ch; va_list argp; char8 *ctrl = (char8 *)ctrl1; va_start( argp, ctrl1); while ((ctrl != NULL) && (*ctrl != (char8)0)) { /* move format string chars to buffer until a */ /* format control is found. */ if (*ctrl != '%') { outbyte(*ctrl); ctrl += 1; continue; } /* initialize all the flags for this format. */ dot_flag = 0; long_flag = 0; par.unsigned_flag = 0; par.left_flag = 0; par.do_padding = 0; par.pad_character = ' '; par.num2=32767; par.num1=0; par.len=0; try_next: if(ctrl != NULL) { ctrl += 1; } if(ctrl != NULL) { ch = *ctrl; } else { ch = *ctrl; } if (isdigit((s32)ch) != 0) { if (dot_flag != 0) { par.num2 = getnum(&ctrl); } else { if (ch == '0') { par.pad_character = '0'; } if(ctrl != NULL) { par.num1 = getnum(&ctrl); } par.do_padding = 1; } if(ctrl != NULL) { ctrl -= 1; } goto try_next; } switch (tolower((s32)ch)) { case '%': outbyte( '%'); Check = 1; break; case '-': par.left_flag = 1; Check = 0; break; case '.': dot_flag = 1; Check = 0; break; case 'l': long_flag = 1; Check = 0; break; case 'u': par.unsigned_flag = 1; /* fall through */ case 'i': case 'd': if (long_flag != 0) { outnum1((s64)va_arg(argp, s64), 10L, &par); } else { outnum( va_arg(argp, s32), 10L, &par); } Check = 1; break; case 'p': par.unsigned_flag = 1; outnum1((s64)va_arg(argp, s64), 16L, &par); Check = 1; break; case 'x': par.unsigned_flag = 1; if (long_flag != 0) { outnum1((s64)va_arg(argp, s64), 16L, &par); } else { outnum((s32)va_arg(argp, s32), 16L, &par); } Check = 1; break; case 's': outs( va_arg( argp, char *), &par); Check = 1; break; case 'c': outbyte( va_arg( argp, s32)); Check = 1; break; case '\\': switch (*ctrl) { case 'a': outbyte( ((char8)0x07)); break; case 'h': outbyte( ((char8)0x08)); break; case 'r': outbyte( ((char8)0x0D)); break; case 'n': outbyte( ((char8)0x0D)); outbyte( ((char8)0x0A)); break; default: outbyte( *ctrl); break; } ctrl += 1; Check = 0; break; default: Check = 1; break; } if(Check == 1) { if(ctrl != NULL) { ctrl += 1; } continue; } goto try_next; } va_end( argp); }
/* ** Translate a number to phonemes. This version is for CARDINAL numbers. ** Note: this is recursive. */ void say_cardinal(long int value) { if (value < 0) { // outstring("mAYnAHs "); outnum(mayn); value = (-value); if (value < 0) /* Overflow! -32768 */ { // outstring("IHnfIHnIHtIY "); outnum(infin); return; } } if (value >= 1000000000L) /* Billions */ { say_cardinal(value/1000000000L); // outstring("bIHlIYAXn "); outnum(bihl); value = value % 1000000000; if (value == 0) return; /* Even billion */ if (value < 100) /* as in THREE BILLION AND FIVE */ // outstring("AEnd "); outnum(end); } if (value >= 1000000L) /* Millions */ { say_cardinal(value/1000000L); // outstring("mIHlIYAXn "); outnum(mil); value = value % 1000000L; if (value == 0) return; /* Even million */ if (value < 100) /* as in THREE MILLION AND FIVE */ outnum(end); // outstring("AEnd "); } /* Thousands 1000..1099 2000..99999 */ /* 1100 to 1999 is eleven-hunderd to ninteen-hunderd */ if ((value >= 1000L && value <= 1099L) || value >= 2000L) { say_cardinal(value/1000L); // outstring("THAWzAEnd "); outnum(thaw); value = value % 1000L; if (value == 0) return; /* Even thousand */ if (value < 100) /* as in THREE THOUSAND AND FIVE */ outnum(end); // outstring("AEnd "); } if (value >= 100L) { outnum(Cardinals[value/100]); // outstring("hAHndrEHd "); outnum(hahn); value = value % 100; if (value == 0) return; /* Even hundred */ } if (value >= 20) { outnum(Twenties[(value-20)/ 10]); value = value % 10; if (value == 0) return; /* Even ten */ } outnum(Cardinals[value]); return; }
bool Producer::launch_loop(int flag_mode) { std::cout << " Producer::launch_loop tooooooop" << std::endl; while (flag_continue_processing_producer) { if (! circular_buffer->is_production_possible()) { std::cout << "Producer launch_loop is_production_possible NO so sleep" << std::endl; return false; } outnum("Producer production IS POSSIBLE ", loop_counter); struct_audio_array * ptr_curr_audio_struct = circular_buffer->do_stage_production(); if (! ptr_curr_audio_struct) { std::cout << "Producer NOTICE - do_stage_production returned NULL pointer " << " sleep N retry" << std::endl; return false; } // ----------- OK now populate buffer ---------------- ptr_curr_audio_struct->aac_index = loop_counter; ptr_curr_audio_struct->ptr_struct_sample_specs = synthesize_sound->get_sample_specs(); ptr_curr_audio_struct->flag_last_buffer = NO; if (SYNTH_MODE_SIN == flag_mode) { std::cout << "Producer launch_loop OK now populate buffer SYNTH_MODE_SIN" << std::endl; pop_audio_spec(ptr_curr_audio_struct->ptr_struct_sample_specs, circular_buffer->get_max_size_circular_buffer()); synthesize_sound->populate_buffer(ptr_curr_audio_struct->ptr_to_array); } else if (SYNTH_MODE_PCM_FILE == flag_mode) { std::cout << "Producer launch_loop OK now populate buffer SYNTH_MODE_PCM_FILE" << std::endl; std::cout << "Producer::launch_loop source_buffer_size " << source_buffer_size << std::endl; // ptr_curr_audio_struct->ptr_to_array = audio_buffer; // std::cout << "PRODUCER NOTICE take out following memcpy ... " // << "its needed to satisify Render need to see new buff address on subsequent buffs" // << std::endl; // memcpy(ptr_curr_audio_struct->ptr_to_array, curr_audio_buffer, circular_buffer->get_max_size_circular_buffer()); unsigned int this_buffer_size = circular_buffer->get_max_size_circular_buffer(); // stens TODO - commented out belo IF ELSE 20131122 /* if (loop_counter == 26) // if (loop_counter == 27) // if (loop_counter == 44) { exit(8); } */ if (buffer_size_available >= this_buffer_size) { // OK we have more buffer in reserve for next iteration buffer_size_available -= this_buffer_size; std::cout << "Producer - OK we have more buffer in reserve for next iteration " << "this_buffer_size " << this_buffer_size << std::endl; } else { // this_buffer_size = buffer_size_available; // stens TODO - since input data does NOT fill desired buffer size may fill with zeros // we have reached END of source input buffer - signal // stens TODO insert logic to communicate this last buffer std::cout << "Producer - we have reached END of source input buffer " << "this_buffer_size " << this_buffer_size << std::endl; flag_continue_processing_producer = false; ptr_curr_audio_struct->flag_last_buffer = YES; } ptr_curr_audio_struct->ptr_to_array = curr_audio_buffer; ptr_curr_audio_struct->ptr_struct_sample_specs->buffer_size = this_buffer_size; ptr_curr_audio_struct->ptr_struct_sample_specs->frequency = 0; // define 0 since from file not synth ptr_curr_audio_struct->ptr_struct_sample_specs->num_channels = num_channels; // following division by 2 (i.e. XXX >> 1) works for mono - I believe stereo wants >> 2 curr_audio_buffer += (circular_buffer->get_max_size_circular_buffer() >> 1); ptr_curr_audio_struct->ptr_struct_sample_specs->sample_rate = sample_rate; } else if (SYNTH_MODE_DIY == flag_mode) {
void log_9_( int level ,int ignoreerrno ,const char *f ,unsigned long long l ,const char *s0 ,const char *s1 ,const char *s2 ,const char *s3 ,const char *s4 ,const char *s5 ,const char *s6 ,const char *s7 ,const char *s8 ) { const char *s[9]; long long i; const char *m; if (level > loglevel) return; s[0] = s0; s[1] = s1; s[2] = s2; s[3] = s3; s[4] = s4; s[5] = s5; s[6] = s6; s[7] = s7; s[8] = s8; switch (level) { case -1: m = "BUG"; break; case 0: m = "usage"; break; case 1: m = "fatal"; break; case 2: if (!ignoreerrno) m = "warning"; else m = "info"; break; case 3: m = "debug"; break; default: m = "unknown"; break; } /* name: session: level: message (error){file:line} */ /* 'name:' */ do { if (level == 0) break; /* don't print in usage level */ if (logflagsyslog) break; /* don't print in syslog mode */ outs(logtext); outs(": "); } while (0); /* 'session:' */ do { if (level == 0) break; /* don't print in usage level */ if (!logflagfnln) break; /* don't print when disabled */ outs(logstring); outs(": "); } while (0); /* 'level:' */ do { if (level == 0) break; /* don't print in usage level */ outs(m); outs(": "); } while (0); /* 'message' */ for (i = 0; i < 9 && s[i]; ++i) outs(s[i]); outs(" "); /* '(error)' */ do { if (!errno) break; /* don't print when errno = 0 */ if (ignoreerrno) break; /* don't print when disabled */ outs("("); outs(e_str(errno)); outs(")"); } while (0); /* {file:line} */ do { if (level == 0) break; /* don't print in usage level */ if (!f) break; /* don't print when no f */ if (!l) break; /* don't print when no l */ if (!logflagfnln && level != -1) break; /* don't print when disabled */ outs("{"); outs(f); outs(":"); outnum(l); outs("}"); } while (0); outs("\n"); flush(); return; }