Example #1
0
//FIXME: n_max_chars is not handled the same way as in GNU findutils.
//FIXME: quoting is not implemented.
static char* FAST_FUNC process_stdin_with_replace(int n_max_chars, int n_max_arg UNUSED_PARAM, char *buf)
{
	int i;
	char *end, *p;

	/* Free strings from last invocation, if any */
	for (i = 0; G.args && G.args[i]; i++)
		if (G.args[i] != G.argv[i])
			free(G.args[i]);

	end = buf + n_max_chars;
	p = buf;

	while (1) {
		int c = getchar();
		if (c == EOF || c == G.eol_ch) {
			if (p == buf)
				goto ret; /* empty line */
			c = '\0';
		}
		*p++ = c;
		if (c == '\0') {   /* EOL or EOF detected */
			i = 0;
			while (G.argv[i]) {
				char *arg = G.argv[i];
				int count = count_strstr(arg, G.repl_str);
				if (count != 0)
					arg = xmalloc_substitute_string(arg, count, G.repl_str, buf);
				store_param(arg);
				dbg_msg("args[]:'%s'", arg);
				i++;
			}
			p = buf;
			goto ret;
		}
		if (p == end) {
			goto ret;
		}
	}
 ret:
	*p = '\0';
	/* store_param(NULL) - caller will do it */
	dbg_msg("return:'%s'", buf);
	return buf;
}
Example #2
0
/*
Build GF for strstr(S, pattern) = position
 */
void count_strstr(CONFIGURE *conf, MLINK lp, char* pattern, int position, bounds* results){
   if (position < 0){
      // printf("%d %s\n", position, pattern);
      count_contains(conf, lp, pattern, results);      
      return;
   }
   int n = strlen(pattern), i, j;
   int ctable[n];
   compute_correlation_table(pattern, ctable, n);
   
   bounds F0;
   char* E;
   count_not_contains(conf, lp, pattern, &F0);
   get_coef(conf, lp, F0.upperBound, position, &E);
   
   for (i = 1; i < n; i++){
      if (i > position) break;
      if (ctable[i] == 1){
            bounds fi;
            char* tmp;
            count_strstr(conf, lp, pattern, position-i, &fi);
            get_coef(conf, lp, fi.upperBound, n+position-i, &tmp);
            char* tmp2 = malloc(strlen(tmp) + strlen(E) + 5);
            sprintf(tmp2, "%s - %s", E, tmp);
            send_to_mathematica(lp, tmp2, &E);
            
            free(tmp);
            free(tmp2);
         }
   }
   char* query =  malloc(strlen(E) + 30);
   sprintf(query, "(%s)X^%d*X^%d/(1-%dX)", E, position, n, conf->alphabet_size);
   char* sresult;
   send_to_mathematica(lp, query, &sresult);
   
   if (DEBUG)
      printf("Result = %s\n", sresult);
   copy_bounds_concrete(sresult, sresult, results);

   free(query);
   free(sresult);
   free(E);
}