Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/librecsort/rstemp.c
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1996-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
* Glenn Fowler <[email protected]> *
19
* *
20
***********************************************************************/
21
#include "rshdr.h"
22
23
/*
24
* create temp stream ready for write
25
*/
26
27
#if __STD_C
28
Sfio_t* rstempwrite(Rs_t* rs, Sfio_t* sp)
29
#else
30
Sfio_t* rstempwrite(rs, sp)
31
Rs_t* rs;
32
Sfio_t* sp;
33
#endif
34
{
35
Sfio_t* op = sp;
36
37
if (!sp)
38
{
39
#if _PACKAGE_ast
40
char path[PATH_MAX];
41
int fd;
42
43
if (!pathtemp(path, sizeof(path), NiL, "sf", &fd))
44
return 0;
45
remove(path);
46
if (!(sp = sfnew(NiL, NiL, SF_UNBOUND, fd, SF_READ|SF_WRITE)))
47
return 0;
48
#else
49
if (!(sp = sftmp(0)))
50
return 0;
51
#endif
52
}
53
else
54
sfresize(sp, 0);
55
if ((rs->events & RS_TEMP_WRITE) && rsnotify(rs, RS_TEMP_WRITE, sp, (Void_t*)0, rs->disc) < 0)
56
{
57
if (!op)
58
sfclose(sp);
59
sp = 0;
60
}
61
return sp;
62
}
63
64
/*
65
* rewind temp stream and prepare for read
66
*/
67
68
#if __STD_C
69
int rstempread(Rs_t* rs, Sfio_t* sp)
70
#else
71
int rstempread(rs, sp)
72
Rs_t* rs;
73
Sfio_t* sp;
74
#endif
75
{
76
int n;
77
78
if (sfsync(sp))
79
return -1;
80
if (rs->events & RS_TEMP_READ)
81
{
82
if ((n = rsnotify(rs, RS_TEMP_READ, sp, (Void_t*)0, rs->disc)) < 0)
83
return -1;
84
if (n)
85
return 0;
86
}
87
return sfseek(sp, (Sfoff_t)0, SEEK_SET) ? -1 : 0;
88
}
89
90
/*
91
* close temp stream
92
*/
93
94
#if __STD_C
95
int rstempclose(Rs_t* rs, Sfio_t* sp)
96
#else
97
int rstempclose(rs, sp)
98
Rs_t* rs;
99
Sfio_t* sp;
100
#endif
101
{
102
int n;
103
104
if (rs->events & RS_TEMP_CLOSE)
105
{
106
if ((n = rsnotify(rs, RS_TEMP_CLOSE, sp, (Void_t*)0, rs->disc)) < 0)
107
return -1;
108
if (n)
109
return 0;
110
}
111
return sfclose(sp);
112
}
113
114