这个数组是如何用C中的索引初始化的



这是Linux内核源代码树中的文件linux/crypto/asymmetric_keys/x509-asn1.c。它使用装箱索引进行分配,如[ 0][ 1][ 2]。。。。。

/*
 * Automatically generated by asn1_compiler.  Do not edit
 *
 * ASN.1 parser for x509
 */
#include <linux/asn1_ber_bytecode.h>
#include "x509-asn1.h"
enum x509_actions {
    ACT_x509_extract_key_data = 0,
    ACT_x509_extract_name_segment = 1,
    ACT_x509_note_OID = 2,
    ACT_x509_note_issuer = 3,
    ACT_x509_note_not_after = 4,
    ACT_x509_note_not_before = 5,
    ACT_x509_note_pkey_algo = 6,
    ACT_x509_note_signature = 7,
    ACT_x509_note_subject = 8,
    ACT_x509_note_tbs_certificate = 9,
    ACT_x509_process_extension = 10,
    NR__x509_actions = 11
};
static const asn1_action_t x509_action_table[NR__x509_actions] = {
    [   0] = x509_extract_key_data,
    [   1] = x509_extract_name_segment,
    [   2] = x509_note_OID,
    [   3] = x509_note_issuer,
    [   4] = x509_note_not_after,
    [   5] = x509_note_not_before,
    [   6] = x509_note_pkey_algo,
    [   7] = x509_note_signature,
    [   8] = x509_note_subject,
    [   9] = x509_note_tbs_certificate,
    [  10] = x509_process_extension,
};
static const unsigned char x509_machine[] = {
    // Certificate
    [   0] = ASN1_OP_MATCH,
    [   1] = _tag(UNIV, CONS, SEQ),
    // TBSCertificate
    [   2] =  ASN1_OP_MATCH,
    [   3] =  _tag(UNIV, CONS, SEQ),
    [   4] =   ASN1_OP_MATCH_JUMP_OR_SKIP,      // version
    [   5] =   _tagn(CONT, CONS,  0),
    [   6] =   _jump_target(68),
    // CertificateSerialNumber
    [   7] =   ASN1_OP_MATCH,
    [   8] =   _tag(UNIV, PRIM, INT),
    // AlgorithmIdentifier
    [   9] =   ASN1_OP_MATCH_JUMP,
    [  10] =   _tag(UNIV, CONS, SEQ),
    [  11] =   _jump_target(72),        // --> AlgorithmIdentifier
    [  12] =   ASN1_OP_ACT,
    [  13] =   _action(ACT_x509_note_pkey_algo),
    // Name
    [  14] =   ASN1_OP_MATCH_JUMP,
    [  15] =   _tag(UNIV, CONS, SEQ),
    [  16] =   _jump_target(78),        // --> Name
    [  17] =   ASN1_OP_ACT,
    [  18] =   _action(ACT_x509_note_issuer),
    // Validity
    [  19] =   ASN1_OP_MATCH,
    [  20] =   _tag(UNIV, CONS, SEQ),
    // Time
    [  21] =    ASN1_OP_MATCH_OR_SKIP,      // utcTime
    [  22] =    _tag(UNIV, PRIM, UNITIM),
    [  23] =    ASN1_OP_COND_MATCH_OR_SKIP,     // generalTime
    [  24] =    _tag(UNIV, PRIM, GENTIM),
    [  25] =    ASN1_OP_COND_FAIL,
    [  26] =    ASN1_OP_ACT,
    [  27] =    _action(ACT_x509_note_not_before),
    // Time
    [  28] =    ASN1_OP_MATCH_OR_SKIP,      // utcTime
    [  29] =    _tag(UNIV, PRIM, UNITIM),
    [  30] =    ASN1_OP_COND_MATCH_OR_SKIP,     // generalTime
    [  31] =    _tag(UNIV, PRIM, GENTIM),
    [  32] =    ASN1_OP_COND_FAIL,
    [  33] =    ASN1_OP_ACT,
    [  34] =    _action(ACT_x509_note_not_after),
    [  35] =   ASN1_OP_END_SEQ,
    // Name
    [  36] =   ASN1_OP_MATCH_JUMP,
    [  37] =   _tag(UNIV, CONS, SEQ),
    [  38] =   _jump_target(78),        // --> Name
    [  39] =   ASN1_OP_ACT,
    [  40] =   _action(ACT_x509_note_subject),
    // SubjectPublicKeyInfo
    [  41] =   ASN1_OP_MATCH,
    [  42] =   _tag(UNIV, CONS, SEQ),
    // AlgorithmIdentifier
    [  43] =    ASN1_OP_MATCH_JUMP,
    [  44] =    _tag(UNIV, CONS, SEQ),
    [  45] =    _jump_target(72),       // --> AlgorithmIdentifier
    [  46] =    ASN1_OP_MATCH_ACT,      // subjectPublicKey
    [  47] =    _tag(UNIV, PRIM, BTS),
    [  48] =    _action(ACT_x509_extract_key_data),
    [  49] =   ASN1_OP_END_SEQ,
    // UniqueIdentifier
    [  50] =   ASN1_OP_MATCH_OR_SKIP,
    [  51] =   _tagn(CONT, PRIM,  1),
    // UniqueIdentifier
    [  52] =   ASN1_OP_MATCH_OR_SKIP,
    [  53] =   _tagn(CONT, PRIM,  2),
    [  54] =   ASN1_OP_MATCH_JUMP_OR_SKIP,      // extensions
    [  55] =   _tagn(CONT, CONS,  3),
    [  56] =   _jump_target(93),
    [  57] =  ASN1_OP_END_SEQ,
    [  58] =  ASN1_OP_ACT,
    [  59] =  _action(ACT_x509_note_tbs_certificate),
    // AlgorithmIdentifier
    [  60] =  ASN1_OP_MATCH_JUMP,
    [  61] =  _tag(UNIV, CONS, SEQ),
    [  62] =  _jump_target(72),     // --> AlgorithmIdentifier
    [  63] =  ASN1_OP_MATCH_ACT,        // signature
    [  64] =  _tag(UNIV, PRIM, BTS),
    [  65] =  _action(ACT_x509_note_signature),
    [  66] = ASN1_OP_END_SEQ,
    [  67] = ASN1_OP_COMPLETE,
    // Version
    [  68] =  ASN1_OP_MATCH,
    [  69] =  _tag(UNIV, PRIM, INT),
    [  70] = ASN1_OP_END_SEQ,
    [  71] = ASN1_OP_RETURN,
    [  72] =  ASN1_OP_MATCH_ACT,        // algorithm
    [  73] =  _tag(UNIV, PRIM, OID),
    [  74] =  _action(ACT_x509_note_OID),
    [  75] =  ASN1_OP_MATCH_ANY,        // parameters
    [  76] = ASN1_OP_END_SEQ,
    [  77] = ASN1_OP_RETURN,
    // RelativeDistinguishedName
    [  78] =  ASN1_OP_MATCH,
    [  79] =  _tag(UNIV, CONS, SET),
    // AttributeValueAssertion
    [  80] =   ASN1_OP_MATCH,
    [  81] =   _tag(UNIV, CONS, SEQ),
    [  82] =    ASN1_OP_MATCH_ACT,      // attributeType
    [  83] =    _tag(UNIV, PRIM, OID),
    [  84] =    _action(ACT_x509_note_OID),
    [  85] =    ASN1_OP_MATCH_ANY_ACT,      // attributeValue
    [  86] =    _action(ACT_x509_extract_name_segment),
    [  87] =   ASN1_OP_END_SEQ,
    [  88] =  ASN1_OP_END_SET_OF,
    [  89] =  _jump_target(80),
    [  90] = ASN1_OP_END_SEQ_OF,
    [  91] = _jump_target(78),
    [  92] = ASN1_OP_RETURN,
    // Extensions
    [  93] =  ASN1_OP_MATCH,
    [  94] =  _tag(UNIV, CONS, SEQ),
    // Extension
    [  95] =   ASN1_OP_MATCH,
    [  96] =   _tag(UNIV, CONS, SEQ),
    [  97] =    ASN1_OP_MATCH_ACT,      // extnid
    [  98] =    _tag(UNIV, PRIM, OID),
    [  99] =    _action(ACT_x509_note_OID),
    [ 100] =    ASN1_OP_MATCH_OR_SKIP,      // critical
    [ 101] =    _tag(UNIV, PRIM, BOOL),
    [ 102] =    ASN1_OP_MATCH_ACT,      // extnValue
    [ 103] =    _tag(UNIV, PRIM, OTS),
    [ 104] =    _action(ACT_x509_process_extension),
    [ 105] =   ASN1_OP_END_SEQ,
    [ 106] =  ASN1_OP_END_SEQ_OF,
    [ 107] =  _jump_target(95),
    [ 108] = ASN1_OP_END_SEQ,
    [ 109] = ASN1_OP_RETURN,
};
const struct asn1_decoder x509_decoder = {
    .machine = x509_machine,
    .machlen = sizeof(x509_machine),
    .actions = x509_action_table,
};

它们是指定的初始化程序

在ISOC99中,您可以按任何顺序给出元素,指定它们所应用的数组索引或结构字段名称。

C99标准规定索引和值之间应该有一个=,GCC作为语言的扩展允许您省略它。

最新更新