Changeset 0c8e692 in mainline for generic/src/debug/symtab.c


Ignore:
Timestamp:
2005-12-11T19:55:56Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3550c393
Parents:
54aff98
Message:

Added some readline functionality to kconsole.
Arrows editing, history, tab completion.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • generic/src/debug/symtab.c

    r54aff98 r0c8e692  
    5656}
    5757
     58/** Find symbols that match the parameter forward and print them
     59 *
     60 * @param name - search string
     61 * @param startpos - starting position, changes to found position
     62 * @return Pointer to the part of string that should be completed or NULL
     63 */
     64static char * symtab_search_one(const char *name, int *startpos)
     65{
     66        int namelen = strlen(name);
     67        char *curname;
     68        int i,j;
     69        char *foundsym = NULL;
     70        int foundpos = 0;
     71        int colonoffset = -1;
     72
     73        for (i=0;name[i];i++)
     74                if (name[i] == ':') {
     75                        colonoffset = i;
     76                        break;
     77                }
     78
     79        for (i=*startpos;symbol_table[i].address_le;++i) {
     80                /* Find a ':' in name */
     81                curname = symbol_table[i].symbol_name;
     82                for (j=0; curname[j] && curname[j] != ':'; j++)
     83                        ;
     84                if (!curname[j])
     85                        continue;
     86                j -= colonoffset;
     87                curname += j;
     88                if (strlen(curname) < namelen)
     89                        continue;
     90                if (strncmp(curname, name, namelen) == 0) {
     91                        *startpos = i;
     92                        return curname+namelen;
     93                }
     94        }
     95        return NULL;
     96}
     97
    5898/** Return address that corresponds to the entry
    5999 *
    60  * Search symbol table, and if the address ENDS with
    61  * the parameter, return value
     100 * Search symbol table, and if there is one match, return it
    62101 *
    63102 * @param name Name of the symbol
     
    66105__address get_symbol_addr(const char *name)
    67106{
    68         count_t i;
    69107        count_t found = 0;
    70         count_t found_pos;
     108        __address addr = NULL;
     109        char *hint;
     110        int i;
    71111
    72         count_t nmlen = strlen(name);
    73         count_t slen;
    74 
    75         for (i=0;symbol_table[i].address_le;++i) {
    76                 slen = strlen(symbol_table[i].symbol_name);
    77                 if (slen < nmlen)
    78                         continue;
    79                 if (strncmp(name, symbol_table[i].symbol_name + (slen-nmlen),
    80                             nmlen) == 0) {
     112        i = 0;
     113        while ((hint=symtab_search_one(name, &i))) {
     114                if (!strlen(hint)) {
     115                        addr =  __u64_le2host(symbol_table[i].address_le);
    81116                        found++;
    82                         found_pos = i;
    83117                }
     118                i++;
    84119        }
    85         if (found == 0)
    86                 return NULL;
    87         if (found == 1)
    88                 return __u64_le2host(symbol_table[found_pos].address_le);
    89         return ((__address) -1);
     120        if (found > 1)
     121                return ((__address) -1);
     122        return addr;
    90123}
    91124
     125/** Find symbols that match parameter and prints them */
    92126void symtab_print_search(const char *name)
    93127{
    94128        int i;
    95         count_t nmlen = strlen(name);
    96         count_t slen;
    97129        __address addr;
    98130        char *realname;
    99131
    100         for (i=0;symbol_table[i].address_le;++i) {
    101                 slen = strlen(symbol_table[i].symbol_name);
    102                 if (slen < nmlen)
    103                         continue;
    104                 if (strncmp(name, symbol_table[i].symbol_name + (slen-nmlen),
    105                             nmlen) == 0) {
    106                         addr =  __u64_le2host(symbol_table[i].address_le);
    107                         realname = symbol_table[i].symbol_name;
    108                         printf("0x%p: %s\n", addr, realname);
     132
     133        i = 0;
     134        while (symtab_search_one(name, &i)) {
     135                addr =  __u64_le2host(symbol_table[i].address_le);
     136                realname = symbol_table[i].symbol_name;
     137                printf("0x%p: %s\n", addr, realname);
     138                i++;
     139        }
     140}
     141
     142/** Symtab completion
     143 *
     144 * @param name - Search string, completes to symbol name
     145 * @returns - 0 - nothing found, 1 - success, >1 print duplicates
     146 */
     147int symtab_compl(char *name)
     148{
     149        char output[MAX_SYMBOL_NAME+1];
     150        int startpos = 0;
     151        char *foundtxt;
     152        int found = 0;
     153        int i;
     154
     155        /* Do not print everything */
     156        if (!strlen(name))
     157                return 0;
     158
     159        output[0] = '\0';
     160
     161        while ((foundtxt = symtab_search_one(name, &startpos))) {
     162                startpos++;
     163                if (!found)
     164                        strncpy(output, foundtxt, strlen(foundtxt)+1);
     165                else {
     166                        for (i=0; output[i] && foundtxt[i] && output[i]==foundtxt[i]; i++)
     167                                ;
     168                        output[i] = '\0';
     169                }
     170                found++;
     171        }
     172        if (!found)
     173                return 0;
     174
     175        if (found > 1) {
     176                printf("\n");
     177                startpos = 0;
     178                while ((foundtxt = symtab_search_one(name, &startpos))) {
     179                        printf("%s\n", symbol_table[startpos].symbol_name);
     180                        startpos++;
    109181                }
    110182        }
     183        strncpy(name, output, MAX_SYMBOL_NAME);
     184        return found;
     185       
    111186}
Note: See TracChangeset for help on using the changeset viewer.