/* * pop symbol table identifiers at this level symbol_right_bracket(); */ void symbol_right_bracket( void) { TUPLE *tuple; /* * print the complete symbol table before poping symbols off */ #ifdef YYDEBUG if( IS_FLAGS_SYMBOL( data.flags)) { printf( "pop symbol table level: %d\n", data.level); print_symbol_table(); } #endif /* * check and remove all tuple above level */ for( tuple = data.symbol_table; tuple; tuple = data.symbol_table) { if( tuple->level < data.level) break; put_address( tuple->address, 1); data.symbol_table = tuple->next; tuple->next = data.symbol_table_free; data.symbol_table_free = tuple; } /* * decrement the symbol table level */ data.level--; return; }
/* * pop symbol table identifiers at this level symbol_right_bracket(); */ void symbol_right_bracket( void) { CLIPS *clips; /* * print the complete symbol table before poping symbols off */ #ifdef YYDEBUG if( IS_FLAGS_SYMBOL( data.flags)) { printf( "pop symbol table level: %d\n", data.level); print_symbol_table(); } #endif /* * check and remove all clips above level */ for( clips = data.symbol_table; clips; clips = data.symbol_table) { if( clips->level < data.level) break; put_address( clips->address); data.symbol_table = clips->next; de_clips( clips); } /* * decrement the symbol table level */ data.level--; return; }
static int interrogate_success(isdn_ctrl *ic, struct call_struc *cs) { char *src = ic->parm.dss1_io.data; int restlen = ic->parm.dss1_io.datalen; int cnt = 1; u_char n,n1; char st[90], *p, *stp; if (restlen < 2) return(-100); /* frame too short */ if (*src++ != 0x30) return(-101); if ((n = *src++) > 0x81) return(-102); /* invalid length field */ restlen -= 2; /* remaining bytes */ if (n == 0x80) { if (restlen < 2) return(-103); if ((*(src+restlen-1)) || (*(src+restlen-2))) return(-104); restlen -= 2; } else if ( n == 0x81) { n = *src++; restlen--; if (n > restlen) return(-105); restlen = n; } else if (n > restlen) return(-106); else restlen = n; /* standard format */ if (restlen < 3) return(-107); /* no procedure */ if ((*src++ != 2) || (*src++ != 1) || (*src++ != 0x0B)) return(-108); restlen -= 3; if (restlen < 2) return(-109); /* list missing */ if (*src == 0x31) { src++; if ((n = *src++) > 0x81) return(-110); /* invalid length field */ restlen -= 2; /* remaining bytes */ if (n == 0x80) { if (restlen < 2) return(-111); if ((*(src+restlen-1)) || (*(src+restlen-2))) return(-112); restlen -= 2; } else if ( n == 0x81) { n = *src++; restlen--; if (n > restlen) return(-113); restlen = n; } else if (n > restlen) return(-114); else restlen = n; /* standard format */ } /* result list header */ while (restlen >= 2) { stp = st; sprintf(stp,"%d 0x%lx %d %s ",DIVERT_REPORT, ic->parm.dss1_io.ll_id, cnt++,divert_if.drv_to_name(ic->driver)); stp += strlen(stp); if (*src++ != 0x30) return(-115); /* invalid enum */ n = *src++; restlen -= 2; if (n > restlen) return(-116); /* enum length wrong */ restlen -= n; p = src; /* one entry */ src += n; if (!(n1 = put_address(stp,p,n & 0xFF))) continue; stp += strlen(stp); p += n1; n -= n1; if (n < 6) continue; /* no service and proc */ if ((*p++ != 0x0A) || (*p++ != 1)) continue; sprintf(stp," 0x%02x ",(*p++) & 0xFF); stp += strlen(stp); if ((*p++ != 0x0A) || (*p++ != 1)) continue; sprintf(stp,"%d ",(*p++) & 0xFF); stp += strlen(stp); n -= 6; if (n > 2) { if (*p++ != 0x30) continue; if (*p > (n-2)) continue; n = *p++; if (!(n1 = put_address(stp,p,n & 0xFF))) continue; stp += strlen(stp); } sprintf(stp,"\n"); put_info_buffer(st); } /* while restlen */ if (restlen) return(-117); return(0); } /* interrogate_success */