|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  | #include <glib.h> | 
|  |  | 
|  | #include "vcardt.h" | 
|  |  | 
|  | #include "vcardt_internal.h" | 
|  |  | 
|  | /* create an ATR with appropriate historical bytes */ | 
|  | #define ATR_TS_DIRECT_CONVENTION 0x3b | 
|  | #define ATR_TA_PRESENT 0x10 | 
|  | #define ATR_TB_PRESENT 0x20 | 
|  | #define ATR_TC_PRESENT 0x40 | 
|  | #define ATR_TD_PRESENT 0x80 | 
|  |  | 
|  | unsigned char *vcard_alloc_atr(const char *postfix, int *atr_len) | 
|  | { | 
|  | int postfix_len; | 
|  | const char prefix[] = "VCARD_"; | 
|  | const char default_postfix[] = "DEFAULT"; | 
|  | const int prefix_len = sizeof(prefix) - 1; | 
|  | int total_len; | 
|  | unsigned char *atr; | 
|  |  | 
|  | if (postfix == NULL) { | 
|  | postfix = default_postfix; | 
|  | } | 
|  | postfix_len = strlen(postfix); | 
|  | total_len = 3 + prefix_len + postfix_len; | 
|  | atr = g_malloc(total_len); | 
|  | atr[0] = ATR_TS_DIRECT_CONVENTION; | 
|  | atr[1] = ATR_TD_PRESENT + prefix_len + postfix_len; | 
|  | atr[2] = 0x00; | 
|  | memcpy(&atr[3], prefix, prefix_len); | 
|  | memcpy(&atr[3 + prefix_len], postfix, postfix_len); | 
|  | if (atr_len) { | 
|  | *atr_len = total_len; | 
|  | } | 
|  | return atr; | 
|  | } |