--- /dev/null
+#include "config.h"
+#include <stdio.h>
+#include <string.h>
+
+/**
+ * a_star - A straightforward implementation of the a-star path finding algorithm
+ *
+ * This code implements the A-star pathfinding algorithm without relying on any
+ * particular representation of the graph being searched other than that each node
+ * can be represented uniquely by a void pointer, which it treats as an opaque
+ * identifier. To use it, you need to provide, besides a start and a goal node,
+ * a function to estimate the distance (however you choose to define that) and
+ * cost (however you choose to define that) as a floating point value between
+ * two nodes, and a function to iterate over the neighbor nodes of any given
+ * node. Additionally you may provide a context pointer (cookie) which is simply
+ * passed back to your callback functions
+ *
+ * Example:
+ * #include <stdio.h>
+ * #include <string.h>
+ * #include <stdlib.h>
+ * #include <math.h>
+ *
+ * #include <ccan/a_star/a_star.h>
+ *
+ * static char maze[] =
+ * "##########@################x#################\n"
+ * "# # #\n"
+ * "# # #\n"
+ * "# ########### ################### #\n"
+ * "# # # # # #\n"
+ * "#### # # # #\n"
+ * "# # # ######## # #\n"
+ * "# # ######### # # # #\n"
+ * "# # # # #\n"
+ * "# # # # #\n"
+ * "# # ##### ##################\n"
+ * "# ########## # #\n"
+ * "# # # # #\n"
+ * "# ######################### #\n"
+ * "# # # # #\n"
+ * "############ # # # #\n"
+ * "# # # #\n"
+ * "#############################################\n";
+ *
+ * static int maze_width(char *maze)
+ * {
+ * char *n;
+ *
+ * n = strchr(maze, '\n');
+ * return 1 + n - maze;
+ * }
+ *
+ * static int xoff[] = { 0, 1, 0, -1 };
+ * static int yoff[] = { 1, 0, -1, 0 };
+ *
+ * static char *maze_node(char *maze, int x, int y)
+ * {
+ * return maze + y * maze_width(maze) + x;
+ * }
+ *
+ * static void *nth_neighbor(void *context, void *p, int n)
+ * {
+ * char *maze = context;
+ * char *c = p;
+ * int i, x, y, offset = c - maze;
+ *
+ * x = offset % maze_width(maze);
+ * y = offset / maze_width(maze);
+ *
+ * for (i = n; i < 4; i++) {
+ * int tx = x + xoff[i];
+ * int ty = y + yoff[i];
+ * if (tx < 0 || ty < 0)
+ * continue;
+ * if (ty * maze_width(maze) + tx > strlen(maze))
+ * continue;
+ * c = maze_node(maze, x + xoff[i], y + yoff[i]);
+ * if (*c != '#')
+ * return c;
+ * }
+ * return NULL;
+ * }
+ *
+ * static float maze_cost(void *context, void *first, void *second)
+ * {
+ * char *maze = context;
+ * char *f = first;
+ * char *s = second;
+ * int sx, sy, fx, fy;
+ * float d, dx, dy;
+ *
+ * int fp = f - maze;
+ * int sp = s - maze;
+ *
+ * sx = sp % maze_width(maze);
+ * sy = sp / maze_width(maze);
+ * fx = fp % maze_width(maze);
+ * fy = fp / maze_width(maze);
+ *
+ * dx = (float) sx - fx;
+ * dy = (float) sy - fy;
+ * d = (float) (abs(dx) + abs(dy));
+ * return d;
+ * }
+ *
+ * int main(int argc, char *argv[])
+ * {
+ * static int maxnodes, i;
+ * char *start, *goal;
+ * struct a_star_path *path;
+ *
+ * start = strchr(maze, '@');
+ * goal = strchr(maze, 'x');
+ * maxnodes = strlen(maze);
+ *
+ * path = a_star((void *) maze, start, goal, maxnodes, maze_cost, maze_cost, nth_neighbor);
+ * if (!path) {
+ * printf("a_star() failed to return a path.\n");
+ * return 0;
+ * }
+ * for (i = 0; i < path->node_count; i++) {
+ * char *p = path->path[i];
+ * *p = '.';
+ * }
+ * *goal = 'x';
+ * *start = '@';
+ *
+ * printf("%s\n", maze);
+ *
+ * free(path);
+ * return 0;
+ * }
+ * License: GPL (v2 or any later version)
+ */
+int main(int argc, char *argv[])
+{
+ /* Expect exactly one argument */
+ if (argc != 2)
+ return 1;
+
+ if (strcmp(argv[1], "depends") == 0) {
+ return 0;
+ }
+
+ return 1;
+}