/* returns a list of ranges contained in the charset */ ScmObj Scm_CharSetRanges(ScmCharSet *cs) { ScmObj h = SCM_NIL, t = SCM_NIL; int ind, begin = 0, prev = FALSE; for (ind = 0; ind < SCM_CHAR_SET_SMALL_CHARS; ind++) { int bit = MASK_ISSET(cs, ind); if (!prev && bit) begin = ind; if (prev && !bit) { ScmObj cell = Scm_Cons(SCM_MAKE_INT(begin), SCM_MAKE_INT(ind-1)); SCM_APPEND1(h, t, cell); } prev = bit; } if (prev) { ScmObj cell = Scm_Cons(SCM_MAKE_INT(begin), SCM_MAKE_INT(ind-1)); SCM_APPEND1(h, t, cell); } ScmTreeIter iter; ScmDictEntry *e; Scm_TreeIterInit(&iter, &cs->large, NULL); while ((e = Scm_TreeIterNext(&iter)) != NULL) { ScmObj cell = Scm_Cons(SCM_MAKE_INT(e->key), SCM_MAKE_INT(e->value)); SCM_APPEND1(h, t, cell); } return h; }
/* ---------------------------------------------------------------------- */ static void process_buffer(float *buf, unsigned int len) { int i; for (i = 0; i < NUMDEMOD; i++) if (MASK_ISSET(i) && dem[i]->demod) dem[i]->demod(dem_st+i, buf, len); }
void process_buffer(float *float_buf, short *short_buf, unsigned int len) { for (int i = 0; (unsigned int) i < NUMDEMOD; i++) if (MASK_ISSET(i) && dem[i]->demod) { buffer_t buffer = {short_buf, float_buf}; dem[i]->demod(dem_st+i, buffer, len); } }
int Scm_CharSetContains(ScmCharSet *cs, ScmChar c) { if (c < 0) return FALSE; if (c < SCM_CHAR_SET_SMALL_CHARS) return MASK_ISSET(cs, c); else { ScmDictEntry *e, *l, *h; e = Scm_TreeCoreClosestEntries(&cs->large, (int)c, &l, &h); if (e || (l && l->value >= c)) return TRUE; else return FALSE; } }
/* Make CS case-insensitive. */ ScmObj Scm_CharSetCaseFold(ScmCharSet *cs) { for (int ch='a'; ch<='z'; ch++) { if (MASK_ISSET(cs, ch) || MASK_ISSET(cs, (ch-('a'-'A')))) { MASK_SET(cs, ch); MASK_SET(cs, (ch-('a'-'A'))); } } ScmTreeIter iter; ScmDictEntry *e; Scm_TreeIterInit(&iter, &cs->large, NULL); while ((e = Scm_TreeIterNext(&iter)) != NULL) { for (ScmChar c = e->key; c <= e->value; c++) { ScmChar uch = Scm_CharUpcase(c); ScmChar lch = Scm_CharDowncase(c); Scm_CharSetAddRange(cs, uch, uch); Scm_CharSetAddRange(cs, lch, lch); } } return SCM_OBJ(cs); }
static void charset_print(ScmObj obj, ScmPort *out, ScmWriteContext *ctx) { int prev, code, first = TRUE; ScmCharSet *cs = SCM_CHAR_SET(obj); Scm_Printf(out, "#["); for (prev = -1, code = 0; code < SCM_CHAR_SET_SMALL_CHARS; code++) { if (MASK_ISSET(cs, code) && prev < 0) { charset_print_ch(out, code, first); prev = code; first = FALSE; } else if (!MASK_ISSET(cs, code) && prev >= 0) { if (code - prev > 1) { if (code - prev > 2) Scm_Printf(out, "-"); charset_print_ch(out, code-1, FALSE); } prev = -1; } } if (prev >= 0) { if (code - prev > 1) { if (prev < 0x7e) Scm_Printf(out, "-"); charset_print_ch(out, code-1, FALSE); } } ScmTreeIter iter; ScmDictEntry *e; Scm_TreeIterInit(&iter, &cs->large, NULL); while ((e = Scm_TreeIterNext(&iter)) != NULL) { charset_print_ch(out, (int)e->key, FALSE); if (e->value != e->key) { if (e->value - e->key > 2) Scm_Printf(out, "-"); charset_print_ch(out, (int)e->value, FALSE); } } Scm_Printf(out, "]"); }
int main(int argc, char *argv[]) { int c; int errflg = 0; int quietflg = 0; int i; char **itype; int mask_first = 1; int sample_rate = -1; unsigned int overlap = 0; char *input_type = "hw"; while ((c = getopt(argc, argv, "t:a:s:v:b:f:g:d:o:cqhAmrxynipeu")) != EOF) { switch (c) { case 'h': case '?': errflg++; break; case 'q': quietflg++; break; case 'A': aprs_mode = 1; memset(dem_mask, 0, sizeof(dem_mask)); mask_first = 0; for (i = 0; (unsigned int) i < NUMDEMOD; i++) if (!strcasecmp("AFSK1200", dem[i]->name)) { MASK_SET(i); break; } break; case 'v': verbose_level = strtoul(optarg, 0, 0); break; case 'b': pocsag_error_correction = strtoul(optarg, 0, 0); if(pocsag_error_correction > 2 || pocsag_error_correction < 0) { fprintf(stderr, "Invalid error correction value!\n"); pocsag_error_correction = 2; } break; case'p': pocsag_show_partial_decodes = 1; break; case'u': pocsag_heuristic_pruning = 1; break; case'e': pocsag_prune_empty = 1; break; case 'm': mute_sox = 1; break; case 'r': repeatable_sox = 1; break; case 't': for (itype = (char **)allowed_types; *itype; itype++) if (!strcmp(*itype, optarg)) { input_type = *itype; goto intypefound; } fprintf(stderr, "invalid input type \"%s\"\n" "allowed types: ", optarg); for (itype = (char **)allowed_types; *itype; itype++) fprintf(stderr, "%s ", *itype); fprintf(stderr, "\n"); errflg++; intypefound: break; case 'a': if (mask_first) memset(dem_mask, 0, sizeof(dem_mask)); mask_first = 0; for (i = 0; (unsigned int) i < NUMDEMOD; i++) if (!strcasecmp(optarg, dem[i]->name)) { MASK_SET(i); break; } if ((unsigned int) i >= NUMDEMOD) { fprintf(stderr, "invalid mode \"%s\"\n", optarg); errflg++; } break; case 's': if (mask_first) memset(dem_mask, 0xff, sizeof(dem_mask)); mask_first = 0; for (i = 0; (unsigned int) i < NUMDEMOD; i++) if (!strcasecmp(optarg, dem[i]->name)) { MASK_RESET(i); break; } if ((unsigned int) i >= NUMDEMOD) { fprintf(stderr, "invalid mode \"%s\"\n", optarg); errflg++; } break; case 'c': if (mask_first) memset(dem_mask, 0xff, sizeof(dem_mask)); mask_first = 0; for (i = 0; (unsigned int) i < NUMDEMOD; i++) MASK_RESET(i); break; case 'f': if(!pocsag_mode) { if(!strncmp("numeric",optarg, sizeof("numeric"))) pocsag_mode = POCSAG_MODE_NUMERIC; else if(!strncmp("alpha",optarg, sizeof("alpha"))) pocsag_mode = POCSAG_MODE_ALPHA; else if(!strncmp("skyper",optarg, sizeof("skyper"))) pocsag_mode = POCSAG_MODE_SKYPER; }else fprintf(stderr, "a POCSAG mode has already been selected!\n"); break; case 'n': dont_flush = true; break; case 'i': pocsag_invert_input = true; break; case 'd': { int i = 0; sscanf(optarg, "%d", &i); if(i) cw_dit_length = abs(i); break; } case 'g': { int i = 0; sscanf(optarg, "%d", &i); if(i) cw_gap_length = abs(i); break; } case 'o': { int i = 0; sscanf(optarg, "%d", &i); if(i) cw_threshold = abs(i); break; } case 'x': cw_disable_auto_threshold = true; break; case 'y': cw_disable_auto_timing = true; break; } } if ( !quietflg ) { // pay heed to the quietflg fprintf(stderr, "multimon-ng (C) 1996/1997 by Tom Sailer HB9JNX/AE4WA\n" " (C) 2012-2014 by Elias Oenal\n" "available demodulators:"); for (i = 0; (unsigned int) i < NUMDEMOD; i++) { fprintf(stderr, " %s", dem[i]->name); } fprintf(stderr, "\n"); } if (errflg) { (void)fprintf(stderr, usage_str, argv[0]); exit(2); } if (mask_first) memset(dem_mask, 0xff, sizeof(dem_mask)); if (!quietflg) fprintf(stdout, "Enabled demodulators:"); for (i = 0; (unsigned int) i < NUMDEMOD; i++) if (MASK_ISSET(i)) { if (!quietflg) fprintf(stdout, " %s", dem[i]->name); //Print demod name if(dem[i]->float_samples) integer_only = false; //Enable float samples on demand memset(dem_st+i, 0, sizeof(dem_st[i])); dem_st[i].dem_par = dem[i]; if (dem[i]->init) dem[i]->init(dem_st+i); if (sample_rate == -1) sample_rate = dem[i]->samplerate; else if ( (unsigned int) sample_rate != dem[i]->samplerate) { if (!quietflg) fprintf(stdout, "\n"); fprintf(stderr, "Error: Current sampling rate %d, " " demodulator \"%s\" requires %d\n", sample_rate, dem[i]->name, dem[i]->samplerate); exit(3); } if (dem[i]->overlap > overlap) overlap = dem[i]->overlap; } if (!quietflg) fprintf(stdout, "\n"); if (optind < argc && !strcmp(argv[optind], "-")) { input_type = "raw"; } if (!strcmp(input_type, "hw")) { if ((argc - optind) >= 1) input_sound(sample_rate, overlap, argv[optind]); else input_sound(sample_rate, overlap, NULL); quit(); exit(0); } if ((argc - optind) < 1) { (void)fprintf(stderr, "no source files specified\n"); exit(4); } for (i = optind; i < argc; i++) input_file(sample_rate, overlap, argv[i], input_type); quit(); exit(0); }
static void input_file(unsigned int sample_rate, unsigned int overlap, const char *fname, const char *type) { struct stat statbuf; int pipedes[2]; int pid = 0, soxstat; int fd; int i; short buffer[8192]; float fbuf[16384]; unsigned int fbuf_cnt = 0; short *sp; /* * if the input type is not raw, sox is started to convert the * samples to the requested format */ if (!strcmp(fname, "-")) { // read from stdin and force raw input fd = 0; type = "raw"; } else if (!type || !strcmp(type, "raw")) { #ifdef WINDOWS if ((fd = open(fname, O_RDONLY | O_BINARY)) < 0) { #else if ((fd = open(fname, O_RDONLY)) < 0) { #endif perror("open"); exit(10); } } #ifndef ONLY_RAW else { if (stat(fname, &statbuf)) { perror("stat"); exit(10); } if (pipe(pipedes)) { perror("pipe"); exit(10); } if (!(pid = fork())) { char srate[8]; /* * child starts here... first set up filedescriptors, * then start sox... */ sprintf(srate, "%d", sample_rate); close(pipedes[0]); /* close reading pipe end */ close(1); /* close standard output */ if (dup2(pipedes[1], 1) < 0) perror("dup2"); close(pipedes[1]); /* close writing pipe end */ execlp("sox", "sox", repeatable_sox?"-R":"-V2", mute_sox?"-V1":"-V2", "-t", type, fname, "-t", "raw", "-esigned-integer", "-b16", "-r", srate, "-", "remix", "1", NULL); perror("execlp"); exit(10); } if (pid < 0) { perror("fork"); exit(10); } close(pipedes[1]); /* close writing pipe end */ fd = pipedes[0]; } #endif /* * demodulate */ for (;;) { i = read(fd, sp = buffer, sizeof(buffer)); if (i < 0 && errno != EAGAIN) { perror("read"); exit(4); } if (!i) break; if (i > 0) { if(integer_only) { fbuf_cnt = i/sizeof(buffer[0]); } else { for (; (unsigned int) i >= sizeof(buffer[0]); i -= sizeof(buffer[0]), sp++) fbuf[fbuf_cnt++] = (*sp) * (1.0f/32768.0f); if (i) fprintf(stderr, "warning: noninteger number of samples read\n"); } if (fbuf_cnt > overlap) { process_buffer(fbuf, buffer, fbuf_cnt-overlap); memmove(fbuf, fbuf+fbuf_cnt-overlap, overlap*sizeof(fbuf[0])); fbuf_cnt = overlap; } } } close(fd); #ifndef ONLY_RAW waitpid(pid, &soxstat, 0); #endif } void quit(void) { int i = 0; for (i = 0; (unsigned int) i < NUMDEMOD; i++) { if(MASK_ISSET(i)) if (dem[i]->deinit) dem[i]->deinit(dem_st+i); } }
int main(int argc, char *argv[]) { int c; int errflg = 0; int i; char **itype; int mask_first = 1; int sample_rate = -1; unsigned int overlap = 0; char *input_type = "hw"; fprintf(stdout, "multimod (C) 1996/1997 by Tom Sailer HB9JNX/AE4WA\n" "available demodulators:"); for (i = 0; i < NUMDEMOD; i++) fprintf(stdout, " %s", dem[i]->name); fprintf(stdout, "\n"); while ((c = getopt(argc, argv, "t:a:s:v:")) != EOF) { switch (c) { case '?': errflg++; break; case 'v': multimon_debug_level = strtoul(optarg, 0, 0); break; case 't': for (itype = (char **)allowed_types; *itype; itype++) if (!strcmp(*itype, optarg)) { input_type = *itype; goto intypefound; } fprintf(stderr, "invalid input type \"%s\"\n" "allowed types: ", optarg); for (itype = (char **)allowed_types; *itype; itype++) fprintf(stderr, "%s ", *itype); fprintf(stderr, "\n"); errflg++; intypefound: break; case 'a': if (mask_first) memset(dem_mask, 0, sizeof(dem_mask)); mask_first = 0; for (i = 0; i < NUMDEMOD; i++) if (!strcasecmp(optarg, dem[i]->name)) { MASK_SET(i); break; } if (i >= NUMDEMOD) { fprintf(stderr, "invalid mode \"%s\"\n", optarg); errflg++; } break; case 's': if (mask_first) memset(dem_mask, 0xff, sizeof(dem_mask)); mask_first = 0; for (i = 0; i < NUMDEMOD; i++) if (!strcasecmp(optarg, dem[i]->name)) { MASK_RESET(i); break; } if (i >= NUMDEMOD) { fprintf(stderr, "invalid mode \"%s\"\n", optarg); errflg++; } break; } } if (errflg) { (void)fprintf(stderr, usage_str); exit(2); } if (mask_first) memset(dem_mask, 0xff, sizeof(dem_mask)); fprintf(stdout, "Enabled demodulators:"); for (i = 0; i < NUMDEMOD; i++) if (MASK_ISSET(i)) { fprintf(stdout, " %s", dem[i]->name); memset(dem_st+i, 0, sizeof(dem_st[i])); dem_st[i].dem_par = dem[i]; if (dem[i]->init) dem[i]->init(dem_st+i, print_data, NULL); if (sample_rate == -1) sample_rate = dem[i]->samplerate; else if (sample_rate != dem[i]->samplerate) { fprintf(stdout, "\n"); fprintf(stderr, "Error: Current sampling rate %d, " " demodulator \"%s\" requires %d\n", sample_rate, dem[i]->name, dem[i]->samplerate); exit(3); } if (dem[i]->overlap > overlap) overlap = dem[i]->overlap; } fprintf(stdout, "\n"); if (!strcmp(input_type, "hw")) { if ((argc - optind) >= 1) input_sound(sample_rate, overlap, argv[optind]); else input_sound(sample_rate, overlap, NULL); exit(0); } if ((argc - optind) < 1) { (void)fprintf(stderr, "no source files specified\n"); exit(4); } for (i = optind; i < argc; i++) input_file(sample_rate, overlap, argv[i], input_type); exit(0); }
int main(int argc, char *argv[]) { int c; int errflg = 0; int quietflg = 0; int i; char **itype; int mask_first = 1; int sample_rate = -1; unsigned int overlap = 0; char *input_type = "hw"; while ((c = getopt(argc, argv, "t:v:qhmrn")) != EOF) { switch (c) { case 'h': case '?': errflg++; break; case 'q': quietflg++; break; case 'v': verbose_level = strtoul(optarg, 0, 0); break; case 'm': mute_sox = 1; break; case 'r': repeatable_sox = 1; break; case 't': for (itype = (char **)allowed_types; *itype; itype++) if (!strcmp(*itype, optarg)) { input_type = *itype; goto intypefound; } fprintf(stderr, "invalid input type \"%s\"\n" "allowed types: ", optarg); for (itype = (char **)allowed_types; *itype; itype++) fprintf(stderr, "%s ", *itype); fprintf(stderr, "\n"); errflg++; intypefound: break; case 'n': dont_flush = true; break; } } if ( !quietflg ) { // pay heed to the quietflg fprintf(stderr, "easmon-ng (C) 1996/1997 by Tom Sailer HB9JNX/AE4WA\n" " (C) 2012-2014 by Elias Oenal\n" " (C) 2014 by Steven Salerno K5SQL\n"); } if (errflg) { (void)fprintf(stderr, usage_str, argv[0]); exit(2); } if (mask_first) memset(dem_mask, 0xff, sizeof(dem_mask)); for (i = 0; (unsigned int) i < NUMDEMOD; i++) if (MASK_ISSET(i)) { if(dem[i]->float_samples) integer_only = false; //Enable float samples on demand memset(dem_st+i, 0, sizeof(dem_st[i])); dem_st[i].dem_par = dem[i]; if (dem[i]->init) dem[i]->init(dem_st+i); if (sample_rate == -1) sample_rate = dem[i]->samplerate; else if ( (unsigned int) sample_rate != dem[i]->samplerate) { if (!quietflg) fprintf(stdout, "\n"); fprintf(stderr, "Error: Current sampling rate %d, " " demodulator \"%s\" requires %d\n", sample_rate, dem[i]->name, dem[i]->samplerate); exit(3); } if (dem[i]->overlap > overlap) overlap = dem[i]->overlap; } if (!quietflg) fprintf(stdout, "\n"); if (optind < argc && !strcmp(argv[optind], "-")) { input_type = "raw"; } if (!strcmp(input_type, "hw")) { if ((argc - optind) >= 1) input_sound(sample_rate, overlap, argv[optind]); else input_sound(sample_rate, overlap, NULL); quit(); exit(0); } if ((argc - optind) < 1) { (void)fprintf(stderr, "no source files specified\n"); exit(4); } for (i = optind; i < argc; i++) input_file(sample_rate, overlap, argv[i], input_type); quit(); exit(0); }
int main(int argc, char *argv[]) { int c; int errflg = 0; int quietflg = 0; int i; char **itype; int mask_first = 1; int sample_rate = -1; unsigned int overlap = 0; char *input_type = "hw"; fprintf(stderr, "multimonNG (C) 1996/1997 by Tom Sailer HB9JNX/AE4WA\n" " (C) 2012 by Elias Oenal\n" "available demodulators:"); for (i = 0; i < NUMDEMOD; i++) fprintf(stderr, " %s", dem[i]->name); fprintf(stderr, "\n"); while ((c = getopt(argc, argv, "t:a:s:v:f:cqh")) != EOF) { switch (c) { case 'h': case '?': errflg++; break; case 'q': quietflg++; break; case 'v': verbose_level = strtoul(optarg, 0, 0); break; case 't': for (itype = (char **)allowed_types; *itype; itype++) if (!strcmp(*itype, optarg)) { input_type = *itype; goto intypefound; } fprintf(stderr, "invalid input type \"%s\"\n" "allowed types: ", optarg); for (itype = (char **)allowed_types; *itype; itype++) fprintf(stderr, "%s ", *itype); fprintf(stderr, "\n"); errflg++; intypefound: break; case 'a': if (mask_first) memset(dem_mask, 0, sizeof(dem_mask)); mask_first = 0; for (i = 0; i < NUMDEMOD; i++) if (!strcasecmp(optarg, dem[i]->name)) { MASK_SET(i); break; } if (i >= NUMDEMOD) { fprintf(stderr, "invalid mode \"%s\"\n", optarg); errflg++; } break; case 's': if (mask_first) memset(dem_mask, 0xff, sizeof(dem_mask)); mask_first = 0; for (i = 0; i < NUMDEMOD; i++) if (!strcasecmp(optarg, dem[i]->name)) { MASK_RESET(i); break; } if (i >= NUMDEMOD) { fprintf(stderr, "invalid mode \"%s\"\n", optarg); errflg++; } break; case 'c': if (mask_first) memset(dem_mask, 0xff, sizeof(dem_mask)); mask_first = 0; for (i = 0; i < NUMDEMOD; i++) MASK_RESET(i); break; case 'f': if(!pocsag_mode) { if(!strncmp("numeric",optarg, sizeof("numeric"))) pocsag_mode = POCSAG_MODE_NUMERIC; else if(!strncmp("alpha",optarg, sizeof("alpha"))) pocsag_mode = POCSAG_MODE_ALPHA; else if(!strncmp("skyper",optarg, sizeof("skyper"))) pocsag_mode = POCSAG_MODE_SKYPER; }else fprintf(stderr, "a POCSAG mode has already been selected!\n"); break; } } if (errflg) { (void)fprintf(stderr, usage_str, argv[0]); exit(2); } if (mask_first) memset(dem_mask, 0xff, sizeof(dem_mask)); if (!quietflg) fprintf(stdout, "Enabled demodulators:"); for (i = 0; i < NUMDEMOD; i++) if (MASK_ISSET(i)) { if (!quietflg) fprintf(stdout, " %s", dem[i]->name); memset(dem_st+i, 0, sizeof(dem_st[i])); dem_st[i].dem_par = dem[i]; if (dem[i]->init) dem[i]->init(dem_st+i); if (sample_rate == -1) sample_rate = dem[i]->samplerate; else if (sample_rate != dem[i]->samplerate) { if (!quietflg) fprintf(stdout, "\n"); fprintf(stderr, "Error: Current sampling rate %d, " " demodulator \"%s\" requires %d\n", sample_rate, dem[i]->name, dem[i]->samplerate); exit(3); } if (dem[i]->overlap > overlap) overlap = dem[i]->overlap; } if (!quietflg) fprintf(stdout, "\n"); if (optind < argc && !strcmp(argv[optind], "-")) { input_type = "raw"; } if (!strcmp(input_type, "hw")) { if ((argc - optind) >= 1) input_sound(sample_rate, overlap, argv[optind]); else input_sound(sample_rate, overlap, NULL); quit(); exit(0); } if ((argc - optind) < 1) { (void)fprintf(stderr, "no source files specified\n"); exit(4); } for (i = optind; i < argc; i++) input_file(sample_rate, overlap, argv[i], input_type); quit(); exit(0); }