Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
6
66
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Eric Vidal
66
Commits
a0a5a3bd
Commit
a0a5a3bd
authored
6 years ago
by
Eric Vidal
Browse files
Options
Downloads
Patches
Plain Diff
add ss_resolve_graph_? function
parent
fb2b2c4b
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
src/include/66/resolve.h
+61
-2
61 additions, 2 deletions
src/include/66/resolve.h
src/lib66/resolve_graph.c
+180
-0
180 additions, 0 deletions
src/lib66/resolve_graph.c
with
241 additions
and
2 deletions
src/include/66/resolve.h
+
61
−
2
View file @
a0a5a3bd
...
...
@@ -17,6 +17,7 @@
#include
<stddef.h>
#include
<skalibs/genalloc.h>
#include
<skalibs/stralloc.h>
#include
<skalibs/types.h>
#include
<skalibs/uint32.h>
...
...
@@ -76,18 +77,63 @@ struct ss_resolve_s
}
;
#define RESOLVE_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
/** Graph struct */
typedef
struct
ss_resolve_graph_ndeps_s
ss_resolve_graph_ndeps_t
;
struct
ss_resolve_graph_ndeps_s
{
uint32_t
idx
;
//uint32_t
genalloc
ndeps
;
//uint32_t
}
;
#define RESOLVE_GRAPH_NDEPS_ZERO { 0 , GENALLOC_ZERO }
typedef
struct
ss_resolve_graph_s
ss_resolve_graph_t
,
*
ss_resolve_graph_t_ref
;
struct
ss_resolve_graph_s
{
genalloc
name
;
//ss_resolve_t
genalloc
cp
;
//ss_resolve_graph_ndeps_t
genalloc
sorted
;
//ss_resolve_t
}
;
#define RESOLVE_GRAPH_ZERO { GENALLOC_ZERO , GENALLOC_ZERO , GENALLOC_ZERO }
typedef
enum
visit_e
visit
;
enum
visit_e
{
WHITE
=
0
,
GRAY
,
BLACK
}
;
#define UTF_V "\342\224\202"
/* U+2502, Vertical line drawing char */
#define UTF_VR "\342\224\234"
/* U+251C, Vertical and right */
#define UTF_H "\342\224\200"
/* U+2500, Horizontal */
#define UTF_UR "\342\224\224"
/* U+2514, Up and right */
typedef
struct
ss_resolve_graph_style_s
ss_resolve_graph_style
;
struct
ss_resolve_graph_style_s
{
const
char
*
tip
;
const
char
*
last
;
const
char
*
limb
;
int
indent
;
}
;
extern
unsigned
int
MAXDEPTH
;
extern
ss_resolve_graph_style
*
STYLE
;
extern
ss_resolve_graph_style
graph_utf8
;
extern
ss_resolve_graph_style
graph_default
;
extern
ss_resolve_t
const
ss_resolve_zero
;
extern
void
ss_resolve_init
(
ss_resolve_t
*
res
)
;
extern
void
ss_resolve_free
(
ss_resolve_t
*
res
)
;
extern
int
ss_resolve_pointo
(
stralloc
*
sa
,
ssexec_t
*
info
,
unsigned
int
type
,
unsigned
int
where
)
;
extern
int
ss_resolve_src
(
genalloc
*
ga
,
stralloc
*
sasrc
,
char
const
*
name
,
char
const
*
src
,
unsigned
int
*
found
)
;
extern
void
ss_resolve_init
(
ss_resolve_t
*
res
)
;
extern
int
ss_resolve_add_uint32
(
stralloc
*
sa
,
uint32_t
data
)
;
extern
int
ss_resolve_add_uint64
(
stralloc
*
sa
,
uint64_t
data
)
;
extern
uint32_t
ss_resolve_add_string
(
ss_resolve_t
*
res
,
char
const
*
data
)
;
extern
int
ss_resolve_pack
(
stralloc
*
sa
,
ss_resolve_t
*
res
)
;
extern
int
ss_resolve_write
(
ss_resolve_t
*
res
,
char
const
*
dst
,
char
const
*
name
,
int
both
)
;
extern
int
ss_resolve_read
(
ss_resolve_t
*
res
,
char
const
*
src
,
char
const
*
name
)
;
extern
void
ss_resolve_free
(
ss_resolve_t
*
res
)
;
extern
int
ss_resolve_check
(
char
const
*
src
,
char
const
*
name
)
;
extern
int
ss_resolve_setnwrite
(
sv_alltype
*
services
,
ssexec_t
*
info
,
char
const
*
dst
)
;
extern
int
ss_resolve_setlognwrite
(
ss_resolve_t
*
sv
,
char
const
*
dst
)
;
...
...
@@ -100,5 +146,18 @@ extern int ss_resolve_add_logger(genalloc *ga,char const *src) ;
extern
int
ss_resolve_copy
(
ss_resolve_t
*
dst
,
ss_resolve_t
*
res
)
;
extern
int
ss_resolve_append
(
genalloc
*
ga
,
ss_resolve_t
*
res
)
;
extern
int
ss_resolve_create_live
(
ssexec_t
*
info
)
;
extern
int
ss_resolve_search
(
genalloc
*
ga
,
char
const
*
name
)
;
extern
int
ss_resolve_check_insrc
(
ssexec_t
*
info
,
char
const
*
name
)
;
extern
int
ss_resolve_write_master
(
ssexec_t
*
info
,
ss_resolve_graph_t
*
graph
,
char
const
*
dir
,
int
writein
,
unsigned
int
reverse
)
;
/** Graph function */
extern
void
ss_resolve_graph_ndeps_free
(
ss_resolve_graph_ndeps_t
*
graph
)
;
extern
void
ss_resolve_graph_free
(
ss_resolve_graph_t
*
graph
)
;
extern
int
ss_resolve_graph_src
(
ss_resolve_graph_t
*
graph
,
char
const
*
dir
,
unsigned
int
reverse
,
unsigned
int
what
)
;
extern
int
ss_resolve_graph_build
(
ss_resolve_graph_t
*
graph
,
ss_resolve_t
*
res
,
char
const
*
src
,
unsigned
int
reverse
)
;
extern
int
ss_resolve_graph_sort
(
ss_resolve_graph_t
*
graph
)
;
extern
int
ss_resolve_dfs
(
ss_resolve_graph_t
*
graph
,
unsigned
int
idx
,
visit
*
c
)
;
extern
int
ss_resolve_graph_publish
(
ss_resolve_graph_t
*
graph
,
unsigned
int
reverse
)
;
#endif
This diff is collapsed.
Click to expand it.
src/lib66/resolve_graph.c
0 → 100644
+
180
−
0
View file @
a0a5a3bd
#include
<66/resolve.h>
#include
<oblibs/string.h>
#include
<oblibs/directory.h>
#include
<skalibs/genalloc.h>
#include
<66/constants.h>
ss_resolve_graph_style
graph_utf8
=
{
UTF_VR
UTF_H
,
UTF_UR
UTF_H
,
UTF_V
" "
,
2
}
;
ss_resolve_graph_style
graph_default
=
{
"|-"
,
"`-"
,
"|"
,
2
}
;
void
ss_resolve_graph_ndeps_free
(
ss_resolve_graph_ndeps_t
*
graph
)
{
genalloc_free
(
uint32_t
,
&
graph
->
ndeps
)
;
}
void
ss_resolve_graph_free
(
ss_resolve_graph_t
*
graph
)
{
genalloc_deepfree
(
ss_resolve_t
,
&
graph
->
name
,
ss_resolve_free
)
;
genalloc_deepfree
(
ss_resolve_graph_ndeps_t
,
&
graph
->
cp
,
ss_resolve_graph_ndeps_free
)
;
genalloc_free
(
ss_resolve_t
,
&
graph
->
sorted
)
;
}
int
ss_resolve_dfs
(
ss_resolve_graph_t
*
graph
,
unsigned
int
idx
,
visit
*
c
)
{
int
cycle
=
0
;
unsigned
int
i
,
data
;
unsigned
int
len
=
genalloc_len
(
uint32_t
,
&
genalloc_s
(
ss_resolve_graph_ndeps_t
,
&
graph
->
cp
)[
idx
].
ndeps
)
;
if
(
c
[
idx
]
==
GRAY
)
return
1
;
if
(
c
[
idx
]
==
WHITE
)
{
c
[
idx
]
=
GRAY
;
for
(
i
=
0
;
i
<
len
;
i
++
)
{
data
=
genalloc_s
(
uint32_t
,
&
genalloc_s
(
ss_resolve_graph_ndeps_t
,
&
graph
->
cp
)[
idx
].
ndeps
)[
i
]
;
cycle
=
(
cycle
||
ss_resolve_dfs
(
graph
,
data
,
c
))
;
}
c
[
idx
]
=
BLACK
;
genalloc_insertb
(
ss_resolve_t
,
&
graph
->
sorted
,
0
,
&
genalloc_s
(
ss_resolve_t
,
&
graph
->
name
)[
idx
],
1
)
;
}
return
cycle
;
}
int
ss_resolve_graph_sort
(
ss_resolve_graph_t
*
graph
)
{
unsigned
int
len
=
genalloc_len
(
ss_resolve_graph_ndeps_t
,
&
graph
->
cp
)
;
visit
c
[
len
]
;
unsigned
int
i
;
for
(
i
=
0
;
i
<
len
;
i
++
)
c
[
i
]
=
WHITE
;
if
(
!
len
)
return
0
;
for
(
i
=
0
;
i
<
len
;
i
++
)
{
if
(
c
[
i
]
==
WHITE
&&
ss_resolve_dfs
(
graph
,
genalloc_s
(
ss_resolve_graph_ndeps_t
,
&
graph
->
cp
)[
i
].
idx
,
c
))
return
-
1
;
}
return
1
;
}
int
ss_resolve_graph_publish
(
ss_resolve_graph_t
*
graph
,
unsigned
int
reverse
)
{
int
ret
=
0
;
genalloc
gatmp
=
GENALLOC_ZERO
;
for
(
unsigned
int
a
=
0
;
a
<
genalloc_len
(
ss_resolve_t
,
&
graph
->
name
)
;
a
++
)
{
ss_resolve_graph_ndeps_t
rescp
=
RESOLVE_GRAPH_NDEPS_ZERO
;
rescp
.
idx
=
a
;
if
(
genalloc_s
(
ss_resolve_t
,
&
graph
->
name
)[
a
].
ndeps
)
{
genalloc_deepfree
(
stralist
,
&
gatmp
,
stra_free
)
;
if
(
!
clean_val
(
&
gatmp
,
genalloc_s
(
ss_resolve_t
,
&
graph
->
name
)[
a
].
sa
.
s
+
genalloc_s
(
ss_resolve_t
,
&
graph
->
name
)[
a
].
deps
))
goto
err
;
for
(
unsigned
int
b
=
0
;
b
<
genalloc_len
(
stralist
,
&
gatmp
)
;
b
++
)
{
char
*
deps
=
gaistr
(
&
gatmp
,
b
)
;
int
r
=
ss_resolve_search
(
&
graph
->
name
,
deps
)
;
if
(
r
>=
0
)
{
if
(
!
genalloc_append
(
uint32_t
,
&
rescp
.
ndeps
,
&
r
))
goto
err
;
}
else
continue
;
}
}
if
(
!
genalloc_append
(
ss_resolve_graph_ndeps_t
,
&
graph
->
cp
,
&
rescp
))
goto
err
;
}
if
(
ss_resolve_graph_sort
(
graph
)
<
0
)
{
ret
=
-
1
;
goto
err
;
}
if
(
!
reverse
)
genalloc_reverse
(
ss_resolve_t
,
&
graph
->
sorted
)
;
genalloc_deepfree
(
stralist
,
&
gatmp
,
stra_free
)
;
return
1
;
err:
genalloc_deepfree
(
stralist
,
&
gatmp
,
stra_free
)
;
return
ret
;
}
int
ss_resolve_graph_build
(
ss_resolve_graph_t
*
graph
,
ss_resolve_t
*
res
,
char
const
*
src
,
unsigned
int
reverse
)
{
char
*
string
=
res
->
sa
.
s
;
char
*
name
=
string
+
res
->
name
;
int
r
=
ss_resolve_search
(
&
graph
->
name
,
name
)
;
if
(
r
<
0
)
{
if
(
!
obstr_equal
(
name
,
SS_MASTER
+
1
))
{
if
(
!
ss_resolve_append
(
&
graph
->
name
,
res
))
goto
err
;
}
if
(
!
reverse
)
{
if
(
!
ss_resolve_add_deps
(
&
graph
->
name
,
res
,
src
))
goto
err
;
}
else
{
if
(
!
ss_resolve_add_rdeps
(
&
graph
->
name
,
res
,
src
))
goto
err
;
}
}
return
1
;
err:
return
0
;
}
/** what = 0 -> only classic
* what = 1 -> only atomic
* what = 2 -> both
* @Return 0 on fail*/
int
ss_resolve_graph_src
(
ss_resolve_graph_t
*
graph
,
char
const
*
dir
,
unsigned
int
reverse
,
unsigned
int
what
)
{
genalloc
gatmp
=
GENALLOC_ZERO
;
ss_resolve_t
res
=
RESOLVE_ZERO
;
size_t
dirlen
=
strlen
(
dir
)
;
char
solve
[
dirlen
+
SS_DB_LEN
+
SS_SRC_LEN
+
1
]
;
memcpy
(
solve
,
dir
,
dirlen
)
;
if
(
!
what
||
what
==
2
)
{
memcpy
(
solve
+
dirlen
,
SS_SVC
,
SS_SVC_LEN
)
;
solve
[
dirlen
+
SS_SVC_LEN
]
=
0
;
if
(
!
dir_get
(
&
gatmp
,
solve
,
""
,
S_IFDIR
))
goto
err
;
}
if
(
what
)
{
memcpy
(
solve
+
dirlen
,
SS_DB
,
SS_DB_LEN
)
;
memcpy
(
solve
+
dirlen
+
SS_DB_LEN
,
SS_SRC
,
SS_SRC_LEN
)
;
solve
[
dirlen
+
SS_DB_LEN
+
SS_SRC_LEN
]
=
0
;
if
(
!
dir_get
(
&
gatmp
,
solve
,
SS_MASTER
+
1
,
S_IFDIR
))
goto
err
;
}
for
(
unsigned
int
i
=
0
;
i
<
genalloc_len
(
stralist
,
&
gatmp
)
;
i
++
)
{
char
*
name
=
gaistr
(
&
gatmp
,
i
)
;
if
(
!
ss_resolve_check
(
dir
,
name
))
goto
err
;
if
(
!
ss_resolve_read
(
&
res
,
dir
,
name
))
goto
err
;
if
(
!
ss_resolve_graph_build
(
graph
,
&
res
,
dir
,
reverse
))
goto
err
;
}
genalloc_deepfree
(
stralist
,
&
gatmp
,
stra_free
)
;
ss_resolve_free
(
&
res
)
;
return
1
;
err:
genalloc_deepfree
(
stralist
,
&
gatmp
,
stra_free
)
;
ss_resolve_free
(
&
res
)
;
return
0
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment