Exemple #1
0
Type operator| ( const Type& t1, const Type& t2)
{
	SimpleType 	*st1, *st2;
	TableType	*tt1, *tt2;
	TupletType	*nt1, *nt2;

	if ( (st1 = isSimpleType(t1)) && (st2 = isSimpleType(t2)) ) {

        return makeSimpleType(	st1->nature()|st2->nature(),
					st1->variability()|st2->variability(),
					st1->computability()|st2->computability(),
					st1->vectorability()|st2->vectorability(),
					st1->boolean()|st2->boolean(),
                    reunion(st1->getInterval(), st2->getInterval())
					);

	} else if ( (tt1 = isTableType(t1)) && (tt2 = isTableType(t2)) ) {

        return makeTableType( tt1->content() | tt2->content() );

	} else if ( (nt1 = isTupletType(t1)) && (nt2 = isTupletType(t2)) ) {

		vector<Type> v;
		int n = min(nt1->arity(), nt2->arity());
		for (int i=0; i<n; i++) { v.push_back( (*nt1)[i] | (*nt2)[i]); }
		return new TupletType( v );

	} else {

	    stringstream error;
        error << "Error : trying to combine incompatible types, " << t1 << " and " << t2 << endl;
        throw faustexception(error.str());
        
	}
}
void solve() {
  FILE *fin = fopen("input.in", "r");
  FILE *fout = fopen("output.out", "w");
  FILE *cur_file;
  Array_t set1, set2;
  if (fin) {
    int i, number_of_files, queries, k;
    char **files, tmp[2000];
    char *line, *word, *operator;
    Map_t *map;
    map = initialize_map(NUMBER_OF_BUCKETS);

    /* Citeste nr de fisiere si retine intr-un vector de cuvinte
     * numele acestora */
    fgets(tmp, 20, fin);
    sscanf(tmp, "%d", &number_of_files);
    files = (char**)malloc(number_of_files * sizeof(char*));

    for (i = 0; i < number_of_files; i++) {
      fgets(tmp, 150, fin);
      /* Retine in "line" numele fisierului, fara CRLF-ul de la final */
      line = strtok(tmp, "\r\n");
      files[i] = (char*)malloc((sizeof(tmp) + 1) * sizeof(char));
      strcpy(files[i], line);
    }

    /* Parcurge cuvintele din fiecare fisier si le adauga in map */
    for (i = 0; i < number_of_files; i++) {
      cur_file = fopen(files[i], "r");
      if (cur_file) {
        while (fscanf(cur_file, "%s", tmp) != EOF) {
          strip_word(tmp);
          put_doc(map, tmp, i);
        }
        fclose(cur_file);
      }
      else {
        printf("Eroare la deschiderea fisierului %s!\n", files[i]);
      }
    }

    /* Citeste numarul de interogari*/
    fgets(tmp, 20, fin);
    sscanf(tmp, "%d", &queries);

    /* Proceseaza fiecare interogare, efectuand operatii pe
     * vectorii ce contin fisierele in care apar respectivele chei */
    for (i = 0; i < queries; i++) {
      fgets(tmp, 2000, fin);

      /* Retine in "line" interogarea, fara CRLF-ul de la final */
      line = strtok(tmp, "\r\n");
      fprintf(fout, "%s:", line);
      word = strtok(line, " \n\r");
      set1 = get_docs(map, word);
      operator = strtok(NULL, " \n\r");

      while (operator) {
        word = strtok(NULL, " \n\r");
        set2 = get_docs(map, word);
        if (strcmp(operator, "&") == 0) {
          set1 = intersection(set1, set2);
        }
        else {
          set1 = reunion(set1, set2);
        }
        operator = strtok(NULL, " \n\r");
      }

      for (k = 0; k <= set1.n; k++) {
        fprintf(fout, " %d", set1.v[k]);
      }
      fprintf(fout, " \n");
    }

    fclose(fin);
    fclose(fout);
  }

  else {
    printf("Eroare la deschiderea fisierului input.in!\n");
  }
}