12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- /* This file is part of the software similarity tester SIM.
- Written by Dick Grune, Vrije Universiteit, Amsterdam.
- $Id: add_run.c,v 2.5 2001/11/08 12:30:28 dick Exp $
- */
- #include <malloc.h>
- #include "sim.h"
- #include "runs.h"
- #include "percentages.h"
- #include "options.h"
- #include "error.h"
- #include "add_run.h"
- static void set_chunk(
- struct chunk *,
- struct text *,
- unsigned int,
- unsigned int
- );
- static void set_pos(
- struct position *,
- int,
- struct text *,
- unsigned int
- );
- void
- add_run(struct text *txt0, unsigned int i0,
- struct text *txt1, unsigned int i1,
- unsigned int size
- ) {
- /* Adds the run of given size to our collection.
- */
- register struct run *r = (struct run *)malloc(sizeof (struct run));
- if (!r) fatal("out of memory");
- set_chunk(&r->rn_cn0, txt0, i0 - txt0->tx_start, size);
- set_chunk(&r->rn_cn1, txt1, i1 - txt1->tx_start, size);
- r->rn_size = size;
- if (option_set('p') ? add_to_percentages(r) : add_to_runs(r)) {
- /* OK */
- }
- else fatal("out of memory");
- }
- static void
- set_chunk(struct chunk *cnk, struct text *txt,
- unsigned int start, unsigned int size
- ) {
- /* Fill the chunk *cnk with info about the piece of text
- in txt starting at start extending over size tokens.
- */
- cnk->ch_text = txt;
- set_pos(&cnk->ch_first, 0, txt, start);
- set_pos(&cnk->ch_last, 1, txt, start + size - 1);
- }
- static void
- set_pos(struct position *pos, int type, struct text *txt, unsigned int start) {
- /* Fill a single struct position */
- pos->ps_next = txt->tx_pos;
- txt->tx_pos = pos;
- pos->ps_type = type;
- pos->ps_tk_cnt = start;
- pos->ps_nl_cnt = -1; /* uninitialized */
- }
|