emacs-devel
[Top][All Lists]

Problem report #3

 From: Dan Nicolaescu Subject: Problem report #3 Date: Sun, 30 Apr 2006 09:42:05 -0700

```CID: 3
File: emacs/lib-src/etags.c
Function: C_entries
Description: After this line, the value of "c" is equal to 47

3208    static void
3209    C_entries (c_ext, inf)
3210         int c_ext;                 /* extension of C */
3211         FILE *inf;                 /* input file */
3212    {
3213      register char c;              /* latest char read; '\0' for end of
line */
3214      register char *lp;            /* pointer one beyond the character `c'
*/
3215      int curndx, newndx;           /* indices for current and new lb */
3216      register int tokoff;          /* offset in line of start of current
token */
3217      register int toklen;          /* length of current token */
3218      char *qualifier;              /* string used to qualify names */
3219      int qlen;                     /* length of qualifier */
3220      int bracelev;                 /* current brace level */
3221      int bracketlev;               /* current bracket level */
3222      int parlev;                   /* current parenthesis level */
3223      int attrparlev;               /* __attribute__ parenthesis level */
3224      int templatelev;              /* current template level */
3225      int typdefbracelev;           /* bracelev where a typedef struct body
begun */
3226      bool incomm, inquote, inchar, quotednl, midtoken;
3227      bool yacc_rules;              /* in the rules part of a yacc file */
3228      struct tok savetoken;         /* token saved during preprocessor
handling */
3229
3230
3231      linebuffer_init (&lbs[0].lb);
3232      linebuffer_init (&lbs[1].lb);
3233      if (cstack.size == 0)
3234        {
3235          cstack.size = (DEBUG) ? 1 : 4;
3236          cstack.nl = 0;
3237          cstack.cname = xnew (cstack.size, char *);
3238          cstack.bracelev = xnew (cstack.size, int);
3239        }
3240
3241      tokoff = toklen = typdefbracelev = 0; /* keep compiler quiet */
3242      curndx = newndx = 0;
3243      lp = curlb.buffer;
3244      *lp = 0;
3245
3246      fvdef = fvnone; fvextern = FALSE; typdef = tnone;
3247      structdef = snone; definedef = dnone; objdef = onone;
3248      yacc_rules = FALSE;
3249      midtoken = inquote = inchar = incomm = quotednl = FALSE;
3250      token.valid = savetoken.valid = FALSE;
3251      bracelev = bracketlev = parlev = attrparlev = templatelev = 0;
3252      if (cjava)
3253        { qualifier = "."; qlen = 1; }
3254      else
3255        { qualifier = "::"; qlen = 2; }
3256
3257
3258      while (!feof (inf))
3259        {
3260          c = *lp++;

Event equality_cond: Cond "c == 92" evaluated as false
Also see events:

3261          if (c == '\\')
3262            {
3263              /* If we are at the end of the line, the next character is a
3264                 '\0'; do not skip it, because it is what tells us
3265                 to read the next line.  */
3266              if (*lp == '\0')
3267                {
3268                  quotednl = TRUE;
3269                  continue;
3270                }
3271              lp++;

Event assignment: Assigning "32" to "c"
Event const: After this line, the value of "c" is equal to 32
Also see events:

3272              c = ' ';
3273            }
3274          else if (incomm)
3275            {
3276              switch (c)
3277                {
3278                case '*':
3279                  if (*lp == '/')
3280                    {
3281                      c = *lp++;
3282                      incomm = FALSE;
3283                    }
3284                  break;
3285                case '\0':
3286                  /* Newlines inside comments do not end macro definitions
in
3288                  CNL_SAVE_DEFINEDEF ();
3289                  break;
3290                }
3291              continue;
3292            }
3293          else if (inquote)
3294            {
3295              switch (c)
3296                {
3297                case '"':
3298                  inquote = FALSE;
3299                  break;
3300                case '\0':
3301                  /* Newlines inside strings do not end macro definitions
3302                     in traditional cpp, even though compilers don't
3303                     usually accept them. */
3304                  CNL_SAVE_DEFINEDEF ();
3305                  break;
3306                }
3307              continue;
3308            }
3309          else if (inchar)
3310            {
3311              switch (c)
3312                {
3313                case '\0':
3314                  /* Hmmm, something went wrong. */
3315                  CNL ();
3316                  /* FALLTHRU */
3317                case '\'':
3318                  inchar = FALSE;
3319                  break;
3320                }
3321              continue;
3322            }
3323          else if (bracketlev > 0)
3324            {
3325              switch (c)
3326                {
3327                case ']':
3328                  if (--bracketlev > 0)
3329                    continue;
3330                  break;
3331                case '\0':
3332                  CNL_SAVE_DEFINEDEF ();
3333                  break;
3334                }
3335              continue;
3336            }

Event const: After this line, the value of "c" is equal to 34
Event const: After this line, the value of "c" is equal to 37
Event const: After this line, the value of "c" is equal to 39
Event const: After this line, the value of "c" is equal to 47
Also see events:

3337          else switch (c)
3338            {

Event new_values: Conditional "c == 34"
Also see events:

3339            case '"':
3340              inquote = TRUE;
3341              if (inattribute)
3342                break;
3343              switch (fvdef)
3344                {
3345                case fdefunkey:
3346                case fstartlist:
3347                case finlist:
3348                case fignore:
3349                case vignore:
3350                  break;
3351                default:
3352                  fvextern = FALSE;
3353                  fvdef = fvnone;
3354                }
3355              continue;

Event new_values: Conditional "c == 39"
Also see events:

3356            case '\'':
3357              inchar = TRUE;
3358              if (inattribute)
3359                break;
3360              if (fvdef != finlist && fvdef != fignore && fvdef !=vignore)
3361                {
3362                  fvextern = FALSE;
3363                  fvdef = fvnone;
3364                }
3365              continue;

Event new_values: Conditional "c == 47"
Also see events:

3366            case '/':
3367              if (*lp == '*')
3368                {
3369                  lp++;
3370                  incomm = TRUE;
3371                  continue;
3372                }
3373              else if (/* cplpl && */ *lp == '/')
3374                {

Event const: After this line, the value of "c" is equal to 0
Event assignment: Assigning "0" to "c"
Also see events:

3375                  c = '\0';
3376                  break;
3377                }
3378              else
3379                break;

Event new_values: Conditional "c == 37"
Also see events:

3380            case '%':
3381              if ((c_ext & YACC) && *lp == '%')
3382                {
3383                  /* Entering or exiting rules section in yacc file. */
3384                  lp++;
3385                  definedef = dnone; fvdef = fvnone; fvextern = FALSE;
3386                  typdef = tnone; structdef = snone;
3387                  midtoken = inquote = inchar = incomm = quotednl = FALSE;
3388                  bracelev = 0;
3389                  yacc_rules = !yacc_rules;
3390                  continue;
3391                }
3392              else
3393                break;
3394            case '#':
3395              if (definedef == dnone)
3396                {
3397                  char *cp;
3398                  bool cpptoken = TRUE;
3399
3400                  /* Look back on this line.  If all blanks, or nonblanks
3401                     followed by an end of comment, this is a preprocessor
3402                     token. */
3403                  for (cp = newlb.buffer; cp < lp-1; cp++)
3404                    if (!iswhite (*cp))
3405                      {
3406                        if (*cp == '*' && *(cp+1) == '/')
3407                          {
3408                            cp++;
3409                            cpptoken = TRUE;
3410                          }
3411                        else
3412                          cpptoken = FALSE;
3413                      }
3414                  if (cpptoken)
3415                    definedef = dsharpseen;
3416                } /* if (definedef == dnone) */
3417              continue;
3418            case '[':
3419              bracketlev++;
3420                continue;
3421            } /* switch (c) */
3422
3423
3424          /* Consider token only if some involved conditions are satisfied.
*/
3425          if (typdef != tignore
3426              && definedef != dignorerest
3427              && fvdef != finlist
3428              && templatelev == 0
3429              && (definedef != dnone
3430                  || structdef != scolonseen)
3431              && !inattribute)
3432            {
3433              if (midtoken)
3434                {
3435                  if (endtoken (c))
3436                    {

Event const: After this line, the value of "c" is equal to 32
Event equality_cond: Cond "c == 58" evaluated as false
Also see events:

3437                      if (c == ':' && *lp == ':' && begtoken (lp[1]))
3438                        /* This handles :: in the middle,
3439                           but not at the beginning of an identifier.
3440                           Also, space-separated :: is not recognised. */
3441                        {
3442                          if (c_ext & C_AUTO) /* automatic detection of C++
*/
3443                            c_ext = (c_ext | C_PLPL) & ~C_AUTO;
3444                          lp += 2;
3445                          toklen += 2;
3446                          c = lp[-1];
3447                          goto still_in_token;
3448                        }

```