memory.c 14.4 KB
Newer Older
Linus Tolke's avatar
Linus Tolke committed
1
/*
2
 * $Id: memory.c,v 0.26 1998/11/09 22:39:04 ceder Exp $
Per Cederqvist's avatar
Per Cederqvist committed
3
 * Copyright (C) 1991, 1992, 1993, 1994, 1996  Lysator Academic Computer Association.
Linus Tolke's avatar
Linus Tolke committed
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 *
 * This file is part of the LysKOM server.
 * 
 * LysKOM is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by 
 * the Free Software Foundation; either version 1, or (at your option) 
 * any later version.
 * 
 * LysKOM is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with LysKOM; see the file COPYING.  If not, write to
 * Lysator, c/o ISY, Linkoping University, S-581 83 Linkoping, SWEDEN,
 * or the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, 
 * MA 02139, USA.
 *
 * Please mail bug reports to bug-lyskom@lysator.liu.se. 
 */
Per Cederqvist's avatar
Per Cederqvist committed
25
/*
26
 * Memory allocators/deallocators/initializers.
Per Cederqvist's avatar
Per Cederqvist committed
27
28
29
30
 *
 * These functions should be used instead of smalloc/srealloc.
 */

31
static const char *
32
rcsid = "$Id: memory.c,v 0.26 1998/11/09 22:39:04 ceder Exp $";
33
34
#include "rcs.h"
USE(rcsid);
Per Cederqvist's avatar
Per Cederqvist committed
35

Per Cederqvist's avatar
Per Cederqvist committed
36
#include <stdio.h>
Per Cederqvist's avatar
Per Cederqvist committed
37
38
39
#ifdef HAVE_STRING_H
#  include <string.h>
#endif
40
41
42
#ifdef HAVE_STDARG_H
#  include <stdarg.h>
#endif
43
44
#include <sys/types.h>
#include <time.h>
Per Cederqvist's avatar
Per Cederqvist committed
45

46
#include "s-string.h"
Per Cederqvist's avatar
Per Cederqvist committed
47
48
49
#include "kom-types.h"
#include "kom-memory.h"
#include "server/smalloc.h"
50
#include "log.h"
Per Cederqvist's avatar
Per Cederqvist committed
51
#include "lyskomd.h"
Per Cederqvist's avatar
Per Cederqvist committed
52
#include "local-to-global.h"
Per Cederqvist's avatar
Per Cederqvist committed
53
54
55
56
57

static int person_cnt = 0;
static int conference_cnt = 0;
static int text_stat_cnt = 0;

58
/* Forward declarations */
Per Cederqvist's avatar
Per Cederqvist committed
59

60
61
62
63
64
65
66
67
static void            clear_mark_list (Mark_list *mark_list);
static Mark_list       copy_mark_list  (Mark_list ml);
static void            clear_member_list (Member_list *m);
static Member_list     copy_member_list  (Member_list ml);
static void            clear_membership (Membership *mship);
static Membership      copy_membership  (Membership m);
static void            clear_membership_list (Membership_list *mlist);
static Membership_list copy_membership_list  (Membership_list ml);
68
69
static void            copy_aux_item_list(Aux_item_list *dest,
					  const Aux_item_list *src);
70
71
72
73
74
75
76
77
78
79

/* Conf_type */

void
init_conf_type(Conf_type *ct)
{
    ct->rd_prot = 0;
    ct->original = 0;
    ct->secret = 0;
    ct->letter_box = 0;
Per Cederqvist's avatar
Per Cederqvist committed
80
81
}

82
/* Conference */
Per Cederqvist's avatar
Per Cederqvist committed
83

84
Conference *
Per Cederqvist's avatar
Per Cederqvist committed
85
86
87
88
89
90
91
alloc_conference(void)
{
    Conference *c;

    conference_cnt++;
    
    c = smalloc(sizeof(Conference));
92
    init_conference(c);
Per Cederqvist's avatar
Per Cederqvist committed
93
94
95
    return c;
}

