~ubuntu-branches/ubuntu/lucid/bsd-mailx/lucid-updates

« back to all changes in this revision

Viewing changes to strings.c

  • Committer: Bazaar Package Importer
  • Author(s): Robert Luberda
  • Date: 2008-04-26 09:52:18 UTC
  • Revision ID: james.westby@ubuntu.com-20080426095218-32ign72cqlucak0n
Tags: upstream-8.1.2-0.20071201cvs
ImportĀ upstreamĀ versionĀ 8.1.2-0.20071201cvs

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*      $OpenBSD: strings.c,v 1.8 2003/06/03 02:56:11 millert Exp $     */
 
2
/*      $NetBSD: strings.c,v 1.5 1996/06/08 19:48:40 christos Exp $     */
 
3
 
 
4
/*
 
5
 * Copyright (c) 1980, 1993
 
6
 *      The Regents of the University of California.  All rights reserved.
 
7
 *
 
8
 * Redistribution and use in source and binary forms, with or without
 
9
 * modification, are permitted provided that the following conditions
 
10
 * are met:
 
11
 * 1. Redistributions of source code must retain the above copyright
 
12
 *    notice, this list of conditions and the following disclaimer.
 
13
 * 2. Redistributions in binary form must reproduce the above copyright
 
14
 *    notice, this list of conditions and the following disclaimer in the
 
15
 *    documentation and/or other materials provided with the distribution.
 
16
 * 3. Neither the name of the University nor the names of its contributors
 
17
 *    may be used to endorse or promote products derived from this software
 
18
 *    without specific prior written permission.
 
19
 *
 
20
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 
21
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
22
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 
23
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 
24
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 
25
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 
26
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
27
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 
28
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 
29
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 
30
 * SUCH DAMAGE.
 
31
 */
 
32
 
 
33
#ifndef lint
 
34
#if 0
 
35
static const char sccsid[] = "@(#)strings.c     8.1 (Berkeley) 6/6/93";
 
36
#else
 
37
static const char rcsid[] = "$OpenBSD: strings.c,v 1.8 2003/06/03 02:56:11 millert Exp $";
 
38
#endif
 
39
#endif /* not lint */
 
40
 
 
41
/*
 
42
 * Mail -- a mail program
 
43
 *
 
44
 * String allocation routines.
 
45
 * Strings handed out here are reclaimed at the top of the command
 
46
 * loop each time, so they need not be freed.
 
47
 */
 
48
 
 
49
#include "rcv.h"
 
50
#include "extern.h"
 
51
 
 
52
/*
 
53
 * Allocate size more bytes of space and return the address of the
 
54
 * first byte to the caller.  An even number of bytes are always
 
55
 * allocated so that the space will always be on a word boundary.
 
56
 * The string spaces are of exponentially increasing size, to satisfy
 
57
 * the occasional user with enormous string size requests.
 
58
 */
 
59
char *
 
60
salloc(int size)
 
61
{
 
62
        char *t;
 
63
        int s;
 
64
        struct strings *sp;
 
65
        int index;
 
66
 
 
67
        s = size;
 
68
        s += (sizeof(char *) - 1);
 
69
        s &= ~(sizeof(char *) - 1);
 
70
        index = 0;
 
71
        for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++) {
 
72
                if (sp->s_topFree == NULL && (STRINGSIZE << index) >= s)
 
73
                        break;
 
74
                if (sp->s_nleft >= s)
 
75
                        break;
 
76
                index++;
 
77
        }
 
78
        if (sp >= &stringdope[NSPACE])
 
79
                errx(1, "String too large");
 
80
        if (sp->s_topFree == NULL) {
 
81
                index = sp - &stringdope[0];
 
82
                sp->s_topFree = (char *)malloc(STRINGSIZE << index);
 
83
                if (sp->s_topFree == NULL)
 
84
                        errx(1, "No room for space %d", index);
 
85
                sp->s_nextFree = sp->s_topFree;
 
86
                sp->s_nleft = STRINGSIZE << index;
 
87
        }
 
88
        sp->s_nleft -= s;
 
89
        t = sp->s_nextFree;
 
90
        sp->s_nextFree += s;
 
91
        return(t);
 
92
}
 
93
 
 
94
/*
 
95
 * Reset the string area to be empty.
 
96
 * Called to free all strings allocated
 
97
 * since last reset.
 
98
 */
 
99
void
 
100
sreset(void)
 
101
{
 
102
        struct strings *sp;
 
103
        int index;
 
104
 
 
105
        if (noreset)
 
106
                return;
 
107
        index = 0;
 
108
        for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++) {
 
109
                if (sp->s_topFree == NULL)
 
110
                        continue;
 
111
                sp->s_nextFree = sp->s_topFree;
 
112
                sp->s_nleft = STRINGSIZE << index;
 
113
                index++;
 
114
        }
 
115
}
 
116
 
 
117
/*
 
118
 * Make the string area permanent.
 
119
 * Meant to be called in main, after initialization.
 
120
 */
 
121
void
 
122
spreserve(void)
 
123
{
 
124
        struct strings *sp;
 
125
 
 
126
        for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++)
 
127
                sp->s_topFree = NULL;
 
128
}