mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-17 05:38:33 +03:00
replace leading spaces with tabs
Change-Id: I86783eba0827b58303b10310e9f6b9625e1a27f1
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -76,45 +76,45 @@ struct Usart_info usart_sim = {.base = USART_SIM, .id = ID_USART_SIM, .state = U
|
||||
*/
|
||||
uint32_t ISO7816_GetChar( uint8_t *pCharToReceive, Usart_info *usart)
|
||||
{
|
||||
uint32_t status;
|
||||
uint32_t timeout=0;
|
||||
uint32_t status;
|
||||
uint32_t timeout=0;
|
||||
|
||||
Usart *us_base = usart->base;
|
||||
uint32_t us_id = usart->id;
|
||||
Usart *us_base = usart->base;
|
||||
uint32_t us_id = usart->id;
|
||||
|
||||
if( usart->state == USART_SEND ) {
|
||||
while((us_base->US_CSR & US_CSR_TXEMPTY) == 0) {}
|
||||
us_base->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
usart->state = USART_RCV;
|
||||
}
|
||||
if( usart->state == USART_SEND ) {
|
||||
while((us_base->US_CSR & US_CSR_TXEMPTY) == 0) {}
|
||||
us_base->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
usart->state = USART_RCV;
|
||||
}
|
||||
|
||||
/* Wait USART ready for reception */
|
||||
while( ((us_base->US_CSR & US_CSR_RXRDY) == 0) ) {
|
||||
/* Wait USART ready for reception */
|
||||
while( ((us_base->US_CSR & US_CSR_RXRDY) == 0) ) {
|
||||
WDT_Restart(WDT);
|
||||
if(timeout++ > 12000 * (BOARD_MCK/1000000)) {
|
||||
TRACE_WARNING("TimeOut\n\r");
|
||||
return( 0 );
|
||||
}
|
||||
}
|
||||
if(timeout++ > 12000 * (BOARD_MCK/1000000)) {
|
||||
TRACE_WARNING("TimeOut\n\r");
|
||||
return( 0 );
|
||||
}
|
||||
}
|
||||
|
||||
/* At least one complete character has been received and US_RHR has not yet been read. */
|
||||
/* At least one complete character has been received and US_RHR has not yet been read. */
|
||||
|
||||
/* Get a char */
|
||||
*pCharToReceive = ((us_base->US_RHR) & 0xFF);
|
||||
/* Get a char */
|
||||
*pCharToReceive = ((us_base->US_RHR) & 0xFF);
|
||||
|
||||
status = (us_base->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
|
||||
(1<<10)));
|
||||
status = (us_base->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
|
||||
(1<<10)));
|
||||
|
||||
if (status != 0 ) {
|
||||
TRACE_DEBUG("R:0x%" PRIX32 "\n\r", status);
|
||||
TRACE_DEBUG("R:0x%" PRIX32 "\n\r", us_base->US_CSR);
|
||||
TRACE_DEBUG("Nb:0x%" PRIX32 "\n\r", us_base->US_NER );
|
||||
us_base->US_CR = US_CR_RSTSTA;
|
||||
}
|
||||
if (status != 0 ) {
|
||||
TRACE_DEBUG("R:0x%" PRIX32 "\n\r", status);
|
||||
TRACE_DEBUG("R:0x%" PRIX32 "\n\r", us_base->US_CSR);
|
||||
TRACE_DEBUG("Nb:0x%" PRIX32 "\n\r", us_base->US_NER );
|
||||
us_base->US_CR = US_CR_RSTSTA;
|
||||
}
|
||||
|
||||
/* Return status */
|
||||
return( status );
|
||||
/* Return status */
|
||||
return( status );
|
||||
}
|
||||
|
||||
|
||||
@@ -125,50 +125,50 @@ uint32_t ISO7816_GetChar( uint8_t *pCharToReceive, Usart_info *usart)
|
||||
*/
|
||||
uint32_t ISO7816_SendChar( uint8_t CharToSend, Usart_info *usart )
|
||||
{
|
||||
uint32_t status;
|
||||
uint32_t status;
|
||||
|
||||
Usart *us_base = usart->base;
|
||||
uint32_t us_id = usart->id;
|
||||
Usart *us_base = usart->base;
|
||||
uint32_t us_id = usart->id;
|
||||
|
||||
if( usart->state == USART_RCV ) {
|
||||
us_base->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
usart->state = USART_SEND;
|
||||
}
|
||||
if( usart->state == USART_RCV ) {
|
||||
us_base->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
usart->state = USART_SEND;
|
||||
}
|
||||
|
||||
/* Wait USART ready for transmit */
|
||||
int i = 0;
|
||||
while((us_base->US_CSR & (US_CSR_TXRDY)) == 0) {
|
||||
i++;
|
||||
if (!(i%1000000)) {
|
||||
printf("s: %x ", us_base->US_CSR);
|
||||
printf("s: %x\r\n", us_base->US_RHR & 0xFF);
|
||||
us_base->US_CR = US_CR_RSTTX;
|
||||
us_base->US_CR = US_CR_RSTRX;
|
||||
}
|
||||
}
|
||||
/* There is no character in the US_THR */
|
||||
/* Wait USART ready for transmit */
|
||||
int i = 0;
|
||||
while((us_base->US_CSR & (US_CSR_TXRDY)) == 0) {
|
||||
i++;
|
||||
if (!(i%1000000)) {
|
||||
printf("s: %x ", us_base->US_CSR);
|
||||
printf("s: %x\r\n", us_base->US_RHR & 0xFF);
|
||||
us_base->US_CR = US_CR_RSTTX;
|
||||
us_base->US_CR = US_CR_RSTRX;
|
||||
}
|
||||
}
|
||||
/* There is no character in the US_THR */
|
||||
|
||||
/* Transmit a char */
|
||||
us_base->US_THR = CharToSend;
|
||||
/* Transmit a char */
|
||||
us_base->US_THR = CharToSend;
|
||||
|
||||
TRACE_ERROR("Sx%02X\r\n", CharToSend);
|
||||
TRACE_ERROR("Sx%02X\r\n", CharToSend);
|
||||
|
||||
status = (us_base->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
|
||||
(1<<10)));
|
||||
status = (us_base->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
|
||||
(1<<10)));
|
||||
|
||||
if (status != 0 ) {
|
||||
TRACE_INFO("******* status: 0x%" PRIX32 " (Overrun: %" PRIX32
|
||||
", NACK: %" PRIX32 ", Timeout: %" PRIX32 ", underrun: %" PRIX32 ")\n\r",
|
||||
status, ((status & US_CSR_OVRE)>> 5), ((status & US_CSR_NACK) >> 13),
|
||||
((status & US_CSR_TIMEOUT) >> 8), ((status & (1 << 10)) >> 10));
|
||||
TRACE_INFO("E (USART CSR reg):0x%" PRIX32 "\n\r", us_base->US_CSR);
|
||||
TRACE_INFO("Nb (Number of errors):0x%" PRIX32 "\n\r", us_base->US_NER );
|
||||
us_base->US_CR = US_CR_RSTSTA;
|
||||
}
|
||||
if (status != 0 ) {
|
||||
TRACE_INFO("******* status: 0x%" PRIX32 " (Overrun: %" PRIX32
|
||||
", NACK: %" PRIX32 ", Timeout: %" PRIX32 ", underrun: %" PRIX32 ")\n\r",
|
||||
status, ((status & US_CSR_OVRE)>> 5), ((status & US_CSR_NACK) >> 13),
|
||||
((status & US_CSR_TIMEOUT) >> 8), ((status & (1 << 10)) >> 10));
|
||||
TRACE_INFO("E (USART CSR reg):0x%" PRIX32 "\n\r", us_base->US_CSR);
|
||||
TRACE_INFO("Nb (Number of errors):0x%" PRIX32 "\n\r", us_base->US_NER );
|
||||
us_base->US_CR = US_CR_RSTSTA;
|
||||
}
|
||||
|
||||
/* Return status */
|
||||
return( status );
|
||||
/* Return status */
|
||||
return( status );
|
||||
}
|
||||
|
||||
|
||||
@@ -177,10 +177,10 @@ uint32_t ISO7816_SendChar( uint8_t CharToSend, Usart_info *usart )
|
||||
*/
|
||||
static void ISO7816_IccPowerOn( void )
|
||||
{
|
||||
/* Set RESET Master Card */
|
||||
if (st_pinIso7816RstMC) {
|
||||
PIO_Set(st_pinIso7816RstMC);
|
||||
}
|
||||
/* Set RESET Master Card */
|
||||
if (st_pinIso7816RstMC) {
|
||||
PIO_Set(st_pinIso7816RstMC);
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
@@ -192,10 +192,10 @@ static void ISO7816_IccPowerOn( void )
|
||||
*/
|
||||
void ISO7816_IccPowerOff( void )
|
||||
{
|
||||
/* Clear RESET Master Card */
|
||||
if (st_pinIso7816RstMC) {
|
||||
PIO_Clear(st_pinIso7816RstMC);
|
||||
}
|
||||
/* Clear RESET Master Card */
|
||||
if (st_pinIso7816RstMC) {
|
||||
PIO_Clear(st_pinIso7816RstMC);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -207,159 +207,159 @@ void ISO7816_IccPowerOff( void )
|
||||
* \return 0 on success, content of US_CSR otherwise
|
||||
*/
|
||||
uint32_t ISO7816_XfrBlockTPDU_T0(const uint8_t *pAPDU,
|
||||
uint8_t *pMessage,
|
||||
uint16_t wLength,
|
||||
uint16_t *retlen )
|
||||
uint8_t *pMessage,
|
||||
uint16_t wLength,
|
||||
uint16_t *retlen )
|
||||
{
|
||||
uint16_t NeNc;
|
||||
uint16_t indexApdu = 4;
|
||||
uint16_t indexMsg = 0;
|
||||
uint8_t SW1 = 0;
|
||||
uint8_t procByte;
|
||||
uint8_t cmdCase;
|
||||
uint32_t status = 0;
|
||||
uint16_t NeNc;
|
||||
uint16_t indexApdu = 4;
|
||||
uint16_t indexMsg = 0;
|
||||
uint8_t SW1 = 0;
|
||||
uint8_t procByte;
|
||||
uint8_t cmdCase;
|
||||
uint32_t status = 0;
|
||||
|
||||
TRACE_INFO("pAPDU[0]=0x%X\n\r",pAPDU[0]);
|
||||
TRACE_INFO("pAPDU[1]=0x%X\n\r",pAPDU[1]);
|
||||
TRACE_INFO("pAPDU[2]=0x%X\n\r",pAPDU[2]);
|
||||
TRACE_INFO("pAPDU[3]=0x%X\n\r",pAPDU[3]);
|
||||
TRACE_INFO("pAPDU[4]=0x%X\n\r",pAPDU[4]);
|
||||
TRACE_INFO("pAPDU[5]=0x%X\n\r",pAPDU[5]);
|
||||
TRACE_INFO("wlength=%d\n\r",wLength);
|
||||
TRACE_INFO("pAPDU[0]=0x%X\n\r",pAPDU[0]);
|
||||
TRACE_INFO("pAPDU[1]=0x%X\n\r",pAPDU[1]);
|
||||
TRACE_INFO("pAPDU[2]=0x%X\n\r",pAPDU[2]);
|
||||
TRACE_INFO("pAPDU[3]=0x%X\n\r",pAPDU[3]);
|
||||
TRACE_INFO("pAPDU[4]=0x%X\n\r",pAPDU[4]);
|
||||
TRACE_INFO("pAPDU[5]=0x%X\n\r",pAPDU[5]);
|
||||
TRACE_INFO("wlength=%d\n\r",wLength);
|
||||
|
||||
ISO7816_SendChar( pAPDU[0], &usart_sim ); /* CLA */
|
||||
ISO7816_SendChar( pAPDU[1], &usart_sim ); /* INS */
|
||||
ISO7816_SendChar( pAPDU[2], &usart_sim ); /* P1 */
|
||||
ISO7816_SendChar( pAPDU[3], &usart_sim ); /* P2 */
|
||||
ISO7816_SendChar( pAPDU[4], &usart_sim ); /* P3 */
|
||||
ISO7816_SendChar( pAPDU[0], &usart_sim ); /* CLA */
|
||||
ISO7816_SendChar( pAPDU[1], &usart_sim ); /* INS */
|
||||
ISO7816_SendChar( pAPDU[2], &usart_sim ); /* P1 */
|
||||
ISO7816_SendChar( pAPDU[3], &usart_sim ); /* P2 */
|
||||
ISO7816_SendChar( pAPDU[4], &usart_sim ); /* P3 */
|
||||
|
||||
/* Handle the four structures of command APDU */
|
||||
indexApdu = 5;
|
||||
/* Handle the four structures of command APDU */
|
||||
indexApdu = 5;
|
||||
|
||||
if( wLength == 4 ) {
|
||||
cmdCase = CASE1;
|
||||
NeNc = 0;
|
||||
}
|
||||
else if( wLength == 5) {
|
||||
cmdCase = CASE2;
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
if (NeNc == 0) {
|
||||
NeNc = 256;
|
||||
}
|
||||
}
|
||||
else if( wLength == 6) {
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
cmdCase = CASE3;
|
||||
}
|
||||
else if( wLength == 7) {
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
if( NeNc == 0 ) {
|
||||
cmdCase = CASE2;
|
||||
NeNc = (pAPDU[5]<<8)+pAPDU[6];
|
||||
}
|
||||
else {
|
||||
cmdCase = CASE3;
|
||||
}
|
||||
}
|
||||
else {
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
if( NeNc == 0 ) {
|
||||
cmdCase = CASE3;
|
||||
NeNc = (pAPDU[5]<<8)+pAPDU[6];
|
||||
}
|
||||
else {
|
||||
cmdCase = CASE3;
|
||||
}
|
||||
}
|
||||
if( wLength == 4 ) {
|
||||
cmdCase = CASE1;
|
||||
NeNc = 0;
|
||||
}
|
||||
else if( wLength == 5) {
|
||||
cmdCase = CASE2;
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
if (NeNc == 0) {
|
||||
NeNc = 256;
|
||||
}
|
||||
}
|
||||
else if( wLength == 6) {
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
cmdCase = CASE3;
|
||||
}
|
||||
else if( wLength == 7) {
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
if( NeNc == 0 ) {
|
||||
cmdCase = CASE2;
|
||||
NeNc = (pAPDU[5]<<8)+pAPDU[6];
|
||||
}
|
||||
else {
|
||||
cmdCase = CASE3;
|
||||
}
|
||||
}
|
||||
else {
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
if( NeNc == 0 ) {
|
||||
cmdCase = CASE3;
|
||||
NeNc = (pAPDU[5]<<8)+pAPDU[6];
|
||||
}
|
||||
else {
|
||||
cmdCase = CASE3;
|
||||
}
|
||||
}
|
||||
|
||||
TRACE_DEBUG("CASE=0x%X NeNc=0x%X\n\r", cmdCase, NeNc);
|
||||
TRACE_DEBUG("CASE=0x%X NeNc=0x%X\n\r", cmdCase, NeNc);
|
||||
|
||||
/* Handle Procedure Bytes */
|
||||
do {
|
||||
status = ISO7816_GetChar(&procByte, &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
TRACE_INFO("procByte: 0x%X\n\r", procByte);
|
||||
/* Handle NULL */
|
||||
if ( procByte == ISO_NULL_VAL ) {
|
||||
TRACE_INFO("INS\n\r");
|
||||
continue;
|
||||
}
|
||||
/* Handle SW1 */
|
||||
else if ( ((procByte & 0xF0) ==0x60) || ((procByte & 0xF0) ==0x90) ) {
|
||||
TRACE_INFO("SW1\n\r");
|
||||
SW1 = 1;
|
||||
}
|
||||
/* Handle INS */
|
||||
else if ( pAPDU[1] == procByte) {
|
||||
TRACE_INFO("HdlINS\n\r");
|
||||
if (cmdCase == CASE2) {
|
||||
/* receive data from card */
|
||||
do {
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim);
|
||||
} while(( 0 != --NeNc) && (status == 0) );
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Send data */
|
||||
do {
|
||||
TRACE_INFO("Send %X", pAPDU[indexApdu]);
|
||||
ISO7816_SendChar(pAPDU[indexApdu++], &usart_sim);
|
||||
} while( 0 != --NeNc );
|
||||
}
|
||||
}
|
||||
/* Handle INS ^ 0xff */
|
||||
else
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||
if ( pAPDU[1] == (procByte ^ 0xff)) {
|
||||
#pragma GCC diagnostic pop
|
||||
TRACE_INFO("HdlINS+\n\r");
|
||||
if (cmdCase == CASE2) {
|
||||
/* receive data from card */
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
TRACE_INFO("Rcv: 0x%X\n\r", pMessage[indexMsg-1]);
|
||||
}
|
||||
else {
|
||||
status = ISO7816_SendChar(pAPDU[indexApdu++], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
NeNc--;
|
||||
}
|
||||
else {
|
||||
/* ?? */
|
||||
TRACE_INFO("procByte=0x%X\n\r", procByte);
|
||||
break;
|
||||
}
|
||||
} while (NeNc != 0);
|
||||
/* Handle Procedure Bytes */
|
||||
do {
|
||||
status = ISO7816_GetChar(&procByte, &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
TRACE_INFO("procByte: 0x%X\n\r", procByte);
|
||||
/* Handle NULL */
|
||||
if ( procByte == ISO_NULL_VAL ) {
|
||||
TRACE_INFO("INS\n\r");
|
||||
continue;
|
||||
}
|
||||
/* Handle SW1 */
|
||||
else if ( ((procByte & 0xF0) ==0x60) || ((procByte & 0xF0) ==0x90) ) {
|
||||
TRACE_INFO("SW1\n\r");
|
||||
SW1 = 1;
|
||||
}
|
||||
/* Handle INS */
|
||||
else if ( pAPDU[1] == procByte) {
|
||||
TRACE_INFO("HdlINS\n\r");
|
||||
if (cmdCase == CASE2) {
|
||||
/* receive data from card */
|
||||
do {
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim);
|
||||
} while(( 0 != --NeNc) && (status == 0) );
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Send data */
|
||||
do {
|
||||
TRACE_INFO("Send %X", pAPDU[indexApdu]);
|
||||
ISO7816_SendChar(pAPDU[indexApdu++], &usart_sim);
|
||||
} while( 0 != --NeNc );
|
||||
}
|
||||
}
|
||||
/* Handle INS ^ 0xff */
|
||||
else
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||
if ( pAPDU[1] == (procByte ^ 0xff)) {
|
||||
#pragma GCC diagnostic pop
|
||||
TRACE_INFO("HdlINS+\n\r");
|
||||
if (cmdCase == CASE2) {
|
||||
/* receive data from card */
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
TRACE_INFO("Rcv: 0x%X\n\r", pMessage[indexMsg-1]);
|
||||
}
|
||||
else {
|
||||
status = ISO7816_SendChar(pAPDU[indexApdu++], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
NeNc--;
|
||||
}
|
||||
else {
|
||||
/* ?? */
|
||||
TRACE_INFO("procByte=0x%X\n\r", procByte);
|
||||
break;
|
||||
}
|
||||
} while (NeNc != 0);
|
||||
|
||||
/* Status Bytes */
|
||||
if (SW1 == 0) {
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim); /* SW1 */
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
else {
|
||||
pMessage[indexMsg++] = procByte;
|
||||
}
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim); /* SW2 */
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
/* Status Bytes */
|
||||
if (SW1 == 0) {
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim); /* SW1 */
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
else {
|
||||
pMessage[indexMsg++] = procByte;
|
||||
}
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim); /* SW2 */
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
|
||||
TRACE_WARNING("SW1=0x%X, SW2=0x%X\n\r", pMessage[indexMsg-2], pMessage[indexMsg-1]);
|
||||
TRACE_WARNING("SW1=0x%X, SW2=0x%X\n\r", pMessage[indexMsg-2], pMessage[indexMsg-1]);
|
||||
|
||||
*retlen = indexMsg;
|
||||
return status;
|
||||
*retlen = indexMsg;
|
||||
return status;
|
||||
|
||||
}
|
||||
|
||||
@@ -368,7 +368,7 @@ uint32_t ISO7816_XfrBlockTPDU_T0(const uint8_t *pAPDU,
|
||||
*/
|
||||
void ISO7816_Escape( void )
|
||||
{
|
||||
TRACE_DEBUG("For user, if needed\n\r");
|
||||
TRACE_DEBUG("For user, if needed\n\r");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -376,8 +376,8 @@ void ISO7816_Escape( void )
|
||||
*/
|
||||
void ISO7816_RestartClock( void )
|
||||
{
|
||||
TRACE_DEBUG("ISO7816_RestartClock\n\r");
|
||||
USART_SIM->US_BRGR = 13;
|
||||
TRACE_DEBUG("ISO7816_RestartClock\n\r");
|
||||
USART_SIM->US_BRGR = 13;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -385,8 +385,8 @@ void ISO7816_RestartClock( void )
|
||||
*/
|
||||
void ISO7816_StopClock( void )
|
||||
{
|
||||
TRACE_DEBUG("ISO7816_StopClock\n\r");
|
||||
USART_SIM->US_BRGR = 0;
|
||||
TRACE_DEBUG("ISO7816_StopClock\n\r");
|
||||
USART_SIM->US_BRGR = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -394,8 +394,8 @@ void ISO7816_StopClock( void )
|
||||
*/
|
||||
void ISO7816_toAPDU( void )
|
||||
{
|
||||
TRACE_DEBUG("ISO7816_toAPDU\n\r");
|
||||
TRACE_DEBUG("Not supported at this time\n\r");
|
||||
TRACE_DEBUG("ISO7816_toAPDU\n\r");
|
||||
TRACE_DEBUG("Not supported at this time\n\r");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -406,64 +406,64 @@ void ISO7816_toAPDU( void )
|
||||
*/
|
||||
uint32_t ISO7816_Datablock_ATR( uint8_t* pAtr, uint8_t* pLength )
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t j;
|
||||
uint32_t y;
|
||||
uint32_t status = 0;
|
||||
uint32_t i;
|
||||
uint32_t j;
|
||||
uint32_t y;
|
||||
uint32_t status = 0;
|
||||
|
||||
*pLength = 0;
|
||||
*pLength = 0;
|
||||
|
||||
/* Read ATR TS */
|
||||
// FIXME: There should always be a check for the GetChar return value..0 means timeout
|
||||
status = ISO7816_GetChar(&pAtr[0], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
/* Read ATR TS */
|
||||
// FIXME: There should always be a check for the GetChar return value..0 means timeout
|
||||
status = ISO7816_GetChar(&pAtr[0], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Read ATR T0 */
|
||||
status = ISO7816_GetChar(&pAtr[1], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
y = pAtr[1] & 0xF0;
|
||||
i = 2;
|
||||
/* Read ATR T0 */
|
||||
status = ISO7816_GetChar(&pAtr[1], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
y = pAtr[1] & 0xF0;
|
||||
i = 2;
|
||||
|
||||
/* Read ATR Ti */
|
||||
while (y && (status == 0)) {
|
||||
/* Read ATR Ti */
|
||||
while (y && (status == 0)) {
|
||||
|
||||
if (y & 0x10) { /* TA[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
if (y & 0x20) { /* TB[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
if (y & 0x40) { /* TC[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
if (y & 0x80) { /* TD[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i], &usart_sim);
|
||||
y = pAtr[i++] & 0xF0;
|
||||
}
|
||||
else {
|
||||
y = 0;
|
||||
}
|
||||
}
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
if (y & 0x10) { /* TA[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
if (y & 0x20) { /* TB[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
if (y & 0x40) { /* TC[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
if (y & 0x80) { /* TD[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i], &usart_sim);
|
||||
y = pAtr[i++] & 0xF0;
|
||||
}
|
||||
else {
|
||||
y = 0;
|
||||
}
|
||||
}
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Historical Bytes */
|
||||
y = pAtr[1] & 0x0F;
|
||||
for( j=0; (j < y) && (status == 0); j++ ) {
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
/* Historical Bytes */
|
||||
y = pAtr[1] & 0x0F;
|
||||
for( j=0; (j < y) && (status == 0); j++ ) {
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
|
||||
*pLength = i;
|
||||
return status;
|
||||
*pLength = i;
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -473,18 +473,18 @@ uint32_t ISO7816_Datablock_ATR( uint8_t* pAtr, uint8_t* pLength )
|
||||
*/
|
||||
void ISO7816_SetDataRateandClockFrequency( uint32_t dwClockFrequency, uint32_t dwDataRate )
|
||||
{
|
||||
uint8_t ClockFrequency;
|
||||
uint8_t ClockFrequency;
|
||||
|
||||
/* Define the baud rate divisor register */
|
||||
/* CD = MCK / SCK */
|
||||
/* SCK = FIDI x BAUD = 372 x 9600 */
|
||||
/* BOARD_MCK */
|
||||
/* CD = MCK/(FIDI x BAUD) = 48000000 / (372x9600) = 13 */
|
||||
USART_SIM->US_BRGR = BOARD_MCK / (dwClockFrequency*1000);
|
||||
/* Define the baud rate divisor register */
|
||||
/* CD = MCK / SCK */
|
||||
/* SCK = FIDI x BAUD = 372 x 9600 */
|
||||
/* BOARD_MCK */
|
||||
/* CD = MCK/(FIDI x BAUD) = 48000000 / (372x9600) = 13 */
|
||||
USART_SIM->US_BRGR = BOARD_MCK / (dwClockFrequency*1000);
|
||||
|
||||
ClockFrequency = BOARD_MCK / USART_SIM->US_BRGR;
|
||||
ClockFrequency = BOARD_MCK / USART_SIM->US_BRGR;
|
||||
|
||||
USART_SIM->US_FIDI = (ClockFrequency)/dwDataRate;
|
||||
USART_SIM->US_FIDI = (ClockFrequency)/dwDataRate;
|
||||
|
||||
}
|
||||
|
||||
@@ -494,10 +494,10 @@ void ISO7816_SetDataRateandClockFrequency( uint32_t dwClockFrequency, uint32_t d
|
||||
*/
|
||||
uint8_t ISO7816_StatusReset( void )
|
||||
{
|
||||
if (st_pinIso7816RstMC) {
|
||||
return PIO_Get(st_pinIso7816RstMC);
|
||||
}
|
||||
return 0;
|
||||
if (st_pinIso7816RstMC) {
|
||||
return PIO_Get(st_pinIso7816RstMC);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -505,16 +505,16 @@ uint8_t ISO7816_StatusReset( void )
|
||||
*/
|
||||
void ISO7816_cold_reset( void )
|
||||
{
|
||||
volatile uint32_t i;
|
||||
volatile uint32_t i;
|
||||
|
||||
/* tb: wait ??? cycles*/
|
||||
for( i=0; i<(400*(BOARD_MCK/1000000)); i++ ) {
|
||||
}
|
||||
/* tb: wait ??? cycles*/
|
||||
for( i=0; i<(400*(BOARD_MCK/1000000)); i++ ) {
|
||||
}
|
||||
|
||||
USART_SIM->US_RHR;
|
||||
USART_SIM->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
USART_SIM->US_RHR;
|
||||
USART_SIM->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
|
||||
ISO7816_IccPowerOn();
|
||||
ISO7816_IccPowerOn();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -522,20 +522,20 @@ void ISO7816_cold_reset( void )
|
||||
*/
|
||||
void ISO7816_warm_reset( void )
|
||||
{
|
||||
volatile uint32_t i;
|
||||
volatile uint32_t i;
|
||||
|
||||
// Clears Reset
|
||||
ISO7816_IccPowerOff();
|
||||
ISO7816_IccPowerOff();
|
||||
|
||||
/* tb: wait ??? cycles */
|
||||
for( i=0; i<(400*(BOARD_MCK/1000000)); i++ ) {
|
||||
}
|
||||
/* tb: wait ??? cycles */
|
||||
for( i=0; i<(400*(BOARD_MCK/1000000)); i++ ) {
|
||||
}
|
||||
|
||||
USART_SIM->US_RHR;
|
||||
USART_SIM->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
USART_SIM->US_RHR;
|
||||
USART_SIM->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
|
||||
// Sets Reset
|
||||
ISO7816_IccPowerOn();
|
||||
ISO7816_IccPowerOn();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -544,99 +544,99 @@ void ISO7816_warm_reset( void )
|
||||
*/
|
||||
void ISO7816_Decode_ATR( uint8_t* pAtr )
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t j;
|
||||
uint32_t y;
|
||||
uint8_t offset;
|
||||
uint32_t i;
|
||||
uint32_t j;
|
||||
uint32_t y;
|
||||
uint8_t offset;
|
||||
|
||||
printf("\n\r");
|
||||
printf("ATR: Answer To Reset:\n\r");
|
||||
printf("TS = 0x%X Initial character ",pAtr[0]);
|
||||
if( pAtr[0] == 0x3B ) {
|
||||
printf("\n\r");
|
||||
printf("ATR: Answer To Reset:\n\r");
|
||||
printf("TS = 0x%X Initial character ",pAtr[0]);
|
||||
if( pAtr[0] == 0x3B ) {
|
||||
|
||||
printf("Direct Convention\n\r");
|
||||
}
|
||||
else {
|
||||
if( pAtr[0] == 0x3F ) {
|
||||
printf("Direct Convention\n\r");
|
||||
}
|
||||
else {
|
||||
if( pAtr[0] == 0x3F ) {
|
||||
|
||||
printf("Inverse Convention\n\r");
|
||||
}
|
||||
else {
|
||||
printf("BAD Convention\n\r");
|
||||
}
|
||||
}
|
||||
printf("Inverse Convention\n\r");
|
||||
}
|
||||
else {
|
||||
printf("BAD Convention\n\r");
|
||||
}
|
||||
}
|
||||
|
||||
printf("T0 = 0x%X Format caracter\n\r",pAtr[1]);
|
||||
printf(" Number of historical bytes: K = %d\n\r", pAtr[1]&0x0F);
|
||||
printf(" Presence further interface byte:\n\r");
|
||||
if( pAtr[1]&0x80 ) {
|
||||
printf("TA ");
|
||||
}
|
||||
if( pAtr[1]&0x40 ) {
|
||||
printf("TB ");
|
||||
}
|
||||
if( pAtr[1]&0x20 ) {
|
||||
printf("TC ");
|
||||
}
|
||||
if( pAtr[1]&0x10 ) {
|
||||
printf("TD ");
|
||||
}
|
||||
if( pAtr[1] != 0 ) {
|
||||
printf(" present\n\r");
|
||||
}
|
||||
printf("T0 = 0x%X Format caracter\n\r",pAtr[1]);
|
||||
printf(" Number of historical bytes: K = %d\n\r", pAtr[1]&0x0F);
|
||||
printf(" Presence further interface byte:\n\r");
|
||||
if( pAtr[1]&0x80 ) {
|
||||
printf("TA ");
|
||||
}
|
||||
if( pAtr[1]&0x40 ) {
|
||||
printf("TB ");
|
||||
}
|
||||
if( pAtr[1]&0x20 ) {
|
||||
printf("TC ");
|
||||
}
|
||||
if( pAtr[1]&0x10 ) {
|
||||
printf("TD ");
|
||||
}
|
||||
if( pAtr[1] != 0 ) {
|
||||
printf(" present\n\r");
|
||||
}
|
||||
|
||||
i = 2;
|
||||
y = pAtr[1] & 0xF0;
|
||||
i = 2;
|
||||
y = pAtr[1] & 0xF0;
|
||||
|
||||
/* Read ATR Ti */
|
||||
offset = 1;
|
||||
while (y) {
|
||||
/* Read ATR Ti */
|
||||
offset = 1;
|
||||
while (y) {
|
||||
|
||||
if (y & 0x10) { /* TA[i] */
|
||||
printf("TA[%d] = 0x%X ", offset, pAtr[i]);
|
||||
if( offset == 1 ) {
|
||||
printf("FI = %d ", (pAtr[i]>>8));
|
||||
printf("DI = %d", (pAtr[i]&0x0F));
|
||||
}
|
||||
printf("\n\r");
|
||||
i++;
|
||||
}
|
||||
if (y & 0x20) { /* TB[i] */
|
||||
printf("TB[%d] = 0x%X\n\r", offset, pAtr[i]);
|
||||
i++;
|
||||
}
|
||||
if (y & 0x40) { /* TC[i] */
|
||||
printf("TC[%d] = 0x%X ", offset, pAtr[i]);
|
||||
if( offset == 1 ) {
|
||||
printf("Extra Guard Time: N = %d", pAtr[i]);
|
||||
}
|
||||
printf("\n\r");
|
||||
i++;
|
||||
}
|
||||
if (y & 0x80) { /* TD[i] */
|
||||
printf("TD[%d] = 0x%X\n\r", offset, pAtr[i]);
|
||||
y = pAtr[i++] & 0xF0;
|
||||
}
|
||||
else {
|
||||
y = 0;
|
||||
}
|
||||
offset++;
|
||||
}
|
||||
if (y & 0x10) { /* TA[i] */
|
||||
printf("TA[%d] = 0x%X ", offset, pAtr[i]);
|
||||
if( offset == 1 ) {
|
||||
printf("FI = %d ", (pAtr[i]>>8));
|
||||
printf("DI = %d", (pAtr[i]&0x0F));
|
||||
}
|
||||
printf("\n\r");
|
||||
i++;
|
||||
}
|
||||
if (y & 0x20) { /* TB[i] */
|
||||
printf("TB[%d] = 0x%X\n\r", offset, pAtr[i]);
|
||||
i++;
|
||||
}
|
||||
if (y & 0x40) { /* TC[i] */
|
||||
printf("TC[%d] = 0x%X ", offset, pAtr[i]);
|
||||
if( offset == 1 ) {
|
||||
printf("Extra Guard Time: N = %d", pAtr[i]);
|
||||
}
|
||||
printf("\n\r");
|
||||
i++;
|
||||
}
|
||||
if (y & 0x80) { /* TD[i] */
|
||||
printf("TD[%d] = 0x%X\n\r", offset, pAtr[i]);
|
||||
y = pAtr[i++] & 0xF0;
|
||||
}
|
||||
else {
|
||||
y = 0;
|
||||
}
|
||||
offset++;
|
||||
}
|
||||
|
||||
/* Historical Bytes */
|
||||
printf("Historical bytes:\n\r");
|
||||
y = pAtr[1] & 0x0F;
|
||||
for( j=0; j < y; j++ ) {
|
||||
printf(" 0x%X", pAtr[i]);
|
||||
i++;
|
||||
}
|
||||
printf("\n\r\n\r");
|
||||
/* Historical Bytes */
|
||||
printf("Historical bytes:\n\r");
|
||||
y = pAtr[1] & 0x0F;
|
||||
for( j=0; j < y; j++ ) {
|
||||
printf(" 0x%X", pAtr[i]);
|
||||
i++;
|
||||
}
|
||||
printf("\n\r\n\r");
|
||||
|
||||
}
|
||||
|
||||
void ISO7816_Set_Reset_Pin(const Pin *pPinIso7816RstMC) {
|
||||
/* Pin ISO7816 initialize */
|
||||
st_pinIso7816RstMC = (Pin *)pPinIso7816RstMC;
|
||||
/* Pin ISO7816 initialize */
|
||||
st_pinIso7816RstMC = (Pin *)pPinIso7816RstMC;
|
||||
}
|
||||
|
||||
/** Initializes a ISO driver
|
||||
@@ -644,46 +644,46 @@ void ISO7816_Set_Reset_Pin(const Pin *pPinIso7816RstMC) {
|
||||
*/
|
||||
void ISO7816_Init( Usart_info *usart, bool master_clock )
|
||||
{
|
||||
uint32_t clk;
|
||||
TRACE_DEBUG("ISO_Init\n\r");
|
||||
uint32_t clk;
|
||||
TRACE_DEBUG("ISO_Init\n\r");
|
||||
|
||||
Usart *us_base = usart->base;
|
||||
uint32_t us_id = usart->id;
|
||||
Usart *us_base = usart->base;
|
||||
uint32_t us_id = usart->id;
|
||||
|
||||
if (master_clock == true) {
|
||||
clk = US_MR_USCLKS_MCK;
|
||||
} else {
|
||||
clk = US_MR_USCLKS_SCK;
|
||||
}
|
||||
if (master_clock == true) {
|
||||
clk = US_MR_USCLKS_MCK;
|
||||
} else {
|
||||
clk = US_MR_USCLKS_SCK;
|
||||
}
|
||||
|
||||
USART_Configure( us_base,
|
||||
US_MR_USART_MODE_IS07816_T_0
|
||||
| clk
|
||||
| US_MR_NBSTOP_1_BIT
|
||||
| US_MR_PAR_EVEN
|
||||
| US_MR_CHRL_8_BIT
|
||||
| US_MR_CLKO
|
||||
| US_MR_INACK /* Inhibit errors */
|
||||
| (3<<24), /* MAX_ITERATION */
|
||||
1,
|
||||
0);
|
||||
USART_Configure( us_base,
|
||||
US_MR_USART_MODE_IS07816_T_0
|
||||
| clk
|
||||
| US_MR_NBSTOP_1_BIT
|
||||
| US_MR_PAR_EVEN
|
||||
| US_MR_CHRL_8_BIT
|
||||
| US_MR_CLKO
|
||||
| US_MR_INACK /* Inhibit errors */
|
||||
| (3<<24), /* MAX_ITERATION */
|
||||
1,
|
||||
0);
|
||||
|
||||
/* Disable interrupts */
|
||||
us_base->US_IDR = (uint32_t) -1;
|
||||
/* Disable interrupts */
|
||||
us_base->US_IDR = (uint32_t) -1;
|
||||
|
||||
/* Configure USART */
|
||||
PMC_EnablePeripheral(us_id);
|
||||
/* Configure USART */
|
||||
PMC_EnablePeripheral(us_id);
|
||||
|
||||
us_base->US_FIDI = 372; /* by default */
|
||||
/* Define the baud rate divisor register */
|
||||
/* CD = MCK / SCK */
|
||||
/* SCK = FIDI x BAUD = 372 x 9600 */
|
||||
/* BOARD_MCK */
|
||||
/* CD = MCK/(FIDI x BAUD) = 48000000 / (372x9600) = 13 */
|
||||
if (master_clock == true) {
|
||||
us_base->US_BRGR = BOARD_MCK / (372*9600);
|
||||
} else {
|
||||
us_base->US_BRGR = US_BRGR_CD(1);
|
||||
}
|
||||
us_base->US_FIDI = 372; /* by default */
|
||||
/* Define the baud rate divisor register */
|
||||
/* CD = MCK / SCK */
|
||||
/* SCK = FIDI x BAUD = 372 x 9600 */
|
||||
/* BOARD_MCK */
|
||||
/* CD = MCK/(FIDI x BAUD) = 48000000 / (372x9600) = 13 */
|
||||
if (master_clock == true) {
|
||||
us_base->US_BRGR = BOARD_MCK / (372*9600);
|
||||
} else {
|
||||
us_base->US_BRGR = US_BRGR_CD(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -202,7 +202,7 @@ static void usart_irq_rx(uint8_t inst_num)
|
||||
csr = usart->US_CSR & usart->US_IMR;
|
||||
|
||||
if (csr & US_CSR_RXRDY) {
|
||||
byte = (usart->US_RHR) & 0xFF;
|
||||
byte = (usart->US_RHR) & 0xFF;
|
||||
if (rbuf_write(&ci->rb, byte) < 0)
|
||||
TRACE_ERROR("rbuf overrun\r\n");
|
||||
}
|
||||
|
||||
@@ -84,11 +84,11 @@ static const Pin pinSmartCard = SMARTCARD_CONNECT_PIN;
|
||||
static void ISR_PioSmartCard(const Pin * pPin)
|
||||
{
|
||||
/* FIXME: why is pinSmartCard.pio->PIO_ISR the wrong number?
|
||||
printf("+++++ Trying to check for pending interrupts (PIO ISR: 0x%X)\n\r", pinSmartCard.pio->PIO_ISR);
|
||||
printf("+++++ Mask: 0x%X\n\r", pinSmartCard.mask);
|
||||
printf("+++++ Trying to check for pending interrupts (PIO ISR: 0x%X)\n\r", pinSmartCard.pio->PIO_ISR);
|
||||
printf("+++++ Mask: 0x%X\n\r", pinSmartCard.mask);
|
||||
Output:
|
||||
+++++ Trying to check for pending interrupts (PIO ISR: 0x400)) = 1<<10
|
||||
+++++ Mask: 0x100 = 1<<8
|
||||
+++++ Trying to check for pending interrupts (PIO ISR: 0x400)) = 1<<10
|
||||
+++++ Mask: 0x100 = 1<<8
|
||||
*/
|
||||
// PA10 is DTXD, which is the debug uart transmit pin
|
||||
|
||||
|
||||
@@ -76,8 +76,8 @@ FILE* const stderr = NULL;
|
||||
//------------------------------------------------------------------------------
|
||||
signed int PutChar(char *pStr, char c)
|
||||
{
|
||||
*pStr = c;
|
||||
return 1;
|
||||
*pStr = c;
|
||||
return 1;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -89,15 +89,15 @@ signed int PutChar(char *pStr, char c)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int PutString(char *pStr, const char *pSource)
|
||||
{
|
||||
signed int num = 0;
|
||||
signed int num = 0;
|
||||
|
||||
while (*pSource != 0) {
|
||||
while (*pSource != 0) {
|
||||
|
||||
*pStr++ = *pSource++;
|
||||
num++;
|
||||
}
|
||||
*pStr++ = *pSource++;
|
||||
num++;
|
||||
}
|
||||
|
||||
return num;
|
||||
return num;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -110,38 +110,38 @@ signed int PutString(char *pStr, const char *pSource)
|
||||
// \param value Integer value.
|
||||
//------------------------------------------------------------------------------
|
||||
signed int PutUnsignedInt(
|
||||
char *pStr,
|
||||
char fill,
|
||||
signed int width,
|
||||
unsigned int value)
|
||||
char *pStr,
|
||||
char fill,
|
||||
signed int width,
|
||||
unsigned int value)
|
||||
{
|
||||
signed int num = 0;
|
||||
signed int num = 0;
|
||||
|
||||
// Take current digit into account when calculating width
|
||||
width--;
|
||||
// Take current digit into account when calculating width
|
||||
width--;
|
||||
|
||||
// Recursively write upper digits
|
||||
if ((value / 10) > 0) {
|
||||
// Recursively write upper digits
|
||||
if ((value / 10) > 0) {
|
||||
|
||||
num = PutUnsignedInt(pStr, fill, width, value / 10);
|
||||
pStr += num;
|
||||
}
|
||||
// Write filler characters
|
||||
else {
|
||||
num = PutUnsignedInt(pStr, fill, width, value / 10);
|
||||
pStr += num;
|
||||
}
|
||||
// Write filler characters
|
||||
else {
|
||||
|
||||
while (width > 0) {
|
||||
while (width > 0) {
|
||||
|
||||
PutChar(pStr, fill);
|
||||
pStr++;
|
||||
num++;
|
||||
width--;
|
||||
}
|
||||
}
|
||||
PutChar(pStr, fill);
|
||||
pStr++;
|
||||
num++;
|
||||
width--;
|
||||
}
|
||||
}
|
||||
|
||||
// Write lower digit
|
||||
num += PutChar(pStr, (value % 10) + '0');
|
||||
// Write lower digit
|
||||
num += PutChar(pStr, (value % 10) + '0');
|
||||
|
||||
return num;
|
||||
return num;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -154,69 +154,69 @@ signed int PutUnsignedInt(
|
||||
// \param value Signed integer value.
|
||||
//------------------------------------------------------------------------------
|
||||
signed int PutSignedInt(
|
||||
char *pStr,
|
||||
char fill,
|
||||
signed int width,
|
||||
signed int value)
|
||||
char *pStr,
|
||||
char fill,
|
||||
signed int width,
|
||||
signed int value)
|
||||
{
|
||||
signed int num = 0;
|
||||
unsigned int absolute;
|
||||
signed int num = 0;
|
||||
unsigned int absolute;
|
||||
|
||||
// Compute absolute value
|
||||
if (value < 0) {
|
||||
// Compute absolute value
|
||||
if (value < 0) {
|
||||
|
||||
absolute = -value;
|
||||
}
|
||||
else {
|
||||
absolute = -value;
|
||||
}
|
||||
else {
|
||||
|
||||
absolute = value;
|
||||
}
|
||||
absolute = value;
|
||||
}
|
||||
|
||||
// Take current digit into account when calculating width
|
||||
width--;
|
||||
// Take current digit into account when calculating width
|
||||
width--;
|
||||
|
||||
// Recursively write upper digits
|
||||
if ((absolute / 10) > 0) {
|
||||
// Recursively write upper digits
|
||||
if ((absolute / 10) > 0) {
|
||||
|
||||
if (value < 0) {
|
||||
|
||||
num = PutSignedInt(pStr, fill, width, -(absolute / 10));
|
||||
}
|
||||
else {
|
||||
if (value < 0) {
|
||||
|
||||
num = PutSignedInt(pStr, fill, width, -(absolute / 10));
|
||||
}
|
||||
else {
|
||||
|
||||
num = PutSignedInt(pStr, fill, width, absolute / 10);
|
||||
}
|
||||
pStr += num;
|
||||
}
|
||||
else {
|
||||
num = PutSignedInt(pStr, fill, width, absolute / 10);
|
||||
}
|
||||
pStr += num;
|
||||
}
|
||||
else {
|
||||
|
||||
// Reserve space for sign
|
||||
if (value < 0) {
|
||||
// Reserve space for sign
|
||||
if (value < 0) {
|
||||
|
||||
width--;
|
||||
}
|
||||
width--;
|
||||
}
|
||||
|
||||
// Write filler characters
|
||||
while (width > 0) {
|
||||
// Write filler characters
|
||||
while (width > 0) {
|
||||
|
||||
PutChar(pStr, fill);
|
||||
pStr++;
|
||||
num++;
|
||||
width--;
|
||||
}
|
||||
PutChar(pStr, fill);
|
||||
pStr++;
|
||||
num++;
|
||||
width--;
|
||||
}
|
||||
|
||||
// Write sign
|
||||
if (value < 0) {
|
||||
// Write sign
|
||||
if (value < 0) {
|
||||
|
||||
num += PutChar(pStr, '-');
|
||||
pStr++;
|
||||
}
|
||||
}
|
||||
num += PutChar(pStr, '-');
|
||||
pStr++;
|
||||
}
|
||||
}
|
||||
|
||||
// Write lower digit
|
||||
num += PutChar(pStr, (absolute % 10) + '0');
|
||||
// Write lower digit
|
||||
num += PutChar(pStr, (absolute % 10) + '0');
|
||||
|
||||
return num;
|
||||
return num;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -230,51 +230,51 @@ signed int PutSignedInt(
|
||||
// \param value Hexadecimal value.
|
||||
//------------------------------------------------------------------------------
|
||||
signed int PutHexa(
|
||||
char *pStr,
|
||||
char fill,
|
||||
signed int width,
|
||||
unsigned char maj,
|
||||
unsigned int value)
|
||||
char *pStr,
|
||||
char fill,
|
||||
signed int width,
|
||||
unsigned char maj,
|
||||
unsigned int value)
|
||||
{
|
||||
signed int num = 0;
|
||||
signed int num = 0;
|
||||
|
||||
// Decrement width
|
||||
width--;
|
||||
// Decrement width
|
||||
width--;
|
||||
|
||||
// Recursively output upper digits
|
||||
if ((value >> 4) > 0) {
|
||||
// Recursively output upper digits
|
||||
if ((value >> 4) > 0) {
|
||||
|
||||
num += PutHexa(pStr, fill, width, maj, value >> 4);
|
||||
pStr += num;
|
||||
}
|
||||
// Write filler chars
|
||||
else {
|
||||
num += PutHexa(pStr, fill, width, maj, value >> 4);
|
||||
pStr += num;
|
||||
}
|
||||
// Write filler chars
|
||||
else {
|
||||
|
||||
while (width > 0) {
|
||||
while (width > 0) {
|
||||
|
||||
PutChar(pStr, fill);
|
||||
pStr++;
|
||||
num++;
|
||||
width--;
|
||||
}
|
||||
}
|
||||
PutChar(pStr, fill);
|
||||
pStr++;
|
||||
num++;
|
||||
width--;
|
||||
}
|
||||
}
|
||||
|
||||
// Write current digit
|
||||
if ((value & 0xF) < 10) {
|
||||
// Write current digit
|
||||
if ((value & 0xF) < 10) {
|
||||
|
||||
PutChar(pStr, (value & 0xF) + '0');
|
||||
}
|
||||
else if (maj) {
|
||||
PutChar(pStr, (value & 0xF) + '0');
|
||||
}
|
||||
else if (maj) {
|
||||
|
||||
PutChar(pStr, (value & 0xF) - 10 + 'A');
|
||||
}
|
||||
else {
|
||||
PutChar(pStr, (value & 0xF) - 10 + 'A');
|
||||
}
|
||||
else {
|
||||
|
||||
PutChar(pStr, (value & 0xF) - 10 + 'a');
|
||||
}
|
||||
num++;
|
||||
PutChar(pStr, (value & 0xF) - 10 + 'a');
|
||||
}
|
||||
num++;
|
||||
|
||||
return num;
|
||||
return num;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -292,91 +292,91 @@ signed int PutHexa(
|
||||
//------------------------------------------------------------------------------
|
||||
signed int vsnprintf(char *pStr, size_t length, const char *pFormat, va_list ap)
|
||||
{
|
||||
char fill;
|
||||
unsigned char width;
|
||||
signed int num = 0;
|
||||
size_t size = 0;
|
||||
char fill;
|
||||
unsigned char width;
|
||||
signed int num = 0;
|
||||
size_t size = 0;
|
||||
|
||||
// Clear the string
|
||||
if (pStr) {
|
||||
// Clear the string
|
||||
if (pStr) {
|
||||
|
||||
*pStr = 0;
|
||||
}
|
||||
*pStr = 0;
|
||||
}
|
||||
|
||||
// Phase string
|
||||
while (*pFormat != 0 && size < length) {
|
||||
// Phase string
|
||||
while (*pFormat != 0 && size < length) {
|
||||
|
||||
// Normal character
|
||||
if (*pFormat != '%') {
|
||||
// Normal character
|
||||
if (*pFormat != '%') {
|
||||
|
||||
*pStr++ = *pFormat++;
|
||||
size++;
|
||||
}
|
||||
// Escaped '%'
|
||||
else if (*(pFormat+1) == '%') {
|
||||
*pStr++ = *pFormat++;
|
||||
size++;
|
||||
}
|
||||
// Escaped '%'
|
||||
else if (*(pFormat+1) == '%') {
|
||||
|
||||
*pStr++ = '%';
|
||||
pFormat += 2;
|
||||
size++;
|
||||
}
|
||||
// Token delimiter
|
||||
else {
|
||||
*pStr++ = '%';
|
||||
pFormat += 2;
|
||||
size++;
|
||||
}
|
||||
// Token delimiter
|
||||
else {
|
||||
|
||||
fill = ' ';
|
||||
width = 0;
|
||||
pFormat++;
|
||||
fill = ' ';
|
||||
width = 0;
|
||||
pFormat++;
|
||||
|
||||
// Parse filler
|
||||
if (*pFormat == '0') {
|
||||
// Parse filler
|
||||
if (*pFormat == '0') {
|
||||
|
||||
fill = '0';
|
||||
pFormat++;
|
||||
}
|
||||
fill = '0';
|
||||
pFormat++;
|
||||
}
|
||||
|
||||
// Parse width
|
||||
while ((*pFormat >= '0') && (*pFormat <= '9')) {
|
||||
|
||||
width = (width*10) + *pFormat-'0';
|
||||
pFormat++;
|
||||
}
|
||||
// Parse width
|
||||
while ((*pFormat >= '0') && (*pFormat <= '9')) {
|
||||
|
||||
width = (width*10) + *pFormat-'0';
|
||||
pFormat++;
|
||||
}
|
||||
|
||||
// Check if there is enough space
|
||||
if (size + width > length) {
|
||||
// Check if there is enough space
|
||||
if (size + width > length) {
|
||||
|
||||
width = length - size;
|
||||
}
|
||||
|
||||
// Parse type
|
||||
switch (*pFormat) {
|
||||
case 'd':
|
||||
case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break;
|
||||
case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break;
|
||||
case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break;
|
||||
case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break;
|
||||
case 's': num = PutString(pStr, va_arg(ap, char *)); break;
|
||||
case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break;
|
||||
default:
|
||||
return EOF;
|
||||
}
|
||||
width = length - size;
|
||||
}
|
||||
|
||||
// Parse type
|
||||
switch (*pFormat) {
|
||||
case 'd':
|
||||
case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break;
|
||||
case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break;
|
||||
case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break;
|
||||
case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break;
|
||||
case 's': num = PutString(pStr, va_arg(ap, char *)); break;
|
||||
case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break;
|
||||
default:
|
||||
return EOF;
|
||||
}
|
||||
|
||||
pFormat++;
|
||||
pStr += num;
|
||||
size += num;
|
||||
}
|
||||
}
|
||||
pFormat++;
|
||||
pStr += num;
|
||||
size += num;
|
||||
}
|
||||
}
|
||||
|
||||
// NULL-terminated (final \0 is not counted)
|
||||
if (size < length) {
|
||||
// NULL-terminated (final \0 is not counted)
|
||||
if (size < length) {
|
||||
|
||||
*pStr = 0;
|
||||
}
|
||||
else {
|
||||
*pStr = 0;
|
||||
}
|
||||
else {
|
||||
|
||||
*(--pStr) = 0;
|
||||
size--;
|
||||
}
|
||||
*(--pStr) = 0;
|
||||
size--;
|
||||
}
|
||||
|
||||
return size;
|
||||
return size;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -390,14 +390,14 @@ signed int vsnprintf(char *pStr, size_t length, const char *pFormat, va_list ap)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int snprintf(char *pString, size_t length, const char *pFormat, ...)
|
||||
{
|
||||
va_list ap;
|
||||
signed int rc;
|
||||
va_list ap;
|
||||
signed int rc;
|
||||
|
||||
va_start(ap, pFormat);
|
||||
rc = vsnprintf(pString, length, pFormat, ap);
|
||||
va_end(ap);
|
||||
va_start(ap, pFormat);
|
||||
rc = vsnprintf(pString, length, pFormat, ap);
|
||||
va_end(ap);
|
||||
|
||||
return rc;
|
||||
return rc;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -410,7 +410,7 @@ signed int snprintf(char *pString, size_t length, const char *pFormat, ...)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int vsprintf(char *pString, const char *pFormat, va_list ap)
|
||||
{
|
||||
return vsnprintf(pString, MAX_STRING_SIZE, pFormat, ap);
|
||||
return vsnprintf(pString, MAX_STRING_SIZE, pFormat, ap);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -422,17 +422,17 @@ signed int vsprintf(char *pString, const char *pFormat, va_list ap)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int vfprintf(FILE *pStream, const char *pFormat, va_list ap)
|
||||
{
|
||||
char pStr[MAX_STRING_SIZE];
|
||||
char pError[] = "stdio.c: increase MAX_STRING_SIZE\n\r";
|
||||
char pStr[MAX_STRING_SIZE];
|
||||
char pError[] = "stdio.c: increase MAX_STRING_SIZE\n\r";
|
||||
|
||||
// Write formatted string in buffer
|
||||
if (vsprintf(pStr, pFormat, ap) >= MAX_STRING_SIZE) {
|
||||
// Write formatted string in buffer
|
||||
if (vsprintf(pStr, pFormat, ap) >= MAX_STRING_SIZE) {
|
||||
|
||||
fputs(pError, stderr);
|
||||
}
|
||||
fputs(pError, stderr);
|
||||
}
|
||||
|
||||
// Display string
|
||||
return fputs(pStr, pStream);
|
||||
// Display string
|
||||
return fputs(pStr, pStream);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -443,7 +443,7 @@ signed int vfprintf(FILE *pStream, const char *pFormat, va_list ap)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int vprintf(const char *pFormat, va_list ap)
|
||||
{
|
||||
return vfprintf(stdout, pFormat, ap);
|
||||
return vfprintf(stdout, pFormat, ap);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -454,15 +454,15 @@ signed int vprintf(const char *pFormat, va_list ap)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int fprintf(FILE *pStream, const char *pFormat, ...)
|
||||
{
|
||||
va_list ap;
|
||||
signed int result;
|
||||
va_list ap;
|
||||
signed int result;
|
||||
|
||||
// Forward call to vfprintf
|
||||
va_start(ap, pFormat);
|
||||
result = vfprintf(pStream, pFormat, ap);
|
||||
va_end(ap);
|
||||
// Forward call to vfprintf
|
||||
va_start(ap, pFormat);
|
||||
result = vfprintf(pStream, pFormat, ap);
|
||||
va_end(ap);
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -472,15 +472,15 @@ signed int fprintf(FILE *pStream, const char *pFormat, ...)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int printf(const char *pFormat, ...)
|
||||
{
|
||||
va_list ap;
|
||||
signed int result;
|
||||
va_list ap;
|
||||
signed int result;
|
||||
|
||||
// Forward call to vprintf
|
||||
va_start(ap, pFormat);
|
||||
result = vprintf(pFormat, ap);
|
||||
va_end(ap);
|
||||
// Forward call to vprintf
|
||||
va_start(ap, pFormat);
|
||||
result = vprintf(pFormat, ap);
|
||||
va_end(ap);
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -490,15 +490,15 @@ signed int printf(const char *pFormat, ...)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int sprintf(char *pStr, const char *pFormat, ...)
|
||||
{
|
||||
va_list ap;
|
||||
signed int result;
|
||||
va_list ap;
|
||||
signed int result;
|
||||
|
||||
// Forward call to vsprintf
|
||||
va_start(ap, pFormat);
|
||||
result = vsprintf(pStr, pFormat, ap);
|
||||
va_end(ap);
|
||||
// Forward call to vsprintf
|
||||
va_start(ap, pFormat);
|
||||
result = vsprintf(pStr, pFormat, ap);
|
||||
va_end(ap);
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -507,6 +507,6 @@ signed int sprintf(char *pStr, const char *pFormat, ...)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int puts(const char *pStr)
|
||||
{
|
||||
return fputs(pStr, stdout);
|
||||
return fputs(pStr, stdout);
|
||||
}
|
||||
|
||||
|
||||
@@ -61,33 +61,33 @@
|
||||
//------------------------------------------------------------------------------
|
||||
void * memcpy(void *pDestination, const void *pSource, size_t num)
|
||||
{
|
||||
unsigned char *pByteDestination;
|
||||
unsigned char *pByteSource;
|
||||
unsigned int *pAlignedSource = (unsigned int *) pSource;
|
||||
unsigned int *pAlignedDestination = (unsigned int *) pDestination;
|
||||
unsigned char *pByteDestination;
|
||||
unsigned char *pByteSource;
|
||||
unsigned int *pAlignedSource = (unsigned int *) pSource;
|
||||
unsigned int *pAlignedDestination = (unsigned int *) pDestination;
|
||||
|
||||
// If num is more than 4 bytes, and both dest. and source are aligned,
|
||||
// then copy dwords
|
||||
if ((((unsigned int) pAlignedDestination & 0x3) == 0)
|
||||
&& (((unsigned int) pAlignedSource & 0x3) == 0)
|
||||
&& (num >= 4)) {
|
||||
// If num is more than 4 bytes, and both dest. and source are aligned,
|
||||
// then copy dwords
|
||||
if ((((unsigned int) pAlignedDestination & 0x3) == 0)
|
||||
&& (((unsigned int) pAlignedSource & 0x3) == 0)
|
||||
&& (num >= 4)) {
|
||||
|
||||
while (num >= 4) {
|
||||
while (num >= 4) {
|
||||
|
||||
*pAlignedDestination++ = *pAlignedSource++;
|
||||
num -= 4;
|
||||
}
|
||||
}
|
||||
*pAlignedDestination++ = *pAlignedSource++;
|
||||
num -= 4;
|
||||
}
|
||||
}
|
||||
|
||||
// Copy remaining bytes
|
||||
pByteDestination = (unsigned char *) pAlignedDestination;
|
||||
pByteSource = (unsigned char *) pAlignedSource;
|
||||
while (num--) {
|
||||
// Copy remaining bytes
|
||||
pByteDestination = (unsigned char *) pAlignedDestination;
|
||||
pByteSource = (unsigned char *) pAlignedSource;
|
||||
while (num--) {
|
||||
|
||||
*pByteDestination++ = *pByteSource++;
|
||||
}
|
||||
*pByteDestination++ = *pByteSource++;
|
||||
}
|
||||
|
||||
return pDestination;
|
||||
return pDestination;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -99,23 +99,23 @@ void * memcpy(void *pDestination, const void *pSource, size_t num)
|
||||
//------------------------------------------------------------------------------
|
||||
void * memset(void *pBuffer, int value, size_t num)
|
||||
{
|
||||
unsigned char *pByteDestination;
|
||||
unsigned int *pAlignedDestination = (unsigned int *) pBuffer;
|
||||
unsigned int alignedValue = (value << 24) | (value << 16) | (value << 8) | value;
|
||||
unsigned char *pByteDestination;
|
||||
unsigned int *pAlignedDestination = (unsigned int *) pBuffer;
|
||||
unsigned int alignedValue = (value << 24) | (value << 16) | (value << 8) | value;
|
||||
|
||||
// Set words if possible
|
||||
if ((((unsigned int) pAlignedDestination & 0x3) == 0) && (num >= 4)) {
|
||||
while (num >= 4) {
|
||||
*pAlignedDestination++ = alignedValue;
|
||||
num -= 4;
|
||||
}
|
||||
}
|
||||
// Set remaining bytes
|
||||
pByteDestination = (unsigned char *) pAlignedDestination;
|
||||
while (num--) {
|
||||
*pByteDestination++ = value;
|
||||
}
|
||||
return pBuffer;
|
||||
// Set words if possible
|
||||
if ((((unsigned int) pAlignedDestination & 0x3) == 0) && (num >= 4)) {
|
||||
while (num >= 4) {
|
||||
*pAlignedDestination++ = alignedValue;
|
||||
num -= 4;
|
||||
}
|
||||
}
|
||||
// Set remaining bytes
|
||||
pByteDestination = (unsigned char *) pAlignedDestination;
|
||||
while (num--) {
|
||||
*pByteDestination++ = value;
|
||||
}
|
||||
return pBuffer;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -126,16 +126,16 @@ void * memset(void *pBuffer, int value, size_t num)
|
||||
//-----------------------------------------------------------------------------
|
||||
char * strchr(const char *pString, int character)
|
||||
{
|
||||
char * p = (char *)pString;
|
||||
char c = character & 0xFF;
|
||||
char * p = (char *)pString;
|
||||
char c = character & 0xFF;
|
||||
|
||||
while(*p != c) {
|
||||
if (*p == 0) {
|
||||
return 0;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
return p;
|
||||
while(*p != c) {
|
||||
if (*p == 0) {
|
||||
return 0;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -144,12 +144,12 @@ char * strchr(const char *pString, int character)
|
||||
//-----------------------------------------------------------------------------
|
||||
size_t strlen(const char *pString)
|
||||
{
|
||||
unsigned int length = 0;
|
||||
unsigned int length = 0;
|
||||
|
||||
while(*pString++ != 0) {
|
||||
length++;
|
||||
}
|
||||
return length;
|
||||
while(*pString++ != 0) {
|
||||
length++;
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
@@ -161,14 +161,14 @@ size_t strlen(const char *pString)
|
||||
//-----------------------------------------------------------------------------
|
||||
char * strrchr(const char *pString, int character)
|
||||
{
|
||||
char *p = 0;
|
||||
char *p = 0;
|
||||
|
||||
while(*pString != 0) {
|
||||
if (*pString++ == character) {
|
||||
p = (char*)pString;
|
||||
}
|
||||
}
|
||||
return p;
|
||||
while(*pString != 0) {
|
||||
if (*pString++ == character) {
|
||||
p = (char*)pString;
|
||||
}
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -179,10 +179,10 @@ char * strrchr(const char *pString, int character)
|
||||
//-----------------------------------------------------------------------------
|
||||
char * strcpy(char *pDestination, const char *pSource)
|
||||
{
|
||||
char *pSaveDest = pDestination;
|
||||
char *pSaveDest = pDestination;
|
||||
|
||||
for(; (*pDestination = *pSource) != 0; ++pSource, ++pDestination);
|
||||
return pSaveDest;
|
||||
for(; (*pDestination = *pSource) != 0; ++pSource, ++pDestination);
|
||||
return pSaveDest;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -196,22 +196,22 @@ char * strcpy(char *pDestination, const char *pSource)
|
||||
//-----------------------------------------------------------------------------
|
||||
int strncmp(const char *pString1, const char *pString2, size_t count)
|
||||
{
|
||||
int r;
|
||||
int r;
|
||||
|
||||
while(count) {
|
||||
r = *pString1 - *pString2;
|
||||
if (r == 0) {
|
||||
if (*pString1 == 0) {
|
||||
break;
|
||||
}
|
||||
pString1++;
|
||||
pString2++;
|
||||
count--;
|
||||
continue;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
return 0;
|
||||
while(count) {
|
||||
r = *pString1 - *pString2;
|
||||
if (r == 0) {
|
||||
if (*pString1 == 0) {
|
||||
break;
|
||||
}
|
||||
pString1++;
|
||||
pString2++;
|
||||
count--;
|
||||
continue;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -223,17 +223,17 @@ int strncmp(const char *pString1, const char *pString2, size_t count)
|
||||
//-----------------------------------------------------------------------------
|
||||
char * strncpy(char *pDestination, const char *pSource, size_t count)
|
||||
{
|
||||
char *pSaveDest = pDestination;
|
||||
char *pSaveDest = pDestination;
|
||||
|
||||
while (count) {
|
||||
*pDestination = *pSource;
|
||||
if (*pSource == 0) {
|
||||
break;
|
||||
}
|
||||
pDestination++;
|
||||
pSource++;
|
||||
count--;
|
||||
}
|
||||
return pSaveDest;
|
||||
while (count) {
|
||||
*pDestination = *pSource;
|
||||
if (*pSource == 0) {
|
||||
break;
|
||||
}
|
||||
pDestination++;
|
||||
pSource++;
|
||||
count--;
|
||||
}
|
||||
return pSaveDest;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user