コード例 #1
0
ファイル: dbverify.c プロジェクト: MarcNo/lifelines
/*============================================
 * cgn_callback -- callback for name traversal
 *  for checking for ghost names
 * Created: 2001/01/01, Perry Rapp
 *==========================================*/
static BOOLEAN
cgn_callback (TRAV_NAMES_FUNC_ARGS(key, name, newset, param))
{
    /* a name record which points at indi=key */
    RECORD indi0 = NULL;
    NODE indi = NULL;
    param=param; /* unused */

    /* bail out immediately if not INDI */
    if (key[0] != 'I') {
        report_error(ERR_NONINDINAME
                     , _("Non-indi name, key=%s, name=%s")
                     , key, name);
        return 1; /* continue traversal */
    }

    indi0 = qkey_to_irecord(key);
    indi = nztop(indi0);

    if (newset) {
        finish_and_delete_nameset();
        soundexseq = create_indiseq_sval();
    }

    append_indiseq_sval(soundexseq, strsave(key), (STRING)name, strsave(name)
                        , TRUE, TRUE); /* sure, alloc */

    if (!indi) {
        report_error(ERR_ORPHANNAME, _("Orphaned name: %s"), name);
        if (todo.fix_ghosts)
            enqueue_list(tofix, (VPTR)alloc_namerefn(name, key, ERR_ORPHANNAME));
    } else {
        NODE node;
        BOOLEAN found=FALSE;
        NODE nam, refn, sex, body, famc, fams;
        split_indi_old(indi, &nam, &refn, &sex, &body, &famc, &fams);
        for (node = nam; node; node = nsibling(node)) {
            if (!strcmp(nval(node), name))
                found=TRUE;
        }
        join_indi(indi, nam, refn, sex, body, famc, fams);
        if (!found) {
            report_error(ERR_GHOSTNAME, _("Ghost name: %s -> %s"), name, key);
            if (todo.fix_ghosts)
                enqueue_list(tofix, (VPTR)alloc_namerefn(name, key, ERR_GHOSTNAME));
        }
    }

    if (noisy)
        report_progress("Name: %s", name);

    return 1; /* continue traversal */
}
コード例 #2
0
ファイル: pedigree.c プロジェクト: MarcNo/lifelines
/*=================================================
 * append_to_text_list - add onto fixed width string list
 *  newline: flag to not append to last element of list
 *  we build each line in current, and add it to list as done
 *  ptr points to the undone part of text
 *  curptr points to the end (insertion point) of current
 * NB: We also build list from last to first, so client can use
 *  FORLIST traversal (which is backwards)
 *  TO DO: Break at whitespace
 *=================================================*/
static void
append_to_text_list (LIST list, STRING text, INT width, BOOLEAN newline)
{
	STRING ptr = text;
	STRING temp, current, curptr;
	INT len, curlen;
	if (!text || !text[0])
		return;
	/* pull off last line into temp, to append to */
	if (newline) {
		temp = NULL;
	} else {
		temp = pop_list(list);
		if (temp && (INT)strlen(temp) >= width) {
			enqueue_list(list, temp);
			temp = NULL;
		}
	}
	current=stdalloc((width+1)*sizeof(char));
	current[0] = 0;
	curptr = current;
	curlen = width;
	if (temp) {
		llstrcatn(&curptr, temp, &curlen);
	}
	while (1) {
		len = strlen(ptr);
		if (!len) {
			/* done */
			if (current[0]) {
				enqueue_list(list, strsave(current));
			}
			stdfree(current);
			return;
		}
		if (len > curlen)
			len = curlen;
		temp = curptr;
		llstrcatn(&curptr, ptr, &curlen);
		ptr += (curptr - temp);
		if (!curlen) {
			/* filled up an item */
			enqueue_list(list, strsave(current));
			current[0] = 0;
			curptr = current;
			curlen = width;
		}
	}
}
コード例 #3
0
ファイル: battle.c プロジェクト: yunhaom94/Battle-Server-C
//matching making, dequeue first two elements of playerlist
int matchmaking(struct queue_list *playerlist, struct queue_list *battlelist)
{
	struct battle *b;
	struct node *p1 = playerlist->front;
	struct player *c1 = p1->content;
	struct node *temp = playerlist->front->next;
	struct player *c2 = temp->content;

	
	if (!p1 || !temp)
	{
		printf("Not enough player!\n");
		return -1;
	}

	while ((c1->prev_id == c2->prev_id) && temp)
	{

		temp = temp->next;
		c2 = temp->content;
	}
    
    if (!temp)
	{
		printf("Cannot find match\n");
		return -1;
	}

	b = createcombat(c1, c2);
	enqueue_list(battlelist, b);
	dequeue_list(playerlist, p1);
	remove_ele(playerlist, temp)
	return 1;

}
コード例 #4
0
ファイル: battle.c プロジェクト: yunhaom94/Battle-Server-C
//deal with client linked list
void addclient(int clientfd,struct in_addr addr, struct queue_list *clientlist)
{
    struct client *c = malloc(sizeof(struct client));
    c->fd = clientfd;
    c->ipaddr = addr;
    enqueue_list(clientlist, c);
}
コード例 #5
0
ファイル: dbverify.c プロジェクト: MarcNo/lifelines
/*============================================
 * cgr_callback -- callback for refn traversal
 *  for checking for ghost refns
 * Created: 2001/01/13, Perry Rapp
 *==========================================*/
