Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libvcodex/Vcwindow/vcwmirror.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 2003-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Phong Vo <[email protected]> *
18
* *
19
***********************************************************************/
20
#include "vcwhdr.h"
21
22
/* Method to compute a matching window in source data with
23
** the same offset as the given target data.
24
**
25
** Written by Kiem-Phong Vo ([email protected])
26
*/
27
28
typedef struct _mirror_s
29
{ Sfoff_t ssize;
30
} Mirror_t;
31
32
#if __STD_C
33
static Vcwmatch_t* mirror(Vcwindow_t* vcw, Void_t* data, size_t size, Sfoff_t here)
34
#else
35
static Vcwmatch_t* mirror(vcw, data, size, here)
36
Vcwindow_t* vcw;
37
Void_t* data; /* target data to be matched */
38
size_t size; /* data size */
39
Sfoff_t here; /* current target position */
40
#endif
41
{
42
ssize_t mtsz;
43
Mirror_t *mir;
44
Sfio_t *srcf;
45
Vcwmatch_t *wm = &vcw->match;
46
47
if(size <= 0 || !vcw || !vcw->disc || !(srcf = vcw->disc->srcf) )
48
return NIL(Vcwmatch_t*);
49
50
if(!(mir = (Mirror_t*)vcw->mtdata) || mir->ssize <= 0)
51
return NIL(Vcwmatch_t*);
52
53
mtsz = size + 2*VCWEXTRA(size);
54
if((here -= VCWEXTRA(mtsz)) < 0)
55
here = 0;
56
if((here+mtsz) > mir->ssize && (here = mir->ssize - mtsz) < 0 )
57
{ here = 0;
58
mtsz = (size_t)mir->ssize;
59
}
60
61
wm->type = VCD_SOURCEFILE;
62
wm->wpos = here;
63
wm->wsize = mtsz;
64
if(sfseek(srcf, here, 0) != here ||
65
!(wm->wdata = sfreserve(srcf, mtsz, 0)) || sfvalue(srcf) < mtsz )
66
return NIL(Vcwmatch_t*);
67
wm->msize = size;
68
wm->more = 0;
69
70
return wm;
71
}
72
73
/* Event handler */
74
#if __STD_C
75
static int mirevent(Vcwindow_t* vcw, int type)
76
#else
77
static int mirevent(vcw, type)
78
Vcwindow_t* vcw;
79
int type;
80
#endif
81
{
82
Mirror_t* mir;
83
84
switch(type)
85
{
86
case VCW_OPENING:
87
if(!(mir = (Mirror_t*)malloc(sizeof(Mirror_t))) )
88
return -1;
89
90
if(!vcw->disc || !vcw->disc->srcf ||
91
sfseek(vcw->disc->srcf,(Sfoff_t)0,0) < 0)
92
{ free(mir);
93
return -1;
94
}
95
mir->ssize = sfsize(vcw->disc->srcf);
96
97
vcw->mtdata = (Void_t*)mir;
98
break;
99
100
case VCW_CLOSING:
101
if((mir = (Mirror_t*)vcw->mtdata) )
102
free(mir);
103
104
vcw->mtdata = NIL(Void_t*);
105
break;
106
}
107
108
return 0;
109
}
110
111
Vcwmethod_t _Vcwmirror =
112
{ mirror,
113
mirevent,
114
"mirror",
115
"Mirroring positions across files.",
116
"[-version?window::mirror (AT&T Research) 2003-01-01] USAGE_LICENSE"
117
};
118
119
Vcwmethod_t* Vcwmirror = &_Vcwmirror;
120
121