1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195 |
- .de TQ
- . br
- . ns
- . TP \\$1
- ..
- .TH GVPR 1 "29 August 2013"
- .SH NAME
- gvpr \- graph pattern scanning and processing language
- .br
- .SH SYNOPSIS
- .B gvpr
- [\fB\-icnqV?\fP]
- [
- .BI \-o
- .I outfile
- ]
- [
- .BI \-a
- .I args
- ]
- [
- .I 'prog'
- |
- .BI \-f
- .I progfile
- ]
- [
- .I files
- ]
- .SH DESCRIPTION
- .B gvpr
- (previously known as
- .BR gpr )
- is a graph stream editor inspired by \fBawk\fP.
- It copies input graphs to its
- output, possibly transforming their structure and attributes,
- creating new graphs, or printing arbitrary information.
- The graph model is that provided by
- .IR libcgraph (3).
- In particular, \fBgvpr\fP reads and writes graphs using the
- dot language.
- .PP
- Basically,
- .B gvpr
- traverses each input graph, denoted by \fB$G\fP, visiting each node and edge,
- matching it with the predicate\(hyaction rules supplied in the input program.
- The rules are evaluated in order.
- For each predicate evaluating to true, the corresponding
- action is performed.
- During the traversal, the current node or edge being visited
- is denoted by \fB$\fP.
- .PP
- For each input graph, there is a target subgraph, denoted by
- \fB$T\fP, initially empty and used to accumulate
- chosen entities, and an output graph, \fB$O\fP, used for final processing
- and then written to output.
- By default, the output graph is the target graph.
- The output graph can be set in the program or, in a limited sense,
- on the command line.
- .SH OPTIONS
- The following options are supported:
- .TP
- .BI \-a " args"
- The string \fIargs\fP is split into whitespace\(hyseparated tokens,
- with the individual tokens
- available as strings in the \fBgvpr\fP program
- as \fBARGV[\fI0\fP],...,ARGV[ARGC\-1]\fR.
- Whitespace characters within single or double quoted substrings, or
- preceded by a backslash, are ignored as separators.
- In general, a backslash character turns off any special meaning of the
- following character.
- Note that the tokens derived from multiple \fB\-a\fP flags are concatenated.
- .TP
- .B \-c
- Use the source graph as the output graph.
- .TP
- .B \-i
- Derive the node\(hyinduced subgraph extension of the output graph in the context
- of its root graph.
- .TP
- .BI \-o " outfile"
- Causes the output stream to be written to the specified file; by default,
- output is written to \fBstdout\fP.
- .TP
- .BI \-f " progfile"
- Use the contents of the specified file as the program to execute
- on the input. If \fIprogfile\fP contains a slash character, the name is taken
- as the pathname of the file. Otherwise, \fBgvpr\fP will use the
- directories specified in the environment variable \fBGVPRPATH\fP to look
- for the file. If
- .B \-f
- is not given,
- .B gvpr
- will use the first non\(hyoption argument as the program.
- .TP
- .B \-q
- Turns off warning messages.
- .TP
- .B \-n
- Turns off graph read-ahead. By default, the variable \fB$NG\fP is set to the next
- graph to be processed. This requires a read of the next graph before processing the
- current graph, which may block if the next graph is only generated in response to
- some action pertaining to the processing of the current graph.
- .TP
- .B \-V
- Causes the program to print version information and exit.
- .TP
- .B \-?
- Causes the program to print usage information and exit.
- .SH OPERANDS
- The following operand is supported:
- .TP 8
- .I files
- Names of files containing 1 or more graphs in the dot language.
- If no
- .B \-f
- option is given, the first name is removed from the list and used
- as the input program. If the list of files is empty, \fBstdin\fP will be used.
- .SH PROGRAMS
- A
- .B gvpr
- program consists of a list of predicate\(hyaction clauses, having one
- of the forms:
- .IP
- .BI "BEGIN { " action " }"
- .IP
- .BI "BEG_G { " action " }"
- .IP
- .BI "N [ " predicate " ] { " action " }
- .IP
- .BI "E [ " predicate " ] { " action " }
- .IP
- .BI "END_G { " action " }"
- .IP
- .BI "END { " action " }"
- .PP
- A program can contain at most one of each of the \fBBEGIN\fP,
- \fBEND_G\fP and \fBEND\fP clauses.
- There can be any number of \fBBEG_G\fP, \fBN\fP and \fBE\fP statements,
- the first applied to graphs, the second to nodes, the third to edges.
- These are separated into blocks, a block consisting of an optional
- \fBBEG_G\fP statement and all \fBN\fP and \fBE\fP statements up to
- the next \fBBEG_G\fP statement, if any.
- The top\(hylevel semantics of a \fBgvpr\fP program are:
- .PP
- .RS
- .nf
- Evaluate the \fBBEGIN\fP clause, if any.
- For each input graph \fIG\fP {
- For each block {
- Set \fIG\fP as the current graph and current object.
- Evaluate the \fBBEG_G\fP clause, if any.
- For each node and edge in \fIG\fP {
- Set the node or edge as the current object.
- Evaluate the \fBN\fP or \fBE\fP clauses, as appropriate.
- }
- }
- Set \fIG\fP as the current object.
- Evaluate the \fBEND_G\fP clause, if any.
- }
- Evaluate the \fBEND\fP clause, if any.
- .fi
- .RE
- .DT
- .PP
- The actions of the \fBBEGIN\fP, \fBBEG_G\fP, \fBEND_G\fP and \fBEND\fP clauses
- are performed when the clauses are evaluated.
- For \fBN\fP or \fBE\fP clauses,
- either the predicate or action may be omitted.
- If there is no predicate with an action, the action is
- performed on every node or edge, as appropriate.
- If there is no action and the predicate evaluates to true,
- the associated node or edge is added to the target graph.
- .PP
- The blocks are evaluated in the order in which they occur.
- Within a block, the \fBN\fP clauses
- (\fBE\fP clauses, respectively) are evaluated in the
- order in which they occur. Note, though, that within a block,
- \fBN\fP or \fBE\fP clauses may be interlaced, depending on the
- traversal order.
- .PP
- Predicates and actions are sequences of statements in the C dialect
- supported by the
- .IR expr (3)
- library.
- The only difference between predicates and actions is that the former
- must have a type that may interpreted as either true or false.
- Here the usual C convention is followed, in which a non\(hyzero value is
- considered true. This would include non\(hyempty strings and non\(hyempty
- references to nodes, edges, etc. However, if a string can be
- converted to an integer, this value is used.
- .PP
- In addition to the usual C base types
- (\fBvoid\fP, \fBint\fP, \fBchar\fP, \fBfloat\fP, \fBlong\fP,
- \fBunsigned\fP and \fBdouble\fP),
- \fBgvpr\fP \fRprovides \fBstring\fP as a synonym for \fBchar*\fP, and
- the graph\(hybased types \fBnode_t\fP,
- \fBedge_t\fP, \fBgraph_t\fP and \fBobj_t\fP.
- The \fBobj_t\fP type can be viewed as a supertype of the other 3 concrete types;
- the correct base type is maintained dynamically.
- Besides these base types, the only other supported type expressions
- are (associative) arrays.
- .PP
- Constants follow C syntax, but strings may be quoted with either
- \fB"..."\fP or \fB'...'\fP.
- \fBgvpr\fP accepts C++ comments as well as cpp\(hytype comments.
- For the latter, if a line begins with a '#' character, the rest of
- the line is ignored.
- .PP
- A statement can be a declaration of a function, a variable
- or an array, or an executable statement. For declarations, there
- is a single scope. Array declarations have the form:
- .PP
- .RS
- .nf
- \fI type array \fB[\fP type0 \fB]\fR
- .fi
- .RE
- .DT
- .PP
- where \fI type0 \fP is optional. If it is supplied, the parser will
- enforce that all array subscripts have the specified type. If it is
- not supplied, objects of all types can be used as subscripts.
- As in C, variables and arrays must
- be declared. In particular, an undeclared variable will be interpreted
- as the name of an attribute of a node, edge or graph, depending on the
- context.
- .PP
- Executable statements can be one of the following:
- .RS
- .TS
- l l.
- \fB{\fR [\fI statement ... \fR] \fB}\fR
- \fIexpression\fP \fR// commonly\fP\fI var \fB=\fP expression\fR
- \fBif(\fI expression \fP)\fI statement \fR[ \fBelse\fI statement \fR]
- \fBfor(\fI expression \fP;\fI expression \fP;\fI expression \fP)\fI statement\fP
- \fBfor(\fI array \fP[\fI var \fP])\fI statement\fP
- \fBforr(\fI array \fP[\fI var \fP])\fI statement\fP
- \fBwhile(\fI expression \fP)\fI statement\fP
- \fBswitch(\fI expression \fP)\fI case statements\fP
- \fBbreak [\fI expression \fP]
- \fBcontinue [\fI expression \fP]
- \fBreturn [\fI expression \fP]\fR
- .TE
- .RE
- .SM
- Items in brackets are optional.
- .PP
- In the second form of the \fBfor\fP statement and the \fBforr\fP statement, the variable \fIvar\fP
- is set to each value used as an index in the specified array and then
- the associated \fIstatement\fP is evaluated. For numeric and string indices, the indices are
- returned in increasing (decreasing) numeric or lexicographic order for
- \fBfor\fP (\fBforr\fP, respectively). This can be used for sorting.
- .PP
- Function definitions can only appear in the \fBBEGIN\fP clause.
- .PP
- Expressions include the usual C expressions.
- String comparisons using \fB==\fP and \fB!=\fP
- treat the right hand operand as a pattern
- for the purpose of regular expression matching.
- Patterns use
- .IR ksh (1)
- file match pattern syntax.
- (For simple string equality, use the \fBstrcmp\fP function.
- .PP
- \fBgvpr\fP will attempt to use an expression as a string or numeric value
- as appropriate. Both C-like casts and function templates will cause
- conversions to be performed, if possible.
- .PP
- Expressions of graphical type (i.e., \fBgraph_t, node_t,
- edge_t, obj_t\fP) may be followed by a field reference in the
- form of \fB.\fP\fIname\fP. The resulting value is the value
- of the attribute named \fIname\fP of the given object.
- In addition, in certain contexts an undeclared, unmodified
- identifier is taken to be an
- attribute name. Specifically, such identifiers denote attributes
- of the current node or edge, respectively, in \fBN\fP
- and \fBE\fP clauses, and the current graph in \fBBEG_G\fP and \fBEND_G\fP
- clauses.
- .PP
- As usual in the
- .IR libcgraph (3)
- model, attributes are string\(hyvalued.
- In addition,
- .B gvpr
- supports certain pseudo\(hyattributes of graph objects, not necessarily
- string\(hyvalued. These reflect intrinsic properties of the graph objects
- and cannot be set by the user.
- .TP
- \fBhead\fR : \fBnode_t\fR
- the head of an edge.
- .TP
- \fBtail\fR : \fBnode_t\fR
- the tail of an edge.
- .TP
- \fBname\fR : \fBstring\fR
- the name of an edge, node or graph. The name of an edge has the
- form "\fI<tail\(hyname><edge\(hyop><head\(hyname>\fB[\fI<key>\fB]\fR",
- where \fI<edge\(hyop>\fP is "\fB\->\fP" or "\fB\-\-\fP" depending on
- whether the graph is directed or not. The bracket part \fB[\fI<key>\fB]\fR
- only appears if the edge has a non\(hytrivial key.
- .TP
- \fBindegree\fR : \fBint\fR
- the indegree of a node.
- .TP
- \fBoutdegree\fR : \fBint\fR
- the outdegree of a node.
- .TP
- \fBdegree\fR : \fBint\fR
- the degree of a node.
- .TP
- \fBX\fR : \fBdouble\fR
- the X coordinate of a node. (Assumes the node has a \fIpos\fP attribute.)
- .TP
- \fBY\fR : \fBdouble\fR
- the Y coordinate of a node. (Assumes the node has a \fIpos\fP attribute.)
- .TP
- \fBroot\fR : \fBgraph_t\fR
- the root graph of an object. The root of a root graph
- is itself.
- .TP
- \fBparent\fR : \fBgraph_t\fR
- the parent graph of a subgraph. The parent of a root graph
- is \fBNULL\fP
- .TP
- \fBn_edges\fR : \fBint\fR
- the number of edges in the graph
- .TP
- \fBn_nodes\fR : \fBint\fR
- the number of nodes in the graph
- .TP
- \fBdirected\fR : \fBint\fR
- true (non\(hyzero) if the graph is directed
- .TP
- \fBstrict\fR : \fBint\fR
- true (non\(hyzero) if the graph is strict
- .SH "BUILT\(hyIN FUNCTIONS"
- .PP
- The following functions are built into \fBgvpr\fP. Those functions
- returning references to graph objects return \fBNULL\fP in case of failure.
- .SS "Graphs and subgraph"
- .TP
- \fBgraph\fP(\fIs\fP : \fBstring\fP, \fIt\fP : \fBstring\fP) : \fBgraph_t\fP
- creates a graph whose name is \fIs\fP and whose type is
- specified by the string \fIt\fP. Ignoring case, the characters
- \fBU, D, S, N\fR have the interpretation undirected, directed,
- strict, and non\(hystrict, respectively. If \fIt\fP is empty,
- a directed, non\(hystrict graph is generated.
- .TP
- \fBsubg\fP(\fIg\fP : \fBgraph_t\fP, \fIs\fP : \fBstring\fP) : \fBgraph_t\fP
- creates a subgraph in graph \fIg\fP with name \fIs\fP. If the subgraph
- already exists, it is returned.
- .TP
- \fBisSubg\fP(\fIg\fP : \fBgraph_t\fP, \fIs\fP : \fBstring\fP) : \fBgraph_t\fP
- returns the subgraph in graph \fIg\fP with name \fIs\fP, if it exists,
- or \fBNULL\fP otherwise.
- .TP
- \fBfstsubg\fP(\fIg\fP : \fBgraph_t\fP) : \fBgraph_t\fP
- returns the first subgraph in graph \fIg\fP, or \fBNULL\fP if none exists.
- .TP
- \fBnxtsubg\fP(\fIsg\fP : \fBgraph_t\fP) : \fBgraph_t\fP
- returns the next subgraph after \fIsg\fP, or \fBNULL\fP.
- .TP
- \fBisDirect\fP(\fIg\fP : \fBgraph_t\fP) : \fBint\fP
- returns true if and only if \fIg\fP is directed.
- .TP
- \fBisStrict\fP(\fIg\fP : \fBgraph_t\fP) : \fBint\fP
- returns true if and only if \fIg\fP is strict.
- .TP
- \fBnNodes\fP(\fIg\fP : \fBgraph_t\fP) : \fBint\fP
- returns the number of nodes in \fIg\fP.
- .TP
- \fBnEdges\fP(\fIg\fP : \fBgraph_t\fP) : \fBint\fP
- returns the number of edges in \fIg\fP.
- .SS "Nodes"
- .TP
- \fBnode\fP(\fIg\fP : \fBgraph_t\fP, \fIs\fP : \fBstring\fP) : \fBnode_t\fP
- creates a node in graph \fIg\fP of name \fIs\fP. If such a node
- already exists, it is returned.
- .TP
- \fBsubnode\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBnode_t\fP
- inserts the node \fIn\fP into the subgraph \fIsg\fP. Returns the node.
- .TP
- \fBfstnode\fP(\fIg\fP : \fBgraph_t\fP) : \fBnode_t\fP
- returns the first node in graph \fIg\fP, or \fBNULL\fP if none exists.
- .TP
- \fBnxtnode\fP(\fIn\fP : \fBnode_t\fP) : \fBnode_t\fP
- returns the next node after \fIn\fP in the root graph, or \fBNULL\fP.
- .TP
- \fBnxtnode_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBnode_t\fP
- returns the next node after \fIn\fP in \fIsg\fP, or \fBNULL\fP.
- .TP
- \fBisNode\fP(\fIsg\fP : \fBgraph_t\fP, \fIs\fP : \fBstring\fP) : \fBnode_t\fP
- looks for a node in (sub)graph \fIsg\fP of name \fIs\fP. If such a node
- exists, it is returned. Otherwise, \fBNULL\fP is returned.
- .TP
- \fBisSubnode\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBint\fP
- returns non-zero if node \fIn\fP is in (sub)graph \fIsg\fP, or zero
- otherwise.
- .TP
- \fBindegreeOf\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBint\fP
- returns the indegree of node \fIn\fP in (sub)graph \fIsg\fP.
- .TP
- \fBoutdegreeOf\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBint\fP
- returns the outdegree of node \fIn\fP in (sub)graph \fIsg\fP.
- .TP
- \fBdegreeOf\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBint\fP
- returns the degree of node \fIn\fP in (sub)graph \fIsg\fP.
- .SS "Edges"
- .TP
- \fBedge\fP(\fIt\fP : \fBnode_t\fP, \fIh\fP : \fBnode_t\fP, \fIs\fP : \fBstring\fP) : \fBedge_t\fP
- creates an edge with tail node \fIt\fP, head node \fIh\fP and
- name \fIs\fP in the root graph. If the graph is undirected, the
- distinction between head and tail nodes is unimportant.
- If such an edge already exists, it is returned.
- .TP
- \fBedge_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIt\fP : \fBnode_t\fP, \fIh\fP : \fBnode_t\fP, \fIs\fP : \fBstring\fP) : \fBedge_t\fP
- creates an edge with tail node \fIt\fP, head node \fIh\fP and name \fIs\fP
- in (sub)graph \fIsg\fP (and all parent graphs). If the graph is undirected, the distinction between
- head and tail nodes is unimportant.
- If such an edge already exists, it is returned.
- .TP
- \fBsubedge\fP(\fIg\fP : \fBgraph_t\fP, \fIe\fP : \fBedge_t\fP) : \fBedge_t\fP
- inserts the edge \fIe\fP into the subgraph \fIg\fP. Returns the edge.
- .TP
- \fBisEdge\fP(\fIt\fP : \fBnode_t\fP, \fIh\fP : \fBnode_t\fP, \fIs\fP : \fBstring\fP) : \fBedge_t\fP
- looks for an edge with tail node \fIt\fP, head node \fIh\fP and
- name \fIs\fP. If the graph is undirected, the distinction between
- head and tail nodes is unimportant.
- If such an edge exists, it is returned. Otherwise, \fBNULL\fP is returned.
- .TP
- \fBisEdge_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIt\fP : \fBnode_t\fP, \fIh\fP : \fBnode_t\fP, \fIs\fP : \fBstring\fP) : \fBedge_t\fP
- looks for an edge with tail node \fIt\fP, head node \fIh\fP and
- name \fIs\fP in (sub)graph \fIsg\fP. If the graph is undirected, the distinction between
- head and tail nodes is unimportant.
- If such an edge exists, it is returned. Otherwise, \fBNULL\fP is returned.
- .TP
- \fBisSubedge\fP(\fIsg\fP : \fBgraph_t\fP, \fIe\fP : \fBedge_t\fP) : \fBint\fP
- returns non-zero if edge \fIe\fP is in (sub)graph \fIsg\fP, or zero
- otherwise.
- .TP
- \fBfstout\fP(\fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
- returns the first outedge of node \fIn\fP in the root graph.
- .TP
- \fBfstout_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
- returns the first outedge of node \fIn\fP in (sub)graph \fIsg\fP.
- .TP
- \fBnxtout\fP(\fIe\fP : \fBedge_t\fP) : \fBedge_t\fP
- returns the next outedge after \fIe\fP in the root graph.
- .TP
- \fBnxtout_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIe\fP : \fBedge_t\fP) : \fBedge_t\fP
- returns the next outedge after \fIe\fP in graph \fIsg\fP.
- .TP
- \fBfstin\fP(\fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
- returns the first inedge of node \fIn\fP in the root graph.
- .TP
- \fBfstin_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
- returns the first inedge of node \fIn\fP in graph \fIsg\fP.
- .TP
- \fBnxtin\fP(\fIe\fP : \fBedge_t\fP) : \fBedge_t\fP
- returns the next inedge after \fIe\fP in the root graph.
- .TP
- \fBnxtin_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIe\fP : \fBedge_t\fP) : \fBedge_t\fP
- returns the next inedge after \fIe\fP in graph \fIsg\fP.
- .TP
- \fBfstedge\fP(\fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
- returns the first edge of node \fIn\fP in the root graph.
- .TP
- \fBfstedge_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
- returns the first edge of node \fIn\fP in graph \fIsg\fP.
- .TP
- \fBnxtedge\fP(\fIe\fP : \fBedge_t\fP, \fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
- returns the next edge after \fIe\fP in the root graph.
- .TP
- \fBnxtedge_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIe\fP : \fBedge_t\fP, \fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
- returns the next edge after \fIe\fP in the graph \fIsg\fP.
- .TP
- \fBopp\fP(\fIe\fP : \fBedge_t\fP, \fIn\fP : \fBnode_t\fP) : \fBnode_t\fP
- returns the node on the edge \fIe\fP not equal to \fIn\fP.
- Returns NULL if \fIn\fP is not a node of \fIe\fP.
- This can be useful when using \fBfstedge\fP and \fBnxtedge\fP
- to enumerate the neighbors of \fIn\fP.
- .SS "Graph I/O"
- .TP
- \fBwrite\fP(\fIg\fP : \fBgraph_t\fP) : \fBvoid\fP
- prints \fIg\fP in dot format onto the output stream.
- .TP
- \fBwriteG\fP(\fIg\fP : \fBgraph_t\fP, \fIfname\fP : \fBstring\fP) : \fBvoid\fP
- prints \fIg\fP in dot format into the file \fIfname\fP.
- .TP
- \fBfwriteG\fP(\fIg\fP : \fBgraph_t\fP, \fIfd\fP : \fBint\fP) : \fBvoid\fP
- prints \fIg\fP in dot format onto the open stream denoted
- by the integer \fIfd\fP.
- .TP
- \fBreadG\fP(\fIfname\fP : \fBstring\fP) : \fBgraph_t\fP
- returns a graph read from the file \fIfname\fP. The graph should be
- in dot format. If no graph can be read, \fBNULL\fP is returned.
- .TP
- \fBfreadG\fP(\fIfd\fP : \fBint\fP) : \fBgraph_t\fP
- returns the next graph read from the open stream \fIfd\fP.
- Returns \fBNULL\fP at end of file.
- .SS "Graph miscellany"
- .TP
- \fBdelete\fP(\fIg\fP : \fBgraph_t\fP, \fIx\fP : \fBobj_t\fP) : \fBvoid\fP
- deletes object \fIx\fP from graph \fIg\fP.
- If \fIg\fP is \fBNULL\fP, the function uses the root graph of \fIx\fP.
- If \fIx\fP is a graph or subgraph, it is closed unless \fIx\fP is locked.
- .TP
- \fBisIn\fP(\fIg\fP : \fBgraph_t\fP, \fIx\fP : \fBobj_t\fP) : \fBint\fP
- returns true if \fIx\fP is in subgraph \fIg\fP.
- .TP
- \fBcloneG\fP(\fIg\fP : \fBgraph_t\fP, \fIs\fP : \fBstring\fP) : \fBgraph_t\fP
- creates a clone of graph \fIg\fP with name of \fIs\fP.
- If \fIs\fP is "", the created graph has the same name as \fIg\fP.
- .TP
- \fBclone\fP(\fIg\fP : \fBgraph_t\fP, \fIx\fP : \fBobj_t\fP) : \fBobj_t\fP
- creates a clone of object \fIx\fP in graph \fIg\fP.
- In particular, the new object has the same name/value attributes
- and structure as the original object.
- If an object with the same key as \fIx\fP already exists, its attributes
- are overlaid by those of \fIx\fP and the object is returned.
- If an edge is cloned, both endpoints are implicitly cloned.
- If a graph is cloned, all nodes, edges and subgraphs are implicitly
- cloned.
- If \fIx\fP is a graph, \fIg\fP may be \fBNULL\fP, in which case the cloned
- object will be a new root graph. In this case, the call is equivalent
- to \fBcloneG(\fP\fIx\fP\fB,"")\fP.
- .TP
- \fBcopy\fP(\fIg\fP : \fBgraph_t\fP, \fIx\fP : \fBobj_t\fP) : \fBobj_t\fP
- creates a copy of object \fIx\fP in graph \fIg\fP,
- where the new object has the same name/value attributes
- as the original object.
- If an object with the same key as \fIx\fP already exists, its attributes
- are overlaid by those of \fIx\fP and the object is returned.
- Note that this is a shallow copy. If \fIx\fP is a graph, none of its nodes,
- edges or subgraphs are copied into the new graph. If \fIx\fP is an edge,
- the endpoints are created if necessary, but they are not cloned.
- If \fIx\fP is a graph, \fIg\fP may be \fBNULL\fP, in which case the cloned
- object will be a new root graph.
- .TP
- \fBcopyA\fP(\fIsrc\fP : \fBobj_t\fP, \fItgt\fP : \fBobj_t\fP) : \fBint\fP
- copies the attributes of object \fIsrc\fP to object \fItgt\fP, overwriting
- any attribute values \fItgt\fP may initially have.
- .TP
- \fBinduce\fP(\fIg\fP : \fBgraph_t\fP) : \fBvoid\fP
- extends \fIg\fP to its node\(hyinduced subgraph extension in its root graph.
- .TP
- \fBhasAttr\fP(\fIsrc\fP : \fBobj_t\fP, \fIname\fP : \fBstring\fP) : \fBint\fP
- returns non-zero if object \fIsrc\fP has an attribute whose name is
- \fIname\fP. It returns 0 otherwise.
- .TP
- \fBisAttr\fP(\fIg\fP : \fBgraph_t\fP, \fIkind\fP : \fBstring\fP, \fIname\fP : \fBstring\fP) : \fBint\fP
- returns non-zero if an attribute \fIname\fP has been defined in \fIg\fP
- for objects of the given \fIkind\fP. For nodes, edges, and graphs, \fIkind\fP
- should be "N", "E", and "G", respectively.
- It returns 0 otherwise.
- .TP
- \fBaget\fP(\fIsrc\fP : \fBobj_t\fP, \fIname\fP : \fBstring\fP) : \fBstring\fP
- returns the value of attribute \fIname\fP in object \fIsrc\fP. This is
- useful for those cases when \fIname\fP conflicts with one of the keywords
- such as "head" or "root".
- If the attribute has not been declared in the graph, the function will
- initialize it with a default value of "". To avoid this, one should use
- the \fBhasAttr\fP or \fBisAttr\fP function to check that the attribute exists.
- .TP
- \fBaset\fP(\fIsrc\fP : \fBobj_t\fP, \fIname\fP : \fBstring\fP, \fIvalue\fP : \fBstring\fP) : \fBint\fP
- sets the value of attribute \fIname\fP in object \fIsrc\fP to \fIvalue\fP.
- Returns 0 on success, non\(hyzero on failure. See \fBaget\fP above.
- .TP
- \fBgetDflt\fP(\fIg\fP : \fBgraph_t\fP, \fIkind\fP : \fBstring\fP, \fIname\fP : \fBstring\fP) : \fBstring\fP
- returns the default value of attribute \fIname\fP in objects in \fIg\fP of
- the given \fIkind\fP. For nodes, edges, and graphs, \fIkind\fP
- should be "N", "E", and "G", respectively.
- If the attribute has not been declared in the graph, the function will
- initialize it with a default value of "". To avoid this, one should use
- the \fBisAttr\fP function to check that the attribute exists.
- .TP
- \fBsetDflt\fP(\fIg\fP : \fBgraph_t\fP, \fIkind\fP : \fBstring\fP, \fIname\fP : \fBstring\fP, \fIvalue\fP : \fBstring\fP) : \fBint\fP
- sets the default value of attribute \fIname\fP to \fIvalue\fP in
- objects in \fIg\fP of
- the given \fIkind\fP. For nodes, edges, and graphs, \fIkind\fP
- should be "N", "E", and "G", respectively.
- Returns 0 on success, non\(hyzero on failure. See \fBgetDflt\fP above.
- .TP
- \fBfstAttr\fP(\fIg\fP : \fBgraph_t\fP, \fIkind\fP : \fBstring\fP) : \fBstring\fP
- returns the name of the first attribute of objects in \fIg\fP of
- the given \fIkind\fP. For nodes, edges, and graphs, \fIkind\fP
- should be "N", "E", and "G", respectively.
- If there are no attributes, the string "" is returned.
- .TP
- \fBnxtAttr\fP(\fIg\fP : \fBgraph_t\fP, \fIkind\fP : \fBstring\fP, \fIname\fP : \fBstring\fP) : \fBstring\fP
- returns the name of the next attribute of objects in \fIg\fP of
- the given \fIkind\fP after the attribute \fIname\fP.
- The argument \fIname\fP must be the name of an existing attribute; it will
- typically be the return value of an previous call to \fBfstAttr\fP or
- \fBnxtAttr\fP.
- For nodes, edges, and graphs, \fIkind\fP
- should be "N", "E", and "G", respectively.
- If there are no attributes left, the string "" is returned.
- .TP
- \fBcompOf\fP(\fIg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBgraph_t\fP
- returns the connected component of the graph \fIg\fP containing node \fIn\fP,
- as a subgraph of \fIg\fP. The subgraph only contains the nodes. One can
- use \fIinduce\fP to add the edges. The function fails and returns \fBNULL\fP
- if \fIn\fP is not in \fIg\fP. Connectivity is based on the underlying
- undirected graph of \fIg\fP.
- .TP
- \fBkindOf\fP(\fIobj\fP : \fBobj_t\fP) : \fBstring\fP
- returns an indication of the type of \fIobj\fP.
- For nodes, edges, and graphs, it returns "N", "E", and "G", respectively.
- .TP
- \fBlock\fP(\fIg\fP : \fBgraph_t\fP, \fIv\fP : \fBint\fP) : \fBint\fP
- implements graph locking on root graphs. If the integer \fIv\fP is positive, the
- graph is set so that future calls to \fBdelete\fP have no immediate effect.
- If \fIv\fP is zero, the graph is unlocked. If there has been a call
- to delete the graph while it was locked, the graph is closed.
- If \fIv\fP is negative, nothing is done.
- In all cases, the previous lock value is returned.
- .SS "Strings"
- .TP
- \fBsprintf\fP(\fIfmt\fP : \fBstring\fP, \fI...\fP) : \fBstring\fP
- returns the string resulting from formatting
- the values of the expressions occurring after \fIfmt\fP
- according to the
- .IR printf (3)
- format
- .I fmt
- .TP
- \fBgsub\fP(\fIstr\fP : \fBstring\fP, \fIpat\fP : \fBstring\fP) : \fBstring\fP
- .TP
- \fBgsub\fP(\fIstr\fP : \fBstring\fP, \fIpat\fP : \fBstring\fP, \fIrepl\fP : \fBstring\fP) : \fBstring\fP
- returns \fIstr\fP with all substrings matching \fIpat\fP
- deleted or replaced by \fIrepl\fP, respectively.
- .TP
- \fBsub\fP(\fIstr\fP : \fBstring\fP, \fIpat\fP : \fBstring\fP) : \fBstring\fP
- .TP
- \fBsub\fP(\fIstr\fP : \fBstring\fP, \fIpat\fP : \fBstring\fP, \fIrepl\fP : \fBstring\fP) : \fBstring\fP
- returns \fIstr\fP with the leftmost substring matching \fIpat\fP
- deleted or replaced by \fIrepl\fP, respectively. The
- characters '^' and '$'
- may be used at the beginning and end, respectively,
- of \fIpat\fP to anchor the pattern to the beginning or end of \fIstr\fP.
- .TP
- \fBsubstr\fP(\fIstr\fP : \fBstring\fP, \fIidx\fP : \fBint\fP) : \fBstring\fP
- .TP
- \fBsubstr\fP(\fIstr\fP : \fBstring\fP, \fIidx\fP : \fBint\fP, \fIlen\fP : \fBint\fP) : \fBstring\fP
- returns the substring of \fIstr\fP starting at position \fIidx\fP to
- the end of the string or of length \fIlen\fP, respectively.
- Indexing starts at 0. If \fIidx\fP is negative or \fIidx\fP is greater than
- the length of \fIstr\fP, a fatal error occurs. Similarly, in the second
- case, if \fIlen\fP is negative or \fIidx\fP + \fIlen\fP is greater than the
- length of \fIstr\fP, a fatal error occurs.
- .TP
- \fBstrcmp\fP(\fIs1\fP : \fBstring\fP, \fIs2\fP : \fBstring\fP) : \fBint\fP
- provides the standard C function
- .IR strcmp (3).
- .TP
- \fBlength\fP(\fIs\fP : \fBstring\fP) : \fBint\fP
- returns the length of string \fIs\fP.
- .TP
- \fBindex\fP(\fIs\fP : \fBstring\fP, \fIt\fP : \fBstring\fP) : \fBint\fP
- .TP
- \fBrindex\fP(\fIs\fP : \fBstring\fP, \fIt\fP : \fBstring\fP) : \fBint\fP
- returns the index of the character in string \fIs\fP where the leftmost
- (rightmost) copy of string \fIt\fP can be found, or \-1 if \fIt\fP is not a
- substring of \fIs\fP.
- .TP
- \fBmatch\fP(\fIs\fP : \fBstring\fP, \fIp\fP : \fBstring\fP) : \fBint\fP
- returns the index of the character in string \fIs\fP where the leftmost
- match of pattern \fIp\fP can be found, or \-1 if no substring of \fIs\fP
- matches \fIp\fP.
- .TP
- \fBtoupper\fP(\fIs\fP : \fBstring\fP) : \fBstring\fP
- returns a version of \fIs\fP with the alphabetic characters converted to upper-case.
- .TP
- \fBtolower\fP(\fIs\fP : \fBstring\fP) : \fBstring\fP
- returns a version of \fIs\fP with the alphabetic characters converted to lower-case.
- .TP
- \fBcanon\fP(\fIs\fP : \fBstring\fP) : \fBstring\fP
- returns a version of \fIs\fP appropriate to be used as an identifier
- in a dot file.
- .TP
- \fBhtml\fP(\fIg\fP : \fBgraph_t\fP, \fIs\fP : \fBstring\fP) : \fBstring\fP
- returns a ``magic'' version of \fIs\fP as an HTML string. This will typically be
- used to attach an HTML-like label to a graph object. Note that the returned string
- lives in \fIg\fP. In particular, it will be freed when \fIg\fP is closed, and to
- act as an HTML string, it has to be used with an object of \fIg\fP. In addition,
- note that the
- angle bracket quotes should not be part of \fIs\fP. These will be added if
- \fIg\fP is written in concrete DOT format.
- .TP
- \fBishtml\fP(\fIs\fP : \fBstring\fP) : \fBint\fP
- returns non-zero if and only if \fIs\fP is an HTML string.
- .TP
- \fBxOf\fP(\fIs\fP : \fBstring\fP) : \fBstring\fP
- returns the string "\fIx\fP" if \fIs\fP has the form "\fIx\fP,\fIy\fP",
- where both \fIx\fP and \fIy\fP are numeric.
- .TP
- \fByOf\fP(\fIs\fP : \fBstring\fP) : \fBstring\fP
- returns the string "\fIy\fP" if \fIs\fP has the form "\fIx\fP,\fIy\fP",
- where both \fIx\fP and \fIy\fP are numeric.
- .TP
- \fBllOf\fP(\fIs\fP : \fBstring\fP) : \fBstring\fP
- returns the string "\fIllx\fP,\fIlly\fP" if \fIs\fP has the form
- "\fIllx\fP,\fIlly\fP,\fIurx\fP,\fIury\fP",
- where all of \fIllx\fP, \fIlly\fP, \fIurx\fP, and \fIury\fP are numeric.
- .TP
- .BI urOf( s )
- \fBurOf\fP(\fIs\fP : \fBstring\fP) : \fBstring\fP
- returns the string "\fIurx\fP,\fIury\fP" if \fIs\fP has the form
- "\fIllx\fP,\fIlly\fP,\fIurx\fP,\fIury\fP",
- where all of \fIllx\fP, \fIlly\fP, \fIurx\fP, and \fIury\fP are numeric.
- .TP
- \fBsscanf\fP(\fIs\fP : \fBstring\fP, \fIfmt\fP : \fBstring\fP, \fI...\fP) : \fBint\fP
- scans the string \fIs\fP, extracting values
- according to the
- .IR sscanf (3)
- format
- .IR fmt .
- The values are stored in the addresses following \fIfmt\fP,
- addresses having the form \fB&\fP\fIv\fP, where \fIv\fP is some declared
- variable of the correct type.
- Returns the number of items successfully scanned.
- .TP
- \fBsplit\fP(\fIs\fP : \fBstring\fP, \fIarr\fP : \fBarray\fP, \fIseps\fP : \fBstring\fP) : \fBint\fP
- .TP
- \fBsplit\fP(\fIs\fP : \fBstring\fP, \fIarr\fP : \fBarray\fP) : \fBint\fP
- .TP
- \fBtokens\fP(\fIs\fP : \fBstring\fP, \fIarr\fP : \fBarray\fP, \fIseps\fP : \fBstring\fP) : \fBint\fP
- .TP
- \fBtokens\fP(\fIs\fP : \fBstring\fP, \fIarr\fP : \fBarray\fP) : \fBint\fP
- The \fBsplit\fP function breaks the string \fIs\fP into fields, while the \fBtokens\fP function
- breaks the string into tokens.
- A field consists of all non-separator characters between two separator characters or the beginning or
- end of the string. Thus, a field may be the empty string. A
- token is a maximal, non-empty substring not containing a separator character.
- The separator characters are those given in the \fIseps\fP argument.
- If \fIseps\fP is not provided, the default value is " \\t\\n".
- The functions return the number of fields or tokens.
- .sp
- The fields and tokens are stored in the argument array. The array must be \fBstring\fP-valued and
- have \fBint\fP as its index type. The entries are indexed by consecutive
- integers, starting at 0. Any values already stored in the array will be either overwritten, or
- still be present after the function returns.
- .SS "I/O"
- .TP
- \fBprint\fP(\fI...\fP) : \fBvoid\fP
- .BI print( " expr" , " ...\fB )
- prints a string representation of each argument in turn onto
- \fBstdout\fP, followed by a newline.
- .TP
- \fBprintf\fP(\fIfmt\fP : \fBstring\fP, \fI...\fP) : \fBint\fP
- .TP
- \fBprintf\fP(\fIfd\fP : \fBint\fP, \fIfmt\fP : \fBstring\fP, \fI...\fP) : \fBint\fP
- prints the string resulting from formatting
- the values of the expressions following \fIfmt\fP
- according to the
- .IR printf (3)
- format
- .IR fmt .
- Returns 0 on success.
- By default, it prints on \fBstdout\fP.
- If the optional integer \fIfd\fP is given, output is written on the open
- stream associated with \fIfd\fP.
- .TP
- \fBscanf\fP(\fIfmt\fP : \fBstring\fP, \fI...\fP) : \fBint\fP
- .TP
- \fBscanf\fP(\fIfd\fP : \fBint\fP, \fIfmt\fP : \fBstring\fP, \fI...\fP) : \fBint\fP
- scans in values from an input stream according to the
- .IR scanf (3)
- format
- .IR fmt .
- The values are stored in the addresses following \fIfmt\fP,
- addresses having the form \fB&\fP\fIv\fP, where \fIv\fP is some declared
- variable of the correct type.
- By default, it reads from \fBstdin\fP.
- If the optional integer \fIfd\fP is given, input is read from the open
- stream associated with \fIfd\fP.
- Returns the number of items successfully scanned.
- .TP
- \fBopenF\fP(\fIs\fP : \fBstring\fP, \fIt\fP : \fBstring\fP) : \fBint\fP
- opens the file \fIs\fP as an I/O stream. The string argument \fIt\fP
- specifies how the file is opened. The arguments are the same as for
- the C function
- .IR fopen (3).
- It returns an integer denoting the stream, or \-1 on error.
- .sp
- As usual, streams 0, 1 and 2 are already open as \fBstdin\fP, \fBstdout\fP,
- and \fBstderr\fP, respectively. Since \fBgvpr\fP may use \fBstdin\fP to
- read the input graphs, the user should avoid using this stream.
- .TP
- \fBcloseF\fP(\fIfd\fP : \fBint\fP) : \fBint\fP
- closes the open stream denoted by the integer \fIfd\fP.
- Streams 0, 1 and 2 cannot be closed.
- Returns 0 on success.
- .TP
- \fBreadL\fP(\fIfd\fP : \fBint\fP) : \fBstring\fP
- returns the next line read from the input stream \fIfd\fP. It returns
- the empty string "" on end of file. Note that the newline character is
- left in the returned string.
- .SS "Math"
- .TP
- \fBexp\fP(\fId\fP : \fBdouble\fP) : \fBdouble\fP
- returns e to the \fId\fPth power.
- .TP
- \fBlog\fP(\fId\fP : \fBdouble\fP) : \fBdouble\fP
- returns the natural log of \fId\fP.
- .TP
- \fBsqrt\fP(\fId\fP : \fBdouble\fP) : \fBdouble\fP
- returns the square root of the double \fId\fP.
- .TP
- \fBpow\fP(\fId\fP : \fBdouble\fP, \fIx\fP : \fBdouble\fP) : \fBdouble\fP
- returns \fId\fP raised to the \fIx\fPth power.
- .TP
- \fBcos\fP(\fId\fP : \fBdouble\fP) : \fBdouble\fP
- returns the cosine of \fId\fP.
- .TP
- \fBsin\fP(\fId\fP : \fBdouble\fP) : \fBdouble\fP
- returns the sine of \fId\fP.
- .TP
- \fBatan2\fP(\fIy\fP : \fBdouble\fP, \fIx\fP : \fBdouble\fP) : \fBdouble\fP
- returns the arctangent of \fIy/x\fP in the range \-pi to pi.
- .TP
- \fBMIN\fP(\fIy\fP : \fBdouble\fP, \fIx\fP : \fBdouble\fP) : \fBdouble\fP
- returns the minimum of \fIy\fP and \fIx\fP.
- .TP
- \fBMAX\fP(\fIy\fP : \fBdouble\fP, \fIx\fP : \fBdouble\fP) : \fBdouble\fP
- returns the maximum of \fIy\fP and \fIx\fP.
- .SS "Associative Arrays"
- .TP
- \fB#\fP \fIarr\fP : \fBint\fP
- returns the number of elements in the array \fIarr\fP.
- .TP
- \fIidx\fP \fBin\fP \fIarr\fP : \fBint\fP
- returns 1 if a value has been set for index \fIidx\fP in the array \fIarr\fP.
- It returns 0 otherwise.
- .TP
- \fBunset\fP(\fIv\fP : \fBarray\fP, \fIidx\fP) : \fBint\fP
- removes the item indexed by \fIidx\fP. It returns 1 if the item existed, 0 otherwise.
- .TP
- \fBunset\fP(\fIv\fP : \fBarray\fP) : \fBvoid\fP
- re-initializes the array.
- .SS "Miscellaneous"
- .TP
- \fBexit\fP(\fIv\fP : \fBint\fP) : \fBvoid\fP
- causes
- .B gvpr
- to exit with the exit code
- .IR v .
- .TP
- \fBsystem\fP(\fIcmd\fP : \fBstring\fP) : \fBint\fP
- provides the standard C function
- .IR system (3).
- It executes \fIcmd\fP in the user's shell environment, and
- returns the exit status of the shell.
- .TP
- \fBrand\fP() : \fBdouble\fP
- returns a pseudo\(hyrandom double between 0 and 1.
- .TP
- \fBsrand\fP() : \fBint\fP
- .TP
- \fBsrand\fP(\fIv\fP : \fBint\fP) : \fBint\fP
- sets a seed for the random number generator. The optional argument gives
- the seed; if it is omitted, the current time is used. The previous seed
- value is returned. \fBsrand\fP should be called before any calls to
- \fBrand\fP.
- .TP
- \fBcolorx\fP(\fIcolor\fP : \fBstring\fP, \fIfmt\fP : \fBstring\fP) : \fBstring\fP
- translates a color from one format to another. The \fIcolor\fP argument should be
- a color in one of the recognized string representations. The \fIfmt\fP value should
- be one of "RGB", "RGBA", "HSV", or "HSVA".
- An empty string is returned on error.
- .SH "BUILT\(hyIN VARIABLES"
- .PP
- .B gvpr
- provides certain special, built\(hyin variables, whose values are set
- automatically by \fBgvpr\fP depending on the context. Except as noted,
- the user cannot modify their values.
- .TP
- \fB$\fP : \fBobj_t\fP
- denotes the current object (node, edge, graph) depending on the
- context. It is not available in \fBBEGIN\fP or \fBEND\fP clauses.
- .TP
- \fB$F\fP : \fBstring\fP
- is the name of the current input file.
- .TP
- \fB$G\fP : \fBgraph_t\fP
- denotes the current graph being processed. It is not available
- in \fBBEGIN\fP or \fBEND\fP clauses.
- .TP
- \fB$NG\fP : \fBgraph_t\fP
- denotes the next graph to be processed. If \fB$NG\fP is NULL,
- the current graph \fB$G\fP is the last graph. Note that if the input
- comes from stdin, the last graph cannot be determined until the input
- pipe is closed.
- It is not available in \fBBEGIN\fP or \fBEND\fP clauses, or if the
- \fB\-n\fP flag is used.
- .TP
- \fB$O\fP : \fBgraph_t\fP
- denotes the output graph. Before graph traversal, it is initialized
- to the target graph. After traversal and any \fBEND_G\fP actions,
- if it refers to a non\(hyempty graph, that graph is printed onto the output stream.
- It is only valid in \fBN\fP, \fBE\fP and \fBEND_G\fP clauses.
- The output graph may be set by the user.
- .TP
- \fB$T\fP : \fBgraph_t\fP
- denotes the current target graph. It is a subgraph of \fB$G\fP
- and is available only in \fBN\fP, \fBE\fP and \fBEND_G\fP clauses.
- .TP
- \fB$tgtname\fP : \fBstring\fP
- denotes the name of the target graph.
- By default, it is set to \fB"gvpr_result"\fP.
- If used multiple times during the execution of
- .BR gvpr ,
- the name will be appended with an integer.
- This variable may be set by the user.
- .TP
- \fB$tvroot\fP : \fBnode_t\fP
- indicates the starting node for a (directed or undirected)
- depth\(hyfirst or breadth\(hyfirst traversal of the
- graph (cf. \fB$tvtype\fP below).
- The default value is \fBNULL\fP for each input graph.
- After the traversal at the given root, if the value of \fB$tvroot\fP has changed,
- a new traversal will begin with the new value of \fB$tvroot\fP. Also, see \fB$tvnext\fP below.
- .TP
- \fB$tvnext\fP : \fBnode_t\fP
- indicates the next starting node for a (directed or undirected)
- depth\(hyfirst or breadth\(hyfirst traversal of the
- graph (cf. \fB$tvtype\fP below).
- If a traversal finishes and the \fB$tvroot\fP has not been reset but the \fB$tvnext\fP has been
- set but not used, this node will be used as the next choice for \fB$tvroot\fP.
- The default value is \fBNULL\fP for each input graph.
- .TP
- \fB$tvedge\fP : \fBedge_t\fP
- For BFS and DFS traversals, this is set to the edge used to arrive at the
- current node or edge. At the beginning of a traversal, or for other traversal
- types, the value is \fBNULL\fP.
- .TP
- \fB$tvtype\fP : \fBtvtype_t\fP
- indicates how \fBgvpr\fP traverses a graph. It can only take
- one of the constant values with the prefix "TV_" described below.
- \fBTV_flat\fP is the default.
- .IP
- In the underlying graph library
- .IR cgraph (3),
- edges in undirected graphs are given an arbitrary direction. This is
- used for traversals, such as \fBTV_fwd\fR, requiring directed edges.
- .
- .TP
- \fBARGC\fP : \fBint\fP
- denotes the number of arguments specified by the
- \fB\-a\fP \fIargs\fP command\(hyline argument.
- .TP
- \fBARGV\fP : \fBstring array\fP
- denotes the array of arguments specified by the
- \fB\-a\fP \fIargs\fP
- command\(hyline argument. The \fIi\fPth argument is given
- by \fBARGV[\fIi\fP]\fR.
- .SH "BUILT\(hyIN CONSTANTS"
- .PP
- There are several symbolic constants defined by \fBgvpr\fP.
- .TP
- \fBNULL\fR : \fIobj_t\fR
- a null object reference, equivalent to 0.
- .TP
- \fBTV_flat\fR : \fItvtype_t\fR
- a simple, flat traversal, with graph objects visited in
- seemingly arbitrary order.
- .TP
- \fBTV_ne\fR : \fItvtype_t\fR
- a traversal which first visits all of the nodes, then all
- of the edges.
- .TP
- \fBTV_en\fR : \fItvtype_t\fR
- a traversal which first visits all of the edges, then all
- of the nodes.
- .TP
- \fBTV_dfs\fR : \fItvtype_t\fR
- .TQ
- \fBTV_postdfs\fR : \fItvtype_t\fR
- .TQ
- \fBTV_prepostdfs\fR : \fItvtype_t\fR
- a traversal of the graph using a depth\(hyfirst search on the
- underlying undirected graph.
- To do the traversal, \fBgvpr\fP will check the value of
- \fB$tvroot\fP. If this has the same value that it had previously
- (at the start, the previous value is initialized to \fBNULL\fP.), \fBgvpr\fP
- will simply look for some unvisited node and traverse its connected
- component. On the other hand, if \fB$tvroot\fP has changed, its connected
- component will be toured, assuming it has not been previously visited or,
- if \fB$tvroot\fP is \fBNULL\fP, the traversal will stop. Note that using
- \fBTV_dfs\fP and \fB$tvroot\fP, it is possible to create an infinite loop.
- .
- .IP
- By default, the traversal is done in pre-order. That is, a node is
- visited before all of its unvisited edges. For \fBTV_postdfs\fR,
- all of a node's unvisited edges are visited before the node. For
- \fBTV_prepostdfs\fR, a node is visited twice, before and after all of
- its unvisited edges.
- .
- .TP
- \fBTV_fwd\fR : \fItvtype_t\fR
- .TQ
- \fBTV_postfwd\fR : \fItvtype_t\fR
- .TQ
- \fBTV_prepostfwd\fR : \fItvtype_t\fR
- A traversal of the graph using a depth\(hyfirst search on the
- graph following only forward arcs.
- The choice of roots for the traversal is the
- same as described for \fBTV_dfs\fR above.
- The different order of visitation specified by \fBTV_fwd\fR,
- \fBTV_postfwd\fR and \fBTV_prepostfwd\fR are the same as those
- specified by the analogous traversals \fBTV_dfs\fR,
- \fBTV_postdfs\fR and \fBTV_prepostdfs\fR.
- .TP
- \fBTV_rev\fR : \fItvtype_t\fR
- .TQ
- \fBTV_postrev\fR : \fItvtype_t\fR
- .TQ
- \fBTV_prepostrev\fR : \fItvtype_t\fR
- A traversal of the graph using a depth\(hyfirst search on the
- graph following only reverse arcs.
- The choice of roots for the traversal is the
- same as described for \fBTV_dfs\fR above.
- The different order of visitation specified by \fBTV_rev\fR,
- \fBTV_postrev\fR and \fBTV_prepostrev\fR are the same as those
- specified by the analogous traversals \fBTV_dfs\fR,
- \fBTV_postdfs\fR and \fBTV_prepostdfs\fR.
- .TP
- \fBTV_bfs\fR : \fItvtype_t\fR
- A traversal of the graph using a breadth\(hyfirst search on the
- graph ignoring edge directions. See the item on \fBTV_dfs\fR above
- for the role of \fB$tvroot\fP.
- .SH EXAMPLES
- .PP
- .RS
- .nf
- \fBgvpr \-i 'N[color=="blue"]' file.gv\fP
- .fi
- .RE
- .DT
- .PP
- Generate the node\(hyinduced subgraph of all nodes with color blue.
- .PP
- .RS
- .nf
- \fBgvpr \-c 'N[color=="blue"]{color = "red"}' file.gv\fP
- .fi
- .RE
- .DT
- .PP
- Make all blue nodes red.
- .PP
- .RS
- .nf
- \fBBEGIN { int n, e; int tot_n = 0; int tot_e = 0; }
- BEG_G {
- n = nNodes($G);
- e = nEdges($G);
- printf ("%d nodes %d edges %s\\n", n, e, $G.name);
- tot_n += n;
- tot_e += e;
- }
- END { printf ("%d nodes %d edges total\\n", tot_n, tot_e) }\fP
- .fi
- .RE
- .DT
- .PP
- Version of the program \fBgc\fP.
- .PP
- .RS
- .nf
- \fBBEG_G { graph_t g = graph ("merge", "S"); }
- E {
- node_t h = clone(g,$.head);
- node_t t = clone(g,$.tail);
- edge_t e = edge(t,h,"");
- e.weight = e.weight + 1;
- }
- END_G { $O = g; }\fP
- .fi
- .RE
- .DT
- .PP
- Produces a strict version of the input graph, where the weight attribute
- of an edge indicates how many edges from the input graph the edge represents.
- .PP
- .RS
- .nf
- \fBBEGIN {node_t n; int deg[]}
- E{deg[head]++; deg[tail]++; }
- END_G {
- for (deg[n]) {
- printf ("deg[%s] = %d\\n", n.name, deg[n]);
- }
- }\fP
- .fi
- .RE
- .DT
- .PP
- Computes the degrees of nodes with edges.
- .PP
- .RS
- .nf
- \fBBEGIN {
- int i, indent;
- int seen[string];
- void prInd (int cnt) {
- for (i = 0; i < cnt; i++) printf (" ");
- }
- }
- BEG_G {
- $tvtype = TV_prepostfwd;
- $tvroot = node($,ARGV[0]);
- }
- N {
- if (seen[$.name]) indent--;
- else {
- prInd(indent);
- print ($.name);
- seen[$.name] = 1;
- indent++;
- }
- }\fP
- .fi
- .RE
- .DT
- .PP
- Prints the depth-first traversal of the graph, starting
- with the node whose name is \fBARGV[0]\fP, as an indented list.
- .SH ENVIRONMENT
- .TP
- .B GVPRPATH
- Colon\(hyseparated list of directories to be searched to find
- the file specified by the \-f option. \fBgvpr\fP has a default list built in. If \fBGVPRPATH\fP
- is not defined, the default list is used. If \fBGVPRPATH\fP starts with colon, the list is formed
- by appending \fBGVPRPATH\fP to the default list. If \fBGVPRPATH\fP ends with colon, the list is formed
- by appending the default list to \fBGVPRPATH\fP. Otherwise, \fBGVPRPATH\fP is used for the list.
- .P
- On Windows systems, replace ``colon'' with ``semicolon'' in the previous paragraph.
- .SH BUGS AND WARNINGS
- Scripts should be careful deleting nodes during \fBN{}\fP and \fBE{}\fP
- blocks using BFS and DFS traversals as these rely on stacks and queues of
- nodes.
- .PP
- When the program is given as a command line argument, the usual
- shell interpretation takes place, which may affect some of the
- special names in \fBgvpr\fP. To avoid this, it is best to wrap the
- program in single quotes.
- .PP
- If string constants contain pattern metacharacters that you want to
- escape to avoid pattern matching, two backslashes will probably be
- necessary, as a single backslash will be lost when the string is
- originally scanned. Usually, it is simpler to use \fBstrcmp\fP to
- avoid pattern matching.
- .PP
- As of 24 April 2008, \fBgvpr\fP switched to using a new, underlying
- graph library, which uses the simpler model that there is only one
- copy of a node, not one copy for each subgraph logically containing
- it. This means that iterators such as \fInxtnode\fP cannot traverse
- a subgraph using just a node argument. For this reason, subgraph
- traversal requires new functions ending in "_sg", which also take
- a subgraph argument. The versions without that suffix will always
- traverse the root graph.
- .PP
- There is a single global scope, except for formal function parameters,
- and even these can interfere with the type system. Also, the
- extent of all variables is the entire life of the program.
- It might be preferable for scope
- to reflect the natural nesting of the clauses, or for the program
- to at least reset locally declared variables.
- For now, it is advisable to use distinct names for all variables.
- .PP
- If a function ends with a complex statement, such as an
- IF statement, with each branch doing a return, type checking may fail.
- Functions should use a return at the end.
- .PP
- The expr library does not support string values of (char*)0.
- This means we can't distinguish between "" and (char*)0 edge keys.
- For the purposes of looking up and creating edges, we translate ""
- to be (char*)0, since this latter value is
- necessary in order to look up any edge with a matching head and tail.
- .PP
- Related to this, strings converted to integers act like char pointers,
- getting the value 0 or 1 depending on whether the string consists
- solely of zeroes or not. Thus, the ((int)"2") evaluates to 1.
- .PP
- The language inherits the usual C problems such as dangling references
- and the confusion between '=' and '=='.
- .SH AUTHOR
- Emden R. Gansner <[email protected]>
- .SH "SEE ALSO"
- .PP
- awk(1), gc(1), dot(1), nop(1), expr(3), cgraph(3)
|