summaryrefslogtreecommitdiffstats
path: root/asn1/asn1c/asn_SEQUENCE_OF.c
blob: ae65af2ad14709768b8f4ce007fe0ab6b597c81a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

/*-
 * Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
 * Redistribution and modifications are permitted subject to BSD license.
 */
#include <asn_internal.h>
#include <asn_SEQUENCE_OF.h>

typedef A_SEQUENCE_OF(void) asn_sequence;

     void asn_sequence_del(void *asn_sequence_of_x, int number, int _do_free)
{
    asn_sequence *as = (asn_sequence *) asn_sequence_of_x;

    if (as) {
        void *ptr;
        int n;

        if (number < 0 || number >= as->count)
            return;             /* Nothing to delete */

        if (_do_free && as->free) {
            ptr = as->array[number];
        } else {
            ptr = 0;
        }

        /*
         * Shift all elements to the left to hide the gap.
         */
        --as->count;
        for (n = number; n < as->count; n++)
            as->array[n] = as->array[n + 1];

        /*
         * Invoke the third-party function only when the state
         * of the parent structure is consistent.
         */
        if (ptr)
            as->free(ptr);
    }
}