GRASS 8 Programmer's Manual 8.6.0dev(2026)-56a9afeb9f
Loading...
Searching...
No Matches
helpers.c
Go to the documentation of this file.
1/* LIBDGL -- a Directed Graph Library implementation
2 * Copyright (C) 2002 Roberto Micarelli
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19/*
20 * best view with tabstop=4
21 */
22
23#include <stdlib.h>
24#include <string.h>
25
26#include "type.h"
27#include "tree.h"
28#include "graph.h"
29#include "helpers.h"
30
31/*
32 * helpers for parametric stack
33 */
34unsigned char *dgl_mempush(unsigned char *pstack, long *istack, long size,
35 void *pv)
36{
37 if (*istack == 0)
38 pstack = NULL;
39 pstack = realloc(pstack, size * (1 + *istack));
40 if (pstack == NULL)
41 return NULL;
42 memcpy(&pstack[(*istack) * size], pv, size);
43 (*istack)++;
44 return pstack;
45}
46
47unsigned char *dgl_mempop(unsigned char *pstack, long *istack, long size)
48{
49 if (*istack == 0)
50 return NULL;
51 return &pstack[size * (--(*istack))];
52}
53
55{
56 unsigned char *pb = (unsigned char *)pn;
57
58 pb[0] ^= pb[3];
59 pb[3] ^= pb[0];
60 pb[0] ^= pb[3];
61
62 pb[1] ^= pb[2];
63 pb[2] ^= pb[1];
64 pb[1] ^= pb[2];
65}
66
68{
69 unsigned char *pb = (unsigned char *)pn;
70
71 pb[0] ^= pb[7];
72 pb[7] ^= pb[0];
73 pb[0] ^= pb[7];
74
75 pb[1] ^= pb[6];
76 pb[6] ^= pb[1];
77 pb[1] ^= pb[6];
78
79 pb[2] ^= pb[5];
80 pb[5] ^= pb[2];
81 pb[2] ^= pb[5];
82
83 pb[3] ^= pb[4];
84 pb[4] ^= pb[3];
85 pb[3] ^= pb[4];
86}
87
88/*
89 * Keep the edge cost prioritizer in sync
90 */
92{
94 register int iEdge1, iEdge2;
96
97 if (pG->edgePrioritizer.pvAVL) {
98
99 findPriItem.nKey = nPriId;
101
102 if (pPriItem && pPriItem->pnData) {
103
104 pnNew = malloc(sizeof(dglInt32_t) * pPriItem->cnData);
105
106 if (pnNew == NULL) {
108 return -pG->iErrno;
109 }
110
111 for (iEdge1 = 0, iEdge2 = 0; iEdge2 < pPriItem->cnData; iEdge2++) {
112 if (pPriItem->pnData[iEdge2] != nId) {
113 pnNew[iEdge1++] = pPriItem->pnData[iEdge2];
114 }
115 }
116
117 free(pPriItem->pnData);
118 if (iEdge1 == 0) {
119 free(pnNew);
120 pPriItem->pnData = NULL;
121 pPriItem->cnData = 0;
122 }
123 else {
124 pPriItem->pnData = pnNew;
125 pPriItem->cnData = iEdge1;
126 }
127 }
128 }
129 return 0;
130}
131
133{
135
136 if (pG->edgePrioritizer.pvAVL == NULL) {
139 if (pG->edgePrioritizer.pvAVL == NULL) {
141 return -pG->iErrno;
142 }
143 }
145 if (pPriItem == NULL) {
147 return -pG->iErrno;
148 }
149 if (pPriItem->cnData == 0) {
150 pPriItem->pnData = (dglInt32_t *)malloc(sizeof(dglInt32_t));
151 }
152 else {
153 pPriItem->pnData = (dglInt32_t *)realloc(
154 pPriItem->pnData, sizeof(dglInt32_t) * (pPriItem->cnData + 1));
155 }
156 if (pPriItem->pnData == NULL) {
158 return -pG->iErrno;
159 }
160 pPriItem->pnData[pPriItem->cnData] = nId;
161 pPriItem->cnData++;
162 return 0;
163}
#define NULL
Definition ccmath.h:32
#define DGL_ERR_MemoryExhausted
Definition graph.h:254
int dgl_edge_prioritizer_del(dglGraph_s *pG, dglInt32_t nId, dglInt32_t nPriId)
Definition helpers.c:91
void dgl_swapInt64Bytes(dglInt64_t *pn)
Definition helpers.c:67
unsigned char * dgl_mempop(unsigned char *pstack, long *istack, long size)
Definition helpers.c:47
unsigned char * dgl_mempush(unsigned char *pstack, long *istack, long size, void *pv)
Definition helpers.c:34
void dgl_swapInt32Bytes(dglInt32_t *pn)
Definition helpers.c:54
int dgl_edge_prioritizer_add(dglGraph_s *pG, dglInt32_t nId, dglInt32_t nPriId)
Definition helpers.c:132
void * malloc(unsigned)
void free(void *)
dglEdgePrioritizer_s edgePrioritizer
Definition graph.h:164
int iErrno
Definition graph.h:138
dglTreeEdgePri32_s * dglTreeEdgePri32Add(void *pavl, dglInt32_t nKey)
Definition tree.c:373
void * dglTreeGetAllocator(void)
Definition tree.c:406
int dglTreeEdgePri32Compare(const void *pvEdgePri32A, const void *pvEdgePri32B, void *pvParam)
Definition tree.c:360
#define avl_find
Definition tree.h:38
#define avl_create
Definition tree.h:31
long long dglInt64_t
Definition type.h:37
long dglInt32_t
Definition type.h:36