1#ifndef INTERNAL_H
2#define INTERNAL_H
3
4#include "shinobi.h"
5
6struct CallFrame {
7 char **args;
8 size_t nargs;
9 struct CallFrame *next;
10};
11
12struct EvalCtx {
13 struct Env *env;
14 struct RuleSet *out;
15 struct CallFrame *call;
16 const char *auto_target;
17 const struct StrList *auto_prereqs;
18 const char *auto_stem;
19 int errors;
20 int avoid_io;
21 struct StrList *side_effects;
22 const char *cur_path;
23 int cur_line;
24 struct StrList exports;
25 struct StrList unexports;
26 int export_all;
27 enum ShinMode mode;
28};
29
30struct SpecialTargets {
31 int posix;
32 struct StrList phony;
33 char recipeprefix;
34 int export_all;
35};
36
37void *xmalloc(size_t n);
38void set_progname(const char *name);
39void warnlikemake(const char *path, int line, const char *msg);
40void dielikemake(const char *path, int line, const char *msg, const char *detail);
41void *xrealloc(void *p, size_t n);
42char *xstrndup(const char *s, size_t n);
43char *xstrdup(const char *s);
44void arena_init(struct Arena *a, size_t block_size);
45void *arena_alloc(struct Arena *a, size_t n);
46char *arena_strndup(struct Arena *a, const char *s, size_t n);
47char *arena_strdup(struct Arena *a, const char *s);
48void arena_free(struct Arena *a);
49const char *intern(const char *s);
50char *readfile(const char *path);
51int loadmakefile(const char *path, char **path_out, char **src_out);
52char *appendassigns(char *src, const struct StrList *assigns);
53char *getcwddup(void);
54char *joinpath(const char *dir, const char *name);
55char *normpath(const char *path);
56char *joinstrs(const struct StrList *list, const char *sep);
57void addstr(struct StrList *list, const char *s);
58int hasword(const struct StrList *list, const char *word);
59int targetownedby(const struct Target *t, const char *owner);
60int usesub(const struct Graph *graph, size_t idx);
61const struct Target *defaulttarget(const struct Graph *graph, const char *owner);
62void addnode(struct NodeList *list, struct Node node);
63void splitwords(struct StrList *out, const char *s, size_t n);
64char *cat3(const char *a, const char *b, const char *c);
65void addwords(struct StrList *dest, const struct StrList *src);
66void adduniqwords(struct StrList *dest, const struct StrList *src);
67void addrecipe(struct RecipeList *dest, const char *raw);
68void addrecipes(struct RecipeList *dest, const struct RecipeList *src);
69void freestrs(struct StrList *list);
70void freerecipes(struct RecipeList *list);
71void freesubmake(struct SubMake *sm);
72void copysubmake(struct SubMake *dst, const struct SubMake *src);
73int parsesubmake(struct SubMake *dst, const char *cmd);
74void envsetvar(struct Env *env, const char *name, char *val, int simple, enum Origin origin,
75 int exported);
76void envdelvar(struct Env *env, const char *name);
77struct Target *findtarget(struct Graph *graph, const char *name);
78const struct Target *findctarget(const struct Graph *graph, const char *name);
79struct Target *gettarget(struct Graph *graph, const char *name, int *added);
80void reindexgraph(struct Graph *graph);
81const char *firstprereq(const struct Target *t);
82char *joinallprereqs(const struct Target *t, const char *sep);
83size_t totalprereqs(const struct Target *t);
84void initspecialtargets(struct SpecialTargets *targets);
85void updatespecialassign(struct SpecialTargets *targets, const char *lhs, const char *rhs);
86int handlespecialrule(struct SpecialTargets *targets, const struct RuleNode *rule);
87
88struct Var *findvar(struct Env *env, const char *name);
89char *expandstr(struct EvalCtx *ctx, const char *s);
90void seedenv(struct Env *env, int posix, int envoverride, enum ShinMode mode);
91void freeenv(struct Env *env);
92void copyenv(struct Env *dst, const struct Env *src);
93void evalassign(struct EvalCtx *ctx, const struct AssignNode *in);
94
95char *fnwildcard(const char *patterns);
96char *fnshell(const char *cmd);
97char *fnfilter(const char *patterns, const char *text);
98char *fnfilterout(const char *patterns, const char *text);
99char *fnfindstring(const char *find, const char *in);
100char *fnaddprefix(const char *prefix, const char *names);
101char *fnaddsuffix(const char *suffix, const char *names);
102char *fnjoin(const char *list1, const char *list2);
103char *fnstrip(const char *text);
104char *fnsort(const char *text);
105char *fninfo(struct EvalCtx *ctx, const char *args);
106char *fnorigin(struct EvalCtx *ctx, const char *args);
107char *fnvalue(struct EvalCtx *ctx, const char *args);
108char *fnnotdir(const char *names);
109char *fndir(const char *names);
110char *fnbasename(const char *names);
111char *fnsubst(const char *from, const char *to, const char *text);
112char *fnpatsubst(const char *pattern, const char *replacement, const char *text);
113char *fnif(const char *cond, const char *then, const char *otherwise);
114char *fnor(struct EvalCtx *ctx, const char *args);
115char *fnwords(const char *text);
116char *fnword(const char *n, const char *list);
117char *fnwordlist(const char *s, const char *e, const char *list);
118char *fnfirstword(const char *list);
119char *fnlastword(const char *list);
120char *fnrealpath(const char *path);
121char *fnabspath(const char *path);
122
123char *fncall(struct EvalCtx *ctx, const char *args);
124char *fnforeach(struct EvalCtx *ctx, const char *args);
125char *fneval(struct EvalCtx *ctx, const char *args);
126int evalsnippet(struct EvalCtx *ctx, const char *path, const char *src);
127
128const char *shinmode_name(enum ShinMode mode);
129int shinmode_parse(const char *s, enum ShinMode *out);
130
131#endif