96
97
void
free_conference(Conference *confp)
Per Cederqvist's avatar
Per Cederqvist committed
98
{
99
100
    if ( confp == NULL )
	return;
Per Cederqvist's avatar
Per Cederqvist committed
101

102
103
104
    conference_cnt--;
    clear_conference(confp);
    sfree(confp);
Per Cederqvist's avatar
Per Cederqvist committed
105
106
}

107
108
void
clear_conference(Conference *confp)
Per Cederqvist's avatar
Per Cederqvist committed
109
{
110
111
    s_clear(&confp->name);
    clear_member_list(&confp->members);
Per Cederqvist's avatar
Per Cederqvist committed
112
    l2g_clear(&confp->texts);
David Byers's avatar
David Byers committed
113
    free_aux_item_list(&confp->aux_item_list);
114
115
    init_conference(confp);
}
Per Cederqvist's avatar
Per Cederqvist committed
116

117
Conference *
Per Cederqvist's avatar
Per Cederqvist committed
118
copy_conference (const Conference *o)
119
120
121
122
{
    Conference *c;

    c = alloc_conference();
123
124
125
126
127
128
129
130
131
132
133
    c->type = o->type;
    c->creator = o->creator;
    c->supervisor = o->supervisor;
    c->permitted_submitters = o->permitted_submitters;
    c->super_conf = o->super_conf;
    c->creation_time = o->creation_time;
    c->presentation = o->presentation;
    c->last_written = o->last_written;
    c->msg_of_day = o->msg_of_day;
    c->nice = o->nice;
    c->expire = o->expire;
134
    s_strcpy(&c->name, o->name);
135
    c->highest_aux = o->highest_aux;
David Byers's avatar
David Byers committed
136
137
    copy_aux_item_list(&c->aux_item_list,
                       &o->aux_item_list);
138
139
    c->members = copy_member_list(o->members);
    l2g_copy(&c->texts, &o->texts);
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
    return c;
}

void
init_conference  (Conference *c)
{
    init_conf_type(&c->type);
    c->creator = 0;
    c->supervisor = 0;
    c->permitted_submitters = 0;
    c->super_conf = 0;
    c->creation_time = NO_TIME;
    c->presentation = 0;
    c->last_written = NO_TIME;
    c->msg_of_day = 0;
    c->nice = 0;
156
157
    c->highest_aux = 0;
    c->expire = 0;
158
159
    c->name = EMPTY_STRING;
    init_member_list(&c->members);
Per Cederqvist's avatar
Per Cederqvist committed
160
    l2g_init(&c->texts);
David Byers's avatar
David Byers committed
161
    init_aux_item_list(&c->aux_item_list);
Per Cederqvist's avatar
Per Cederqvist committed
162
163
}

164
165
166
167
168
169
170
171
172
/* Dynamic_session_info */

void
init_dynamic_session_info (Dynamic_session_info *d)
{
    d->session = 0;
    d->person = 0;
    d->working_conference = 0;
    d->idle_time = 0;
173
174
175
176
177
178
179
180
    d->flags.invisible = FALSE;
    d->flags.user_active_used = FALSE;
    d->flags.user_absent = FALSE;
    d->flags.reserved3 = FALSE;
    d->flags.reserved4 = FALSE;
    d->flags.reserved5 = FALSE;
    d->flags.reserved6 = FALSE;
    d->flags.reserved7 = FALSE;
181
182
183
    d->what_am_i_doing = EMPTY_STRING;
}

184

185
186
/* Mark_list */

187
188
static  void
clear_mark_list(Mark_list *mark_list)
Per Cederqvist's avatar
Per Cederqvist committed
189
190
{
    if ( mark_list == NULL )
191
192
    {
	log("clear_mark_list(): mark_list == NULL.\n");
Per Cederqvist's avatar
Per Cederqvist committed
193
	return;
194
    }
Per Cederqvist's avatar
Per Cederqvist committed
195
196

    sfree(mark_list->marks);
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
    init_mark_list(mark_list);
}

static  Mark_list
copy_mark_list(Mark_list ml)
{
    Mark_list r;

    r.no_of_marks = ml.no_of_marks;
    r.marks = smalloc(r.no_of_marks * sizeof(Mark));
    memcpy(r.marks, ml.marks, r.no_of_marks * sizeof(Mark));
    return r;
}

