2014-10-17 20 views
0

這是Linux內核源代碼樹中的文件linux/crypto/asymmetric_keys/x509-asn1.c。它使用分配盒裝指標像[ 0][ 1][ 2] .....這個數組是如何用C中的索引初始化的?

/* 
* 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, 
}; 

回答

3

他們designated initializers

在ISO C99中,您可以按任意順序給出元素,指定它們所應用的數組索引或結構字段名稱。

C99標準規定索引和值之間應該有一個=,GCC作爲語言的擴展允許您省略它。