graph.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862
  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. * best view with tabstop=4
  20. */
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include <sys/types.h>
  24. #include <sys/stat.h>
  25. #include <unistd.h>
  26. #include <stdlib.h>
  27. #include <errno.h>
  28. #define DGL_V2 1
  29. #include "type.h"
  30. #include "tree.h"
  31. #include "graph.h"
  32. #include "graph_v1.h"
  33. #if defined(DGL_V2)
  34. #include "graph_v2.h"
  35. #endif
  36. #include "helpers.h"
  37. void dglResetStats(dglGraph_s * pgraph)
  38. {
  39. #ifdef DGL_STATS
  40. pgraph->clkAddEdge = 0;
  41. pgraph->cAddEdge = 0;
  42. pgraph->clkNodeTree = 0;
  43. pgraph->cNodeTree = 0;
  44. #endif
  45. }
  46. int dglInitialize(dglGraph_s * pGraph, dglByte_t Version,
  47. dglInt32_t NodeAttrSize, dglInt32_t EdgeAttrSize,
  48. dglInt32_t * pOpaqueSet)
  49. {
  50. if (pGraph == NULL) {
  51. return -DGL_ERR_BadArgument;
  52. }
  53. switch (Version) {
  54. case 1:
  55. #ifdef DGL_V2
  56. case 2:
  57. case 3:
  58. #endif
  59. memset(pGraph, 0, sizeof(dglGraph_s));
  60. /*
  61. * round attr size to the upper multiple of dglInt32_t size
  62. */
  63. if (NodeAttrSize % sizeof(dglInt32_t))
  64. NodeAttrSize +=
  65. (sizeof(dglInt32_t) - (NodeAttrSize % sizeof(dglInt32_t)));
  66. if (EdgeAttrSize % sizeof(dglInt32_t))
  67. EdgeAttrSize +=
  68. (sizeof(dglInt32_t) - (EdgeAttrSize % sizeof(dglInt32_t)));
  69. pGraph->Version = Version;
  70. pGraph->NodeAttrSize = NodeAttrSize;
  71. pGraph->EdgeAttrSize = EdgeAttrSize;
  72. if (pOpaqueSet)
  73. memcpy(&pGraph->aOpaqueSet, pOpaqueSet, sizeof(dglInt32_t) * 16);
  74. #ifdef DGL_ENDIAN_BIG
  75. pGraph->Endian = DGL_ENDIAN_BIG;
  76. #else
  77. pGraph->Endian = DGL_ENDIAN_LITTLE;
  78. #endif
  79. }
  80. switch (Version) {
  81. case 1:
  82. if (dgl_initialize_V1(pGraph) < 0) {
  83. return -pGraph->iErrno;
  84. }
  85. else
  86. return 0;
  87. #ifdef DGL_V2
  88. case 2:
  89. case 3:
  90. if (dgl_initialize_V2(pGraph) < 0) {
  91. return -pGraph->iErrno;
  92. }
  93. else
  94. return 0;
  95. #endif
  96. }
  97. pGraph->iErrno = DGL_ERR_VersionNotSupported;
  98. return -pGraph->iErrno;
  99. }
  100. int dglRelease(dglGraph_s * pGraph)
  101. {
  102. switch (pGraph->Version) {
  103. case 1:
  104. return dgl_release_V1(pGraph);
  105. #ifdef DGL_V2
  106. case 2:
  107. case 3:
  108. return dgl_release_V2(pGraph);
  109. #endif
  110. }
  111. pGraph->iErrno = DGL_ERR_BadVersion;
  112. return -pGraph->iErrno;
  113. }
  114. int dglUnflatten(dglGraph_s * pGraph)
  115. {
  116. switch (pGraph->Version) {
  117. case 1:
  118. return dgl_unflatten_V1(pGraph);
  119. #ifdef DGL_V2
  120. case 2:
  121. case 3:
  122. return dgl_unflatten_V2(pGraph);
  123. #endif
  124. }
  125. pGraph->iErrno = DGL_ERR_BadVersion;
  126. return -pGraph->iErrno;
  127. }
  128. int dglFlatten(dglGraph_s * pGraph)
  129. {
  130. switch (pGraph->Version) {
  131. case 1:
  132. return dgl_flatten_V1(pGraph);
  133. #ifdef DGL_V2
  134. case 2:
  135. case 3:
  136. return dgl_flatten_V2(pGraph);
  137. #endif
  138. }
  139. pGraph->iErrno = DGL_ERR_BadVersion;
  140. return -pGraph->iErrno;
  141. }
  142. dglInt32_t *dglGetNode(dglGraph_s * pGraph, dglInt32_t nNodeId)
  143. {
  144. switch (pGraph->Version) {
  145. case 1:
  146. return dgl_get_node_V1(pGraph, nNodeId);
  147. #ifdef DGL_V2
  148. case 2:
  149. case 3:
  150. return dgl_get_node_V2(pGraph, nNodeId);
  151. #endif
  152. }
  153. pGraph->iErrno = DGL_ERR_BadVersion;
  154. return NULL;
  155. }
  156. dglInt32_t *dglNodeGet_OutEdgeset(dglGraph_s * pGraph, dglInt32_t * pnNode)
  157. {
  158. if (pnNode) {
  159. switch (pGraph->Version) {
  160. case 1:
  161. return dgl_getnode_outedgeset_V1(pGraph, pnNode);
  162. #ifdef DGL_V2
  163. case 2:
  164. case 3:
  165. return dgl_getnode_outedgeset_V2(pGraph, pnNode);
  166. #endif
  167. }
  168. pGraph->iErrno = DGL_ERR_BadVersion;
  169. return NULL;
  170. }
  171. return NULL;
  172. }
  173. dglInt32_t *dglNodeGet_InEdgeset(dglGraph_s * pGraph, dglInt32_t * pnNode)
  174. {
  175. if (pnNode) {
  176. switch (pGraph->Version) {
  177. case 1:
  178. pGraph->iErrno = DGL_ERR_NotSupported;
  179. return NULL;
  180. #ifdef DGL_V2
  181. case 2:
  182. case 3:
  183. return dgl_getnode_inedgeset_V2(pGraph, pnNode);
  184. #endif
  185. }
  186. pGraph->iErrno = DGL_ERR_BadVersion;
  187. return NULL;
  188. }
  189. return NULL;
  190. }
  191. /*
  192. * Given that node id can be negative, only iErrno can report a error,
  193. * thus it is initialized to zero
  194. */
  195. dglInt32_t dglNodeGet_Id(dglGraph_s * pGraph, dglInt32_t * pnNode)
  196. {
  197. pGraph->iErrno = 0;
  198. if (pnNode) {
  199. switch (pGraph->Version) {
  200. case 1:
  201. return DGL_NODE_ID_v1(pnNode);
  202. #ifdef DGL_V2
  203. case 2:
  204. case 3:
  205. return DGL_NODE_ID_v2(pnNode);
  206. #endif
  207. }
  208. pGraph->iErrno = DGL_ERR_BadVersion;
  209. return 0;
  210. }
  211. pGraph->iErrno = DGL_ERR_UnexpectedNullPointer;
  212. return 0;
  213. }
  214. dglInt32_t dglNodeGet_Status(dglGraph_s * pGraph, dglInt32_t * pnNode)
  215. {
  216. pGraph->iErrno = 0;
  217. if (pnNode) {
  218. switch (pGraph->Version) {
  219. case 1:
  220. return DGL_NODE_STATUS_v1(pnNode);
  221. #ifdef DGL_V2
  222. case 2:
  223. case 3:
  224. return DGL_NODE_STATUS_v2(pnNode);
  225. #endif
  226. }
  227. pGraph->iErrno = DGL_ERR_BadVersion;
  228. return 0;
  229. }
  230. pGraph->iErrno = DGL_ERR_UnexpectedNullPointer;
  231. return 0;
  232. }
  233. dglInt32_t *dglNodeGet_Attr(dglGraph_s * pGraph, dglInt32_t * pnNode)
  234. {
  235. if (pnNode) {
  236. switch (pGraph->Version) {
  237. case 1:
  238. return DGL_NODE_ATTR_PTR_v1(pnNode);
  239. #ifdef DGL_V2
  240. case 2:
  241. case 3:
  242. return DGL_NODE_ATTR_PTR_v2(pnNode);
  243. #endif
  244. }
  245. pGraph->iErrno = DGL_ERR_BadVersion;
  246. return NULL;
  247. }
  248. pGraph->iErrno = DGL_ERR_UnexpectedNullPointer;
  249. return NULL;
  250. }
  251. void dglNodeSet_Attr(dglGraph_s * pGraph, dglInt32_t * pnNode,
  252. dglInt32_t * pnAttr)
  253. {
  254. if (pnNode) {
  255. switch (pGraph->Version) {
  256. case 1:
  257. memcpy(DGL_NODE_ATTR_PTR_v1(pnNode), pnAttr,
  258. pGraph->NodeAttrSize);
  259. return;
  260. #ifdef DGL_V2
  261. case 2:
  262. case 3:
  263. memcpy(DGL_NODE_ATTR_PTR_v2(pnNode), pnAttr,
  264. pGraph->NodeAttrSize);
  265. return;
  266. #endif
  267. }
  268. return;
  269. }
  270. return;
  271. }
  272. int dglNodeGet_InDegree(dglGraph_s * pGraph, dglInt32_t * pnNode)
  273. {
  274. #ifdef DGL_V2
  275. dglInt32_t *pinedgeset;
  276. #endif
  277. pGraph->iErrno = 0;
  278. if (pnNode) {
  279. switch (pGraph->Version) {
  280. case 1:
  281. pGraph->iErrno = DGL_ERR_NotSupported;
  282. return 0;
  283. #ifdef DGL_V2
  284. case 2:
  285. if (DGL_NODE_STATUS_v2(pnNode) & DGL_NS_ALONE)
  286. return 0;
  287. pinedgeset = dglNodeGet_InEdgeset(pGraph, pnNode);
  288. if (pinedgeset)
  289. return DGL_EDGESET_EDGECOUNT_v2(pinedgeset);
  290. return 0;
  291. case 3:
  292. return dglNodeGet_Valence(pGraph, pnNode);
  293. #endif
  294. }
  295. pGraph->iErrno = DGL_ERR_BadVersion;
  296. return 0;
  297. }
  298. pGraph->iErrno = DGL_ERR_UnexpectedNullPointer;
  299. return 0;
  300. }
  301. int dglNodeGet_OutDegree(dglGraph_s * pGraph, dglInt32_t * pnNode)
  302. {
  303. dglInt32_t *poutedgeset;
  304. pGraph->iErrno = 0;
  305. if (pnNode) {
  306. switch (pGraph->Version) {
  307. case 1:
  308. if (DGL_NODE_STATUS_v1(pnNode) & DGL_NS_ALONE)
  309. return 0;
  310. poutedgeset = dglNodeGet_OutEdgeset(pGraph, pnNode);
  311. if (poutedgeset)
  312. return DGL_EDGESET_EDGECOUNT_v1(poutedgeset);
  313. return 0;
  314. #ifdef DGL_V2
  315. case 2:
  316. if (DGL_NODE_STATUS_v2(pnNode) & DGL_NS_ALONE)
  317. return 0;
  318. poutedgeset = dglNodeGet_OutEdgeset(pGraph, pnNode);
  319. if (poutedgeset)
  320. return DGL_EDGESET_EDGECOUNT_v2(poutedgeset);
  321. return 0;
  322. case 3:
  323. return dglNodeGet_Valence(pGraph, pnNode);
  324. #endif
  325. }
  326. pGraph->iErrno = DGL_ERR_BadVersion;
  327. return 0;
  328. }
  329. pGraph->iErrno = DGL_ERR_UnexpectedNullPointer;
  330. return 0;
  331. }
  332. int dglNodeGet_Valence(dglGraph_s * pGraph, dglInt32_t * pnNode)
  333. {
  334. #ifdef DGL_V2
  335. dglInt32_t *poutedgeset;
  336. dglInt32_t *pinedgeset;
  337. int c;
  338. #endif
  339. pGraph->iErrno = 0;
  340. if (pnNode) {
  341. switch (pGraph->Version) {
  342. #ifdef DGL_V2
  343. case 3:
  344. if (DGL_NODE_STATUS_v2(pnNode) & DGL_NS_ALONE)
  345. return 0;
  346. poutedgeset = dglNodeGet_OutEdgeset(pGraph, pnNode);
  347. pinedgeset = dglNodeGet_InEdgeset(pGraph, pnNode);
  348. c = 0;
  349. if (poutedgeset)
  350. c += DGL_EDGESET_EDGECOUNT_v2(poutedgeset);
  351. if (pinedgeset)
  352. c += DGL_EDGESET_EDGECOUNT_v2(pinedgeset);
  353. return c;
  354. #endif
  355. }
  356. pGraph->iErrno = DGL_ERR_BadVersion;
  357. return 0;
  358. }
  359. pGraph->iErrno = DGL_ERR_UnexpectedNullPointer;
  360. return 0;
  361. }
  362. dglInt32_t dglEdgesetGet_EdgeCount(dglGraph_s * pGraph,
  363. dglInt32_t * pnEdgeset)
  364. {
  365. pGraph->iErrno = 0;
  366. if (pnEdgeset) {
  367. switch (pGraph->Version) {
  368. case 1:
  369. return DGL_EDGESET_EDGECOUNT_v1(pnEdgeset);
  370. #ifdef DGL_V2
  371. case 2:
  372. case 3:
  373. return DGL_EDGESET_EDGECOUNT_v2(pnEdgeset);
  374. #endif
  375. }
  376. pGraph->iErrno = DGL_ERR_BadVersion;
  377. return 0;
  378. }
  379. pGraph->iErrno = DGL_ERR_UnexpectedNullPointer;
  380. return 0;
  381. }
  382. dglInt32_t dglEdgeGet_Cost(dglGraph_s * pGraph, dglInt32_t * pnEdge)
  383. {
  384. pGraph->iErrno = 0;
  385. if (pnEdge) {
  386. switch (pGraph->Version) {
  387. case 1:
  388. return DGL_EDGE_COST_v1(pnEdge);
  389. #ifdef DGL_V2
  390. case 2:
  391. case 3:
  392. return DGL_EDGE_COST_v2(pnEdge);
  393. #endif
  394. }
  395. pGraph->iErrno = DGL_ERR_BadVersion;
  396. return 0;
  397. }
  398. pGraph->iErrno = DGL_ERR_UnexpectedNullPointer;
  399. return 0;
  400. }
  401. dglInt32_t dglEdgeGet_Id(dglGraph_s * pGraph, dglInt32_t * pnEdge)
  402. {
  403. pGraph->iErrno = 0;
  404. if (pnEdge) {
  405. switch (pGraph->Version) {
  406. case 1:
  407. return DGL_EDGE_ID_v1(pnEdge);
  408. #ifdef DGL_V2
  409. case 2:
  410. case 3:
  411. return DGL_EDGE_ID_v2(pnEdge);
  412. #endif
  413. }
  414. pGraph->iErrno = DGL_ERR_BadVersion;
  415. return 0;
  416. }
  417. pGraph->iErrno = DGL_ERR_UnexpectedNullPointer;
  418. return 0;
  419. }
  420. dglInt32_t *dglEdgeGet_Head(dglGraph_s * pGraph, dglInt32_t * pnEdge)
  421. {
  422. pGraph->iErrno = 0;
  423. if (pnEdge) {
  424. switch (pGraph->Version) {
  425. case 1:
  426. if (pGraph->Flags & DGL_GS_FLAT) {
  427. return DGL_NODEBUFFER_SHIFT_v1(pGraph,
  428. DGL_EDGE_HEADNODE_OFFSET_v1
  429. (pnEdge));
  430. }
  431. else {
  432. return dgl_get_node_V1(pGraph,
  433. DGL_EDGE_HEADNODE_OFFSET_v1(pnEdge));
  434. }
  435. #ifdef DGL_V2
  436. case 2:
  437. case 3:
  438. if (pGraph->Flags & DGL_GS_FLAT) {
  439. return DGL_NODEBUFFER_SHIFT_v2(pGraph,
  440. DGL_EDGE_HEADNODE_OFFSET_v2
  441. (pnEdge));
  442. }
  443. else {
  444. return dgl_get_node_V2(pGraph,
  445. DGL_EDGE_HEADNODE_OFFSET_v2(pnEdge));
  446. }
  447. #endif
  448. }
  449. pGraph->iErrno = DGL_ERR_BadVersion;
  450. return NULL;
  451. }
  452. pGraph->iErrno = DGL_ERR_UnexpectedNullPointer;
  453. return NULL;
  454. }
  455. dglInt32_t *dglEdgeGet_Tail(dglGraph_s * pGraph, dglInt32_t * pnEdge)
  456. {
  457. pGraph->iErrno = 0;
  458. if (pnEdge) {
  459. switch (pGraph->Version) {
  460. case 1:
  461. if (pGraph->Flags & DGL_GS_FLAT) {
  462. return DGL_NODEBUFFER_SHIFT_v1(pGraph,
  463. DGL_EDGE_TAILNODE_OFFSET_v1
  464. (pnEdge));
  465. }
  466. else {
  467. return dgl_get_node_V1(pGraph,
  468. DGL_EDGE_TAILNODE_OFFSET_v1(pnEdge));
  469. }
  470. #ifdef DGL_V2
  471. case 2:
  472. case 3:
  473. if (pGraph->Flags & DGL_GS_FLAT) {
  474. return DGL_NODEBUFFER_SHIFT_v2(pGraph,
  475. DGL_EDGE_TAILNODE_OFFSET_v2
  476. (pnEdge));
  477. }
  478. else {
  479. return dgl_get_node_V2(pGraph,
  480. DGL_EDGE_TAILNODE_OFFSET_v2(pnEdge));
  481. }
  482. #endif
  483. }
  484. pGraph->iErrno = DGL_ERR_BadVersion;
  485. return NULL;
  486. }
  487. pGraph->iErrno = DGL_ERR_UnexpectedNullPointer;
  488. return NULL;
  489. }
  490. dglInt32_t *dglEdgeGet_Attr(dglGraph_s * pGraph, dglInt32_t * pnEdge)
  491. {
  492. pGraph->iErrno = 0;
  493. if (pnEdge) {
  494. switch (pGraph->Version) {
  495. case 1:
  496. return DGL_EDGE_ATTR_PTR_v1(pnEdge);
  497. #ifdef DGL_V2
  498. case 2:
  499. case 3:
  500. return DGL_EDGE_ATTR_PTR_v2(pnEdge);
  501. #endif
  502. }
  503. pGraph->iErrno = DGL_ERR_BadVersion;
  504. return NULL;
  505. }
  506. pGraph->iErrno = DGL_ERR_UnexpectedNullPointer;
  507. return NULL;
  508. }
  509. int dglEdgeSet_Attr(dglGraph_s * pGraph, dglInt32_t * pnAttr,
  510. dglInt32_t * pnEdge)
  511. {
  512. if (pnEdge) {
  513. switch (pGraph->Version) {
  514. case 1:
  515. memcpy(DGL_EDGE_ATTR_PTR_v1(pnEdge), pnAttr,
  516. pGraph->EdgeAttrSize);
  517. return 0;
  518. #ifdef DGL_V2
  519. case 2:
  520. case 3:
  521. memcpy(DGL_EDGE_ATTR_PTR_v2(pnEdge), pnAttr,
  522. pGraph->EdgeAttrSize);
  523. return 0;
  524. #endif
  525. }
  526. pGraph->iErrno = DGL_ERR_BadVersion;
  527. return -pGraph->iErrno;
  528. }
  529. pGraph->iErrno = DGL_ERR_UnexpectedNullPointer;
  530. return -pGraph->iErrno;
  531. }
  532. dglInt32_t *dglGetEdge(dglGraph_s * pGraph, dglInt32_t nEdgeId)
  533. {
  534. switch (pGraph->Version) {
  535. case 1:
  536. return dgl_get_edge_V1(pGraph, nEdgeId);
  537. break;
  538. #ifdef DGL_V2
  539. case 2:
  540. case 3:
  541. return dgl_get_edge_V2(pGraph, nEdgeId);
  542. break;
  543. #endif
  544. }
  545. pGraph->iErrno = DGL_ERR_BadVersion;
  546. return NULL;
  547. }
  548. int dglDelEdge(dglGraph_s * pGraph, dglInt32_t nEdgeId)
  549. {
  550. switch (pGraph->Version) {
  551. case 1:
  552. return dgl_del_edge_V1(pGraph, nEdgeId);
  553. break;
  554. #ifdef DGL_V2
  555. case 2:
  556. case 3:
  557. return dgl_del_edge_V2(pGraph, nEdgeId);
  558. break;
  559. #endif
  560. }
  561. pGraph->iErrno = DGL_ERR_BadVersion;
  562. return -pGraph->iErrno;
  563. }
  564. int dglAddEdge(dglGraph_s * pGraph,
  565. dglInt32_t nHead,
  566. dglInt32_t nTail, dglInt32_t nCost, dglInt32_t nEdge)
  567. {
  568. int nRet;
  569. #ifdef DGL_STATS
  570. clock_t clk;
  571. clk = clock();
  572. pGraph->cAddEdge++;
  573. #endif
  574. switch (pGraph->Version) {
  575. case 1:
  576. nRet =
  577. dgl_add_edge_V1(pGraph, nHead, nTail, nCost, nEdge, NULL, NULL,
  578. NULL, 0);
  579. break;
  580. #ifdef DGL_V2
  581. case 2:
  582. case 3:
  583. nRet =
  584. dgl_add_edge_V2(pGraph, nHead, nTail, nCost, nEdge, NULL, NULL,
  585. NULL, 0);
  586. break;
  587. #endif
  588. default:
  589. pGraph->iErrno = DGL_ERR_BadVersion;
  590. nRet = -pGraph->iErrno;
  591. break;
  592. }
  593. #ifdef DGL_STATS
  594. pGraph->clkAddEdge += clock() - clk;
  595. #endif
  596. return nRet;
  597. }
  598. int dglAddEdgeX(dglGraph_s * pGraph,
  599. dglInt32_t nHead,
  600. dglInt32_t nTail,
  601. dglInt32_t nCost,
  602. dglInt32_t nEdge,
  603. void *pvHeadAttr,
  604. void *pvTailAttr, void *pvEdgeAttr, dglInt32_t nFlags)
  605. {
  606. int nRet;
  607. #ifdef DGL_STATS
  608. clock_t clk;
  609. clk = clock();
  610. pGraph->cAddEdge++;
  611. #endif
  612. switch (pGraph->Version) {
  613. case 1:
  614. nRet =
  615. dgl_add_edge_V1(pGraph, nHead, nTail, nCost, nEdge, pvHeadAttr,
  616. pvTailAttr, pvEdgeAttr, nFlags);
  617. break;
  618. #ifdef DGL_V2
  619. case 2:
  620. case 3:
  621. nRet =
  622. dgl_add_edge_V2(pGraph, nHead, nTail, nCost, nEdge, pvHeadAttr,
  623. pvTailAttr, pvEdgeAttr, nFlags);
  624. break;
  625. #endif
  626. default:
  627. pGraph->iErrno = DGL_ERR_BadVersion;
  628. nRet = -pGraph->iErrno;
  629. break;
  630. }
  631. #ifdef DGL_STATS
  632. pGraph->clkAddEdge += clock() - clk;
  633. #endif
  634. return nRet;
  635. }
  636. int dglAddNode(dglGraph_s * pGraph,
  637. dglInt32_t nNodeId, void *pvNodeAttr, dglInt32_t nFlags)
  638. {
  639. int nRet;
  640. switch (pGraph->Version) {
  641. case 1:
  642. nRet = dgl_add_node_V1(pGraph, nNodeId, pvNodeAttr, nFlags);
  643. break;
  644. #ifdef DGL_V2
  645. case 2:
  646. case 3:
  647. nRet = dgl_add_node_V2(pGraph, nNodeId, pvNodeAttr, nFlags);
  648. break;
  649. #endif
  650. default:
  651. pGraph->iErrno = DGL_ERR_BadVersion;
  652. nRet = -pGraph->iErrno;
  653. break;
  654. }
  655. return nRet;
  656. }
  657. int dglDelNode(dglGraph_s * pGraph, dglInt32_t nNodeId)
  658. {
  659. int nRet;
  660. switch (pGraph->Version) {
  661. case 1:
  662. nRet = dgl_del_node_V1(pGraph, nNodeId);
  663. break;
  664. #ifdef DGL_V2
  665. case 2:
  666. case 3:
  667. nRet = dgl_del_node_V2(pGraph, nNodeId);
  668. break;
  669. #endif
  670. default:
  671. pGraph->iErrno = DGL_ERR_BadVersion;
  672. nRet = -pGraph->iErrno;
  673. break;
  674. }
  675. return nRet;
  676. }
  677. int dglWrite(dglGraph_s * pGraph, int fd)
  678. {
  679. int nRet;
  680. switch (pGraph->Version) {
  681. case 1:
  682. nRet = dgl_write_V1(pGraph, fd);
  683. break;
  684. #ifdef DGL_V2
  685. case 2:
  686. case 3:
  687. nRet = dgl_write_V2(pGraph, fd);
  688. break;
  689. #endif
  690. default:
  691. pGraph->iErrno = DGL_ERR_BadVersion;
  692. nRet = -pGraph->iErrno;
  693. break;
  694. }
  695. return nRet;
  696. }
  697. int dglRead(dglGraph_s * pGraph, int fd)
  698. {
  699. dglByte_t bVersion;
  700. int nRet;
  701. if (read(fd, &bVersion, 1) != 1) {
  702. pGraph->iErrno = DGL_ERR_Read;
  703. nRet = -pGraph->iErrno;
  704. }
  705. else {
  706. switch (bVersion) {
  707. case 1:
  708. nRet = dgl_read_V1(pGraph, fd);
  709. break;
  710. #ifdef DGL_V2
  711. case 2:
  712. case 3:
  713. nRet = dgl_read_V2(pGraph, fd, bVersion);
  714. break;
  715. #endif
  716. default:
  717. pGraph->iErrno = DGL_ERR_VersionNotSupported;
  718. nRet = -pGraph->iErrno;
  719. break;
  720. }
  721. }
  722. return nRet;
  723. }
  724. int dglShortestPath(dglGraph_s * pGraph,
  725. dglSPReport_s ** ppReport,
  726. dglInt32_t nStart,
  727. dglInt32_t nDestination,
  728. dglSPClip_fn fnClip,
  729. void *pvClipArg, dglSPCache_s * pCache)
  730. {
  731. int nRet;
  732. switch (pGraph->Version) {
  733. case 1:
  734. nRet =
  735. dgl_dijkstra_V1(pGraph, ppReport, NULL, nStart, nDestination,
  736. fnClip, pvClipArg, pCache);
  737. break;
  738. #ifdef DGL_V2
  739. case 2:
  740. case 3:
  741. nRet =
  742. dgl_dijkstra_V2(pGraph, ppReport, NULL, nStart, nDestination,
  743. fnClip, pvClipArg, pCache);
  744. break;
  745. #endif
  746. default:
  747. pGraph->iErrno = DGL_ERR_BadVersion;
  748. nRet = -pGraph->iErrno;
  749. break;
  750. }
  751. return nRet;
  752. }
  753. int dglShortestDistance(dglGraph_s * pGraph,
  754. dglInt32_t * pnDistance,
  755. dglInt32_t nStart,
  756. dglInt32_t nDestination,
  757. dglSPClip_fn fnClip,
  758. void *pvClipArg, dglSPCache_s * pCache)
  759. {
  760. int nRet;
  761. switch (pGraph->Version) {
  762. case 1:
  763. nRet =
  764. dgl_dijkstra_V1(pGraph, NULL, pnDistance, nStart, nDestination,
  765. fnClip, pvClipArg, pCache);
  766. break;
  767. #ifdef DGL_V2
  768. case 2:
  769. case 3:
  770. nRet =
  771. dgl_dijkstra_V2(pGraph, NULL, pnDistance, nStart, nDestination,
  772. fnClip, pvClipArg, pCache);
  773. break;
  774. #endif
  775. default:
  776. pGraph->iErrno = DGL_ERR_BadVersion;
  777. nRet = -pGraph->iErrno;
  778. break;
  779. }
  780. return nRet;
  781. }
  782. int dglDepthSpanning(dglGraph_s * pgraphInput,
  783. dglGraph_s * pgraphOutput,
  784. dglInt32_t nVertexNode,
  785. dglSpanClip_fn fnClip, void *pvClipArg)
  786. {
  787. int nRet;
  788. void *pvVisited;
  789. if (dglGet_EdgeCount(pgraphInput) == 0) { /* no span */
  790. pgraphInput->iErrno = 0;
  791. return 0;
  792. }
  793. #ifndef DGL_V2
  794. if (pgraphInput->Version == 2) {
  795. pgraphInput->iErrno = DGL_ERR_BadVersion;
  796. return -pgraphInput->iErrno;
  797. }
  798. #endif
  799. nRet = dglInitialize(pgraphOutput,
  800. dglGet_Version(pgraphInput),
  801. dglGet_NodeAttrSize(pgraphInput),
  802. dglGet_EdgeAttrSize(pgraphInput),
  803. dglGet_Opaque(pgraphInput));
  804. if (nRet < 0)
  805. return nRet;
  806. if ((pvVisited =
  807. avl_create(dglTreeNodeCompare, NULL,
  808. dglTreeGetAllocator())) == NULL) {
  809. pgraphInput->iErrno = DGL_ERR_MemoryExhausted;
  810. return -pgraphInput->iErrno;
  811. }
  812. switch (pgraphInput->Version) {
  813. case 1:
  814. nRet =
  815. dgl_depthfirst_spanning_V1(pgraphInput, pgraphOutput, nVertexNode,
  816. pvVisited, fnClip, pvClipArg);
  817. break;
  818. #ifdef DGL_V2
  819. case 2:
  820. case 3:
  821. nRet =
  822. dgl_depthfirst_spanning_V2(pgraphInput, pgraphOutput, nVertexNode,
  823. pvVisited, fnClip, pvClipArg);
  824. break;
  825. #endif
  826. default:
  827. pgraphInput->iErrno = DGL_ERR_BadVersion;
  828. nRet = -pgraphInput->iErrno;
  829. break;
  830. }
  831. avl_destroy(pvVisited, dglTreeNodeCancel);
  832. if (nRet < 0) {
  833. dglRelease(pgraphOutput);
  834. }
  835. return nRet;
  836. }
  837. int dglDepthComponents(dglGraph_s * pgraphInput,
  838. dglGraph_s * pgraphComponents,
  839. int cgraphComponents,
  840. dglSpanClip_fn fnClip, void *pvClipArg)
  841. {
  842. int i, nret = 0;
  843. dglTreeNode_s findVisited;
  844. void *pvVisited;
  845. dglInt32_t *pvertex, *pnode;
  846. if (dglGet_EdgeCount(pgraphInput) == 0) { /* no span */
  847. pgraphInput->iErrno = 0;
  848. return 0;
  849. }
  850. #ifndef DGL_V2
  851. if (pgraphInput->Version == 2 || pgraphInput->Version == 3) {
  852. pgraphInput->iErrno = DGL_ERR_BadVersion;
  853. return -pgraphInput->iErrno;
  854. }
  855. #endif
  856. if ((pvVisited =
  857. avl_create(dglTreeNodeCompare, NULL,
  858. dglTreeGetAllocator())) == NULL) {
  859. pgraphInput->iErrno = DGL_ERR_MemoryExhausted;
  860. goto error;
  861. }
  862. /*
  863. * choose a vertex to start from
  864. */
  865. pvertex = NULL;
  866. {
  867. dglNodeTraverser_s pT;
  868. dglNode_T_Initialize(&pT, pgraphInput);
  869. for (pnode = dglNode_T_First(&pT); pnode; pnode = dglNode_T_Next(&pT)) {
  870. switch (pgraphInput->Version) {
  871. case 1:
  872. if (DGL_NODE_STATUS_v1(pnode) & DGL_NS_HEAD)
  873. pvertex = pnode;
  874. break;
  875. #ifdef DGL_V2
  876. case 2:
  877. case 3:
  878. if (DGL_NODE_STATUS_v2(pnode) & DGL_NS_HEAD)
  879. pvertex = pnode;
  880. break;
  881. #endif
  882. }
  883. if (pvertex)
  884. break;
  885. }
  886. dglNode_T_Release(&pT);
  887. }
  888. if (pvertex == NULL) {
  889. pgraphInput->iErrno = DGL_ERR_UnexpectedNullPointer;
  890. goto error;
  891. }
  892. for (i = 0; i < cgraphComponents && pvertex; i++) {
  893. nret = dglInitialize(&pgraphComponents[i],
  894. dglGet_Version(pgraphInput),
  895. dglGet_NodeAttrSize(pgraphInput),
  896. dglGet_EdgeAttrSize(pgraphInput),
  897. dglGet_Opaque(pgraphInput));
  898. if (nret < 0)
  899. goto error;
  900. switch (pgraphInput->Version) {
  901. case 1:
  902. nret =
  903. dgl_depthfirst_spanning_V1(pgraphInput, &pgraphComponents[i],
  904. DGL_NODE_ID_v1(pvertex), pvVisited,
  905. fnClip, pvClipArg);
  906. if (nret < 0)
  907. goto error;
  908. break;
  909. #ifdef DGL_V2
  910. case 2:
  911. case 3:
  912. nret =
  913. dgl_depthfirst_spanning_V2(pgraphInput, &pgraphComponents[i],
  914. DGL_NODE_ID_v1(pvertex), pvVisited,
  915. fnClip, pvClipArg);
  916. if (nret < 0)
  917. goto error;
  918. break;
  919. #endif
  920. default:
  921. pgraphInput->iErrno = DGL_ERR_BadVersion;
  922. nret = -pgraphInput->iErrno;
  923. goto error;
  924. }
  925. /*
  926. * select next unvisited vertex
  927. */
  928. pvertex = NULL;
  929. {
  930. dglNodeTraverser_s pT;
  931. dglNode_T_Initialize(&pT, pgraphInput);
  932. for (pnode = dglNode_T_First(&pT); pnode;
  933. pnode = dglNode_T_Next(&pT)) {
  934. switch (pgraphInput->Version) {
  935. case 1:
  936. if (DGL_NODE_STATUS_v1(pnode) & DGL_NS_HEAD) {
  937. findVisited.nKey = DGL_NODE_ID_v1(pnode);
  938. if (avl_find(pvVisited, &findVisited) == NULL) {
  939. pvertex = pnode;
  940. break;
  941. }
  942. }
  943. break;
  944. #ifdef DGL_V2
  945. case 2:
  946. case 3:
  947. if (DGL_NODE_STATUS_v2(pnode) & DGL_NS_HEAD) {
  948. findVisited.nKey = DGL_NODE_ID_v2(pnode);
  949. if (avl_find(pvVisited, &findVisited) == NULL) {
  950. pvertex = pnode;
  951. break;
  952. }
  953. }
  954. break;
  955. #endif
  956. }
  957. if (pvertex)
  958. break;
  959. }
  960. dglNode_T_Release(&pT);
  961. }
  962. }
  963. avl_destroy(pvVisited, dglTreeNodeCancel);
  964. return i;
  965. error:
  966. avl_destroy(pvVisited, dglTreeNodeCancel);
  967. return nret;
  968. }
  969. int dglMinimumSpanning(dglGraph_s * pgraphInput,
  970. dglGraph_s * pgraphOutput,
  971. dglInt32_t nVertexNode,
  972. dglSpanClip_fn fnClip, void *pvClipArg)
  973. {
  974. int nRet;
  975. if (dglGet_EdgeCount(pgraphInput) == 0) { /* no span */
  976. pgraphInput->iErrno = 0;
  977. return 0;
  978. }
  979. nRet = dglInitialize(pgraphOutput,
  980. dglGet_Version(pgraphInput),
  981. dglGet_NodeAttrSize(pgraphInput),
  982. dglGet_EdgeAttrSize(pgraphInput),
  983. dglGet_Opaque(pgraphInput));
  984. if (nRet < 0)
  985. return nRet;
  986. switch (pgraphInput->Version) {
  987. case 1:
  988. nRet =
  989. dgl_minimum_spanning_V1(pgraphInput, pgraphOutput, nVertexNode,
  990. fnClip, pvClipArg);
  991. break;
  992. #ifdef DGL_V2
  993. case 2:
  994. case 3:
  995. nRet =
  996. dgl_minimum_spanning_V2(pgraphInput, pgraphOutput, nVertexNode,
  997. fnClip, pvClipArg);
  998. break;
  999. #endif
  1000. default:
  1001. pgraphInput->iErrno = DGL_ERR_BadVersion;
  1002. nRet = -pgraphInput->iErrno;
  1003. break;
  1004. }
  1005. if (nRet < 0) {
  1006. dglRelease(pgraphOutput);
  1007. }
  1008. return nRet;
  1009. }
  1010. void dglFreeSPReport(dglGraph_s * pgraph, dglSPReport_s * pSPReport)
  1011. {
  1012. int iArc;
  1013. if (pSPReport) {
  1014. if (pSPReport->pArc) {
  1015. for (iArc = 0; iArc < pSPReport->cArc; iArc++) {
  1016. if (pSPReport->pArc[iArc].pnEdge)
  1017. free(pSPReport->pArc[iArc].pnEdge);
  1018. }
  1019. free(pSPReport->pArc);
  1020. }
  1021. free(pSPReport);
  1022. }
  1023. }
  1024. int dglInitializeSPCache(dglGraph_s * pGraph, dglSPCache_s * pCache)
  1025. {
  1026. switch (pGraph->Version) {
  1027. case 1:
  1028. return dgl_sp_cache_initialize_V1(pGraph, pCache, 0);
  1029. #ifdef DGL_V2
  1030. case 2:
  1031. case 3:
  1032. return dgl_sp_cache_initialize_V2(pGraph, pCache, 0);
  1033. #endif
  1034. }
  1035. pGraph->iErrno = DGL_ERR_BadVersion;
  1036. return -pGraph->iErrno;
  1037. }
  1038. void dglReleaseSPCache(dglGraph_s * pGraph, dglSPCache_s * pCache)
  1039. {
  1040. pGraph->iErrno = 0;
  1041. switch (pGraph->Version) {
  1042. case 1:
  1043. dgl_sp_cache_release_V1(pGraph, pCache);
  1044. break;
  1045. #ifdef DGL_V2
  1046. case 2:
  1047. case 3:
  1048. dgl_sp_cache_release_V2(pGraph, pCache);
  1049. break;
  1050. #endif
  1051. }
  1052. pGraph->iErrno = DGL_ERR_BadVersion;
  1053. }
  1054. int dglErrno(dglGraph_s * pgraph)
  1055. {
  1056. return pgraph->iErrno;
  1057. }
  1058. char *dglStrerror(dglGraph_s * pgraph)
  1059. {
  1060. switch (pgraph->iErrno) {
  1061. case DGL_ERR_BadVersion:
  1062. return "Bad Version";
  1063. case DGL_ERR_BadNodeType:
  1064. return "Bad Node Type";
  1065. case DGL_ERR_MemoryExhausted:
  1066. return "Memory Exhausted";
  1067. case DGL_ERR_HeapError:
  1068. return "Heap Error";
  1069. case DGL_ERR_UndefinedMethod:
  1070. return "Undefined Method";
  1071. case DGL_ERR_Write:
  1072. return "Write";
  1073. case DGL_ERR_Read:
  1074. return "Read";
  1075. case DGL_ERR_NotSupported:
  1076. return "Not Supported";
  1077. case DGL_ERR_UnknownByteOrder:
  1078. return "Unknown Byte Order";
  1079. case DGL_ERR_NodeNotFound:
  1080. return "Node Not Found";
  1081. case DGL_ERR_HeadNodeNotFound:
  1082. return "Head Node Not Found";
  1083. case DGL_ERR_TailNodeNotFound:
  1084. return "Tail Node Not Found";
  1085. case DGL_ERR_BadEdge:
  1086. return "Bad Edge";
  1087. case DGL_ERR_BadOnFlatGraph:
  1088. return "Operation Not Supported On Flat-State Graph";
  1089. case DGL_ERR_BadOnTreeGraph:
  1090. return "Operation Not Supported On Tree-State Graph";
  1091. case DGL_ERR_TreeSearchError:
  1092. return "Tree Search Error";
  1093. case DGL_ERR_UnexpectedNullPointer:
  1094. return "Unexpected Null Pointer";
  1095. case DGL_ERR_VersionNotSupported:
  1096. return "Version Not Supported";
  1097. case DGL_ERR_EdgeNotFound:
  1098. return "Edge Not Found";
  1099. case DGL_ERR_NodeAlreadyExist:
  1100. return "Node Already Exist";
  1101. case DGL_ERR_NodeIsAComponent:
  1102. return "Node Is A Component";
  1103. case DGL_ERR_EdgeAlreadyExist:
  1104. return "Edge Already Exist";
  1105. case DGL_ERR_BadArgument:
  1106. return "Bad Argument";
  1107. }
  1108. return "unknown graph error code";
  1109. }
  1110. /*
  1111. * dglGraph_s hiders
  1112. */
  1113. int dglGet_Version(dglGraph_s * pgraph)
  1114. {
  1115. return pgraph->Version;
  1116. }
  1117. void dglSet_Version(dglGraph_s * pgraph, int nVersion)
  1118. {
  1119. pgraph->Version = nVersion;
  1120. }
  1121. int dglGet_Endianess(dglGraph_s * pgraph)
  1122. {
  1123. return pgraph->Endian;
  1124. }
  1125. int dglGet_NodeAttrSize(dglGraph_s * pgraph)
  1126. {
  1127. return pgraph->NodeAttrSize;
  1128. }
  1129. int dglGet_EdgeAttrSize(dglGraph_s * pgraph)
  1130. {
  1131. return pgraph->EdgeAttrSize;
  1132. }
  1133. int dglGet_NodeCount(dglGraph_s * pgraph)
  1134. {
  1135. return pgraph->cNode;
  1136. }
  1137. int dglGet_HeadNodeCount(dglGraph_s * pgraph)
  1138. {
  1139. return pgraph->cHead;
  1140. }
  1141. int dglGet_TailNodeCount(dglGraph_s * pgraph)
  1142. {
  1143. return pgraph->cTail;
  1144. }
  1145. int dglGet_AloneNodeCount(dglGraph_s * pgraph)
  1146. {
  1147. return pgraph->cAlone;
  1148. }
  1149. int dglGet_EdgeCount(dglGraph_s * pgraph)
  1150. {
  1151. return pgraph->cEdge;
  1152. }
  1153. int dglGet_State(dglGraph_s * pgraph)
  1154. {
  1155. return pgraph->Flags;
  1156. }
  1157. dglInt32_t *dglGet_Opaque(dglGraph_s * pgraph)
  1158. {
  1159. return pgraph->aOpaqueSet;
  1160. }
  1161. void dglSet_Opaque(dglGraph_s * pgraph, dglInt32_t * pOpaque)
  1162. {
  1163. memcpy(pgraph->aOpaqueSet, pOpaque, sizeof(dglInt32_t) * 16);
  1164. }
  1165. int dglGet_NodeSize(dglGraph_s * pgraph)
  1166. {
  1167. switch (pgraph->Version) {
  1168. case 1:
  1169. return DGL_NODE_SIZEOF_v1(pgraph->NodeAttrSize);
  1170. #ifdef DGL_V2
  1171. case 2:
  1172. case 3:
  1173. return DGL_NODE_SIZEOF_v2(pgraph->NodeAttrSize);
  1174. #endif
  1175. }
  1176. pgraph->iErrno = DGL_ERR_BadVersion;
  1177. return -pgraph->iErrno;
  1178. }
  1179. int dglGet_EdgeSize(dglGraph_s * pgraph)
  1180. {
  1181. switch (pgraph->Version) {
  1182. case 1:
  1183. return DGL_EDGE_SIZEOF_v1(pgraph->NodeAttrSize);
  1184. #ifdef DGL_V2
  1185. case 2:
  1186. case 3:
  1187. return DGL_EDGE_SIZEOF_v2(pgraph->NodeAttrSize);
  1188. #endif
  1189. }
  1190. pgraph->iErrno = DGL_ERR_BadVersion;
  1191. return -pgraph->iErrno;
  1192. }
  1193. dglInt64_t dglGet_Cost(dglGraph_s * pgraph)
  1194. {
  1195. return pgraph->nnCost;
  1196. }
  1197. void dglSet_Cost(dglGraph_s * pgraph, dglInt64_t nnCost)
  1198. {
  1199. pgraph->nnCost = nnCost;
  1200. }
  1201. dglInt32_t dglGet_Family(dglGraph_s * pgraph)
  1202. {
  1203. return pgraph->nFamily;
  1204. }
  1205. void dglSet_Family(dglGraph_s * pgraph, dglInt32_t nFamily)
  1206. {
  1207. pgraph->nFamily = nFamily;
  1208. }
  1209. dglInt32_t dglGet_Options(dglGraph_s * pgraph)
  1210. {
  1211. return pgraph->nOptions;
  1212. }
  1213. void dglSet_Options(dglGraph_s * pgraph, dglInt32_t nOptions)
  1214. {
  1215. pgraph->nOptions = nOptions;
  1216. }
  1217. dglEdgePrioritizer_s *dglGet_EdgePrioritizer(dglGraph_s * pGraph)
  1218. {
  1219. return &pGraph->edgePrioritizer;
  1220. }
  1221. dglNodePrioritizer_s *dglGet_NodePrioritizer(dglGraph_s * pGraph)
  1222. {
  1223. return &pGraph->nodePrioritizer;
  1224. }
  1225. /*
  1226. * Node Traverse
  1227. */
  1228. int dglNode_T_Initialize(dglNodeTraverser_s * pT, dglGraph_s * pGraph)
  1229. {
  1230. switch (pGraph->Version) {
  1231. case 1:
  1232. return dgl_node_t_initialize_V1(pGraph, pT);
  1233. #ifdef DGL_V2
  1234. case 2:
  1235. case 3:
  1236. return dgl_node_t_initialize_V2(pGraph, pT);
  1237. #endif
  1238. }
  1239. pGraph->iErrno = DGL_ERR_BadVersion;
  1240. return -pGraph->iErrno;
  1241. }
  1242. void dglNode_T_Release(dglNodeTraverser_s * pT)
  1243. {
  1244. switch (pT->pGraph->Version) {
  1245. case 1:
  1246. dgl_node_t_release_V1(pT);
  1247. return;
  1248. #ifdef DGL_V2
  1249. case 2:
  1250. case 3:
  1251. dgl_node_t_release_V2(pT);
  1252. return;
  1253. #endif
  1254. }
  1255. pT->pGraph->iErrno = DGL_ERR_BadVersion;
  1256. }
  1257. dglInt32_t *dglNode_T_First(dglNodeTraverser_s * pT)
  1258. {
  1259. switch (pT->pGraph->Version) {
  1260. case 1:
  1261. return dgl_node_t_first_V1(pT);
  1262. #ifdef DGL_V2
  1263. case 2:
  1264. case 3:
  1265. return dgl_node_t_first_V2(pT);
  1266. #endif
  1267. }
  1268. pT->pGraph->iErrno = DGL_ERR_BadVersion;
  1269. return NULL;
  1270. }
  1271. dglInt32_t *dglNode_T_Next(dglNodeTraverser_s * pT)
  1272. {
  1273. switch (pT->pGraph->Version) {
  1274. case 1:
  1275. return dgl_node_t_next_V1(pT);
  1276. #ifdef DGL_V2
  1277. case 2:
  1278. case 3:
  1279. return dgl_node_t_next_V2(pT);
  1280. #endif
  1281. }
  1282. pT->pGraph->iErrno = DGL_ERR_BadVersion;
  1283. return NULL;
  1284. }
  1285. dglInt32_t *dglNode_T_Find(dglNodeTraverser_s * pT, dglInt32_t nNodeId)
  1286. {
  1287. switch (pT->pGraph->Version) {
  1288. case 1:
  1289. return dgl_node_t_find_V1(pT, nNodeId);
  1290. #ifdef DGL_V2
  1291. case 2:
  1292. case 3:
  1293. return dgl_node_t_find_V2(pT, nNodeId);
  1294. #endif
  1295. }
  1296. pT->pGraph->iErrno = DGL_ERR_BadVersion;
  1297. return NULL;
  1298. }
  1299. /*
  1300. * Edge Traverser
  1301. */
  1302. int dglEdge_T_Initialize(dglEdgeTraverser_s * pT,
  1303. dglGraph_s * pGraph,
  1304. dglEdgePrioritizer_s * pEdgePrioritizer)
  1305. {
  1306. switch (pGraph->Version) {
  1307. case 1:
  1308. return dgl_edge_t_initialize_V1(pGraph, pT, pEdgePrioritizer);
  1309. #ifdef DGL_V2
  1310. case 2:
  1311. case 3:
  1312. return dgl_edge_t_initialize_V2(pGraph, pT, pEdgePrioritizer);
  1313. #endif
  1314. }
  1315. pGraph->iErrno = DGL_ERR_BadVersion;
  1316. return -pGraph->iErrno;
  1317. }
  1318. void dglEdge_T_Release(dglEdgeTraverser_s * pT)
  1319. {
  1320. switch (pT->pGraph->Version) {
  1321. case 1:
  1322. dgl_edge_t_release_V1(pT);
  1323. return;
  1324. #ifdef DGL_V2
  1325. case 2:
  1326. case 3:
  1327. dgl_edge_t_release_V2(pT);
  1328. return;
  1329. #endif
  1330. }
  1331. pT->pGraph->iErrno = DGL_ERR_BadVersion;
  1332. }
  1333. dglInt32_t *dglEdge_T_First(dglEdgeTraverser_s * pT)
  1334. {
  1335. switch (pT->pGraph->Version) {
  1336. case 1:
  1337. return dgl_edge_t_first_V1(pT);
  1338. #ifdef DGL_V2
  1339. case 2:
  1340. case 3:
  1341. return dgl_edge_t_first_V2(pT);
  1342. #endif
  1343. }
  1344. pT->pGraph->iErrno = DGL_ERR_BadVersion;
  1345. return NULL;
  1346. }
  1347. dglInt32_t *dglEdge_T_Next(dglEdgeTraverser_s * pT)
  1348. {
  1349. switch (pT->pGraph->Version) {
  1350. case 1:
  1351. return dgl_edge_t_next_V1(pT);
  1352. #ifdef DGL_V2
  1353. case 2:
  1354. case 3:
  1355. return dgl_edge_t_next_V2(pT);
  1356. #endif
  1357. }
  1358. pT->pGraph->iErrno = DGL_ERR_BadVersion;
  1359. return NULL;
  1360. }
  1361. int dglEdgeset_T_Initialize(dglEdgesetTraverser_s * pT,
  1362. dglGraph_s * pGraph, dglInt32_t * pnEdgeset)
  1363. {
  1364. switch (pGraph->Version) {
  1365. case 1:
  1366. return dgl_edgeset_t_initialize_V1(pGraph, pT, pnEdgeset);
  1367. #ifdef DGL_V2
  1368. case 2:
  1369. case 3:
  1370. return dgl_edgeset_t_initialize_V2(pGraph, pT, pnEdgeset);
  1371. #endif
  1372. }
  1373. pGraph->iErrno = DGL_ERR_BadVersion;
  1374. return -pGraph->iErrno;
  1375. }
  1376. void dglEdgeset_T_Release(dglEdgesetTraverser_s * pT)
  1377. {
  1378. }
  1379. dglInt32_t *dglEdgeset_T_First(dglEdgesetTraverser_s * pT)
  1380. {
  1381. switch (pT->pGraph->Version) {
  1382. case 1:
  1383. return dgl_edgeset_t_first_V1(pT);
  1384. #ifdef DGL_V2
  1385. case 2:
  1386. case 3:
  1387. return dgl_edgeset_t_first_V2(pT);
  1388. #endif
  1389. }
  1390. pT->pGraph->iErrno = DGL_ERR_BadVersion;
  1391. return NULL;
  1392. }
  1393. dglInt32_t *dglEdgeset_T_Next(dglEdgesetTraverser_s * pT)
  1394. {
  1395. switch (pT->pGraph->Version) {
  1396. case 1:
  1397. return dgl_edgeset_t_next_V1(pT);
  1398. #ifdef DGL_V2
  1399. case 2:
  1400. case 3:
  1401. return dgl_edgeset_t_next_V2(pT);
  1402. #endif
  1403. }
  1404. pT->pGraph->iErrno = DGL_ERR_BadVersion;
  1405. return NULL;
  1406. }
  1407. /*
  1408. * chunked I/O
  1409. */
  1410. #define __CIO_BEGIN 0
  1411. #define __CIO_W_HEADER 1
  1412. #define __CIO_W_NODEBUFFER 2
  1413. #define __CIO_W_EDGEBUFFER 3
  1414. #define __CIO_R_HEADER 4
  1415. #define __CIO_R_NODEBUFFER 5
  1416. #define __CIO_R_EDGEBUFFER 6
  1417. #define __CIO_END 7
  1418. int dglIOContextInitialize(dglGraph_s * pG, dglIOContext_s * pIO)
  1419. {
  1420. pIO->pG = pG;
  1421. pIO->nState = __CIO_BEGIN;
  1422. pIO->cb = 0;
  1423. pIO->ib = 0;
  1424. pIO->pb = NULL;
  1425. return 0;
  1426. }
  1427. void dglIOContextRelease(dglIOContext_s * pIO)
  1428. {
  1429. }
  1430. int dglWriteChunk(dglIOContext_s * pIO, dglWriteChunk_fn pfn, void *pv)
  1431. {
  1432. unsigned char *pb;
  1433. int cb;
  1434. switch (pIO->nState) {
  1435. case __CIO_BEGIN:
  1436. pIO->pb = pIO->ab;
  1437. pb = pIO->pb;
  1438. memcpy(pb, &pIO->pG->Version, 1);
  1439. pb += 1; /* 1 */
  1440. memcpy(pb, &pIO->pG->Endian, 1);
  1441. pb += 1; /* 2 */
  1442. memcpy(pb, &pIO->pG->NodeAttrSize, 4);
  1443. pb += 4; /* 6 */
  1444. memcpy(pb, &pIO->pG->EdgeAttrSize, 4);
  1445. pb += 4; /* 10 */
  1446. memcpy(pb, &pIO->pG->aOpaqueSet, 64);
  1447. pb += 64; /* 74 */
  1448. memcpy(pb, &pIO->pG->nOptions, 4);
  1449. pb += 4; /* 78 */
  1450. memcpy(pb, &pIO->pG->nFamily, 4);
  1451. pb += 4; /* 82 */
  1452. memcpy(pb, &pIO->pG->nnCost, 8);
  1453. pb += 8; /* 90 */
  1454. memcpy(pb, &pIO->pG->cNode, 4);
  1455. pb += 4; /* 94 */
  1456. memcpy(pb, &pIO->pG->cHead, 4);
  1457. pb += 4; /* 98 */
  1458. memcpy(pb, &pIO->pG->cTail, 4);
  1459. pb += 4; /* 102 */
  1460. memcpy(pb, &pIO->pG->cAlone, 4);
  1461. pb += 4; /* 106 */
  1462. memcpy(pb, &pIO->pG->cEdge, 4);
  1463. pb += 4; /* 110 */
  1464. memcpy(pb, &pIO->pG->iNodeBuffer, 4);
  1465. pb += 4; /* 114 */
  1466. memcpy(pb, &pIO->pG->iEdgeBuffer, 4);
  1467. pb += 4; /* 118 */
  1468. pIO->cb = 118;
  1469. cb = pfn(pIO->pG, pIO->pb, pIO->cb, pv);
  1470. if (cb >= 0) {
  1471. pIO->ib += cb;
  1472. if ((pIO->cb - pIO->ib) == 0) {
  1473. pIO->ib = 0;
  1474. pIO->cb = pIO->pG->iNodeBuffer;
  1475. pIO->pb = pIO->pG->pNodeBuffer;
  1476. pIO->nState = __CIO_W_NODEBUFFER;
  1477. }
  1478. else {
  1479. pIO->nState = __CIO_W_HEADER;
  1480. }
  1481. }
  1482. return cb;
  1483. case __CIO_W_HEADER:
  1484. cb = pfn(pIO->pG, pIO->pb + pIO->ib, pIO->cb - pIO->ib, pv);
  1485. if (cb > 0) {
  1486. pIO->ib += cb;
  1487. if ((pIO->cb - pIO->ib) == 0) {
  1488. if (pIO->pG->iNodeBuffer > 0) {
  1489. pIO->ib = 0;
  1490. pIO->cb = pIO->pG->iNodeBuffer;
  1491. pIO->pb = pIO->pG->pNodeBuffer;
  1492. pIO->nState = __CIO_W_NODEBUFFER;
  1493. }
  1494. else if (pIO->pG->iEdgeBuffer > 0) {
  1495. pIO->ib = 0;
  1496. pIO->cb = pIO->pG->iEdgeBuffer;
  1497. pIO->pb = pIO->pG->pEdgeBuffer;
  1498. pIO->nState = __CIO_W_EDGEBUFFER;
  1499. }
  1500. else {
  1501. pIO->nState = __CIO_END;
  1502. }
  1503. }
  1504. else {
  1505. pIO->nState = __CIO_W_HEADER;
  1506. }
  1507. }
  1508. return cb;
  1509. case __CIO_W_NODEBUFFER:
  1510. cb = pfn(pIO->pG, pIO->pb + pIO->ib, pIO->cb - pIO->ib, pv);
  1511. if (cb > 0) {
  1512. pIO->ib += cb;
  1513. if ((pIO->cb - pIO->ib) == 0) {
  1514. if (pIO->pG->iEdgeBuffer > 0) {
  1515. pIO->ib = 0;
  1516. pIO->cb = pIO->pG->iEdgeBuffer;
  1517. pIO->pb = pIO->pG->pEdgeBuffer;
  1518. pIO->nState = __CIO_W_EDGEBUFFER;
  1519. }
  1520. else {
  1521. pIO->nState = __CIO_END;
  1522. }
  1523. }
  1524. }
  1525. return cb;
  1526. case __CIO_W_EDGEBUFFER:
  1527. cb = pfn(pIO->pG, pIO->pb + pIO->ib, pIO->cb - pIO->ib, pv);
  1528. if (cb > 0) {
  1529. pIO->ib += cb;
  1530. if ((pIO->cb - pIO->ib) == 0) {
  1531. pIO->nState = __CIO_END;
  1532. }
  1533. }
  1534. return cb;
  1535. case __CIO_END:
  1536. pfn(pIO->pG, NULL, 0, pv); /* notify end of graph */
  1537. return 0;
  1538. }
  1539. return 0;
  1540. }
  1541. #ifndef MIN
  1542. #define MIN(x,y) (((x)<(y))?x:y)
  1543. #endif
  1544. int dglReadChunk(dglIOContext_s * pIO, dglByte_t * pbChunk, int cbChunk)
  1545. {
  1546. int i, c;
  1547. unsigned char *pb;
  1548. switch (pIO->nState) {
  1549. case __CIO_BEGIN:
  1550. pIO->cb = 118;
  1551. pIO->ib = 0;
  1552. pIO->pb = pIO->ab;
  1553. c = MIN(cbChunk, 118);
  1554. memcpy(pIO->pb, pbChunk, c);
  1555. pIO->ib += c;
  1556. if ((pIO->cb - pIO->ib) == 0)
  1557. goto init_nodebuffer;
  1558. pIO->nState = __CIO_R_HEADER;
  1559. return c;
  1560. case __CIO_R_HEADER:
  1561. c = MIN(cbChunk, pIO->cb - pIO->ib);
  1562. memcpy(pIO->pb + pIO->ib, pbChunk, c);
  1563. pIO->ib += c;
  1564. init_nodebuffer:
  1565. if ((pIO->cb - pIO->ib) == 0) {
  1566. pb = pIO->pb;
  1567. memcpy(&pIO->pG->Version, pb, 1);
  1568. pb += 1; /* 1 */
  1569. memcpy(&pIO->pG->Endian, pb, 1);
  1570. pb += 1; /* 2 */
  1571. memcpy(&pIO->pG->NodeAttrSize, pb, 4);
  1572. pb += 4; /* 6 */
  1573. memcpy(&pIO->pG->EdgeAttrSize, pb, 4);
  1574. pb += 4; /* 10 */
  1575. memcpy(&pIO->pG->aOpaqueSet, pb, 64);
  1576. pb += 64; /* 74 */
  1577. memcpy(&pIO->pG->nOptions, pb, 4);
  1578. pb += 4; /* 78 */
  1579. memcpy(&pIO->pG->nFamily, pb, 4);
  1580. pb += 4; /* 82 */
  1581. memcpy(&pIO->pG->nnCost, pb, 8);
  1582. pb += 8; /* 90 */
  1583. memcpy(&pIO->pG->cNode, pb, 4);
  1584. pb += 4; /* 94 */
  1585. memcpy(&pIO->pG->cHead, pb, 4);
  1586. pb += 4; /* 98 */
  1587. memcpy(&pIO->pG->cTail, pb, 4);
  1588. pb += 4; /* 102 */
  1589. memcpy(&pIO->pG->cAlone, pb, 4);
  1590. pb += 4; /* 106 */
  1591. memcpy(&pIO->pG->cEdge, pb, 4);
  1592. pb += 4; /* 110 */
  1593. memcpy(&pIO->pG->iNodeBuffer, pb, 4);
  1594. pb += 4; /* 114 */
  1595. memcpy(&pIO->pG->iEdgeBuffer, pb, 4);
  1596. pb += 4; /* 118 */
  1597. pIO->fSwap = 0;
  1598. #ifdef DGL_ENDIAN_BIG
  1599. if (pIO->pG->Endian == DGL_ENDIAN_LITTLE)
  1600. pIO->fSwap = 1;
  1601. #else
  1602. if (pIO->pG->Endian == DGL_ENDIAN_BIG)
  1603. pIO->fSwap = 1;
  1604. #endif
  1605. if (pIO->fSwap) {
  1606. dgl_swapInt32Bytes(&pIO->pG->NodeAttrSize);
  1607. dgl_swapInt32Bytes(&pIO->pG->EdgeAttrSize);
  1608. dgl_swapInt32Bytes(&pIO->pG->nOptions);
  1609. dgl_swapInt32Bytes(&pIO->pG->nFamily);
  1610. dgl_swapInt64Bytes(&pIO->pG->nnCost);
  1611. dgl_swapInt32Bytes(&pIO->pG->cNode);
  1612. dgl_swapInt32Bytes(&pIO->pG->cHead);
  1613. dgl_swapInt32Bytes(&pIO->pG->cTail);
  1614. dgl_swapInt32Bytes(&pIO->pG->cAlone);
  1615. dgl_swapInt32Bytes(&pIO->pG->cEdge);
  1616. dgl_swapInt32Bytes(&pIO->pG->iNodeBuffer);
  1617. dgl_swapInt32Bytes(&pIO->pG->iEdgeBuffer);
  1618. for (i = 0; i < 16; i++) {
  1619. dgl_swapInt32Bytes(&pIO->pG->aOpaqueSet[i]);
  1620. }
  1621. #ifdef DGL_ENDIAN_BIG
  1622. pIO->pG->Endian = DGL_ENDIAN_BIG;
  1623. #else
  1624. pIO->pG->Endian = DGL_ENDIAN_LITTLE;
  1625. #endif
  1626. }
  1627. if (pIO->pG->iNodeBuffer > 0) {
  1628. pIO->pG->pNodeBuffer = malloc(pIO->pG->iNodeBuffer);
  1629. if (pIO->pG->pNodeBuffer == NULL) {
  1630. return -1;
  1631. }
  1632. pIO->cb = pIO->pG->iNodeBuffer;
  1633. pIO->pb = pIO->pG->pNodeBuffer;
  1634. pIO->ib = 0;
  1635. pIO->nState = __CIO_R_NODEBUFFER;
  1636. }
  1637. else {
  1638. goto init_edgebuffer;
  1639. }
  1640. }
  1641. return c;
  1642. case __CIO_R_NODEBUFFER:
  1643. c = MIN(cbChunk, pIO->cb - pIO->ib);
  1644. memcpy(pIO->pb + pIO->ib, pbChunk, c);
  1645. pIO->ib += c;
  1646. init_edgebuffer:
  1647. if ((pIO->cb - pIO->ib) == 0) {
  1648. if (pIO->pG->iEdgeBuffer > 0) {
  1649. pIO->pG->pEdgeBuffer = malloc(pIO->pG->iEdgeBuffer);
  1650. if (pIO->pG->pEdgeBuffer == NULL) {
  1651. return -1;
  1652. }
  1653. pIO->cb = pIO->pG->iEdgeBuffer;
  1654. pIO->pb = pIO->pG->pEdgeBuffer;
  1655. pIO->ib = 0;
  1656. pIO->nState = __CIO_R_EDGEBUFFER;
  1657. }
  1658. else {
  1659. pIO->nState = __CIO_END;
  1660. }
  1661. }
  1662. return c;
  1663. case __CIO_R_EDGEBUFFER:
  1664. c = MIN(cbChunk, pIO->cb - pIO->ib);
  1665. memcpy(pIO->pb + pIO->ib, pbChunk, c);
  1666. pIO->ib += c;
  1667. if ((pIO->cb - pIO->ib) == 0) {
  1668. pIO->nState = __CIO_END;
  1669. }
  1670. return c;
  1671. case __CIO_END:
  1672. {
  1673. /* switch on FLAT bit */
  1674. pIO->pG->Flags |= DGL_GS_FLAT;
  1675. /* nodebuffer and edgebuffer are both arrays on 32 bit integer
  1676. * byte order swapping is straightforward
  1677. */
  1678. if (pIO->fSwap && pIO->pG->iNodeBuffer > 0) {
  1679. int in, cn;
  1680. dglInt32_t *pn;
  1681. for (cn = pIO->pG->iNodeBuffer / sizeof(dglInt32_t),
  1682. pn = (dglInt32_t *) pIO->pG->pNodeBuffer,
  1683. in = 0; in < cn; in++) {
  1684. dgl_swapInt32Bytes(&pn[in]);
  1685. }
  1686. }
  1687. if (pIO->fSwap && pIO->pG->iEdgeBuffer > 0) {
  1688. int in, cn;
  1689. dglInt32_t *pn;
  1690. for (cn = pIO->pG->iEdgeBuffer / sizeof(dglInt32_t),
  1691. pn = (dglInt32_t *) pIO->pG->pEdgeBuffer,
  1692. in = 0; in < cn; in++) {
  1693. dgl_swapInt32Bytes(&pn[in]);
  1694. }
  1695. }
  1696. }
  1697. return 0;
  1698. default:
  1699. return 0;
  1700. }
  1701. }