625 lines
11 KiB
C
625 lines
11 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these libraries and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/* $XConsortium: appt4.c /main/1 1996/04/21 19:21:34 drk $ */
|
|
/*
|
|
* (c) Copyright 1993, 1994 Hewlett-Packard Company
|
|
* (c) Copyright 1993, 1994 International Business Machines Corp.
|
|
* (c) Copyright 1993, 1994 Novell, Inc.
|
|
* (c) Copyright 1993, 1994 Sun Microsystems, Inc.
|
|
*/
|
|
|
|
/*
|
|
* this file contains allocate and free routines for v4 data structures
|
|
*/
|
|
|
|
#include <EUSCompat.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "appt4.h"
|
|
|
|
#define FAUX_STRING "Appointment"
|
|
|
|
/*
|
|
* forward declaration of static functions used within the file
|
|
*/
|
|
static void free_tag4(Tag_4 *t);
|
|
static Attribute_4 *copy_attr4(Attribute_4 *a4);
|
|
static Tag_4 *copy_tag4(Tag_4 *t4);
|
|
|
|
/*****************************************************************************
|
|
* extern functions
|
|
*****************************************************************************/
|
|
|
|
extern Appt_4 *
|
|
_DtCm_make_appt4(boolean_t alloc)
|
|
{
|
|
Appt_4 *a;
|
|
|
|
if ((a = (Appt_4 *)calloc(1, sizeof(Appt_4))) == NULL)
|
|
return NULL;
|
|
|
|
if ((a->tag = (Tag_4 *)calloc(1, sizeof(Tag_4))) == NULL) {
|
|
free(a);
|
|
return NULL;
|
|
}
|
|
a->tag->tag = appointment_4;
|
|
a->tag->next = NULL;
|
|
a->tag->showtime = B_TRUE;
|
|
|
|
a->period.period = single_4;
|
|
a->appt_status = active_4;
|
|
a->privacy = public_4;
|
|
|
|
if (alloc) {
|
|
a->what = calloc(1, sizeof(1));
|
|
a->author = calloc(1, sizeof(1));
|
|
a->client_data = calloc(1, sizeof(1));
|
|
}
|
|
|
|
a->next = NULL;
|
|
return(a);
|
|
}
|
|
|
|
extern Appt_4 *
|
|
_DtCm_copy_one_appt4(Appt_4 *a4)
|
|
{
|
|
Appt_4 *ptr, *copy;
|
|
|
|
if (a4 == NULL)
|
|
return NULL;
|
|
|
|
ptr = a4->next;
|
|
a4->next = NULL;
|
|
|
|
copy = _DtCm_copy_appt4(a4);
|
|
|
|
a4->next = ptr;
|
|
return (copy);
|
|
}
|
|
|
|
extern Appt_4 *
|
|
_DtCm_copy_appt4(Appt_4 *a4)
|
|
{
|
|
Appt_4 *a, *head, *prev;
|
|
boolean_t cleanup = B_FALSE;
|
|
|
|
prev = head = NULL;
|
|
while (a4 != NULL) {
|
|
if ((a = (Appt_4 *)calloc(1, sizeof(Appt_4))) == NULL) {
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
|
|
a->appt_id.tick = a4->appt_id.tick;
|
|
a->appt_id.key = a4->appt_id.key;
|
|
|
|
a->duration = a4->duration;
|
|
a->ntimes = a4->ntimes;
|
|
|
|
if (a4->what) {
|
|
if ((a->what = strdup(a4->what)) == NULL) {
|
|
_DtCm_free_appt4(a);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
} else if ((a->what = (char *)calloc(1, 1)) == NULL) {
|
|
_DtCm_free_appt4(a);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
|
|
a->period.period = a4->period.period;
|
|
a->period.nth = a4->period.nth;
|
|
a->period.enddate = a4->period.enddate;
|
|
|
|
if (a4->author) {
|
|
if ((a->author = strdup(a4->author)) == NULL) {
|
|
_DtCm_free_appt4(a);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
} else if ((a->author = (char *)calloc(1, 1)) == NULL) {
|
|
_DtCm_free_appt4(a);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
|
|
if (a4->client_data) {
|
|
if ((a->client_data = strdup(a4->client_data)) == NULL) {
|
|
_DtCm_free_appt4(a);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
} else if ((a->client_data = (char *)calloc(1, 1)) == NULL) {
|
|
_DtCm_free_appt4(a);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
|
|
if (a4->exception &&
|
|
(a->exception = _DtCm_copy_excpt4(a4->exception)) == NULL) {
|
|
_DtCm_free_appt4(a);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
|
|
if (a4->attr && (a->attr = copy_attr4(a4->attr)) == NULL) {
|
|
_DtCm_free_appt4(a);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
|
|
if (a4->tag) {
|
|
if ((a->tag = copy_tag4(a4->tag)) == NULL) {
|
|
free(a);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
} else if ((a->tag = (Tag_4 *)calloc(1, sizeof(Tag_4))) == NULL) {
|
|
free(a);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
} else {
|
|
a->tag->tag = appointment_4;
|
|
a->tag->showtime = B_TRUE;
|
|
a->tag->next = NULL;
|
|
}
|
|
|
|
a->appt_status = a4->appt_status;
|
|
a->privacy = a4->privacy;
|
|
a->next = NULL;
|
|
|
|
if (head == NULL)
|
|
head = a;
|
|
else
|
|
prev->next = a;
|
|
prev = a;
|
|
|
|
a4 = a4->next;
|
|
}
|
|
|
|
if (cleanup == B_TRUE) {
|
|
_DtCm_free_appt4(head);
|
|
head = NULL;
|
|
}
|
|
|
|
return (head);
|
|
}
|
|
|
|
/*
|
|
* Copy one appointment.
|
|
* The what field is set to "Appointment".
|
|
*/
|
|
extern Appt_4 *
|
|
_DtCm_copy_semiprivate_appt4(Appt_4 *original)
|
|
{
|
|
Appt_4 *temp, *copy = NULL;
|
|
|
|
if (original != NULL) {
|
|
temp = original->next;
|
|
original->next = NULL;
|
|
|
|
if ((copy = _DtCm_copy_appt4(original)) != NULL) {
|
|
if (copy->what != NULL)
|
|
free(copy->what);
|
|
if ((copy->what = (char *)strdup(FAUX_STRING)) == NULL)
|
|
{
|
|
_DtCm_free_appt4(copy);
|
|
copy = NULL;
|
|
}
|
|
}
|
|
|
|
original->next = temp;
|
|
}
|
|
return(copy);
|
|
}
|
|
|
|
extern Abb_Appt_4 *
|
|
_DtCm_appt_to_abbrev4(Appt_4 *original)
|
|
{
|
|
Abb_Appt_4 *new = NULL;
|
|
|
|
if (original != NULL) {
|
|
if ((new = (Abb_Appt_4 *)calloc(1, sizeof(Abb_Appt_4))) == NULL)
|
|
return NULL;
|
|
|
|
if ((new->tag = copy_tag4(original->tag)) == NULL) {
|
|
free(new);
|
|
return NULL;
|
|
}
|
|
|
|
new->appt_id.tick = original->appt_id.tick;
|
|
new->appt_id.key = original->appt_id.key;
|
|
|
|
if ((new->what = (char *)strdup(original->what)) == NULL) {
|
|
_DtCm_free_abbrev_appt4(new);
|
|
return NULL;
|
|
}
|
|
|
|
new->duration = original->duration;
|
|
new->period.period = original->period.period;
|
|
new->period.nth = original->period.nth;
|
|
new->period.enddate = original->period.enddate;
|
|
|
|
new->appt_status = original->appt_status;
|
|
new->privacy = original->privacy;
|
|
new->next=NULL;
|
|
}
|
|
return(new);
|
|
}
|
|
|
|
/*
|
|
* The what field is set to "Appointment".
|
|
*/
|
|
extern Abb_Appt_4 *
|
|
_DtCm_appt_to_semiprivate_abbrev4(Appt_4 *original)
|
|
{
|
|
Abb_Appt_4 *new = _DtCm_appt_to_abbrev4(original);
|
|
if (new != NULL) {
|
|
if (new->what != NULL)
|
|
free(new->what);
|
|
if ((new->what = strdup(FAUX_STRING)) == NULL) {
|
|
_DtCm_free_abbrev_appt4(new);
|
|
new = NULL;
|
|
}
|
|
}
|
|
return(new);
|
|
}
|
|
|
|
extern void
|
|
_DtCm_free_appt4(Appt_4 *a)
|
|
{
|
|
Appt_4 *ptr;
|
|
|
|
while (a != NULL) {
|
|
ptr = a->next;
|
|
|
|
if (a->what != NULL)
|
|
free(a->what);
|
|
|
|
if (a->author != NULL)
|
|
free(a->author);
|
|
|
|
if (a->tag != NULL)
|
|
free_tag4(a->tag);
|
|
|
|
if (a->attr != NULL)
|
|
_DtCm_free_attr4(a->attr);
|
|
|
|
if (a->exception != NULL)
|
|
_DtCm_free_excpt4(a->exception);
|
|
|
|
free(a);
|
|
|
|
a = ptr;
|
|
}
|
|
}
|
|
|
|
extern void
|
|
_DtCm_free_abbrev_appt4(Abb_Appt_4 *a)
|
|
{
|
|
Abb_Appt_4 *ptr;
|
|
|
|
while (a != NULL) {
|
|
ptr = a->next;
|
|
|
|
if (a->what != NULL) {
|
|
free(a->what);
|
|
}
|
|
|
|
if (a->tag != NULL) {
|
|
free_tag4(a->tag);
|
|
}
|
|
|
|
free(a);
|
|
|
|
a = ptr;
|
|
}
|
|
}
|
|
|
|
Attribute_4 *
|
|
_DtCm_make_attr4(void)
|
|
{
|
|
Attribute_4 *a;
|
|
|
|
if ((a = (Attribute_4 *)calloc(1, sizeof(Attribute_4))) == NULL)
|
|
return NULL;
|
|
|
|
if ((a->attr = (char *)calloc(1, 1)) == NULL) {
|
|
free(a);
|
|
return NULL;
|
|
}
|
|
|
|
if ((a->value = (char *)calloc(1, 1)) == NULL) {
|
|
_DtCm_free_attr4(a);
|
|
return NULL;
|
|
}
|
|
|
|
if ((a->clientdata = (char *)calloc(1, 1)) == NULL) {
|
|
_DtCm_free_attr4(a);
|
|
return NULL;
|
|
}
|
|
|
|
return(a);
|
|
}
|
|
|
|
extern void
|
|
_DtCm_free_attr4(Attribute_4 *a)
|
|
{
|
|
Attribute_4 *ptr;
|
|
|
|
while (a != NULL) {
|
|
ptr = a->next;
|
|
if (a->attr != NULL)
|
|
free(a->attr);
|
|
if (a->value != NULL)
|
|
free(a->value);
|
|
if (a->clientdata != NULL)
|
|
free(a->clientdata);
|
|
free(a);
|
|
|
|
a = ptr;
|
|
}
|
|
}
|
|
|
|
extern Reminder_4 *
|
|
_DtCm_copy_reminder4(Reminder_4 *r4)
|
|
{
|
|
Reminder_4 *rem, *head, *prev;
|
|
|
|
prev = head = NULL;
|
|
while (r4 != NULL) {
|
|
rem = (Reminder_4 *)calloc(1, sizeof(Reminder_4));
|
|
rem->appt_id = r4->appt_id;
|
|
rem->tick = r4->tick;
|
|
rem->attr.next = NULL;
|
|
rem->attr.attr = strdup(r4->attr.attr);
|
|
rem->attr.value = strdup(r4->attr.value);
|
|
rem->attr.clientdata = strdup(r4->attr.clientdata);
|
|
rem->next = NULL;
|
|
|
|
if (head == NULL)
|
|
head = rem;
|
|
else
|
|
prev->next = rem;
|
|
prev = rem;
|
|
|
|
r4 = r4->next;
|
|
}
|
|
return(head);
|
|
}
|
|
|
|
extern void
|
|
_DtCm_free_reminder4(Reminder_4 *r)
|
|
{
|
|
Reminder_4 *ptr;
|
|
|
|
while (r != NULL) {
|
|
ptr = r->next;
|
|
|
|
if (r->attr.attr != NULL)
|
|
free (r->attr.attr);
|
|
if (r->attr.value != NULL)
|
|
free (r->attr.value);
|
|
if (r->attr.clientdata != NULL)
|
|
free (r->attr.clientdata);
|
|
free (r);
|
|
|
|
r = ptr;
|
|
}
|
|
}
|
|
|
|
extern void
|
|
_DtCm_free_keyentry4(Uid_4 *k)
|
|
{
|
|
Uid_4 *ptr;
|
|
|
|
while (k != NULL) {
|
|
ptr = k->next;
|
|
free(k);
|
|
k = ptr;
|
|
}
|
|
}
|
|
|
|
extern Access_Entry_4 *
|
|
_DtCm_make_access_entry4(char *who, int perms)
|
|
{
|
|
Access_Entry_4 *e;
|
|
|
|
if (who==NULL) return((Access_Entry_4 *)NULL);
|
|
if ((e = (Access_Entry_4 *)calloc(1, sizeof(Access_Entry_4))) == NULL)
|
|
return NULL;
|
|
|
|
if ((e->who = strdup(who)) == NULL) {
|
|
free(e);
|
|
return NULL;
|
|
}
|
|
|
|
e->access_type = perms;
|
|
e->next = NULL;
|
|
return(e);
|
|
}
|
|
|
|
extern void
|
|
_DtCm_free_access_list4(Access_Entry_4 *e)
|
|
{
|
|
Access_Entry_4 *ptr;
|
|
|
|
while (e != NULL) {
|
|
ptr = e->next;
|
|
|
|
if (e->who != NULL)
|
|
free(e->who);
|
|
free(e);
|
|
|
|
e = ptr;
|
|
}
|
|
}
|
|
|
|
extern void
|
|
_DtCm_free_excpt4(Except_4 *e)
|
|
{
|
|
Except_4 *ptr;
|
|
|
|
while (e != NULL) {
|
|
ptr = e->next;
|
|
free(e);
|
|
e = ptr;
|
|
}
|
|
}
|
|
|
|
extern Except_4 *
|
|
_DtCm_copy_excpt4(Except_4 *e4)
|
|
{
|
|
Except_4 *e, *head, *prev;
|
|
boolean_t cleanup = B_FALSE;
|
|
|
|
prev = head = NULL;
|
|
while (e4 != NULL) {
|
|
if ((e = (Except_4 *)calloc(1, sizeof(Except_4))) == NULL) {
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
|
|
e->ordinal = e4->ordinal;
|
|
e->next = NULL;
|
|
|
|
if (head == NULL)
|
|
head = e;
|
|
else
|
|
prev->next = e;
|
|
prev = e;
|
|
|
|
e4 = e4->next;
|
|
}
|
|
|
|
if (cleanup == B_TRUE) {
|
|
_DtCm_free_excpt4(head);
|
|
head = NULL;
|
|
}
|
|
|
|
return (head);
|
|
}
|
|
|
|
/******************************************************************************
|
|
* static functions used within the file
|
|
******************************************************************************/
|
|
|
|
static void
|
|
free_tag4(Tag_4 *t)
|
|
{
|
|
Tag_4 *ptr;
|
|
|
|
while (t != NULL) {
|
|
ptr = t->next;
|
|
free(t);
|
|
t = ptr;
|
|
}
|
|
}
|
|
|
|
/* Copy an attribute list recursively */
|
|
static Attribute_4 *
|
|
copy_attr4(Attribute_4 *a4)
|
|
{
|
|
Attribute_4 *a, *head, *prev;
|
|
boolean_t cleanup = B_FALSE;
|
|
|
|
prev = head = NULL;
|
|
while (a4 != NULL) {
|
|
if ((a = (Attribute_4 *)calloc(1, sizeof(Attribute_4)))
|
|
== NULL) {
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
|
|
if ((a->attr = strdup(a4->attr)) == NULL) {
|
|
free(a);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
|
|
if ((a->value = strdup(a4->value)) == NULL) {
|
|
_DtCm_free_attr4(a);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
|
|
if ((a->clientdata = strdup(a4->clientdata)) == NULL) {
|
|
_DtCm_free_attr4(a);
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
|
|
if (head == NULL)
|
|
head = a;
|
|
else
|
|
prev->next = a;
|
|
prev = a;
|
|
|
|
a4 = a4->next;
|
|
}
|
|
|
|
if (cleanup == B_TRUE) {
|
|
_DtCm_free_attr4(head);
|
|
head = NULL;
|
|
}
|
|
|
|
return (head);
|
|
}
|
|
|
|
static Tag_4 *
|
|
copy_tag4(Tag_4 *t4)
|
|
{
|
|
Tag_4 *t, *head, *prev;
|
|
boolean_t cleanup = B_FALSE;
|
|
|
|
prev = head = NULL;
|
|
while (t4 != NULL) {
|
|
if ((t = (Tag_4 *)calloc(1, sizeof(Tag_4))) == NULL) {
|
|
cleanup = B_TRUE;
|
|
break;
|
|
}
|
|
|
|
t->tag = t4->tag;
|
|
t->showtime = t4->showtime;
|
|
t->next = NULL;
|
|
|
|
if (head == NULL)
|
|
head = t;
|
|
else
|
|
prev->next = t;
|
|
prev = t;
|
|
|
|
t4 = t4->next;
|
|
}
|
|
|
|
if (cleanup == B_TRUE) {
|
|
free_tag4(head);
|
|
head = NULL;
|
|
}
|
|
|
|
return (head);
|
|
}
|
|
|