void
init_mark_list (Mark_list *ml)
{
    ml->no_of_marks = 0;
    ml->marks = NULL;
}

/* Member_list */

static void 
clear_member_list(Member_list *m)
{
    if ( m == NULL )
	return;

    sfree(m->members);
    init_member_list(m);
}

static  Member_list
copy_member_list(Member_list ml)
{
    Member_list res;

    res.no_of_members = ml.no_of_members;
    res.members = smalloc(res.no_of_members * sizeof ( Member ));
    memcpy(res.members, ml.members, res.no_of_members * sizeof ( Member ));
    return res;
Per Cederqvist's avatar
Per Cederqvist committed
239
240
}

241
242
243
244
245
246
247
248
void
init_member_list (Member_list *ml)
{
    ml->no_of_members = 0;
    ml->members = NULL;
}

/* Membership */
Per Cederqvist's avatar
Per Cederqvist committed
249

250
251
252
253
static  void
clear_membership(Membership *mship)
{
    if ( mship == NULL )
Per Cederqvist's avatar
Per Cederqvist committed
254
    {
255
256
	log("clear_membership(): mship == NULL.\n");
	return;
Per Cederqvist's avatar
Per Cederqvist committed
257
258
    }

259
    sfree(mship->read_texts);
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
    init_membership(mship);
}

static Membership
copy_membership(Membership m)
{
    Membership res;

    res = m;
    res.read_texts = smalloc(m.no_of_read * sizeof(Local_text_no));
    memcpy(res.read_texts, m.read_texts, m.no_of_read * sizeof(Local_text_no));
    return res;
}

void
init_membership(Membership *m)
{
    m->conf_no = 0;
    m->priority = 0;
    m->last_text_read = 0;
    m->no_of_read = 0;
    m->read_texts = NULL;
    m->last_time_read = NO_TIME;
283
284
285
286
287
288
289
290
291
292
    m->added_by = 0;
    m->added_at = 0;
    m->type.invitation = 0;
    m->type.passive = 0;
    m->type.secret = 0;
    m->type.reserved1 = 0;
    m->type.reserved2 = 0;
    m->type.reserved3 = 0;
    m->type.reserved4 = 0;
    m->type.reserved5 = 0;
Per Cederqvist's avatar
Per Cederqvist committed
293
294
}

295
296
/* Membership_list */

Per Cederqvist's avatar
Per Cederqvist committed
297
static void
298
clear_membership_list(Membership_list *mlist)
Per Cederqvist's avatar
Per Cederqvist committed
299
{
300
301
302
303
304
    int i;

    if ( mlist == NULL )
    {
	log("clear_membership_list(): membership_list == NULL.\n");
Per Cederqvist's avatar
Per Cederqvist committed
305
	return;
306
    }
Per Cederqvist's avatar
Per Cederqvist committed
307

308
309
310
311
    for ( i = 0; i < mlist->no_of_confs; i++ )
    {
	clear_membership(&mlist->confs[i]);
    }
Per Cederqvist's avatar
Per Cederqvist committed
312

313
    sfree(mlist->confs);
314
    init_membership_list(mlist);
Per Cederqvist's avatar
Per Cederqvist committed
315
316
}

317
318
319
320
321
322
323
324
static  Membership_list
copy_membership_list(Membership_list ml)
{
    Membership_list r;
    int i;

    r.no_of_confs = ml.no_of_confs;
    r.confs = smalloc(ml.no_of_confs * sizeof(Membership));
325

326
327
328
329
330
331
332
333
334
335
    for ( i = 0; i < r.no_of_confs; i++ )
    {
	r.confs[i] = copy_membership(ml.confs[i]);
    }

    return r;
}

void
init_membership_list (Membership_list *m)
Per Cederqvist's avatar
Per Cederqvist committed
336
{
337
338
339
340
    m->no_of_confs = 0;
    m->confs = NULL;
}

341
342
343
344
345
346
347
348
349
350
351
/* Static_session_info */

void
init_static_session_info (Static_session_info *d)
{
    d->username = EMPTY_STRING;
    d->hostname = EMPTY_STRING;
    d->ident_user = EMPTY_STRING;
    d->connection_time = NO_TIME;
}

