Library /sys$common/syshlp/SCA$MENU.HLB  —  SCA Topics
    Help is available on the following SCA topics:

1  –  Advanced Query Examples

    The examples in this section use the supplied example library. You
    are encouraged to try these queries using the example library.

    1.  FIND CALLED_BY( END=translit, DEPTH=ALL)

    This query gives the full call tree for TRANSLIT.

    2.  FIND CALLED_BY( END=translit, BEGIN=signal_duplicate, DEPTH=ALL)

    This query returns all the call paths emanating from translit that
    end up calling SIGNAL_DUPLICATE.

    3.  FIND CALLED_BY( translit, DEPTH=ALL, TRACE=(NOT OPEN*))

    This query gives the full call tree for TRANSLIT, but does not
    show any calls from items named OPEN*. Calls to items named OPEN*
    appear in the call tree; however, items which are called by OPEN*
    do not appear. Try the query without the trace expression and
    compare the results when the TRACE is given.

    4.  FIND CALLED_BY( END=translit,
                        BEGIN=(NOT DOMAIN=PREDEFINED and NOT lib$*),
                        DEPTH=ALL )

    This example leaves predefined functions and functions named
    LIB$* out of the call graph. Functions such as CHR and WRITELN
    in Pascal, MAX in FORTRAN, a builtin like _ADAWI in C, and so
    forth are predefined. These functions are defined by the language,
    not the programmer.

    5.  FIND IN( build_table and occ=comp, max_code )

    This example finds all occurrences of MAX_CODE in the module
    BUILD_TABLE. In this case, module has the same meaning as it
    does in SHOW MODULE. This is the fastest way to limit a query to
    occurrences in a particular module. The first parameter to the IN
    function tells SCA in what container to look. The "and occ=comp"
    part of the query ensures that the BUILD_TABLE you are looking
    in is one of the modules displayed by SHOW MODULE, rather than
    something else.

    The second parameter to the IN function tells SCA what to look
    for. This is faster than specifying the following:

          FIND IN( build_table and occ=comp ) and max_code

    Both queries in this example produce the same result.

    Routines Used in a Module But Declared Elsewhere

    In this example, you find functions that are used in a given
    module but have their primary declaration in some other module.
    This example is a multistep process that makes use of previous
    queries. Each query in this section is numbered so that you can
    refer to a specific query. If you refer to a query, adjust the
    query name (for example, where @1 is used) to refer to the query
    name you have created.

    1.  FIND IN( translit and occurrence=compilation_unit, -
             symbol=function and domain=(global,inheritable) )

    This query finds all occurrences of functions, either declarations
    or references, in the module TRANSLIT.

    You use "domain=(global,inheritable)" to limit the query only
    to occurrence in which you are interested. Only global and
    inheritable symbols can be imported because module-specific
    symbols are from the same module, and predefined symbols come
    from the language. Next, you have to remove any functions that
    have their primary declaration in the module.

    2.  FIND @1 AND NOT EXPAND( @1 and occurrence=primary )

    This query removes any functions that have a primary declaration
    in the module TRANSLIT. What remains are those global or
    inheritable functions that do not have a primary declaration in
    TRANSLIT.

    The EXPAND function in this query can be evaluated efficiently
    by SCA. The parameter to EXPAND, @1 and occurrence=primary, can
    be evaluated by looking at the result of query 1, so SCA does not
    have to use the SCA library. Because the overall query does @1 AND
    ..., everything in the result is present in the result of query 1.
    All we are doing is removing occurrences. In this case, SCA can
    evaluate the whole query expression by looking at the result of
    query 1 and does not have to use the SCA library.

    Items Declared In a Module But Not Used Anywhere In the Module

    In this example, you find occurrences of functions or variables
    that are declared in a module but are not used in the module. This
    example is a multistep process that makes use of previous queries.
    The numbers by each query are used to refer to it later. If you
    refer to a query, adjust the query name (for example, where @1 is
    used) to refer to the query names you have created.

    1.  FIND IN( translit and occurrence=compilation_unit, -
                 symbol=(function, variable) )

    This query finds all occurrences of functions or variables, either
    declarations or references, in the module TRANSLIT.

    2.  FIND @1 AND NOT EXPAND( @1 and occurrence=reference )

    This query removes from our first query any functions or variables
    that have a reference in the module TRANSLIT. What remains are
    those functions or variables that are not used anywhere in the
    module.

    The EXPAND function in this query can be evaluated efficiently
    by SCA. The parameter to EXPAND, @1 and occ=reference, can be
    evaluated just by looking at the result of query 1, so SCA does
    not have to use the SCA library. Because the overall query does
    @1 AND ..., everything in the result is present in the result of
    query 1. All we are doing is removing items. In this case, SCA can
    evaluate the whole query expression by looking at the result of
    query 1, and does not have to use the SCA library.

    Finding Unused Functions

    This example finds functions or subroutines that are never used.
    It provides several ways of solving the problem. Some of these are
    easy to understand, but can be very slow on larger SCA libraries.
    The more complex ones are intended to improve performance on
    larger SCA libraries. They do not have a significant impact on
    smaller libraries.

    The first example finds unused functions only. Note that instead
    of saying "occurrence=call" to find functions that are called, you
    specify "occurrence=reference" to find functions that are used at
    all. The query is as follows:

      FIND symbol=function AND occurrence=primary -
          AND NOT EXPAND( symbol=function and occurrence=reference )

    On the example library, this query works well because it is
    a small library. On a larger library, it may be too slow. To
    evaluate this query, SCA must first evaluate "symbol=function
    and occurrence=primary." It must then evaluate "symbol=function
    and occurrence=reference" before doing any additional processing.
    In this case, SCA has to do twice what is essentially the same
    work. Also, SCA does not discard information about functions that
    are referenced until the end, so it uses a lot of memory.

    Using Previous Query Results to Find Unused Functions Faster

    The next example also finds unused functions. However, it uses
    previous query results, so the work is done only once. For this
    reason, it is faster than the previous example. It also uses
    somewhat less memory, but still not enough to make a difference on
    a large library.

      FIND symbol=function and occurrence=(primary,reference)

    In the previous query, we find all the occurrences that we want to
    use. We ignore the associated declarations at this point because
    they are not essential to the query.

    Next, we must select those functions that are not used as in the
    following query:

      FIND @1 AND occurrence=primary -
           AND NOT EXPAND( @1 AND occurrence=reference )

    This query removes from the list of functions in our system any
    that are referenced, leaving only unreferenced functions. Because
    you are using a previous query with all the information in it,
    SCA does not have to access the SCA library, and performance is
    generally faster.

    However, on a large library, this may still be slow. The reason
    for this is that it ends up keeping a list of all the functions
    and all their references in memory.

2  –  Basic Query Concepts

    This section covers some of the basic concepts underlying SCA
    queries.

    What Queries Are

    An SCA library is a collection of information about your source
    code. This includes information, such as the names and locations
    of all variables in your code, all the places where routines
    are called and what their arguments are, and many other kinds
    of information.

    Issuing a query is the process of selecting some of this
    information from the library. By giving a query expression with
    the FIND command, you specify exactly what information you want to
    retrieve from the library.

    Occurrences

    An occurrence is any instance of an entity in your program. An
    entity can be any language construct, such as a variable, a
    routine, or a constant. To further clarify this, consider the
    following code fragment (not written in a particular language):

      1   MODULE myprog;
      2
      3   VAR i,j;
      4
      5   ROUTINE foo()
      6   BEGIN
      7       i = 5;
      8       j = i;
      9   END;
      10  END;

    The code contains four entities (myprog, foo, i, j). There is one
    occurrence each of the module myprog, and the routine foo. The
    variable i, however, has three occurrences, and the variable j has
    two.

    Attribute Selection

    Attribute selection is a query that selects occurrences based
    on certain attributes. For example, you can have SCA return all
    occurrences in which the name attribute is XYZ. The following
    sections list the attributes used for selection.

    NAME Attribute

    Generally, you think of entities in you program as having
    only a name. In fact, the name of an entity is only one of its
    attributes. What you are doing when you give the basic query FIND
    X, is asking for all occurrences in the library that have the name
    attribute X. (The query FIND X is equivalent to the query FIND
    NAME=X. NAME= is the default attribute, so it may be omitted.)

    SYMBOL_CLASS Attribute

    The symbol class attribute describes an occurrence in terms
    of language constructs. In the previous example, myprog is a
    MODULE, foo is a ROUTINE, and i and j are variables. Thus, you
    could ask SCA to find things based on the symbol class only. For
    example, you can find all the routines in the library by giving
    the following query: FIND SYMBOL_CLASS=ROUTINE

    Note that MODULE, ROUTINE, and VARIABLE are SCA keywords for
    symbol classes. Because different languages use different
    terminology, there is a need to understand how the SCA language-
    independent terms relate to the language-specific terms. We have
    provided tables to help you match the SCA terms to the specific
    language constructs for all the languages that support SCA. See
    the Getting_Started help subtopics for specific languages.

    OCCURRENCE Attribute

    The occurrence class attribute allows you to select occurrences
    based on attributes specific to the occurrence. In the previous
    example, on line 3 the occurrence of the variable i has an
    occurrence class of PRIMARY. On line 7, the occurrence has
    an occurrence class of WRITE, and on the following line, its
    occurrence class is READ. To find all entities that are declared
    in your system, specify the following query:

    FIND OCCURRENCE=PRIMARY

    Note that as with symbol classes, there is a need to understand
    the relationship between the SCA occurrence class keywords and
    the equivalent language terminology. See the Getting_Started help
    subtopics for specific languages.

    FILE_SPEC Attribute

    Another attribute of all occurrences is the name of the file in
    which they occur. If the previous example program was in a file
    called MYPROG.BAR, then the following query would return all the
    occurrences found in the file; in this case, all occurrences of
    myprog, foo, i, and j:

    FIND FILE_SPEC="MYPROG.BAR"

    SYMBOL DOMAIN Attribute

    The domain of an entity defines the scope within the source over
    which the entity is known. Variables or routines, for example,
    may be local to a particular module, or they might be known to all
    modules in a system. To find all occurrences of entities that are
    known throught your system, specify the following query:

    FIND DOMAIN=GLOBAL

    See the Getting_Started help subtopics for specific languages.

    Basic Queries

    You have already seen examples of the most basic type of query,
    that is a query based on the selection of just one attribute.
    These examples are:

    FIND X
    FIND SYMBOL=ROUTINE
    FIND OCCURRENCE=PRIMARY
    FIND DOMAIN=GLOBAL
    FIND FILE_SPEC="MYPROG.BAR"

    Each of these queries results in a set of occurrences. Often,
    the result of such a query contains more information than you
    really want. You can explicitly indicate the result you want by
    specifying multiple attributes and combining them by using set
    operations. For example, if you only want the ROUTINES named
    X (rather than all items named X or all routines), specify the
    following query expression:

    FIND X AND SYMBOL=ROUTINE

    In the previous example, the set operator AND was used to take the
    intersection of the two sets. The other set operators available
    are OR, XOR, and NOT. In this manner, you can combine attribute
    selection expressions using multiple set operators. For example:

    FIND (X OR Y ) AND SYMBOL=ROUTINE AND OCCURRENCE=CALL

    This query finds all call references to routines named X or Y.

    Relationship Queries

    You have already learned how to select occurrences based on
    their attributes. The following section describes how to select
    occurrences based on their relationship with other occurrences.

    Calls Relationship

    The most common of these relationships is the calls relationship.
    SCA provides two functions: CALLING and CALLED_BY. With these
    functions, you can display the call tree structure of your
    program. The most basic format of the query expression is as
    follows:

    FIND CALLED_BY FOO

    In this example, the result shows a structured display of all the
    routines that FOO directly calls. You can also display routines
    that call FOO as follows:

    FIND CALLING FOO

    The previous two queries answer the questions, "Who is called by
    FOO?" and, "Who is calling FOO?" respectively.

    The full syntax of the relationship functions is complex, and
    each relationship function is described in more detail under SCA_
    Topics. Without explaining why the parentheses are necessary,
    and emphasizing that the order of parameters is important, the
    following examples shows one more useful feature of relationship
    functions. It is possible to get a call tree of arbitrary depth by
    giving the following query:

    FIND CALLED_BY (FOO, DEPTH=ALL )

    This returns a display showing not only the routines called
    directly by FOO, but also the routines that they in turn call,
    for all levels. You can replace the keyword ALL with any positive
    integer to limit the depth of the call tree.

    Contains Relationship

    Another relationship available through SCA is the contains
    relationship, which is obtained through the CONTAINING and
    CONTAINED_BY functions. These functions have the same syntax as
    the calls functions.

    The CONTAINED_BY function returns all entities logically contained
    within the given parameter. For example, the query FIND CONTAINED
    FOO returns two occurrences of i and one occurrence of j, in the
    code fragment that follows:

      1   MODULE myprog;
      2
      3   VAR i,j;
      4
      5   ROUTINE foo()
      6   BEGIN
      7       i = 5;
      8       j = i;
      9   END;
      10  END;

    Similarly, the following query returns the occurrence of the
    module MYPROG:

    FIND CONTAINING FOO

    Types Relationship

    The types relationship consists of the two functions TYPING
    and TYPED_BY. These functions also have the same syntax as the
    previous functions. The TYPED_BY function returns type trees. This
    is useful if there are many user-defined types in your system,
    particularly if they are complex record structures. The TYPING
    function returns the type of its argument.

    For more information about all the relationship functions, see the
    help topic for each relationship.