static BOOLEAN
cgr_callback (TRAV_REFNS_FUNC_ARGS(key, refn, newset, param))
{
    /* a refn record which points at record=key */
    RECORD rec = key_to_record(key);
    NODE node = nztop(rec);
    param = param; /* unused */

    if (newset) {
        finish_and_delete_refnset();
        soundexseq = create_indiseq_sval();
    }
    append_indiseq_sval(soundexseq, strsave(key), NULL, strsave(refn)
                        , TRUE, TRUE); /* sure, alloc */

    if (!node) {
        report_error(ERR_ORPHANNAME, _("Orphaned refn: %s"), refn);
        if (todo.fix_ghosts)
            enqueue_list(tofix, (VPTR)alloc_namerefn(refn, key, ERR_ORPHANNAME));
    } else {
    }
    if (noisy)
        report_progress("Refn: %s", refn);

    return 1; /* continue traversal */
}
コード例 #6
0
ファイル: proptbls.c プロジェクト: MarcNo/lifelines
/*===================================================
 * add_dir_files_to_proplist -- Add all files in dir to list of property tables
 * Created: 2002/10/19, Perry Rapp
 *=================================================*/
INT
add_dir_files_to_proplist (CNSTRING dir, SELECT_FNC selectfnc, LIST list)
{
	struct dirent **programs;
	INT n = scandir(dir, &programs, selectfnc, alphasort);
	INT i;
	for (i=0; i<n; ++i) {
		TABLE table = create_table_str();
		set_prop_dnum(table, 1, "filename", programs[i]->d_name);
		set_prop_dnum(table, 2, "dir", dir);
		stdfree(programs[i]);
		programs[i] = NULL;
		enqueue_list(list, table);
	}
	if (n>0)
		stdfree(programs);
	return i;
}
コード例 #7
0
ファイル: advedit.c プロジェクト: MarcNo/lifelines
/*=================================================================
 * advedit_expand_traverse -- Traverse routine called when expanding record
 *===============================================================*/
