memcmp(), memcmp_isr()

Updated: May 06, 2022

Compare the bytes in two buffers

Synopsis:

#include <string.h>

int memcmp( const void* s1,
            const void* s2,
            size_t length );

int memcmp_isr( const void* s1,
                const void* s2,
                size_t length );

Arguments:

s1, s2
Pointers to the buffers that you want to compare.
length
The number of bytes that you want to compare.

Library:

libc

Use the -l c option to qcc to link against this library. This library is usually included automatically.

Description:

The memcmp() function compares length bytes of the buffer pointed to by s1 to the buffer pointed to by s2. The memcmp_isr() function is similar, but it's safe for you to use it in an interrupt service routine.

Returns:

< 0
The object pointed to by s1 is less than the object pointed to by s2.
0
The object pointed to by s1 is equal to the object pointed to by s2.
> 0
The object pointed to by s1 is greater than the object pointed to by s2.

Examples:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main( void )
{
    char buffer[80];
    int retval;

    strcpy( buffer, "World" );
    
    retval = memcmp( buffer, "hello", 5 );
    if( retval < 0 ) {
        printf( "Less than\n" );
    } else if( retval == 0 ) {
        printf( "Equal to\n");
    } else {
        printf( "Greater than\n");
    }
    
    return EXIT_SUCCESS;
}

produces the output:

Less than

Environment variables:

LIBC_STRINGS
On certain targets, you can use this environment variable to select the implementation of memcmp(). It doesn't affect the implementation of memcmp_isr(). The value is one of the strings given below.
  • for AArch64 targets:
    • aarch64_neon — optimized for AARCH64 targets using NEON
    • generic — the default
  • for ARMv7 targets:
    • cortex_a9 — optimized for the ARM Cortex-A9 processor; assumes that no unaligned access is supported
    • cortex_a9_aligned — optimized for ARM Cortex-A9; requires that unaligned memory access be enabled on the platform. If memory access is misaligned, this implementation falls back to the NEON version.
    • cortex_a9_neon — optimized for ARM Cortex-A9 using NEON
    • generic — the default
    • krait — optimized for the Qualcomm Krait CPU
    • krait_neon — optimized for Qualcomm Krait using NEON

Processes that register ISRs shouldn't use the NEON versions.

Classification:

memcmp() is ANSI, POSIX 1003.1; memcmp_isr() is QNX Neutrino.

Table 1. memcmp()
Safety:  
Cancellation point No
Interrupt handler Read the Caveats
Signal handler Yes
Thread Yes
Table 2. memcmp_isr()
Safety:  
Cancellation point No
Interrupt handler Yes
Signal handler Yes
Thread Yes

Caveats:

Implementations of memcmp() that are optimized using SIMD instructions aren't safe to use in an interrupt handler. These include the NEON implementations on ARMv7 and AArch64.