3  –  Building An SCA Library

    To create your own SCA library, you must first create a library
    directory for it.  Once you have a directory in which to create a
    library, create a library from inside SCA using the CREATE LIBRARY
    command.

    You now have an empty SCA library. To add a module to the SCA
    library, you must first compile your source code and generate an
    analysis_data (.ana) file.  To load the analysis data file into your
    SCA library and show the new module, type the following SCA commands:

      SCA> LOAD myfile.ANA
      SCA> SHOW MODULE

    You will see that the new module has been loaded into the library,
    and you will now be able to query that library.

    For more information, see the help topics for Libraries and
    Reducing_LOAD_Time.

4  –  CALLED_BY

    The CALLED_BY function is a relationship function. It finds
    occurrences that have a CALLED_BY relationship between them.
    For example, if routine B is called by routine A, then these two
    occurrences are in a CALLED_BY relationship. In its most common
    form, the function format is as follows:

    CALLED_BY( <caller>, <callee>, DEPTH={<number> | ALL} )

    In this format, <caller> and <callee> can be any legal query
    expression, and <number> is a positive integer. A typical use
    of the function is to find those routines which are called by some
    specified routine. For example:

      FIND CALLED_BY( xyz, *, DEPTH=ALL )

    This query finds the full call tree below XYZ, where XYZ is some
    routine in the SCA database. In other words, this query finds all
    routines which are either directly or indirectly called by XYZ.

    The CALLED_BY function provides the power to return the exact call
    tree you want. The full format is as follows:

    CALLED_BY( [ END=<caller> ],
               [ BEGIN=<callee> ],
               [ DEPTH={<number> | ALL} ],
               [ RESULT=RESULT_KEYWORD ],
               [ TRACE=query_expression ] )

    In the previous format, <callee> and <caller> are any legal query
    expression, <number> is a positive integer, RESULT_KEYWORD can
    be STRUCTURE, NOSTRUCTURE, ANY_PATH, BEGIN, or END, and QUERY_
    EXPRESSION is any legal query expression.

    For a full description of the CALLED_BY relationship, see the
    LSE/SCA User Manual.

5  –  CALLING

    The CALLING function is a relationship function. It finds
    occurrences with the CALLING relationship between them. For
    example, if routine A is calling routine B, then these two
    occurrences are in a CALLING relationship. In its most common
    form, the function format is as follows:

    CALLING( <callee>, <caller>, DEPTH={<number> | ALL} )

    In this format, <callee> and <caller> can be any legal query
    expression and <number> is a positive integer. A typical use of
    the function is to find those routines which are calling some
    specified routine call. For example,

      FIND CALLING( abc, *, DEPTH=ALL )

    This query finds the full call tree above ABC, where ABC is some
    routine in the SCA database. In other words, find all the routines
    that are directly or indirectly calling ABC.

    The CALLING function provides the power to return the exact call
    tree of interest. The full format is:

    CALLING ( [ END=<callee> ],
              [ BEGIN=<caller> ],
              [ DEPTH={<number> | ALL} ],
              [ RESULT=RESULT_KEYWORD ],
              [ TRACE=query_expression ] )

    In the previous format, <callee> and <caller> are any legal query
    expression, <number> is a positive integer, RESULT_KEYWORD can be
    STRUCTURE, ANY_PATH, BEGIN, or END, and QUERY_EXPRESSION is any
    legal query expression.

    For a full description of the CALLING relationship, see the
    LSE/SCA User Manual.

6  –  CONTAINED_BY

    The CONTAINED_BY function is a relationship function. It finds
    occurrences that have a CONTAINED_BY relationship between them. In
    its most common form, the function format is as follows:

    CONTAINED_BY( <container>, <containee>, DEPTH={<number> | ALL} )

    In this format, <container> and <containee> can be any legal query
    expression, and <number> is a positive integer.

    Some examples will help you understand this function. The diagram
    that follows applies to these examples.

              A (module)
              +-------------------------+
              |                         |
              |  B (routine)            |
              |  +-------------------+  |
              |  |                   |  |
              |  |  C (routine)      |  |
              |  |  +-------------+  |  |
              |  |  |             |  |  |
              |  |  | D (variable)|  |  |
              |  |  |             |  |  |
              |  |  |             |  |  |
              |  |  +-------------+  |  |
              |  |                   |  |
              |  +-------------------+  |
              |                         |
              | E (variable)            |
              |                         |
              +-------------------------+

    Consider the following queries:

      1. FIND CONTAINED_BY( A, *, DEPTH=1 )
      2. FIND CONTAINED_BY( C, *, DEPTH=1 )
      3. FIND CONTAINED_BY( A, *, DEPTH=2 )

    The first query returns A (the container), B (a containee), and
    E (a containee). Similarly, the second query returns C and D.
    The third query returns A, B, and C and E. The D variable is NOT
    included because it is not reachable at a depth of two.

    Now consider the following two queries:

      4. FIND CONTAINED_BY( A, D, DEPTH=ALL )
      5. FIND CONTAINED_BY( A, D, DEPTH=2 )

    Query four returns A (the container), B (because it is on the path
    to D), C (becasue it is on the path) and D (which is the containee
    being searched for). The fifth query does not return anything
    because the D variable cannot be reached at a depth of two.

    Where a container begins and ends is determined by the language
    syntax. These boundaries are reported to SCA by the compiler and
    used by the CONTAINED_BY function to determine nesting.

    The CONTAINED_BY function provides the power to return the exact
    nesting structure you want. The full format is as follows:

    CONTAINED_BY( [ END=<container> ],
                  [ BEGIN=<containee> ],
                  [ DEPTH={<number> | ALL} ],
                  [ RESULT=RESULT_KEYWORD ],
                  [ TRACE=query_expression ] )

    In the previous format, <containee> and <container> is any legal
    query expression, <number> is a positive integer, RESULT_KEYWORD
    can be STRUCTURE, NOSTRUCTURE, ANY_PATH, BEGIN, or END, and QUERY_
    EXPRESSION is any legal query expression.

    For a full description of the CONTAINED_BY relationship, see the
    LSE/SCA User Manual. See also the help topic for the IN function,
    which is similar to the CONTAINED_BY relationship.

7  –  CONTAINING

    The CONTAINING function is a relationship function. It finds
    occurrences that have a CONTAINING relationship between them.
    In its most common form, the function format is as follows:

    CONTAINING( <containee>, <container>, DEPTH={<number> | ALL} )

    In this format, <containee> and <container> can be any legal query
    expression, and <number> is a positive integer.

    Some examples will help you understand the CONTAINING function.
    The diagram that follows applies to these examples.

              A (module)
              +-------------------------+
              |                         |
              |  B (routine)            |
              |  +-------------------+  |
              |  |                   |  |
              |  |  C (routine)      |  |
              |  |  +-------------+  |  |
              |  |  |             |  |  |
              |  |  | D (variable)|  |  |
              |  |  |             |  |  |
              |  |  |             |  |  |
              |  |  +-------------+  |  |
              |  |                   |  |
              |  +-------------------+  |
              |                         |
              | E (variable)            |
              |                         |
              +-------------------------+

    Consider the following queries:

      1. FIND CONTAINING( D, *, DEPTH=1 )
      2. FIND CONTAINING( C, *, DEPTH=1 )
      3. FIND CONTAINING( D, *, DEPTH=2 )

    The first query returns D (the containee), and C (the container).
    Similarly, the second query returns C and B. The third query
    returns D, C and B.

    Now consider the following 2 queries:

      4. FIND CONTAINING( D, A, DEPTH=ALL )
      5. FIND CONTAINING( D, A, DEPTH=2 )

    Query four returns D (the containee), C (because it is on the
    path to A), B (because it is on the path) and A (which is the
    container being looked for). The fifth query does not return
    anything because A cannot be reached at a depth of two.

    Where a container begins and ends is determined by the language
    syntax. These boundaries are reported to SCA by the compiler and
    used by the CONTAINING function to determine nesting.

    The CONTAINING function provides the power to return the exact
    nesting structure you want. The full format is as follows:

    CONTAINING( [ END=<containee> ],
                [ BEGIN=<container> ],
                [ DEPTH={<number> | ALL} ],
                [ RESULT=RESULT_KEYWORD ],
                [ TRACE=query_expression ] )

    In the previous format, <containee> and <container> is any legal
    query expression, <number> is a positive integer, RESULT_KEYWORD
    can be STRUCTURE, NOSTRUCTURE, ANY_PATH, BEGIN, or END, and QUERY_
    EXPRESSION is any legal query expression.

    For a full description of the CONTAINING relationship, see the
    LSE/SCA User Manual.