static BOOLEAN
advedit_expand_traverse (NODE node, VPTR param)
{
	LIST subs = (LIST)param;
	STRING key = value_to_xref(nval(node));
	if (!key) return TRUE;
	key = strsave(key);
#ifdef DEBUG
	llwprintf("expand_traverse: %s %s\n", ntag(node), nval(node));
#endif /* DEBUG */
	FORLIST(subs, el)
#ifdef DEBUG
	llwprintf("expand_traverse: %s %s\n", key, rmvat(nval((NODE) el)));
#endif /* DEBUG */
		if (eqstr(key, rmvat(nval((NODE) el)))) {
			STOPLIST
			stdfree(key);
			return TRUE;
		}
	ENDLIST
	enqueue_list(subs, node);
	stdfree(key);
	return TRUE;
}
コード例 #8
0
ファイル: battle.c プロジェクト: yunhaom94/Battle-Server-C
int battle_end(struct battle *b, struct queue_list *playerlist, int force_exit)
{
    struct player *p = b->player_1;
    struct player *p_1 = b->player_2;
    char buf1[256];
    char buf2[256];
    int n, n1, err = 1, err1 = 1, bid;
    

    if (!b)
    {   
        return -1;
    }


    if ((p->stat->hp > 0) && (p_1->stat->hp > 0) && (force_exit != 1))
    {
        return 0; // battle doesn't end
    }
    
    else
    {
        bid = b->battle_id;
        if ((p->stat->hp <= 0) && (p_1->stat->hp > 0))
        {
            n = sprintf(buf1, "You win! You have defeated %s!\nAwaiting for next battle\r\n", p->name);
            n1 = sprintf(buf2, "You are defeated by %s!\nAwaiting for next battle\r\n", p_1->name);
            err = write(p_1->client->fd, buf1, n);
            err1 = write(p->client->fd, buf2, n1);
        }
        else if ((p->stat->hp > 0) && (p_1->stat->hp <=0))
        {
            n = sprintf(buf1, "You win! You have defeated %s!\nAwaiting for next battle\r\n", p_1->name);
            n1 = sprintf(buf2, "You are defeated by %s!\nAwaiting for next battle\r\n", p->name);
            err = write(p->client->fd, buf1, n);
            err1 = write(p_1->client->fd, buf2, n1);
        }

        else
        {   
            if (force_exit != 1)
            {
                return -1;
            }
        }

        if (err < 0 || err1 < 0)
        {
            perror("write battle_end()");
        }
        
        p->status = 0;
        p_1->status = 0;
        p->cur_bat = NULL;
        p_1->cur_bat = NULL;

		enqueue_list(playerlist, p_1);
		enqueue_list(playerlist, p_2);

        return bid;
    }
    return -1;
}
コード例 #9
0
ファイル: dbverify.c プロジェクト: MarcNo/lifelines
/*=====================================
 * process_fam -- process indi record
 *  checking in pass 1, fixing in pass 2
 *===================================*/
