Subversion Repositories HelenOS

Rev

Rev 4263 | Rev 4581 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4263 Rev 4327
Line 106... Line 106...
106
#include <cpu.h>
106
#include <cpu.h>
107
#include <arch/asm.h>
107
#include <arch/asm.h>
108
#include <arch.h>
108
#include <arch.h>
109
#include <errno.h>
109
#include <errno.h>
110
#include <align.h>
110
#include <align.h>
-
 
111
#include <debug.h>
111
 
112
 
112
/** Byte mask consisting of lowest @n bits (out of 8) */
113
/** Byte mask consisting of lowest @n bits (out of 8) */
113
#define LO_MASK_8(n)  ((uint8_t) ((1 << (n)) - 1))
114
#define LO_MASK_8(n)  ((uint8_t) ((1 << (n)) - 1))
114
 
115
 
115
/** Byte mask consisting of lowest @n bits (out of 32) */
116
/** Byte mask consisting of lowest @n bits (out of 32) */
Line 526... Line 527...
526
 
527
 
527
    return 0;
528
    return 0;
528
 
529
 
529
}
530
}
530
 
531
 
531
/** Copy NULL-terminated string.
532
/** Copy string.
532
 *
533
 *
533
 * Copy source string @a src to destination buffer @a dst.
534
 * Copy source string @a src to destination buffer @a dest.
534
 * No more than @a size bytes are written. NULL-terminator is always
535
 * No more than @a size bytes are written. If the size of the output buffer
535
 * written after the last succesfully copied character (i.e. if the
536
 * is at least one byte, the output string will always be well-formed, i.e.
536
 * destination buffer is has at least 1 byte, it will be always
537
 * null-terminated and containing only complete characters.
537
 * NULL-terminated).
-
 
538
 *
538
 *
539
 * @param src   Source string.
-
 
540
 * @param dst   Destination buffer.
539
 * @param dst   Destination buffer.
541
 * @param count Size of the destination buffer.
540
 * @param count Size of the destination buffer (must be > 0).
542
 *
541
 * @param src   Source string.
543
 */
542
 */
544
void str_ncpy(char *dst, const char *src, size_t size)
543
void str_cpy(char *dest, size_t size, const char *src)
545
{
544
{
546
    /* No space for the NULL-terminator in the buffer */
-
 
547
    if (size == 0)
-
 
548
        return;
-
 
549
   
-
 
550
    wchar_t ch;
545
    wchar_t ch;
551
    size_t str_off = 0;
546
    size_t src_off;
552
    size_t dst_off = 0;
547
    size_t dest_off;
-
 
548
 
-
 
549
    /* There must be space for a null terminator in the buffer. */
-
 
550
    ASSERT(size > 0);
553
   
551
   
-
 
552
    src_off = 0;
-
 
553
    dest_off = 0;
-
 
554
 
554
    while ((ch = str_decode(src, &str_off, STR_NO_LIMIT)) != 0) {
555
    while ((ch = str_decode(src, &src_off, STR_NO_LIMIT)) != 0) {
555
        if (chr_encode(ch, dst, &dst_off, size) != EOK)
556
        if (chr_encode(ch, dest, &dest_off, size - 1) != EOK)
556
            break;
557
            break;
557
    }
558
    }
-
 
559
 
-
 
560
    dest[dest_off] = '\0';
-
 
561
}
-
 
562
 
-
 
563
/** Copy size-limited substring.
-
 
564
 *
-
 
565
 * Copy prefix of string @a src of max. size @a size to destination buffer
-
 
566
 * @a dest. No more than @a size bytes are written. The output string will
-
 
567
 * always be well-formed, i.e. null-terminated and containing only complete
-
 
568
 * characters.
-
 
569
 *
-
 
570
 * No more than @a n bytes are read from the input string, so it does not
-
 
571
 * have to be null-terminated.
-
 
572
 *
-
 
573
 * @param dst   Destination buffer.
-
 
574
 * @param count Size of the destination buffer (must be > 0).
-
 
575
 * @param src   Source string.
-
 
576
 * @param n Maximum number of bytes to read from @a src.
-
 
577
 */
-
 
578
void str_ncpy(char *dest, size_t size, const char *src, size_t n)
-
 
579
{
-
 
580
    wchar_t ch;
-
 
581
    size_t src_off;
-
 
582
    size_t dest_off;
-
 
583
 
-
 
584
    /* There must be space for a null terminator in the buffer. */
-
 
585
    ASSERT(size > 0);
558
   
586
   
559
    if (dst_off >= size)
587
    src_off = 0;
560
        dst[size - 1] = 0;
588
    dest_off = 0;
-
 
589
 
-
 
590
    while ((ch = str_decode(src, &src_off, n)) != 0) {
-
 
591
        if (chr_encode(ch, dest, &dest_off, size - 1) != EOK)
-
 
592
            break;
561
    else
593
    }
-
 
594
 
562
        dst[dst_off] = 0;
595
    dest[dest_off] = '\0';
563
}
596
}
564
 
597
 
565
/** Copy NULL-terminated wide string to string
598
/** Copy NULL-terminated wide string to string
566
 *
599
 *
567
 * Copy source wide string @a src to destination buffer @a dst.
600
 * Copy source wide string @a src to destination buffer @a dst.
Line 606... Line 639...
606
 */
639
 */
607
const char *str_chr(const char *str, wchar_t ch)
640
const char *str_chr(const char *str, wchar_t ch)
608
{
641
{
609
    wchar_t acc;
642
    wchar_t acc;
610
    size_t off = 0;
643
    size_t off = 0;
-
 
644
    size_t last = 0;
611
   
645
   
612
    while ((acc = str_decode(str, &off, STR_NO_LIMIT)) != 0) {
646
    while ((acc = str_decode(str, &off, STR_NO_LIMIT)) != 0) {
613
        if (acc == ch)
647
        if (acc == ch)
614
            return (str + off);
648
            return (str + last);
-
 
649
        last = off;
615
    }
650
    }
616
   
651
   
617
    return NULL;
652
    return NULL;
618
}
653
}
619
 
654