8  –  DOMAIN

    DOMAIN is an attribute of an occurrence that determines the scope
    of the symbol defined. It is the range of source code in which a
    symbol has the potential of being used.

    For example, A BLISS OWN declaration creates a symbol that has
    a module-specific symbol domain; it cannot be used outside that
    module. On the other hand, a BLISS GLOBAL declaration creates a
    symbol that has a multimodule symbol domain; it has the potential
    of being used in more than one module.

    The format for DOMAIN is as follows:

    DOMAIN=(keyword[,keyword...])

    The keyword can be one of the following:

    o  INHERITABLE - able to be inherited into other modules (for
       example, through BLISS library, PASCAL environment, or Ada
       compilation system mechanisms)

    o  GLOBAL - known to multiple modules via linker global symbol
       definitions

    o  PREDEFINED - defined by the language (examples: BLISS ap,
       FORTRAN sin, PASCAL writeln)

    o  MULTI_MODULE - domain spans more than one module (domain=multi_
       module is equivalent to domain=(inheritable,global,predefined)

    o  MODULE_SPECIFIC - domain is limited to one module

    The previous keywords are SCA terms. For information on
    corresponding language-specific terms, request help for the
    appropriate language table (for example, FORTRAN_ATTRIBUTES_TABLE)
    under the Getting_Started help topic.

    An example using the DOMAIN attribute follows:

      FIND DOMAIN=GLOBAL AND SYMBOL=VARIABLE

    This query finds all global variables.

9  –  EXPAND

    The EXPAND function determines the symbol to which an occurrence
    belongs and returns the full set of occurrences for the symbol.

    For example, the following code fragments, written in a pseudo
    language, declare and use the variable i in three files.

      file 1          file 2          file 3
      ------          ------          ------

      GLOBAL i (d)    LOCAL i (d)     EXTERNAL i (d)

      i := 0 (wr)     i := 5 (wr)     IF i EQUALS 0 (rr)

      (d)  - declaration
      (wr) - write reference
      (rr) - read reference

    The pseudo language defines variables, such that the variable i
    in "file 1" and the variable i in "file 3" are the same variable.
    The variable i in "file 2", however, is a different variable. SCA
    treats these variables in the same manner by saying there are two
    unique symbols which happen to have the same name.

    The important point in the previous example is that what the
    programmer considers unique items SCA also considers unique items.
    In SCA terms, these items are symbols.

    Given the previous code fragments, consider the follwoing query:

      FIND SYMBOL_CLASS=VARIABLE AND OCCURRENCE=READ

    This query returns one occurrence, which is the read reference in
    "file 3." Now consider the next query:

      FIND EXPAND( symbol_class=variable and occurrence=read )

    This query returns two occurrences of "i" in "file 1" and the two
    occurrences of "i" in "file 3." The EXPAND function uses the read
    reference to determine the corresponding symbol and then returns
    all the occurrences for that symbol. In this case the symbol was
    the global variable "i".

    Note that the two occurrences in "file 2" are not returned because
    they belong to a different symbol. The programmer does not view
    the i in "file 2" to be the same as the i in "file 1" and "file 3"
    and SCA reflects that view.

    When given more than one occurrence, the EXPAND function performs
    this operation iteratively and removes any duplicate occurrences
    from the result.

    In the following example, you use the EXPAND function to find the
    declarations of routines defined in the system, but which are not
    used. To do this, specify the following query:

      FIND (SYMBOL=ROUTINE AND OCCURRENCE=PRIMARY) AND NOT
      EXPAND(SYMBOL=ROUTINE AND OCCURRENCE=REFERENCE)

10  –  FILE_SPEC

    FILE_SPEC is an attribute selection that specifies the name of the
    file. You identify a source file by its file name.  If it contains
    a period (.), the file name should be enclosed in quotation marks.

    The format for the FILE_SPEC attribute is as follows:

    FILE_SPEC="filename.extension"

    An example using the FILE_SPEC attribute follows:

      FIND FILE_SPEC="MYPROG.FOR"

    This query finds all occurrences in the file MYPROG.FOR.

11  –  Getting Started

    SCA works with many languages. See the subtopics in this section
    for information about getting started with a specific language.

11.1  –  Using Ada

    This section contains some basic examples that show what SCA can
    do to help you with your programs. The examples have very little
    explanation. For a more detailed explanation of the underlying
    concepts, see the Basic_Query_Concepts help topic. The remainder
    of this section is written in terms that are specific to Ada
    programs.

    If you want to follow along and try the examples, you will need to
    have an SCA library available. The examples use generic variable
    names (such as 'i'). You will have to substitute variable names that
    exist in your code when trying the examples.

    The first example is the easiest query: It lets you find all the
    items in your SCA library named 'i', and shows you all the places
    where they appear (all occurrences  of 'i').

    FIND i

    You can search for any name in this manner, including using
    wildcard characters (for example, FIND i*).

    Suppose you are looking for an occurrence, and you know that
    it occurs in a particular file. The following query finds all
    occurrences of items that are named 'i' but will then limit them
    to those which happen to occur in the file named PROG.ADA.

    FIND i AND FILE_SPEC="PROG.ADA"

    Another typical question one might ask is, "Find all the places
    where this item is assigned to (or read from, called, declared,
    and so forth)." The next example finds all occurrences of items
    that are named 'i', but then limits them to only those occurrences
    where 'i' is assigned a value:

    FIND i AND OCCURRENCE=WRITE

    (SCA understands many occurrence classes other then WRITE. See the
    help subtopics under Getting_Started for tables containing all the
    SCA attributes and their corresponding meanings in Ada.)

    Often, you only want to know where (in what file or package) a
    particular function is, so that you can go to it and edit it.
    You can use the first query (where 'i' will be the name of the
    function) and then look through the output. The output will
    include all occurrences of the function, one of which would be
    its declaration, which you can then select. Or, you can ask SCA to
    limit the search for you by typing the following query:

    FIND i AND OCCURRENCE=PRIMARY

    In SCA terms, a primary declaration is the most significant
    declaration of an item. For an Ada function, this means the body
    of the function, or package, or generic, and so forth. This is in
    contrast to the specification, which is considered an associated
    declaration.

    Another problem you might have is that there are many different
    items in your system having a given name. Some may be variables;
    others may be functions, constants, tasks, and so forth. Suppose
    you want to find only the functions named i. Again, the query
    FIND i will give you what you want, but it will also give you much
    more. It is preferable to issue the following query:

    FIND i AND SYMBOL_CLASS=FUNCTION

    The previous four examples have selected information based on two
    attributes. The last example selected information based on a name
    attribute (in this case, i) and a symbol class attribute (in this
    case, FUNCTION). Note how the attributes are combined using the
    boolean operator AND. In general, you can select items out of your
    library based on any combination of attributes, using AND as well
    as the other logical operators OR, XOR, and NOT.

    The next example shows another primary feature of SCA - the
    ability to display relationships between items. This example shows
    the most common use of this feature. It finds the complete call
    tree (that is, all functions called directly and indirectly) of
    the function named i.

    FIND CALLED_BY (i, DEPTH=ALL)

    If you want to limit the depth of the call tree, replace the
    keyword ALL by any positive integer.

    To obtain help on the following topics, request help as indicated.

    o  For help on query language, see the Basic_Query_Concepts help
       topic.

    o  For help on libraries, see the Building_An_SCA_Library help
       topic.

11.2  –  Ada Attributes Table

    The following table lists the SCA symbol classes and their
    corresponding meanings in Ada.

    SCA Symbol Classes and Equivalent Ada Language Terminology

    SCA Term       Ada Term       Explanation

    Argument       Formal         A subprogram formal parameter
                   parameter

    Component,     Component      Record components and discriminants
    Field

    Constant,      Constant
    Literal

    Exception      Exception

    File           File           A file used during compilation

    Function,      All
    Procedure,     subprograms,
    Program,       entries,
    Routine,       and ACCEPT
    Subroutine     statements

    Generic        Generic        Generic subprograms or generic
                                  packages

    Keyword        Keyword        PDF keyword tag

    Label          Labels
                   and loop
                   identifiers

    Macro          N/A

    Module,        Packages
    Package

    Placeholder    Placeholder    LSE placeholder

    Psect          N/A

    Tag            Tag            PDF tag

    Task           Task           Task objects

    Type           Type

    Unbound        Unbound        Pragmas and attributes

    Variable       Object

    The following table lists the SCA occurrence classes and their
    corresponding meanings in Ada.

    SCA Occurrence Classes and Equivalent Ada Language Terminology

    SCA Term       Ada Term       Explanation

    Primary        Body           For example, package body

    Associated     Specification  For example, package specification

    Declaration    Declaration    Any declaration, either primary or
                                  associated

    Reference      Reference      Any nondeclaration

    Read, Fetch    Read

    Write, Store   Write

    Address,       N/A
    Pointer

    Call           Call

    Command_line   Command line   A file referred to on the command
                                  line; for example, ADA foo.ada

    Include        N/A

    Precompiled    N/A

    Separate       Separate       Any Ada package or sub-program unit
                                  defined as SEPARATE

    With           With           Any WITH of an Ada package or sub-program
                                  unit

    Explicit       Explicit       An entity that is explicitly
                                  declared. For example,
                                  declarations resulting from generic
                                  instantiations.

    Implicit       Implicit       Any symbol declared by the compiler,
                                  for example a loop name

    Visible        Visible        A symbol whose name is visible in
                                  the source

    Hidden         Hidden         A symbol whose name is not visible
                                  in the source; for example,
                                  anonymous types

    Compilation_   Compilation    Subprogram declaration or body,
    unit           unit           package declaration or body, and so
                                  forth

    Limited        Limited        Any Ada limited private type

    Private        Private        Any Ada private type

    The following table lists the SCA domain classes and their
    corresponding meanings in ADA.

    SCA Domain Classes and Equivalent Ada Language Terminology

    SCA Term       Ada Term       Explanation

    Inheritable                   Objects declared in a package
                                  specification

    Global         N/A

    Predefined     N/A

    Multi_module                  Inheritable, Global and Predefined

    Module_        Module         Objects known to only one module
    specific       specific

11.3  –  Using BLISS

    This section contains some basic examples that show what SCA can
    do to help you with your programs. The examples have very little
    explanation. For a more detailed explanation of the underlying
    concepts, see the Basic_Query_Concepts help topic. The remainder
    of this section is written in terms that are specific to BLISS
    programs.

    If you want to follow along and try the examples, you will need to
    have an SCA library available. The examples use generic variable
    names (such as 'i'). You will have to substitute variable names that
    exist in your code when trying the examples.

    The first example is the easiest query. It lets you find all the
    items in your SCA library named i, and shows you all the places
    where they appear (all occurrences of i):

    FIND i

    You can search for any name in this manner, including using
    wildcard characters (for example, FIND i*).

    Now suppose you are looking for an occurrence, and you know that
    it occurs in a particular file. The following query finds all
    occurrences of items that are named i, but will then limit them to
    those that happen to occur in the file named PROG.B32.

    FIND i AND FILE_SPEC="PROG.B32"

    Another typical question you might ask is, "Find all the places
    where this item is assigned to (or read from, called, declared and
    so forth)." The next example finds all occurrences of items that
    are named i, but then limits them to only those occurrences where
    i is assigned a value:

    FIND i AND OCCURRENCE=WRITE

    (SCA understands many occurrence classes other then WRITE. See the
    help subtopics under Getting_Started for tables containing all the
    SCA attributes and their corresponding meanings in BLISS.)

    Often, you only want to know where (in what file or module) a
    particular routine is, so that you can go to it and edit it. You
    can use the first query (where i will be the name of the routine)
    and then look through the output. The output will include all
    occurrences of the routine, one of which will be its declaration,
    which you can then select. Or, you can ask SCA to limit the search
    for you by typing the following query:

    FIND i AND OCCURRENCE=PRIMARY

    In SCA terms, a primary declaration is the most significant
    declaration of an item. For a BLISS routine, this means the
    place where the routine is actually implemented. This is in
    contrast to FORWARD or EXTERNAL declarations, which are associated
    declarations.

    Another problem you might have is that there are many different
    items in your system having a given name. Some may be variables;
    others may be routines, literals, macros, and so forth. Suppose
    you want to find only the routines named i. Again, the query
    FIND i will give you what you wanted, but it will also give you
    much more. It is preferable to issue the following query:

    FIND i AND SYMBOL_CLASS=ROUTINE

    The last four examples have all selected information based on two
    attributes. The last example selected information based on a name
    attribute (in this case, i) and a symbol_class attribute (in this
    case, ROUTINE). Note how the attributes are combined using the
    boolean operator AND. In general, you can select items out of your
    library based on any combination of attributes, using AND as well
    as the other logical operators OR, XOR, and NOT.

    The next example shows another primary feature of SCA - the
    ability to display relationships between items. This example shows
    the most common use of this feature. It finds the complete call
    tree (that is, all routines called directly and indirectly) of the
    routine named i.

    FIND CALLED_BY (i, DEPTH=ALL)

    If you want to limit the depth of the call tree, replace the
    keyword ALL by any positive integer.

    To obtain help on the following topics, request help as indicated.

    o  For help on query language, see the Basic_Query_Concepts help
       topic.

    o  For help on libraries, see the Building_An_SCA_Library help
       topic.

11.4  –  BLISS Attributes Table

    The following table lists the SCA symbol classes and their
    corresponding meanings in BLISS.

    SCA Symbol Classes and Equivalent BLISS Language Terminology

    SCA Term       BLISS Term     Explanation

    Argument       Parameter      Routine formal parameter

    Component,     Field          Subpart of a BLOCK or BLOCKVECTOR
    Field                         structure

    Constant,      Literal        A literal
    Literal

    Exception      N/A

    File           file           A file used during compilation

    Function,      routine        A routine
    Procedure,
    Program,
    Routine,
    Subroutine

    Generic        N/A

    Keyword        Keyword        PDF keyword tag

    Label          Label          A label identifier

    Macro          Macro          A macro

    Module,        Module         A compilation unit
    Package

    Placeholder    Placeholder    An LSE placeholder

    Psect          Psect          A psect

    Tag            Tag            A PDF tag

    Task           N/A

    Type           Type           For example, fieldset

    Unbound        Unbound        A name the compiler does not know
                                  the purpose of. This is common when
                                  macros are used.

    Variable       Variable       A program variable

    The following table lists the SCA occurrence classes and their
    corresponding meanings in BLISS.

    SCA Occurrence Classes and Equivalent BLISS Language Terminology

    SCA Term       BLISS Term     Explanation

    Primary        Declaration    The declaration containing the
                                  actual implementation

    Associated     Declaration    A FORWARD or EXTERNAL declaration

    Declaration    Declaration    Either a PRIMARY or ASSOCIATED
                                  declaration

    Read, Fetch    Fetch

    Write, Store   Store

    Address,       Address
    Pointer

    Call           call

    Command_line   Input file     A file specified on the command
                   specification  line; for example, BLISS foo.b32

    Include        Require        A file specified in a REQUIRE or
                                  %REQUIRE statement

    Precompiled    Library        A file specified in a LIBRARY
                                  statement

    Reference      Reference      Any nondeclaration

    Explicit       Explicit       Any symbol declared by the user

    Implicit       Implicit       Any symbol declared by the compiler;
                                  for example, a loop variable

    Visible        Visible        A symbol whose name is visible in
                                  the source

    Hidden         Hidden         A symbol whose name is not visible
                                  in the source; for example,
                                  contained inside a macro

    Compilation_   Module         A module
    unit           declaration

    The following table lists the SCA domain classes and their
    corresponding meanings in BLISS.

    SCA Domain Classes and Equivalent BLISS Language Terminology

    SCA Term       BLISS Term     Explanation

    Inheritable    Inheritable    A symbol declared in a library file,
                                  and used elsewhere

    Global         GLOBAL

    Predefined     Defined by     For example, CH$FILL, BLOCKVECTOR,
                   the language   and so forth

    Multi_module                  GLOBAL, Predefined, or Inheritable

    Module_        LOCAL or OWN
    specific

11.5  –  Using C

    This section contains some basic examples that illustrate what
    SCA can do to help you with your programs. The examples have very
    little explanation. If you want a more detailed explanation of the
    underlying concepts, see the Basic_Query_Concepts help topic. The
    remainder of this section is written in terms that are specific to
    C programs.

    If you want to follow along and try the examples, you will need to
    have an SCA library available. The examples use generic variable
    names (such as 'i'). You will have to substitute variable names that
    exist in your code when trying the examples.

    The first example is the easiest query: It lets you find all the
    items in your SCA library named i, and shows you all the places
    where they appear (all occurrences of i).

    FIND i

    You can search for any name in this manner, including using
    wildcard characters (for example, FIND i*).

    Now let's say you are looking for an occurrence, and you know
    that it occurs in a particular file. The following query finds all
    occurrences of items that are named i but will then limit them to
    those which happen to occur in the file named 'PROG.C'.

    FIND i AND FILE_SPEC="PROG.C"

    Another typical question one might ask is "Find all the places
    where this item is assigned to (or read from, called, declared,and
    so forth)." The next example finds all occurrences of items that
    are named i, but then limits them to only those occurrences where
    i is assigned a value.

    FIND i AND OCCURRENCE=WRITE

    (SCA understands many occurrence classes other then WRITE. See the
    help subtopics under Getting_Started for tables containing all the
    SCA attributes and their corresponding meanings in C.)

    Often, you only want to know where (in what file or module) a
    particular function is, so that you can go to it and edit it.
    You could use the first query (where i would be the name of the
    function) and then look through the output. The output would
    include all occurrences of the function, one of which would be
    its definition, which you could then select. Or, you could ask SCA
    to limit the search for you by typing the following query:

    FIND i AND OCCURRENCE=PRIMARY

    In SCA terms, a primary declaration is the most significant
    declaration of an item. For a C function, this means the function
    definition. This is in contrast to a C function declaration
    (for example, extern i()), which in SCA terms is an associated
    declaration.

    Another problem you might have is that there are many different
    items in your system having a given name. Some may be variables;
    others may be functions, #define  constants, macros, and so forth.
    Suppose you want to find only the functions named i. Again, the
    query FIND i would give you what you wanted, but it would also
    give you much more. It is preferable to issue the following query:

    FIND i AND SYMBOL_CLASS=FUNCTION

    The last four examples have all selected information based on two
    attributes. The last example selected information based on a name
    attribute (in this case, i) and a symbol class attribute (in this
    case, FUNCTION). Note how the attributes are combined using the
    boolean operator AND. In general, you can select items out of your
    library based on any combination of attributes, using AND as well
    as the other logical operators OR, XOR and NOT.

    The next example shows another primary feature of SCA - the
    ability to display relationships between items. The example
    given here shows the most common use of this feature. It finds
    the complete call tree (that is, all functions called directly and
    indirectly), of the function named i.

    FIND CALLED_BY (i, DEPTH=ALL)

    If you want to limit the depth of the call tree, you can replace
    the keyword ALL by any positive integer.

    To obtain help on the following topics, request help as indicated.

    o  For help on query language, see the Basic_Query_Concepts help
       topic.

    o  For help on libraries, see the Building_An_SCA_Library help
       topic.

11.6  –  C Attributes Table

    The following table lists the SCA symbol classes and their
    corresponding meanings in C.

    SCA Symbol Classes and Equivalent C Language Terminology

    SCA Term       C Term         Explanation

    Argument       Formal         The variable named in a function
                   Parameter      definition

    Component,     Member         A member of a structure or union
    Field

    Constant,      Constant       A defined value that does not change
    Literal

    Exception      N/A

    File           File           A file used during compilation

    Function,      Function       Any function ( such as 'main' )
    Procedure,
    Program,
    Routine,
    Subroutine

    Generic        N/A

    Keyword        Keyword        PDF keyword tag

    Label          Label          A label identifier

    Macro          Macro          A Macro created by #define

    Module,        Module         Each .c source file represents a
    Package                       module

    Placeholder    Placeholder    An LSE placeholder

    Psect          N/A

    Tag            Tag            A PDF tag

    Task           N/A

    Type           Type           int, float, struct {...}, typedef,
                                  and so forth

    Unbound        N/A

    Variable       Variable       Program variable

    The following table lists the SCA occurrence classes and their
    corresponding meanings in C.

    SCA Occurrence Classes and Equivalent C Language Terminology

    SCA Term       C Term         Explanation

    Primary        Declaration    Most significant declaration; for
                   or definition  example, a variable declaration, or
                                  a function definition

    Associated     Declaration    Other declarations; for example,
                                  function declarations or EXTERN
                                  declarations

    Declaration    Definition or  Any declaration, either primary or
                   Declaration    associated

    Read, Fetch    Read           The act of retrieving an Rvalue

    Write, Store   Write          Changing the contents of an Lvalue

    Address,       Address        The use of the & operator
    Pointer

    Call           Call           A function call

    Command_line   Command_line   A file specified on the command
                                  line, for example, CC foo.c

    Include        Include        A file specified in a #include
                                  preprocessor directive

    Precompiled    N/A

    Reference      Reference      Any nondeclaration

    Explicit       Explicit       An entity that is explicitly
                                  declared

    Implicit       Implicit       An entity that is implicitly
                                  declared by the compiler; for
                                  example, a function with no type
                                  is implicitly declared as INT

    Visible        Visible        Occurrence appears in source

    Hidden         Hidden         Occurrence does not appear in
                                  source; for example, it appears
                                  only in the expansion of a macro

    Compilation_   Module         A module
    unit

    The following table lists the SCA domain classes and their
    corresponding meanings in C.

    SCA Domain Classes and Equivalent C Language Terminology

    SCA Term       C Term         Explanation

    Inheritable    N/A

    Global         Globally       For example, extern, globaldef,
                   visible        globalref, globalvalue

    Predefined     Defined by     For example, int, float, char
                   the language

    Multi_module                  Predefined and global

    Module_        Local to one   For example, static, auto, register
    specific       module

11.7  –  Using C++

    This section contains some basic examples that illustrate what
    SCA can do to help you with your programs. The examples have very
    little explanation. If you want a more detailed explanation of the
    underlying concepts, see the Basic_Query_Concepts help topic. The
    remainder of this section is written in terms that are specific to
    C++ programs.

    If you want to follow along and try the examples, you will need to
    have an SCA library available. The examples use generic variable
    names (such as 'i'). You will have to substitute variable names that
    exist in your code when trying the examples.

    The first example is the easiest query: It lets you find all the
    items in your SCA library named i, and shows you all the places
    where they appear (all occurrences of i).

    FIND i

    You can search for any name in this manner, including using
    wildcard characters (for example, FIND i*).

    Now let's say you are looking for an occurrence, and you know
    that it occurs in a particular file. The following query finds all
    occurrences of items that are named i but will then limit them to
    those which happen to occur in the file named 'PROG.CXX'.

    FIND i AND FILE_SPEC="PROG.CXX"

    Another typical question one might ask is "Find all the places
    where this item is assigned to (or read from, called, declared,and
    so forth)." The next example finds all occurrences of items that
    are named i, but then limits them to only those occurrences where
    i is assigned a value.

    FIND i AND OCCURRENCE=WRITE

    (SCA understands many occurrence classes other then WRITE. See the
    help subtopics under Getting_Started for tables containing all the
    SCA attributes and their corresponding meanings in C++.)

    Often, you only want to know where (in what file or module) a
    particular function is, so that you can go to it and edit it.
    You could use the first query (where i would be the name of the
    function) and then look through the output. The output would
    include all occurrences of the function, one of which would be
    its definition, which you could then select. Or, you could ask SCA
    to limit the search for you by typing the following query:

    FIND i AND OCCURRENCE=PRIMARY

    In SCA terms, a primary declaration is the most significant
    declaration of an item. For a C++ function, this means the function
    definition. This is in contrast to a C++ function declaration (for
    example, extern i()), which in SCA terms is an associated declaration.

    Another problem you might have is that there are many different
    items in your system having a given name. Some may be variables;
    others may be functions, #define  constants, macros, and so forth.
    Suppose you want to find only the functions named i. Again, the
    query FIND i would give you what you wanted, but it would also
    give you much more. It is preferable to issue the following query:

    FIND i AND SYMBOL_CLASS=FUNCTION

    The last four examples have all selected information based on two
    attributes. The last example selected information based on a name
    attribute (in this case, i) and a symbol class attribute (in this
    case, FUNCTION). Note how the attributes are combined using the
    boolean operator AND. In general, you can select items out of your
    library based on any combination of attributes, using AND as well
    as the other logical operators OR, XOR and NOT.

    The next example shows another primary feature of SCA - the
    ability to display relationships between items. The example
    given here shows the most common use of this feature. It finds
    the complete call tree (that is, all functions called directly and
    indirectly), of the function named i.

    FIND CALLED_BY (i, DEPTH=ALL)

    If you want to limit the depth of the call tree, you can replace
    the keyword ALL by any positive integer.

    To obtain help on the following topics, request help as indicated.

    o  For help on query language, see the Basic_Query_Concepts help
       topic.

    o  For help on libraries, see the Building_An_SCA_Library help
       topic.

11.8  –  C++ Attributes Table

    The following table lists the SCA symbol classes and their
    corresponding meanings in C++.

    SCA Symbol Classes and Equivalent C++ Language Terminology

    SCA Term       C++ Term         Explanation

    Argument       Formal           Formal arguement such as a routine
                   Parameter        or macro argument

    Class          Class            Any C++ class object defined by class,
                                    structure or union

    Component,     Class, structure A component of a class, structure
    Field          or union member  or union

    Constant,      Constant         Named compile-time constants
    Literal

    Exception      Exception        A program exception specified by
                                    the catch, throw and try statements

    File           File             A file used during compilation

    Function,      Function         Callable routines defined by function
    Procedure,                      statements
    Program,
    Routine,
    Subroutine

    Generic        Template         Generic object defined by template
                                    objects

    Keyword        Keyword          PDF keyword tag

    Label          Function Label   User-specified label

    Macro          Macro            A Macro created by #define

    Module,        Module           Any logical program unit typically
    Package                         each .cxx source file represents a
                                    module

    Placeholder    Placeholder      An LSE placeholder

    Psect          N/A

    Tag            Tag              A PDF tag

    Task           N/A

    Type           Type             int, float, struct {...}, typedef,
                                    and so forth

    Unbound        N/A

    Variable       Variable         Program variable

    The following table lists the SCA occurrence classes and their
    corresponding meanings in C++.

    SCA Occurrence Classes and Equivalent C++ Language Terminology

    SCA Term       C++ Term         Explanation

    Primary        Declaration    Most significant declaration; for
                   or definition  example, a variable declaration, or
                                  a function definition

    Associated     Declaration    Other declarations; for example,
                                  function declarations or EXTERN
                                  declarations

    Declaration    Definition or  Any declaration, either primary or
                   Declaration    associated

    Read, Fetch    Read           The act of retrieving an Rvalue

    Write, Store   Write          Changing the contents of an Lvalue

    Address,       Address        The use of the & operator
    Pointer

    Call           Call           A function call

    Command_line   Command_line   A file specified on the command
                                  line, for example, Cxx foo.c

    Include        Include        A file specified in a #include
                                  preprocessor directive

    Precompiled    N/A

    Base           Base           Any base class of a class

    Friend         Friend         Any friend of a class

    Member         Member         Any member of a class

    Reference      Reference      Any nondeclaration

    Explicit       Explicit       An entity that is explicitly
                                  declared

    Implicit       Implicit       An entity that is implicitly
                                  declared by the compiler; for
                                  example, a function with no type
                                  is implicitly declared as INT

    Visible        Visible        Occurrence appears in source

    Hidden         Hidden         Occurrence does not appear in
                                  source; for example, it appears
                                  only in the expansion of a macro

    Compilation_   Module         A module
    unit

    Private        Private        Any private object

    Protected      Protected      Any protected object

    Public         Public         Any public object

    Virtual        Virtual        Any virtual object

    The following table lists the SCA domain classes and their
    corresponding meanings in C++.

    SCA Domain Classes and Equivalent C++ Language Terminology

    SCA Term       C++ Term         Explanation

    Inheritable    N/A

    Global         Globally       For example, extern, globaldef,
                   visible        globalref, globalvalue

    Predefined     Defined by     For example, int, float, char
                   the language

    Multi_module                  Predefined and global

    Module_        Local to one   For example, static, auto, register
    specific       module

11.9  –  Using FORTRAN

    This section contains some basic examples that illustrate what
    SCA can do to help you with your programs. The examples have very
    little explanation. If you want a more detailed explanation of the
    underlying concepts, see the Basic_Query_Concepts help topic. The
    remainder of this section is written in terms that are specific to
    FORTRAN programs.

    If you want to follow along and try the examples, you will need to
    have an SCA library available. The examples use generic variable
    names (such as 'i'). You will have to substitute variable names that
    exist in your code when trying the examples.

    The first example is the easiest query: It lets you find all the
    items in your SCA library named i, and shows you all the places
    where they appear (all occurrences of i).

    FIND i

    characters (for example, FIND i*).

    Now let's say you are looking for an occurrence, and you know
    that it occurs in a particular file. The following query finds all
    occurrences of items that are named i but will then limit them to
    those which happen to occur in the file named 'PROG.FOR'.

    FIND i AND FILE_SPEC="PROG.FOR"

    Another typical question one might ask is "Find all the places
    where this item is assigned to (or read from, called, declared,
    and so forth)." The next example finds all occurrences of items
    that are named i, but then limits them to only those occurrences
    where i is assigned a value.

    FIND i AND OCCURRENCE=WRITE

    (SCA understands many occurrence classes other then WRITE. See the
    help subtopics under Getting_Started for tables containing all the
    SCA attributes and their corresponding meanings in FORTRAN.)

    Often, you only want to know where (in what file or module) a
    particular subroutine is, so that you can go to it and edit it.
    You could use the first query (where i would be the name of the
    subroutine) and then look through the output. The output would
    include all occurrences of the subroutine, one of which would be
    its definition, which you could then select. Or, you could ask SCA
    to limit the search for you by typing the following query:

    FIND i AND OCCURRENCE=PRIMARY

    In SCA terms, a primary declaration is the most significant
    declaration of an item. For a FORTRAN subroutine, this is where
    the actual SUBROUTINE statement is. This is in contrast to a
    FORTRAN EXTERNAL declaration, which in SCA terms is an associated
    declaration. The FORTRAN compiler also creates implicit associated
    declarations for any undeclared functions.

    Another problem you might have is that there are many different
    items in your system having a given name. Some may be variables;
    others may be subroutines, PARAMETER constants, and so forth.
    Suppose you want to find only the subroutines named i. Again, the
    query FIND i would give you what you wanted, but it would also
    give you much more. It is preferable to issue the following query:

    FIND i AND SYMBOL_CLASS=SUBROUTINE

    The last four examples have all selected information based on two
    attributes. The last example selected information based on a name
    attribute (in this case, i) and a symbol class attribute (in this
    case, SUBROUTINE). Note how the attributes are combined using the
    boolean operator AND. In general, you can select items out of your
    library based on any combination of attributes, using AND as well
    as the other logical operators OR, XOR and NOT.

    The next example shows another primary feature of SCA - the
    ability to display relationships between items. The example
    given here shows the most common use of this feature. It finds
    the complete call tree (that is, all subroutines called directly
    and indirectly), of the subroutine named i.

    FIND CALLED_BY (I, DEPTH=ALL)

    If you want to limit the depth of the call tree, you can replace
    the keyword ALL by any positive integer.

    To obtain help on the following topics, request help as indicated.

    o  For help on query language, see the Basic_Query_Concepts help
       topic.

    o  For help on libraries, see the Building_An_SCA_Library help
       topic.

11.10  –  FORTRAN Attributes Table

    The following table lists the SCA symbol classes and their
    corresponding meanings in FORTRAN.

    SCA Symbol Classes and Equivalent FORTRAN Language Terminology

    SCA Term       FORTRAN Term   Explanation

    Argument       Dummy          The variable named in a function
                   argument       declaration

    Component,     record
    Field          component

    Constant,      PARAMETER
    Literal

    Exception      N/A

    File           File           A file used during compilation

    Function,      SUBROUTINE or  A SUBROUTINE, FUNCTION, or main
    Procedure,     FUNCTION       program
    Program,
    Routine,
    Subroutine

    Generic        N/A

    Keyword        Keyword        A PDF keyword

    Label          Label          A statement label

    Macro          N/A

    Module,        BLOCK DATA,
    Package        SUBROUTINE

    Placeholder    Placeholder    An LSE placeholder

    Psect          COMMON block

    Tag            tag            A PDF tag

    Task           N/A

    Type           Type           For example, INTEGER, REAL, COMPLEX
                                  and so forth

    Unbound        N/A

    Variable       Variable

    The following table lists the SCA occurrence classes and their
    corresponding meanings in FORTRAN.

    SCA Occurrence Classes and Equivalent FORTRAN Language Terminology

    SCA Term       FORTRAN Term   Explanation

    Primary        Declaration    The declaration containing the
                                  actual implementation

    Associated     Declaration    An EXTERNAL declaration

    Declaration    Declaration    Any declaration, either primary or
                                  associated

    Read, Fetch    Read

    Write, Store   Write

    Address,       Address        %LOC, actual arguments
    Pointer

    Call           Call           For example, a CALL statement

    Command_line   Command line   A file specified on the command
                                  line; for example, FORTRAN foo.for

    Include        INCLUDE        A file specified in an INCLUDE
                                  statement

    Precompiled    N/A

    Reference      Reference      Any nondeclaration

    Explicit       Explicit       Any symbol declared by the user

    Implicit       Implicit       Any symbol declared by the compiler
                                  when it sees the first reference

    Visible        Visible        A symbol whose name is visible in
                                  the source

    Hidden         Hidden         A symbol whose name is not visible
                                  in the source

    Compilation_   Program unit   A SUBROUTINE, FUNCTION, PROGRAM,
    unit                          BLOCK DATE, and so forth

    The following table lists the SCA domain classes and their
    corresponding meanings in FORTRAN.

    SCA Domain Classes and Equivalent FORTRAN Language Terminology

    SCA Term       FORTRAN Term   Explanation

    Inheritable    N/A

    Global                        A SUBROUTINE, FUNCTION, or COMMON
                                  block

    Predefined     Defined by     For example, INTEGER, REAL*4, and so
                   the language   forth

    Multi_module   GLOBAL,
                   predefined,
                   and
                   inheritable

    Module_                       Only known within a SUBROUTINE,
    specific                      FUNCTION, and so forth

12  –  Glossary

12.1  –  analysis_data_file

    A file produced by a compiler which contains information that
    describes the source code to SCA. It may contain one or more
    analysis data modules.

12.2  –  analysis_data_module

    A module containing all the information used by SCA for one
    compilation unit.

12.3  –  appearance

    One of the attributes of an occurrence. It tells you whether the
    name of the occurrence is visible or hidden. You can instruct SCA
    to show only occurrences with a particular appearance by using the
    "occurrence=" attribute selection. For example, you can ask for
    hidden occurrences by specifying "occurrence=hidden."

12.4  –  associated_declaration

    Any declaration which is not a primary declaration. Typically,
    associated declarations provide information needed by the compiler
    to refer to an object.

12.5  –  attribute_selection

    A way of limiting a result of a query to those occurrences which
    match certain characteristics. You can select the following
    attributes: NAME, SYMBOL_CLASS, OCCURRENCE, DOMAIN, or FILE_SPEC
    attributes. In the query language, you use phrases like name=foo,
    symbol=argument, occurrence=declaration, domain=module_specific,
    and file="foo.c" to specify which attributes you want. You combine
    these phrases with AND, OR and NOT operators.

12.6  –  attribute_selection_expression

    A query question which combines one or more attribute selections
    (such as name=foo, symbol=routine) using AND, OR, NOT, and XOR.
    Some examples are:

      name=foo and symbol=routine and occurrence=primary
      name=foo_module and occurrence=compilation_unit

12.7  –  call_graph

    Shows what procedures and functions are called from a subroutine,
    and all subsequent calls in the call graph.

12.8  –  CALLED_BY

    See the SCA_Topics CALLED_BY help topic.

12.9  –  CALLING

    See the SCA_Topics CALLING help topic.

12.10  –  compilation_line_number

    A line number generated by the compiler which starts at 1 for
    the first file used during the compile and goes up by one for
    each line read. If there is an include file, the compilation line
    number is increased by one for each line in the include file. By
    default, the line numbers in the query display produced by the
    FIND or INSPECT commands are compilation line numbers.

12.11  –  compilation_unit

    A compilation unit is the smallest piece of source code that
    can be separately compiled. For example, in FORTRAN, this is
    a subroutine or function; in C, this is a single file. Some
    languages allow you to compile more than one compilation unit
    at once. Even if you compile more than one unit at a time, SCA
    considers the units to be separate.

12.12  –  consistency_checks

    A check that INSPECT makes in which all occurrences of a symbol
    are checked for consistency. For example, you can ensure that
    all calls to a routine have the correct number and type of
    arguments. In this type of check, each occurrence is compared
    with a single occurrence selected by INSPECT to be the standard
    against which all occurrences are checked. In this type of check,
    each particular occurrence is either correct or incorrect.

12.13  –  CONTAINED_BY

    See the SCA_Topics CONTAINED_BY help topic.

12.14  –  CONTAINING

    See the SCA_Topics CONTAINING help topic.

12.15  –  declaration

    Tells the compiler about an object before the compiler uses it.
    This can make the compiler create the object, or it can tell the
    compiler about an object that was created elsewhere. A declaration
    has a position in the source code with both a start and an end,
    and can contain other declarations or references. A declaration
    can be either a primary declaration or an associated declaration.

12.16  –  declaration_class

    Tells you what symbol class a declaration is (subroutine,
    function, variable). For example, both procedures and functions
    (in Pascal terms) belong to the routine symbol class, but their
    declaration classes are different. The declaration class tells
    the user whether a declaration is a primary declaration or
    an associated declaration. SCA uses the declaration class to
    decide what to display as the occurrence class in the result of a
    FIND command. The user can find the declaration class using the
    callable interface.

12.17  –  diagnostic_error_messages

    The error messages that INSPECT produces. The query result from
    an INSPECT command is like that of a FIND command, but with error
    messages attached to each occurrence.

12.18  –  explicit

    See expression.

12.19  –  expression

    One of the attributes of an occurrence. The expression attribute
    tells you whether the occurrence is one that you the user placed
    in the source code, or is one which the compiler created for
    the user. An occurrence can be either explicit or implicit.
    Explicit occurrences are those placed by the user in the source
    code; implicit occurrences are those created by the compiler on
    behalf of the user. For example, in the following FORTRAN program,
    there are three references to i which are explicit. There is one
    implicit declaration of i which is created by the FORTRAN compiler
    when it sees the first reference to i.

      program test
      i = 0
      i = i + 1
      end

12.20  –  hidden

    See both appearance and hidden modules.

12.21  –  hidden_modules

    A module in one of the libraries in the current library list which
    is also present in a library which is earlier in the library list.
    The module in the earlier library is visible. The same module in
    any later library is a hidden module, hidden by the first module.

12.22  –  implicit

    See expression.

12.23  –  indicated

    This term is specific to using SCA with LSE.  It refers to the
    symbol underneath the current cursor location within the editor,
    ie., the indicated symbol.

12.24  –  intersection

    The operation performed by the AND operator, which indicates
    that SCA will accept any occurrence that matches both X and Y
    as follows:

      FIND X AND Y

12.25  –  library

    Generic term usually referring to a physical library.

12.26  –  library_list

    A list of one or more physical libraries which compose the virtual
    library. The order of the physical libraries is important. A
    module found in one physical library in the library list hides
    the same module in other physical libraries that come later in the
    library list.

    For example, suppose you have three libraries. Library 1 contains
    module A. Library 2 contains modules A, B, and C. Library 3
    contains modules C and D. SCA uses module A from Library 1,
    modules B and C from library 2, and module D from library 3.

12.27  –  library_number

    Refers to the position of a single physical library in a library
    list. This can be used with any command that refers to a library
    already in the library list. For example, the command SET
    NOLIBRARY 1 removes the first library from the library list.

12.28  –  module

    Represents a single compilation unit. You can list the modules
    with the SHOW MODULE command. Each module shown represents a
    single compilation unit - the smallest piece of source that can
    be separately compiled. Even if several of these are compiled at
    once (which is common in languages such as FORTRAN and BASIC),
    each compilation unit appears separately.

    In the query language, SYMBOL=MODULE specifies a certain type
    of symbol. This is not the same as a compilation unit. You can
    have modules which are not compilation units, and compilation
    units which are not modules. How a module is defined varies from
    language to language.

12.29  –  name

    A string of characters used to identify symbols in your source
    code. Legal characters for a name are defined by whatever language
    you use. Each name has zero or more characters. Any character
    may appear in a name. Special characters that appear in a name
    must be quoted using double quotes. Which characters are considered
    special characters is system dependent.  See the system specific
    guide for further details.

12.30  –  name_selection_expression

    Selects occurrences with a particular name. For example, you can
    specify the following:

      FIND name=xyz

    You can use wildcards in the name expression. Unlike other
    atttributes, you can omit "name=" from the expression and only
    specify the following:

      FIND xyz

12.31  –  nonstructured_relationship_expression

    A relationship query (such as CONTAINED_BY, CALLED_BY, CALLING)
    which requests that structure information be excluded. You can
    specify RESULT=NOSTRUCTURE, RESULT=BEGIN, or RESULT=END as one
    of the parameters to the relationship function. If you specify
    RESULT=BEGIN or RESULT=END, this is displayed like any query
    which does not have a relationship function. If you specify
    RESULT=NOSTRUCTURE, this is displayed like any query which does
    not have a relationship function, but has all the occurrences that
    would be present if the structure were present.

12.32  –  nonstructured_set

    A query result that contains occurrences, but does not contain any
    relationships between occurrences. These are produced by queries
    that do not involve relationship functions, or queries that do
    involve relationship functions but specify RESULT=NOSTRUCTURE,
    RESULT=BEGIN, or RESULT=END.

12.33  –  occurrence

    An occurrence is any instance of an entity in your program. An
    entity can be any language construct, such as a variable, a
    routine, or a constant. To further clarify this, consider the
    following code fragment (not written in a particular language):

      1   MODULE myprog;
      2
      3   VAR i,j;
      4
      5   ROUTINE foo()
      6   BEGIN
      7       i = 5;
      8       j = i;
      9   END;
      10  END;

    The code contains four entities: myprog, foo, i, j. There is one
    occurrence each of the module myprog, and the routine foo. The
    variable i, however, has three occurrences, and the variable j has
    two.

12.34  –  occurrence_checks

    A check that INSPECT performs on a single occurrence. For example,
    INSPECT can check whether an occurrence is an implicit declaration
    of a variable without having to look at any other occurrences.

12.35  –  occurrence_class

    One of the attributes of an occurrence that tells you what kind of
    occurrence it is. The occurrence class indicates if an occurrence
    is a declaration, a reference, or another class. It also indicates
    what kind of declaration or reference it is. You can instruct SCA
    to show you only occurrences with a particular occurrence class
    using the OCCURRENCE= attribute selection. For example, you can
    ask for write references using OCCURRENCE=WRITE.

12.36  –  occurrence_selection_expression

    The expression containing the occurrence class for each occurrence
    you want to find.

12.37  –  physical_library

    A single directory containing an SCA database. The directory
    should not contain anything else. SCA always locks an entire
    physical library when it accesses it. When you are reading a
    physical library (for example, with a FIND command), other users
    are not allowed to write to the physical library, but other users
    are allowed to read the physical library. When you are writing
    to a physical library (for example, using LOAD), no other user is
    allowed to read or write to the physical library.

12.38  –  primary_declaration

    Any declaration which affects how a particular object, such as a
    routine or a variable, is implemented.

12.39  –  primary_library

    The first library in the library list. Commands which change the
    SCA library, such as LOAD and REORGANIZE, apply to the primary
    library, unless you use select a different library.

12.40  –  query

    The question you ask SCA together with the information you receive
    from SCA. The question uses the SCA query language with the FIND
    or INSPECT commands. The answer is called a query result. You use
    the FIND or INSPECT commands to display the query result. You can
    also use the query result as part of the question for a subsequent
    query.

12.41  –  query_result

    A query result is the information you get when you evaluate a
    query, using the FIND or INSPECT commands. It consists of a set of
    occurrences, and relationships between occurrences.

12.42  –  reference

    The use of some object in the source code. For example: X = X + 1
    In this example, there are two references to the variable X. One
    (to the left of the =) is a write reference; the other is a read
    reference. A reference has a position in the source code, but it
    is a single point and cannot contain anything.

12.43  –  relationship

    An association between two different occurrences. For example, the
    CALLED_BY relationship in SCA associates a primary declaration of
    a procedure with call references to other procedures and functions
    in that procedure. A relationship has both a source and a target.
    A relationship also has a relationship type. Relationships go in
    both directions. For example, the CALLED_BY relationship is the
    inverse of the CALLING relationship.

12.44  –  relationship_type

    The kind of relationship between two occurrences. For example, a
    CALLED_BY relationship between a declaration of a routine FOO and
    a reference to a routine BAR shows that routine FOO calls routine
    BAR. The relationship types that are valid for SCA are: CALLED_BY,
    CALLING, CONTAINED_BY, CONTAINING, TYPED_BY, and TYPING.

12.45  –  set

    The occurrences that result from each query.

12.46  –  static_analysis

    The analysis of a software system performed by looking at the
    source code. This is in contrast to dynamic analysis, which is
    analysis of the software while it is running.

    SCA has some commands which do static analysis. These commands are
    the INSPECT command, which does consistency checking, and some uses
    of the FIND command, to generate call graphs and type graphs.

12.47  –  structured_relationship_expression

    A query that uses a relationship function (such as CONTAINED_
    BY, CALLED_BY, or TYPED) which asks for structure information.
    Structure information shows the relationships between occurrences
    found as well as the occurrences found. Structure information is
    provided by default.

12.48  –  structured_set

    A query result which has both occurrences and relationships
    between occurrences. These are produced by queries which involve
    relationship functions.

12.49  –  symbol

    Any object in a program. For example, a FUNCTION, a VARIABLE, a
    CONSTANT, or any of the entities with which a programmer typically
    deals.

    A symbol has occurrences. For example, the declaration of
    a variable is an occurrence, and uses of the variable are
    occurrences. SCA determines which occurrences belong to which
    symbols using the rules of the language you are using. For
    example, you may have two different variables named INDEX in
    separate subroutines. According to the rules of your language,
    these are usually different variables, so they are different
    symbols for SCA.

    It does not matter whether all occurrences of a symbol are in
    a single compilation unit, or spread over several compilation
    units. All the occurrences still belong to the same symbol. For
    example, you may have a subroutine SUB1 in one module, and calls
    to that subroutine in several other modules. These all appear as
    occurrences of the same symbol, named SUB1.

    The programmer and SCA should have the same definition of what
    constitutes a unique item. SCA's term for a unique item is symbol.

12.50  –  symbol_checks

    A check that INSPECT performs on all occurrences of a symbol.
    For example, INSPECT can ensure that there are both read and
    write references to a variable. In this type of check, no single
    occurrence is either correct or incorrect. If there are problems,
    the problems are with the symbol as a whole.

12.51  –  SYMBOL_CLASS

    An attribute selection that identifies the type of symbol. Tells
    you whether the symbol is a variable, constant, or some other
    class. You can use the FIND command to find only symbols with
    a particular symbol class. For example, you can specify "FIND
    symbol=argument." You can abbreviate both "symbol" and "argument".

12.52  –  symbol_class_selection_expression

    The expression containing the symbol class for each symbol you
    want to find.

12.53  –  type_graph

    A set of occurrences and relationships that describes a complex
    data type. For example, a declaration of a record consists of a
    record and some record components. Each record component has a
    type, which may be another record, a pointer to the same record,
    a basic data type such as integer, and so forth. In SCA, the type
    graph connects all these together, with relationships connecting
    the record to its components and the components to their types.

12.54  –  TYPED_BY

    See the SCA_Topics TYPED_BY help topic.

12.55  –  TYPING

    See the SCA_Topics TYPING help topic.

12.56  –  union

    The operation performed by the OR operator, which indicates that
    SCA will accept any occurrence that matches either X or Y as
    follows:

      FIND X OR Y

12.57  –  virtual_library

    A library that allows you to split your SCA library into pieces.
    Each piece is called a physical library. SCA works the same way
    whether your virtual library has only one physical library or
    several physical libraries.

    Some of the reasons for using more than one physical library are
    as follows:

    o  Physical libraries can be placed on more than one disk, if
       there is not enough room on a single disk.

    o  Analysis date files can be loaded into more than one physical
       library at the same time, to make LOAD run faster.

    o  A small personal physical library can be used to keep track of
       your personal changes without affecting other users.

    o  A separate physical library can be used for each major
       component in your system.

    A single virtual library is a list of one or more physical
    libraries. The order is important. A module in one physical
    library hides the same module in physical libraries later on in
    the list. This list of physical libraries is called a library
    list.

12.58  –  visible

    See both appearance and visible modules.

12.59  –  visible_modules

    Modules that SCA can examine when performing a FIND or INSPECT
    command. The current library list tells you what modules are
    visible. All modules in the first library in the library list
    are visible. Modules in the second library which are not in the
    first library are visible. Modules in the third library which are
    not in the first or second libraries are visible. Any module which
    is not visible is hidden.

12.60  –  wildcards

    Wildcards are used to match more than one name at once. What
    wildcards are available is system dependent.  See the system
    specific guide for further details.

13  –  IN

    The IN function searches for occurrences inside a container. The
    IN function is a special case of the CONTAINED_BY function. In its
    most common form, the function format is as follows:

    IN( <container>, <containee> )

    In this format, <container> and <containee> can be any legal query
    expression. The IN function returns all occurrences that match the
    <containee> expression as long as those occurrences are somewhere
    inside the container.

    Some examples will help you understand the IN function. The
    following picture applies to the examples that follow.

              A (module)
              +-------------------------+
              |                         |
              |  B (routine)            |
              |  +-------------------+  |
              |  |                   |  |
              |  |  C (routine)      |  |
              |  |  +-------------+  |  |
              |  |  |             |  |  |
              |  |  | D (variable)|  |  |
              |  |  |             |  |  |
              |  |  |             |  |  |
              |  |  +-------------+  |  |
              |  |                   |  |
              |  +-------------------+  |
              |                         |
              | E (variable)            |
              |                         |
              +-------------------------+

    Consider the following queries:

      1. FIND IN( A, *)
      2. FIND IN( B, D)
      3. FIND IN( A, SYMBOL_CLASS=ROUTINE and OCCURRENCE=DECLARATION)

    The first query returns B (a containee), C (a containee), D (a
    containee) and E (a containee). A is not returned because it is
    the container.

    The second query returns only D (the containee). C is not returned
    because it does not match the <containee> expression. B is not
    returned because it is the container.

    The third query returns all routine declarations inside A. In this
    case, B and C are returned.

    The IN function is a convenient way to limit a query to a
    particular container.

    The full format of the In function is as follows:

    IN( [END=<container>],
        [BEGIN=<containee>] )

    In this format, <container> and <containee> can be any legal query
    expression.

14  –  INDICATED

    The INDICATED function is available only from within LSE. The
    INDICATED function matches the occurrence on which the cursor is
    positioned. The INDICATED function has no parameters. The format
    is as follows:

    INDICATED()

    An example of using the INDICATED function is as follows:

      FIND EXPAND( INDICATED() )

    This query finds all occurrences of the item on which the cursor
    is positioned in LSE.

15  –  Language Specific Tables

    For information about SCA terms and corresponding language-
    specific terminology, see the tables under the Getting_Started
    help topic.

16  –  Libraries

16.1  –  Project Libraries

    There are many ways you can organize the SCA libraries for your
    project. Usually, there is one library (or set of libraries)
    for the whole project. Each developer has a personal library
    containing modules that they have changed but have not yet made
    available to the entire project. However, if there is only one
    developer working on the project, it makes more sense to use a
    single SCA library.

    There are many ways you can organize your project libraries. You
    can have one project SCA library if it is a reasonable size. You
    can use several libraries, one for each subsystem. You may want to
    organize your SCA libraries the way your development environment
    is organized. For example, have one SCA library for each CMS
    library. If your project is divided into different subsystems,
    you may want one SCA library for each subsystem.

    For information on creating your own SCA library, see the help
    topic Building_An_SCA_Library.

    Examples of Typical Libraries

    Consider a project with three developers: Paul, Mark, and Joanna.
    The project consists of two different subsystems, each with its own
    SCA library.

    Each of the developers also has a personal SCA library in their personal
    directories.

    Paul, Mark and Joanna set up their SCA libraries using the SCA library
    command as follows:

        SCA> SET LIBRARY personal_lib,subsystem_1_lib,subsystem_2_lib

    When Paul changes a module in Subsystem 1, he compiles it and loads it
    into his personal library.  For Paul, this hides the old version of the
    module in the project library for Subsystem 1, so his SCA library is up
    to date and consistent with his changes.

    Mark and Joanna do not see Paul's changes in their SCA libraries
    because they the SCA library that Paul updated is not in their library
    list.  They still see the old version of the module in the project
    library for Subsystem 1.

    Once Paul has completed his change, the nightly build updates everything
    for Subsystem 1, replacing the module in the project library.  Now Mark
    and Joanna can both see the change.

16.2  –  Virtual Libraries

    SCA can use more than one SCA library at the same time when doing
    queries using the FIND and INSPECT commands. The list of SCA
    libraries used for this is called a virtual library. The order
    of SCA libraries in the library list is important. A module in
    the first library in the library list will hide the same module
    in other libraries, further on in the library list. For example,
    suppose PROJECT_LIB has modules A, B, C and library MYLIB has
    modules A, and D. You can set the library as follows:

      LSE Command> SET LIBRARY MYLIB,PROJECT_LIB

    The modules visible in the virtual library would be A (from
    MYLIB), B, and C (both from PROJECT_LIB) and D (from MYLIB).

    There are many reasons for using more than one physical library as
    your virtual library:

    o  Using more than one library, you can improve LOAD performance
       by loading multiple libraries simultaneously. See the help
       topic Reducing_LOAD_Time.

    o  You can use virtual libraries to allow several developers to
       maintain a consistent view of their changes to a project,
       without affecting the other developers, and without having
       to copy the entire SCA library for each developer.

    o  You can put your SCA libraries on different disks or on
       different nodes (using the SCA server). This improves
       performance or takes advantage of the available disk space.

    o  You can easily change the order of libraries in your virtual library
       list with the INSERT LIBRARY BEFORE, INSERT LIBRARY AFTER, INSERT
       LIBRARY FIRST, and INSERT LIBRARY LAST commands, eliminating the need
       to reenter a library list.  Libraries may also be removed from the list
       with the CANCEL LIBRARY command.  You can specify libraries in your
       library list using library numbers.  For example, the command CANCEL
       LIBRARY 2 removes the second SCA library from the library list.

17  –  NAME

    NAME is an attribute of an occurrence that is a string of ASCII
    characters which identifies symbols in your source code. A
    specific name can be associated with more than one symbol.

    The language you are using defines the legal characters for
    a name. Each name has zero or more characters. Any character
    may appear in a name. Special characters that appear in a name
    must be quoted using double quotes. Which characters are considered
    special characters is system dependent.  See the system specific
    guide for further details.

    You can use wildcards in the name expression.  See the entry on
    WILDCARDS for further information.

    The format for NAME can be one of the following:

    name
    NAME=(name[,name...])

18  –  New Users

    The Source Code Analyzer for OpenVMS (SCA) is an interactive cross-
    reference and static analysis tool that works with many languages.
    It can help you understand the complexities of a large software
    project. Because it allows you to analyze and understand an entire
    system, SCA is extremely useful during the implementation and
    maintenance phases of a project.

    SCA is included in the DECset Software Engineering Tools Package.
    SCA is integrated with the Language-Sensitive Editor for OpenVMS
    (LSE). When SCA is used with LSE, you can interactively edit,
    compile, debug, navigate, and analyze source code during a single
    development session.

    For more information, see the following topics:

    o  Basic_Query_Concepts - Describes some of the basic concepts
       underlying SCA queries.

    o  Getting_Started - Provides subtopics with information about
       getting started with specific languages.

    o  Building_An_SCA_Library - Describes how to quickly create an
       SCA library.

    o  Advanced_Query_Examples - Provides advanced examples using the
       supplied example library.

    o  Glossary - Provides definitions of SCA terms.

    o  Libraries - Provides subtopics with information about project
       libraries and virtual libraries.

    o  Reducing_LOAD_Time - Provides guidelines for reducing your LOAD
       time.

    o  Quick_Reference_Card - Provides a pointer to a quick reference
       card for the SCA query language.

    Under SCA_Topics, there is help information for specific keywords.
    These keywords include attributes, relationships, and functions.
    For example, you can request help on SCA_Topics SYMBOL_CLASS to
    get information about the SYMBOL_CLASS attribute.

19  –  OCCURRENCE

    The occurrence class is an attribute of an occurrence that
    identifies the type of occurrence. The occurrence class indicates
    if the occurrence is a declaration, a reference, or one of the
    other classes in the list that follows. If the occurrence class is
    a declaration or reference, the occurrence class indicates what
    type of declaration or reference it is.

    The format for the occurrence class attribute is as follows:

    OCCURRENCE=(keyword[,keyword...])

    The occurrence class can be one of the following keywords:

    Declarations

    o  PRIMARY - most significant declaration

    o  ASSOCIATED - associated declaration

    o  DECLARATION - primary or associated

    References

    o  READ, FETCH - fetch of a symbol value

    o  WRITE, STORE - assignment of a symbol value

    o  ADDRESS, POINTER - reference to the location of a symbol

    o  CALL - call to a routine or macro

    o  COMMAND_LINE - command line file reference

    o  INCLUDE - source file include referenece

    o  PRECOMPILED - precompiled file include referenece

    o  OTHER - any other kind of reference (such as a macro expansion
       or use of a constant)

    o  REFERENCE - any of the preceding values

    o  BASE - Any base class of a C++ class

    o  FRIEND - Any friend of a C++ class

    o  MEMBER - Any member of a C++ class

    o  SPEPARATE - Any Ada package or sub-program unit defined
       as SEPARATE

    o  WITH - Any WITH of an Ada package or sub-program unit

    Other Occurrence Classes

    o  EXPLICIT - explicitly declared

    o  IMPLICIT - implicitly declared

    o  VISIBLE - occurrence appears in the source

    o  HIDDEN - occurrence does not appear in the source

    o  COMPILATION_UNIT - the declaration that contains all
       occurrences in a particular compilation unit

    o  LIMITED - Any Ada limited private type

    o  PRIVATE - Any private C++ objects, or Ada private type

    o  PROTECTED - Any protected c++ object

    o  PUBLIC - Any public C++ object

    o  VIRTUAL - Any virtual C++ object

    The previous keywords are SCA terms. For information on
    corresponding language-specific terms, request help for the
    appropriate language table (for example, FORTRAN_ATTRIBUTES_TABLE)
    under the Getting_Started help topic.

    An example using the occurrence class attribute follows:

      FIND OCCURRENCE=PRIMARY

    This query finds all PRIMARY occurrences of declarations.

20  –  Quick Reference Card

   ATTRIBUTE SELECTIONS:                  |RELATIONSHIP FUNCTIONS:
                                          |
   Name Class:                            |Short form:
   ----------                             |-----------
   <name-expression>                      |CALLED_BY(<caller>,<callee>,<depth>)
   NAME=<name-expression>                 |CALLING(<callee>,<caller>,<depth>)
   NAME=(<name-expression>,...)           |
                                          |CONTAINED_BY(<container>,<containee>,
   Symbol Class:                          |             <depth>)
   -------------                          |CONTAINING(<containee>,<container>,
   SYMBOL=<symbol-class-keyword>          |           <depth>)
   SYMBOL=(<symbol-class-keyword>,...)    |
                                          |TYPED_BY(<type>,<typee>,<depth>)
   Symbol Class keywords:                 |TYPING(<typee>,<type>,<depth>)
                                          |
   Argument, Component, Constant,         |Long form:
   Exception, File, Field, Function,      |----------
   Generic, Keyword, Label, Literal,      |<rel-func>(END=<query-expression>,
   Macro, Module, Package, Placeholder,   |           BEGIN=<query-expression>,
   Procedure, Program, Psect, Routine,    |           DEPTH={<number> | ALL },
   Subroutine, Tag ,Task, Type, Unbound,  |           RESULT=<result-keyword>,
   Variable, Other, All, None             |           TRACE=<query-expression>)
                                          |
   Occurrence Class:                      |Result keywords:
   -----------------                      |
   OCCURRENCE=<occ-class-keyword>         |Begin, End, [No]Structure, Any_path
   OCCURRENCE=(<occ-class-keyword>,...)   |
                                          |OTHER FUNCTIONS:
   Occurrence Class keywords:             |----------
                                          |
   Declaration, Primary, Associated,      |IN (END=<query-expression>,
   Reference, Address, Call,              |    BEGIN=<query-expression>)
   Command_line, Fetch, Include,          |
   Pointer, Precompiled, Read, Store,     |EXPAND (<query-expression>)
   Write, Other, All, None                |
                                          |@(<query-name>)
   Domain Class:                          |
   -------------                          |INDICATED()    (NOTE: LSE required)
   DOMAIN=<domain-class-keyword>          |
   DOMAIN=(<domain-class-keyword>,...)    |NOT(<query-expression>)
                                          |
   Domain Class keywords:                 |
                                          |
   Global, Inheritable, Module_specific,  |
   Multi_module, Predefined, All, None    |
                                          |
   File Class:                            |
   ----------                             |
   FILE=<filename-expression>             |
   FILE=(<filename-expression>,...)       |
                                          |
   OPERATORS:                             |
   ----------                             |
   AND, OR, XOR, Pathname (\ or \\)       |
                                          |
   ATTRIBUTE SELECTION EXPRESSIONS:       |
   <attri-select> [<op> <attri-select>]...|

21  –  Reducing LOAD time

    There are different means you can use to try to decrease LOAD
    time. Listed below are a few guidelines that may help you reduce
    LOAD time:

    o  Loading an SCA library for a software system is a time-
       consuming operation.  Loading more than one module at a time
       is more efficient than loading modules separately. Using
       LOAD *.ANA is a common method for loading multiple modules.
       LOAD -DELETE can be used to clean up .ANA files after they are
       loaded successfully and to use a little less disk space during
       the load.

    o  With large software systems, it is a good idea to use more
       than one SCA library and load them all simultaneously. This
       can lessen the elapsed LOAD time considerably. You should be
       able to load several libraries simultaneously on a single
       disk. Additionally, using more than one CPU to do your loads
       also helps, but SCA loading is mainly I/O intensive. For more
       information about how to use multiple libraries, see the help
       subtopics under Libraries.

    o  SCA uses a large number of I/Os during LOAD. Loading an SCA
       library on a heavily used or badly fragmented disk causes the
       load to be less efficient.

22  –  SYMBOL_CLASS

    SYMBOL_CLASS is an attribute selection that identifies the type of
    symbol. A symbol can be a variable, constant, or some other class.

    The format for SYMBOL_CLASS is as follows:

    SYMBOL_CLASS=(keyword[,keyword...])

    The SYMBOL_CLASS can be one of the following keywords:

    o  ARGUMENT - formal argument (such as a routine argument or macro
       argument)

    o  CLASS - Any C++ class object construct defined by the union,
       structure or class statements

    o  COMPONENT,FIELD - component of a record

    o  CONSTANT,LITERAL - named compile-time constant value

    o  EXCEPTION - exception

    o  FILE - file

    o  FUNCTION,PROCEDURE, PROGRAM,ROUTINE, SUBROUTINE - callable
       program function

    o  GENERIC - generic unit

    o  KEYWORD - keyword

    o  LABEL - user-specified label

    o  MACRO - macro

    o  MODULE, PACKAGE - collection of logically related elements

    o  PLACEHOLDER - marker where program text is needed

    o  PSECT - program section

    o  TAG - comment heading

    o  TASK - task

    o  TYPE - user-defined type

    o  UNBOUND - unbound name

    o  VARIABLE - program variable

    o  OTHER - any other class of symbol

    The previous keywords are SCA terms. For information on
    corresponding language-specific terms, request help for the
    appropriate language table (for example, FORTRAN_ATTRIBUTES_TABLE)
    under the Getting_Started help topic.

    An example using the SYMBOL_CLASS attribute follows:

      FIND X AND SYMBOL_CLASS=ROUTINE

    This query finds all routines named X.

23  –  TYPING

    The TYPING function is a relationship function. It finds the type
    of some occurrence. Occurrences related in this manner have a
    TYPING relationship between them. For example, if INTEGER is
    typing variable X, then these two occurrences are in a TYPING
    relationship. In its most common form, the function format is as
    follows:

    TYPING( <typee>, <type>, DEPTH={<number> | ALL} )

    In this format, <typee> and <type> can be any legal query
    expression, and <number> is a positive integer. A typical use
    of the function is to find the type of a variable. For example:

      FIND TYPING( X, *, DEPTH=1)

    This query finds the type of X, where X is some variable in the
    SCA database.

    The TYPING function also works on user-defined types. The defined
    type can have many levels, in which case the user can specify a
    depth as follows:

      FIND TYPING( user_defined_type, *, DEPTH=ALL)

    This query gives the full type tree for USER_DEFINED_TYPE.

    The TYPING function provides the power to return the exact type
    tree you want. The full format is as follows:

    TYPING( [ END=<typee> ],
            [ BEGIN=<type> ],
            [ DEPTH={<number> | ALL} ],
            [ RESULT=RESULT_KEYWORD ],
            [ TRACE=query_expression ] )

    In the previous format, <typee> and <type> is any legal query
    expression, <number> is a positive integer, RESULT_KEYWORD can
    be STRUCTURE, NOSTRUCTURE, ANY_PATH, BEGIN, or END, and QUERY_
    EXPRESSION is any legal query expression.

    For a full description of the TYPING relationship, see the
    LSE/SCA User Manual.

24  –  TYPED_BY

    The TYPED_BY function is a relationship function. It finds
    occurrences that have a TYPED_BY relationship between them.
    For example, if variable X is typed by INTEGER, then these two
    occurrences are in a TYPED_BY relationship. In its most common
    form, the function format is as follows:

    TYPED_BY( <type>, <typee>, DEPTH={<number> | ALL} )

    In this format, <typee> and <type> can be any legal query
    expression, and <number> is a positive integer. A typical use
    of the function is to find what is being typed by INTEGER. For
    example:

      FIND TYPED_BY( INTEGER, *, DEPTH=1)

    This query finds everything that is of type INTEGER. The TYPED_BY
    function can also tell you the items that are in some way affected
    by a given type. The type can be predefined by language elements
    such as INTEGER, or can be user defined. For example:

      FIND TYPED_BY( user_defined_type, *, DEPTH=ALL)

    This query finds all the items that are directly or indirectly
    affected by USER_DEFINED_TYPE.

    The TYPED_BY function provides the power to return the exact type
    tree you want. The full format is as follows:

    TYPED_BY( [ END=<type> ],
              [ BEGIN=<typee> ],
              [ DEPTH={<number> | ALL} ],
              [ RESULT=RESULT_KEYWORD ],
              [ TRACE=query_expression ] )

    In the previous format, <type> and <typee> is any legal query
    expression, <number> is a positive integer, RESULT_KEYWORD can
    be STRUCTURE, NOSTRUCTURE, ANY_PATH, BEGIN, or END, and QUERY_
    EXPRESSION is any legal query expression.

    For a full description of the TYPED_BY relationship, see the
    LSE/SCA User Manual.

25  –  \ (Pathname)

    The path name expression allows you to identify specific symbols
    based on the path of the expression. This is similar to the
    debugger pathname notation. The format of this expression is as
    follows:

    query_expression\query_expression[\query_expression...]

    Typically, you use this expression to identify a particular
    variable in a routine when you may have declared a variable of the
    same name in more than one routine. For example, RETURN_STATUS may
    be a common variable in multiple routines. Some typical queries
    are as follows:

      1. FIND MYROUTINE\RETURN_STATUS
      2. FIND MYMODULE\MYROUTINE\RETURN_STATUS
      3. FIND MYMODULE\SYMBOL_CLASS=ROUTINE

    The first query returns all occurrences of the RETURN_STATUS
    variable that are declared inside MYROUTINE. The second example
    returns all occurrences of the RETURN_STATUS variable which are
    declared inside MYROUTINE, where MYROUTINE is declared inside
    MYMODULE. The third example returns all occurrences of routines
    which are declared inside MYMODULE.

    You may also use the pathname when the exact path is not known.
    For example, assume that you know the module name and that XYZ is
    declared somewhere inside the MYMODULE, but you do not know the
    exact pathname. You can then use the following query:

      FIND MYMODULE\\XYZ

    This query locates the XYZ variable that is declared somewhere
    inside MYMODULE and returns all occurrences of XYZ.

26  –  @ (Query Usage)

    A query usage function incorporates the results of previous
    queries into query expressions. The function has the following
    form:

    @( query_name )

    The value of this expression is that of the expression that is
    specified as query_name. The default query name is the current
    query, SCA$CURRENT_QUERY.

    You can see an example of its use in the following sequence of
    queries:

       FIND X
       FIND @(SCA$CURRENT_QUERY) AND SYMBOL=ROUTINE

    The advantage of using this notation is that the results of the
    previous query are not reevaluated. Thus the second query will be
    faster than the query:

      FIND X AND SYMBOL=ROUTINE
Close Help