예제 #1
0
SizeList* recover_size_list(char *filename, int *del_num){
    int i = 0, offset = 0, size;
    size_t nread;

    int reg_num = number_of_registers();
    SizeList *list = malloc(sizeof(SizeList) * reg_num);
    FILE *datafile = fopen(filename, "r+");

    *del_num = 0;
    if(datafile){
        while((nread = fread(&size, 1, sizeof(int), datafile)) > 0){
            char *reg = malloc(sizeof(char)*size);
            fread(reg, 1, size, datafile);
            if(reg[0] == '*'){
                list[i].byteOffset = offset;
                list[i].tamanho = size;
                i++;
                *del_num = *del_num+1;
            }
            offset += size + sizeof(int);
            free(reg);
        }
    }
    return list;
}
예제 #2
0
void delete_favorite (char *filename) {
	int delete_value, datasize, delete_index;
	int *deletion_offset;
	int i, count = 0;
	FavoriteIndex *fav_idx;
	InvertedList *fav_list;

	datasize = REGISTER_SIZE;
	deletion_offset = malloc(sizeof(int) * datasize);
	fav_idx = malloc(sizeof(FavoriteIndex) * datasize);
	fav_list = malloc(sizeof(InvertedList) * datasize);

	printf ("insert favorite count for deletion: ");
	scanf ("%d", &delete_value);

	fav_idx = recover_fav_index();
    fav_list = recover_fav_list();
    int qntRegistros = number_of_registers();
    if(qntRegistros<TAMANHO_MINIMO){
        printf("Not enough data to delete by favorite");
        return;
    }
    delete_index = search_index_favorite(fav_idx, datasize, delete_value);
    if(delete_index > -1){
        delete_index = fav_idx[delete_index].RRN;
        while(fav_list[delete_index].proximo != -1){
            deletion_offset[count] = fav_list[delete_index].byteOffSet;
            delete_index = fav_list[delete_index].proximo;
            count++;
        }
        deletion_offset[count] = fav_list[delete_index].byteOffSet;

        //imprime as opções de tweets(se tiver)
       // datafile = fopen(filename, "r+");
        for(i=0; i <= count; i++){
            printf("[tweet %d]\n", i);
            print_register_todelete(filename, deletion_offset[i]);
        }
        printf("which tweet would you like to delete?");
        scanf("%d", &delete_index);
        delete_offset(filename,deletion_offset[delete_index]);
        index_manager(filename);
        diminuiArqTamanho();
        printf("\n Registro Excluido\n");
    }
    else
        printf("no tweets found with this favorite count.\n");
}
예제 #3
0
void new_tweet(char *filename){
    FILE *datafile;
	int pos_ideal = -1, tam_ideal = 1000;
	int *del_num, size_trash = 1,i;
	SizeList *list = malloc(sizeof(SizeList) * number_of_registers());
	datafile = fopen(filename, "a+");
	Tweet new_tweet;

	char *delimitador = (char*) malloc (sizeof(char));
	strcpy(delimitador,"|");

	new_tweet.text = (char*) malloc (sizeof(char)*BUFFER);
	new_tweet.user = (char*) malloc (sizeof(char)*BUFFER);
	new_tweet.coordinates = (char*) malloc (sizeof(char)*BUFFER);
	new_tweet.language = (char*) malloc (sizeof(char)*BUFFER);

	int register_size = 4; // ja conta inicialmente com o tamanho dos delimitadores
	printf ("insert text: ");
	fgets (new_tweet.text, BUFFER, stdin);
	remove_new_line (new_tweet.text);

	printf ("insert user: "******"insert coordinates: ");
	fgets (new_tweet.coordinates, BUFFER, stdin);
	remove_new_line (new_tweet.coordinates);

	printf ("insert language: ");
	fgets (new_tweet.language, BUFFER, stdin);
	remove_new_line (new_tweet.language);

	printf ("insert favorite count: ");
	scanf ("%d", &new_tweet.favorite_count);

	printf ("insert retweet count: ");
	scanf ("%d", &new_tweet.retweet_count);

	printf ("insert view count: ");
	scanf ("%d", &new_tweet.views_count);

    register_size += strlen(new_tweet.text)+strlen(new_tweet.user)+strlen(new_tweet.coordinates)+strlen(new_tweet.language)+3*sizeof(int);
    //estrategia best fit
   /* list = recover_size_list(filename, del_num);
    for(i=0; i < *del_num; i++){
        if(list[i].tamanho == register_size){
            pos_ideal = list[i].byteOffset;
            break;
        }
        else if(list[i].tamanho >= (register_size + sizeof(char) + sizeof(int))){
            if(list[i].tamanho < tam_ideal){
                tam_ideal = list[i].tamanho;
                pos_ideal = list[i].byteOffset;
            }
        }
    }
    if(pos_ideal != -1){
        fseek(datafile, pos_ideal, SEEK_SET);
        if(i == *del_num){
            fwrite(&size_trash, sizeof(int), 1, datafile);
            fwrite("*", sizeof(char), 1, datafile);
        }
    }*/
    fwrite(&register_size,sizeof(int),1,datafile);
    fwrite(new_tweet.text,sizeof(char), strlen(new_tweet.text), datafile);
    fwrite(delimitador,sizeof(char),strlen(delimitador),datafile);
    fwrite(new_tweet.user,sizeof(char), strlen(new_tweet.user), datafile);
    fwrite(delimitador,sizeof(char),strlen(delimitador),datafile);
    fwrite(new_tweet.coordinates,sizeof(char), strlen(new_tweet.coordinates), datafile);
    fwrite(delimitador,sizeof(char),strlen(delimitador),datafile);
    fwrite(new_tweet.language,sizeof(char), strlen(new_tweet.language), datafile);
    fwrite(delimitador,sizeof(char),strlen(delimitador),datafile);
    fwrite(&new_tweet.favorite_count,sizeof(int), 1, datafile);
    fwrite(&new_tweet.retweet_count,sizeof(int), 1, datafile);
    fwrite(&new_tweet.views_count,sizeof(int), 1, datafile);

    printf ("\nNEW TWEET POSTED!\n");

    fclose(datafile);
}
예제 #4
0
void calc_depth(inst_t *inst_list, int min_index, int max_index) {

    int MAX_REGS;
    int *latest_use_time, *completion_time;
    int t, j;
    int i;
    int max_depth = 0;

    MAX_REGS = number_of_registers();

    latest_use_time = (int *) malloc(MAX_REGS * sizeof (int));
    completion_time = (int *) malloc(MAX_REGS * sizeof (int));

    for (i = 0; i < MAX_REGS; i++) {
        latest_use_time[i] = 0;
        completion_time[i] = 0;
    }

    while (min_index <= max_index) {
        if (inst_list[min_index]->ops[0].t == op_reg && inst_list[min_index]->op != OP_STR && inst_list[min_index]->op != OP_BR) {
            t = max(1, latest_use_time[inst_list[min_index]->ops[0].reg] - latency(inst_list[min_index]) + 1);
        }
        if (inst_list[min_index]->op == OP_IN) { // IN writes to R0
            t = max(1, latest_use_time[0] - latency(inst_list[min_index]) + 1);
        }
        for (j = 1; j <= 2; j++) {
            if (inst_list[min_index]->ops[j].t == op_reg) {
                t = max(t, completion_time[inst_list[min_index]->ops[j].reg]);
            }
        }
        if (inst_list[min_index]->op == OP_STR || inst_list[min_index]->op == OP_BR) { // STR reads from first register
            t = max(t, completion_time[inst_list[min_index]->ops[0].reg]);
        }
        if (inst_list[min_index]->op == OP_OUT) { // OUT reads from R0
            t = max(t, completion_time[0]);
        }
        if (inst_list[min_index]->ops[0].t == op_reg && inst_list[min_index]->op != OP_STR && inst_list[min_index]->op != OP_BR) {
            t = max(t, completion_time[inst_list[min_index]->ops[0].reg] - latency(inst_list[min_index]));
        }
        if (inst_list[min_index]->op == OP_IN) { // IN writes to R0
            t = max(t, completion_time[0] - latency(inst_list[min_index]));
        }
        if (inst_list[min_index]->ops[0].t == op_reg && inst_list[min_index]->op != OP_STR && inst_list[min_index]->op != OP_BR) {
            completion_time[inst_list[min_index]->ops[0].reg] = t + latency(inst_list[min_index]);
        }
        if (inst_list[min_index]->op == OP_IN) { // IN writes to R0
            completion_time[0] = t + latency(inst_list[min_index]);
        }
        for (j = 1; j <= 2; j++) {
            if (inst_list[min_index]->ops[j].t == op_reg) {
                latest_use_time[inst_list[min_index]->ops[j].reg] = max(latest_use_time[inst_list[min_index]->ops[j].reg], t);
            }
        }
        if (inst_list[min_index]->op == OP_STR || inst_list[min_index]->op == OP_BR) { // STR reads from first register
            latest_use_time[inst_list[min_index]->ops[0].reg] = max(latest_use_time[inst_list[min_index]->ops[0].reg], t);
        }
        if (inst_list[min_index]->op == OP_OUT) { // OUT reads from R0
            latest_use_time[0] = max(latest_use_time[0], t);
        }
        inst_list[min_index]->depth = t;
        max_depth = max(max_depth, t);

        min_index++;
    }

    if (inst_list[max_index]->op == OP_BRA) {
        inst_list[max_index]->depth = max_depth;
    }
    
    free(latest_use_time);
    free(completion_time);

    return;
}