static void
process_fam (RECORD rec)
{
    NODE fam0, fam1;
    NODE fref1, husb1, wife1, chil1, rest1;
    NODE node1;
    INT members = 0;
    BOOLEAN altered=FALSE;
    BOOLEAN needfix=FALSE;
    CNSTRING key = nzkey(rec);

    fam0 = nztop(rec);
    if (todo.pass==1) {
        fam1 = fam0;
    } else {
        fam1 = copy_node_subtree(fam0);
    }
    split_fam(fam1, &fref1, &husb1, &wife1, &chil1, &rest1);

    /* check refns */
    for (node1 = fref1; node1; node1 = nsibling(node1)) {
        /* STRING refn=nval(node1); */
        /* TO DO: verify that refn is in db */
    }
    /* check husbs */
    for (node1 = husb1; node1; node1 = nsibling(node1)) {
        STRING husbkey=rmvat(nval(node1));
        NODE husb = qkey_to_indi(husbkey);
        members++;
        if (!husb) {
            if (todo.pass == 1) {
                report_error(ERR_BADHUSBREF
                             , _("Bad HUSB reference (%s) in family %s")
                             , husbkey, key);
                needfix=TRUE;
            } else {
                if (fix_bad_pointer(key, rec, node1)) {
                    report_fix(ERR_BADHUSBREF
                               , _("Fixed Bad HUSB reference (%s) in family %s")
                               , husbkey, key);
                    altered=TRUE;
                }
            }
        } else {
            /* look for family (key) in husb */
            if (!find_xref(key, husb, "FAMS", NULL)) {
                report_error(ERR_EXTRAHUSB
                             , _("Improper HUSB (%s) in family (%s)")
                             , husbkey, key);
            }
        }
    }
    /* check wives */
    for (node1 = wife1; node1; node1 = nsibling(node1)) {
        STRING wifekey=rmvat(nval(node1));
        NODE wife = qkey_to_indi(wifekey);
        members++;
        if (!wife) {
            if (todo.pass == 1) {
                report_error(ERR_BADWIFEREF
                             , _("Bad wife reference (%s) in family %s")
                             , wifekey, key);
                needfix=TRUE;
            } else {
                if (fix_bad_pointer(key, rec, node1)) {
                    report_fix(ERR_BADWIFEREF
                               , _("Fixed Bad wife reference (%s) in family %s")
                               , printkey(wifekey), key);
                    altered=TRUE;
                }
            }
        } else {
            /* look for family (key) in wife */
            if (!find_xref(key, wife, "FAMS", NULL)) {
                report_error(ERR_EXTRAWIFE
                             , _("Improper wife (%s) in family (%s)")
                             , printkey(wifekey), key);
            }
        }
    }
    /* check children */
    for (node1 = chil1; node1; node1 = nsibling(node1)) {
        STRING chilkey=rmvat(nval(node1));
        NODE child = qkey_to_indi(chilkey);
        members++;
        if (!child) {
            if (todo.pass == 1) {
                report_error(ERR_BADCHILDREF
                             , _("Bad child reference (%s) in family %s")
                             , printkey(chilkey), key);
                needfix=TRUE;
            } else {
                if (fix_bad_pointer(key, rec, node1)) {
                    report_fix(ERR_BADCHILDREF
                               , _("Fixed bad child reference (%s) in family %s")
                               , printkey(chilkey), key);
                    altered=TRUE;
                }
            }
        } else {
            /* look for family (key) in child */
            if (!find_xref(key, child, "FAMC", NULL)) {
                report_error(ERR_EXTRACHILD
                             , _("Improper child: Child (%s) without FAMC reference to family (%s)")
                             , printkey(chilkey), key);
            }
        }
    }
    join_fam(fam1, fref1, husb1, wife1, chil1, rest1);
    /* check for undersized family */
    if (!members) {
        report_error(ERR_EMPTYFAM, _("Empty family (%s)"), key);
    } else if (members == 1) {
        report_error(ERR_SOLOFAM, _("Single person family (%s)"), key);
    }


    if (altered) {
        /* must normalize, as some lineage references may have been
        altered to non-lineage tags to fix broken pointers */
        normalize_fam(fam1);

        /* write to database */
        replace_fam(fam0, fam1);

    } else if (needfix) {
        enqueue_list(tofix, strsave(key));
    }
}
コード例 #10
0
ファイル: dbverify.c プロジェクト: MarcNo/lifelines
/*=====================================
 * process_indi -- process indi record
 *  checking in pass 1, fixing in pass 2
 *===================================*/