352
353
354
355
356
357
358
359
360
361
362
/* Person */
Person *
alloc_person(void)
{
    Person *p;

    person_cnt++;
    
    p = smalloc(sizeof(Person));
    init_person(p);
    return p;
Per Cederqvist's avatar
Per Cederqvist committed
363
364
}

365
void
Per Cederqvist's avatar
Per Cederqvist committed
366
367
368
369
370
371
372
373
374
375
free_person(Person *person)
{
    if ( person == NULL )
	return;

    person_cnt--;
    clear_person(person);
    sfree(person);
}

376
377
378
379
void
clear_person(Person *person)
{
    s_clear(&person->username);
Per Cederqvist's avatar
Per Cederqvist committed
380
    l2g_clear(&person->created_texts);
381
382
383
384
    clear_mark_list(&person->marks);
    clear_membership_list(&person->conferences);
    init_person(person);
}
Per Cederqvist's avatar
Per Cederqvist committed
385

386
Person *
387
copy_person(const Person *p)
Per Cederqvist's avatar
Per Cederqvist committed
388
{
389
    Person *c;
Per Cederqvist's avatar
Per Cederqvist committed
390

391
    c = alloc_person();
392
393
394
395
396
397
398
399
400
401
402
403
    c->user_area = p->user_area;
    c->privileges = p->privileges;
    c->flags = p->flags;
    c->last_login = p->last_login;
    c->total_time_present = p->total_time_present;
    c->sessions = p->sessions;
    c->created_lines = p->created_lines;
    c->created_bytes = p->created_bytes;
    c->read_texts = p->read_texts;
    c->no_of_text_fetches = p->no_of_text_fetches;
    c->created_persons = p->created_persons;
    c->created_confs = p->created_confs;
404
    s_strcpy(&c->username, p->username);
Per Cederqvist's avatar
Per Cederqvist committed
405
    l2g_copy(&c->created_texts, &p->created_texts);
406
407
    c->marks = copy_mark_list(p->marks);
    c->conferences = copy_membership_list(p->conferences);
408
    memcpy(&c->pwd, &p->pwd, sizeof(Password));
409
    return c;
Per Cederqvist's avatar
Per Cederqvist committed
410
411
}

412
413
void
init_person  (Person *p)
Per Cederqvist's avatar
Per Cederqvist committed
414
{
415
416
417
418
419
420
421
422
423
424
425
426
427
428
    p->user_area = 0;
    p->total_time_present = 0;
    p->sessions = 0;
    p->created_lines = 0;
    p->created_bytes = 0;
    p->read_texts = 0;
    p->no_of_text_fetches = 0;
    p->created_persons = 0;
    p->created_confs = 0;
    p->username = EMPTY_STRING;
    p->last_login = NO_TIME;

    init_priv_bits(&p->privileges);
    init_personal_flags(&p->flags);
Per Cederqvist's avatar
Per Cederqvist committed
429
    l2g_init(&p->created_texts);
430
431
432
433
    init_mark_list(&p->marks);
    init_membership_list(&p->conferences);

    /* No initialization of pwd is done (or needed) */
Per Cederqvist's avatar
Per Cederqvist committed
434
435
}

436
/* Personal_flags */
Per Cederqvist's avatar
Per Cederqvist committed
437

438
439
440
441
442
443
444
445
446
447
448
void
init_personal_flags (Personal_flags *p)
{
    p->unread_is_secret = 0;
    p->flg2 = 0;
    p->flg3 = 0;
    p->flg4 = 0;
    p->flg5 = 0;
    p->flg6 = 0;
    p->flg7 = 0;
    p->flg8 = 0;
Per Cederqvist's avatar
Per Cederqvist committed
449
450
}

451
452
453
454
/* Priv_bits */

void
init_priv_bits (Priv_bits *pb)
Per Cederqvist's avatar
Per Cederqvist committed
455
{
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
    pb->wheel = 0;
    pb->admin = 0;
    pb->statistic = 0;
    pb->create_pers = 0;
    pb->create_conf = 0;
    pb->change_name = 0;
    pb->extern_gw = 0;
    pb->flg8 = 0;
    pb->flg9 = 0;
    pb->flg10 = 0;
    pb->flg11 = 0;
    pb->flg12 = 0;
    pb->flg13 = 0;
    pb->flg14 = 0;
    pb->flg15 = 0;
    pb->flg16 = 0;
}
Per Cederqvist's avatar
Per Cederqvist committed
473

