void ProtoBufExport::ParameterVariable(clang::ParmVarDecl const *param) { exportData([&](ct::proto::Envelope &env) { auto var = env.mutable_var(); mapper.ResolveName(*var->mutable_name(), *param); mapper.ResolveType(*var->mutable_own_type(), param->getType()); var->set_kind(ct::proto::Var_VarKind_PARAMETER); }); }
void ProtoBufExport::LocalVariable(clang::VarDecl const *varDecl) { exportData([&](ct::proto::Envelope &env) { auto var = env.mutable_var(); mapper.ResolveName(*var->mutable_name(), *varDecl); mapper.ResolveType(*var->mutable_own_type(), varDecl->getType()); var->set_kind(ct::proto::Var_VarKind_LOCAL); }); }
void ProtoBufExport::MemberVariable(clang::FieldDecl const *field) { exportData([&](ct::proto::Envelope &env) { auto c_var = env.mutable_c_var(); mapper.ResolveType(*c_var->mutable_parent(), clang::QualType(field->getParent()->getTypeForDecl(), 0)); auto var = c_var->mutable_base(); mapper.ResolveName(*var->mutable_name(), *field); mapper.ResolveType(*var->mutable_own_type(), field->getType()); var->set_kind(ct::proto::Var_VarKind_CLASS); }); }
WORD new_index(BYTE *val, WORD kind, BYTE *name) { if (rcs_ndxno >= NDXSIZE) return (NIL); else { set_value(rcs_ndxno, val); set_kind(rcs_ndxno, kind); set_name(rcs_ndxno, name); return (rcs_ndxno++); } }
sieve_relation::sieve_relation(sieve_relation_plugin & p, const relation_signature & s, const bool * inner_columns, relation_base * inner) : relation_base(p, s), m_inner_cols(s.size(), inner_columns), m_inner(inner) { unsigned n = s.size(); for(unsigned i=0; i<n; i++) { if(inner_columns && inner_columns[i]) { unsigned inner_idx = m_inner2sig.size(); SASSERT(get_inner().get_signature()[inner_idx]==s[i]); m_sig2inner.push_back(inner_idx); m_inner2sig.push_back(i); } else { m_sig2inner.push_back(UINT_MAX); m_ignored_cols.push_back(i); } } set_kind(p.get_relation_kind(*this, inner_columns)); }
Token nextTkn(void) /* 次のトークン */ { Token tkn = {NulKind, "", 0}; int errF = FALSE, num, ct, n; char *p = tkn.text, *p_end31 = p+ID_SIZ; char lite[100+1], *lite_end = lite+100; static int ch = ' '; /* 前回文字を保持するためstatic */ while (isspace(ch)) { ch = nextCh(); } /* 空白読み捨て */ if (ch == EOF) { tkn.kind = EofTkn; return tkn; } /* EOF */ switch (ctyp[ch]) { case Letter: for ( ; ctyp[ch]==Letter || ctyp[ch]==Digit; ch = nextCh()) { if (p < p_end31) *p++ = ch; /* 識別子は最大31文字まで有効 */ } *p = '\0'; break; case Digit: /* 数値定数 */ for (num=0; ctyp[ch]==Digit; ch = nextCh()) { num = num*10 + (ch-'0'); } tkn.kind = IntNum; tkn.intVal = num; /* 値格納 */ sprintf(tkn.text, "%d", num); /* エラー表示用 */ break; case SngQ: /* 文字定数 */ for (ct=0,ch=nextCh(); ch!=EOF && ch!='\n' && ch!='\''; ch=nextCh()) { if (ch == '\\') { if ((ch=nextCh()) == 'n') ch = '\n'; } /* \nの処理 */ if (++ct == 1) tkn.intVal = ch; /* 文字定数値格納 */ } if (ct != 1) errF = TRUE; if (ch == '\'') ch = nextCh(); else errF = TRUE; if (errF) err_s("不正な文字定数"); tkn.kind = IntNum; /* 以降は整数定数として扱う */ sprintf(tkn.text, "'%c'", tkn.intVal); /* エラー表示用 */ break; case DblQ: /* 文字列定数 */ p = lite; ch = nextCh(); while (ch!=EOF && ch!='\n' && ch!='"') { if (errF) { ch = nextCh(); continue; } if ((n=is_kanji(ch)) > 0) { while (n--) { if (p < lite_end) P_SET(); else errF = TRUE; } continue; } if (ch == '\\') { if ((ch=nextCh()) == 'n') ch = '\n'; } /* \nの処理 */ if (p < lite_end) P_SET(); else errF = TRUE; } *p = '\0'; if (errF) err_s("文字列リテラルが長すぎる"); if (ch == '"') ch = nextCh(); else err_s("文字列リテラルが閉じていない"); tkn.kind = String; tkn.intVal = mallocS(lite); /* 文字列をメモリに確保し番地を格納 */ tkn.text[0] = '\"'; /*以下エラー表示用に文字列確保*/ strncat(tkn.text+1, lite, 29); if (strlen(tkn.text) <= 29) strcat(tkn.text, "\""); break; default: /* 記号 */ if (ch<0 || 127<ch) err_s("不正な文字が使われている"); if ((n=is_kanji(ch)) > 0) { while (n--) P_SET(); } else P_SET(); if (is_ope2(*(p-1), ch)) P_SET(); /* == など */ *p = '\0'; } if (tkn.kind == NulKind) tkn = set_kind(tkn); /* 種別設定 */ if (tkn.kind == Others) err_ss("不正なトークン", tkn.text); return tkn; }