#include #include #include #include #include int now_msec(void) { struct timeval tm; gettimeofday(&tm, NULL); return tm.tv_sec * 1000 + tm.tv_usec / 1000; } void wr_delta(int v) { char buf[8], *bp; if(v < 0 || v > 100){ fprintf(stderr, "v=%d", v); exit(1); } if(v == 0){ putchar(0); fflush(stdout); return; } bp = buf; while(v){ *bp++ = v & 0x7f; v >>= 7; } while(--bp != buf) putchar(0x80 | *bp); putchar(*bp); fflush(stdout); } int readable_chk(void) { int fd = 0; fd_set rfs; struct timeval tm; FD_ZERO(&rfs); FD_SET(fd, &rfs); tm.tv_sec = 0; tm.tv_usec = 0; return select(fd+1, &rfs, NULL, NULL, &tm) > 0; } int my_getchar(void) { char c; int n = read(0, &c, 1); if(n <= 0) return EOF; return c; } int rd(char *data, int n) { int i = 0, c; while(i < n && (c = my_getchar()) != EOF){ if(c == '\\') if(my_getchar() != '\\') break; data[i++] = c; } if(i == 0 && c == EOF) return -1; return i; } #define TEMPO 120 #define MSEC4 int st_msec, last_msec, sum, div_n = 96; #define BUFN 4096 char buf[ BUFN ]; void wr_delta_now(void) { int t, msec; last_msec = now_msec(); msec = last_msec - st_msec; #if 1 t = (int)(div_n * msec * 0.001 * (TEMPO / 60.0)); #else t = div_n * msec * TEMPO / (60*1000); #endif wr_delta(t - sum); sum = t; } void wr_clock_now(void) { char ev; wr_delta_now(); ev = 0xf8; fwrite(&ev, 1, 1, stdout); fflush(stdout); } int main(int ac, char **av) { int n, i; while((n = rd(buf, BUFN)) <= 0); fwrite(buf, 1, n, stdout); fflush(stdout); i = 4+4+2+2; if(n >= i+2) div_n = (buf[i] << 8) | buf[i+1]; sum = -30; st_msec = now_msec(); wr_clock_now(); while(1){ if(readable_chk()){ if((n = rd(buf, BUFN)) < 0) break; wr_delta_now(); fwrite(buf, 1, n, stdout); fflush(stdout); } if(now_msec() - last_msec >= 60*1000 / (TEMPO * 24)) wr_clock_now(); usleep(1000); } return 0; } /* EOF */