474
/* Session_info */
Per Cederqvist's avatar
Per Cederqvist committed
475

476
477
478
479
480
481
482
483
484
485
486
void
init_session_info (Session_info *s)
{
    s->person = 0;
    s->what_am_i_doing = EMPTY_STRING;
    s->username = EMPTY_STRING;
    s->working_conference = 0;
    s->session = 0;
    s->connection_time = NO_TIME;
    s->idle_time = 0;
}
Per Cederqvist's avatar
Per Cederqvist committed
487

488
489
490
491
492
493
494
495
496
497
498
499
500
501
/* Session_info_ident */

void
init_session_info_ident (Session_info_ident *s)
{
    s->person = 0;
    s->what_am_i_doing = EMPTY_STRING;
    s->username = EMPTY_STRING;
    s->ident_user = EMPTY_STRING;
    s->hostname = EMPTY_STRING;
    s->working_conference = 0;
    s->session = 0;
    s->connection_time = NO_TIME;
    s->idle_time = 0;
Per Cederqvist's avatar
Per Cederqvist committed
502
503
}

504
/* Text_stat */
505

506
507
Text_stat *
alloc_text_stat(void)
Per Cederqvist's avatar
Per Cederqvist committed
508
{
509
    Text_stat *t;
Per Cederqvist's avatar
Per Cederqvist committed
510

511
512
513
514
515
    text_stat_cnt++;
    
    t = smalloc(sizeof(Text_stat));
    init_text_stat(t);
    return t;
Per Cederqvist's avatar
Per Cederqvist committed
516
517
}

518
519
520
521
522
void
free_text_stat(Text_stat *t)
{
    if ( t == NULL )
	return;
523

524
525
526
527
528
529
530
    text_stat_cnt--;
    clear_text_stat(t);
    sfree(t);
}

void
clear_text_stat(Text_stat *t)
Per Cederqvist's avatar
Per Cederqvist committed
531
532
533
{
    int i;

534
    for ( i = 0; i < t->no_of_misc; i++ )
Per Cederqvist's avatar
Per Cederqvist committed
535
    {
536
537
538
539
	switch ( t->misc_items[ i ].type )
	{
	case recpt:
	case cc_recpt:
540
	case bcc_recpt:
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
	case comm_to:
	case comm_in:
	case footn_to:
	case footn_in:
	case loc_no:
	case rec_time:
	case sent_by:
	case sent_at:
	    /* No need to free anything for these. */
	    break;

	default:
	    restart_kom("%s: free_text_stat: unknown Info_type %d.",
			__FILE__, t->misc_items[ i ].type );
	}
Per Cederqvist's avatar
Per Cederqvist committed
556
557
    }

558
    sfree(t->misc_items);
David Byers's avatar
David Byers committed
559
    free_aux_item_list(&t->aux_item_list);
560
    init_text_stat(t);
Per Cederqvist's avatar
Per Cederqvist committed
561
562
}

563
Text_stat *
564
copy_text_stat(const Text_stat *t)
565
{
566
    Text_stat *c;
567

568
    c = alloc_text_stat();
569
570
571
572
573
574
575
576
    c->creation_time = t->creation_time;
    c->file_pos = t->file_pos;
    c->author = t->author;
    c->no_of_lines = t->no_of_lines;
    c->no_of_chars = t->no_of_chars;
    c->no_of_marks = t->no_of_marks;
    c->no_of_misc = t->no_of_misc;
    c->highest_aux = t->highest_aux;
577
578
    c->misc_items = smalloc(c->no_of_misc * sizeof(Misc_info));
    memcpy(c->misc_items, t->misc_items, c->no_of_misc * sizeof(Misc_info));
David Byers's avatar
David Byers committed
579
580
    copy_aux_item_list(&c->aux_item_list,
                       &t->aux_item_list);
581
582
583
    return c;
}