static void
process_indi (RECORD rec)
{
    NODE indi0, indi1;
    NODE name1, refn1, sex1, body1, famc1, fams1;
    NODE node1;
    BOOLEAN altered=FALSE;
    BOOLEAN needfix=FALSE;
    CNSTRING key = nzkey(rec);

    indi0 = nztop(rec);
    if (todo.pass==1) {
        indi1 = indi0;
    } else {
        indi1 = copy_node_subtree(indi0);
    }
    split_indi_old(indi1, &name1, &refn1, &sex1, &body1, &famc1, &fams1);

    if (todo.pass == 1) {
        /* check names */
        for (node1 = name1; node1; node1 = nsibling(node1)) {
            STRING name=nval(node1);
            if (!valid_name(name)) {
                report_error(ERR_BADNAME, _("Bad name for individual %s: %s"), key, name);
            } else {
                /* TO DO: verify that name is in db */
            }
        }
        /* check refns */
        for (node1 = refn1; node1; node1 = nsibling(node1)) {
            /* STRING refn=nval(node1); */
            /* TO DO: verify that refn is in db */
        }
    }

    /* check parents */
    for (node1 = famc1; node1; node1 = nsibling(node1)) {
        STRING famkey=rmvat(nval(node1));
        NODE fam2 = qkey_to_fam(famkey);
        if (!fam2) {
            if (todo.pass == 1) {
                report_error(ERR_BADFAMREF, _("Bad family reference (%s) individual %s"), famkey, key);
            }
        } else {
            /* look for indi1 (key) in fam2's children */
            if (!find_xref(key, fam2, "CHIL", NULL)) {
                if (todo.pass == 1) {
                    report_error(ERR_MISSINGCHILD, _("Missing child (%s) in family (%s)"), key, famkey);
                    needfix=TRUE;
                } else {
                    if (fix_bad_pointer(key, rec, node1)) {
                        report_fix(ERR_MISSINGCHILD, _("Fixed missing child (%s) in family (%s)"), key, famkey);
                        altered=TRUE;
                    }
                }
            }
        }
    }

    /* check spouses */
    for (node1 = fams1; node1; node1 = nsibling(node1)) {
        STRING famkey=rmvat(nval(node1));
        NODE fam2 = qkey_to_fam(famkey);
        if (!fam2) {
            if (todo.pass == 1) {
                report_error(ERR_BADFAMREF, _("Bad family reference (%s) individual %s"), famkey, key);
            }
        } else {
            /* look for indi1 (key) in fam2's spouses */
            if (!find_xref(key, fam2, "HUSB", "WIFE")) {
                if (todo.pass == 1) {
                    report_error(ERR_MISSINGSPOUSE, _("Missing spouse (%s) in family (%s)"), key, famkey);
                    needfix=TRUE;
                } else {
                    if (fix_bad_pointer(key, rec, node1)) {
                        report_fix(ERR_MISSINGSPOUSE, _("Fixed missing spouse (%s) in family (%s)"), key, famkey);
                        altered=TRUE;
                    }
                }
            }
        }
    }

    join_indi(indi1, name1, refn1, sex1, body1, famc1, fams1);
    if (altered) {
        /* must normalize, as some lineage references may have been
        altered to non-lineage tags to fix broken pointers */
        normalize_indi(indi1);

        /* write to database */
        replace_indi(indi0, indi1);

    } else if (needfix) {
        enqueue_list(tofix, strsave(key));
    }
}
コード例 #11
0
ファイル: Filereader.c プロジェクト: MohamadKin/OS
int read_File(FILE * fp,sch * list) {
	char string[BUFF_SIZE];
	int temp = 0, temp2 = 0, temp3 = 0;
	int thread_id = 0;
	int proc_id = 0;
	int num_thread = 0;
	int num_CPU = 0;
	int counter = 0;
	int thread_counter = 0;
	int CPU_counter = 0;
	int flag = 0;
	if(fp!=NULL){
		while(!feof(fp)){			
			if( fgets(string,BUFF_SIZE,fp) != NULL){
				if(counter == 0){
					sscanf(string,"%d%d%d",&temp,&temp2,&temp3);
					list->number_proc = temp;
					list->thread_switch = temp2;
					list->proc_switch = temp3;
					//creat procs
				}else if(thread_counter == num_thread && flag == 0){
					sscanf(string,"%d%d",&temp,&temp2);
					num_thread = temp2;
					proc_id = temp;
					thread_counter = 0;
					if(enqueue_list(list,NULL,NULL, creat_proc(temp,temp2),0,0) == 1){
						printf("error: proc\n");
						exit(1);
					}
					//creat threads
				}else if(CPU_counter == num_CPU){
					sscanf(string,"%d%d%d",&temp,&temp2,&temp3);
					num_CPU = temp3;
					thread_id = temp;
					thread_counter++;
					CPU_counter = 0;
					if(thread_counter == num_thread){
						flag = 1;
					}
					if(enqueue_list(list,NULL,creat_thread(temp,temp2,temp3),NULL,proc_id,0) == 1){
						printf("error: thread\n");
						exit(1);
					}
				}else{
					//creat burst
					sscanf(string,"%d%d%d",&temp,&temp2,&temp3);
					CPU_counter++;
					if(flag == 1 && CPU_counter == num_CPU){
						flag = 0;
					}
					if(enqueue_list(list,creat_CPU(temp,temp3,temp2),NULL,NULL,thread_id,proc_id) == 1){
						printf("error: CPU\n");
						exit(1);
					}
				}
				temp = 0;
				temp2 = 0;
				temp3  = 0;
				counter++;
			}
		}
		fclose(fp);
	}else{
		return -1;
	}

	return 0; 
}