584
585
void
init_text_stat  (Text_stat *t)
Per Cederqvist's avatar
Per Cederqvist committed
586
{
587
588
589
590
591
592
593
    t->creation_time = NO_TIME;
    t->file_pos = 0;
    t->author = 0;
    t->no_of_lines = 0;
    t->no_of_chars = 0;
    t->no_of_marks = 0;
    t->no_of_misc = 0;
594
    t->highest_aux = 0;
595
    t->misc_items = NULL;
David Byers's avatar
David Byers committed
596
    init_aux_item_list(&t->aux_item_list);
Per Cederqvist's avatar
Per Cederqvist committed
597
598
}

599
/* struct tm */
600

601
602
603
604
605
606
607
608
609
610
611
612
void
init_struct_tm (struct tm *t)
{
    t->tm_sec = 0;
    t->tm_min = 0;
    t->tm_hour = 0;
    t->tm_mday = 0;
    t->tm_mon = 0;
    t->tm_year = 0;
    t->tm_wday = 0;
    t->tm_yday = 0;
    t->tm_isdst = 0;
613
614
}

615
616
617
618
/* Who_info */

void
init_who_info (Who_info *w)
619
{
620
621
622
623
624
625
    w->person = 0;
    w->what_am_i_doing = EMPTY_STRING;
    w->username = EMPTY_STRING;
    w->working_conference = 0;
    w->session_no = 0;
}
626

627
628
629
630
631
632
633
634
635
636
637
638
/* Who_info_ident */

void
init_who_info_ident (Who_info_ident *w)
{
    w->person = 0;
    w->what_am_i_doing = EMPTY_STRING;
    w->username = EMPTY_STRING;
    w->ident_user = EMPTY_STRING;
    w->hostname = EMPTY_STRING;
    w->working_conference = 0;
    w->session_no = 0;
639
640
}

641
/* Who_info_old */
642

643
644
645
646
647
648
649
650
void
init_who_info_old (Who_info_old *w)
{
    w->person = 0;
    w->what_am_i_doing = EMPTY_STRING;
    w->working_conference = 0;
}

651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
/* Aux_item_list */

void
free_aux_item_list(Aux_item_list *list)
{
    unsigned long i;

    if (list->items != NULL)
    {
        for (i = 0; i < list->length; i++)
            s_clear(&list->items[i].data);
    }
    list->length = 0;
    sfree(list->items);
    list->items = NULL;
}

668
static void
Per Cederqvist's avatar
Per Cederqvist committed
669
670
copy_aux_item_list(Aux_item_list *dest,
		   const Aux_item_list *src)
David Byers's avatar
David Byers committed
671
672
673
{
    unsigned long   i;

674
    dest->length = src->length;
David Byers's avatar
David Byers committed
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
    dest->items = smalloc(sizeof(Aux_item) * src->length);
    for (i = 0; i < src->length; i++)
    {
        copy_aux_item(&dest->items[i], &src->items[i]);
    }
}

void
init_aux_item_list(Aux_item_list *list)
{
    list->length = 0;
    list->items = NULL;
}

void
690
691
692
693
694
695
696
697
copy_aux_item(Aux_item *dest, const Aux_item *src)
{
    dest->aux_no = src->aux_no;
    dest->creator = src->creator;
    dest->sent_at = src->sent_at;
    dest->flags = src->flags;
    dest->inherit_limit = src->inherit_limit;
    dest->tag = src->tag;
David Byers's avatar
David Byers committed
698
699
700
701
702
    dest->data = EMPTY_STRING;
    s_strcpy(&dest->data, src->data);
}


703
704
705
706
/*
 * Other kind of functions 
 */
void
Per Cederqvist's avatar
Per Cederqvist committed
707
708
dump_alloc_counts(FILE *fp)
{
Per Cederqvist's avatar
Per Cederqvist committed
709
710
711
    fprintf(fp, "---memory.c:\n\tperson:          %d\n\tconference:      %d\n",
	    person_cnt, conference_cnt);
    fprintf(fp, "\ttext_stat:       %d\n", text_stat_cnt);
Per Cederqvist's avatar
Per Cederqvist committed
712
}