OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [runtime/] [go-rune.c] - Rev 747

Compare with Previous | Blame | View Log

/* go-rune.c -- rune functions for Go.
 
   Copyright 2009, 2010 The Go Authors. All rights reserved.
   Use of this source code is governed by a BSD-style
   license that can be found in the LICENSE file.  */
 
#include <stddef.h>
 
#include "go-string.h"
 
/* Get a character from the UTF-8 string STR, of length LEN.  Store
   the Unicode character, if any, in *RUNE.  Return the number of
   characters used from STR.  */
 
int
__go_get_rune (const unsigned char *str, size_t len, int *rune)
{
  int c, c1, c2, c3;
 
  /* Default to the "replacement character".  */
  *rune = 0xfffd;
 
  if (len <= 0)
    return 1;
 
  c = *str;
  if (c <= 0x7f)
    {
      *rune = c;
      return 1;
    }
 
  if (len <= 1)
    return 1;
 
  c1 = str[1];
  if ((c & 0xe0) == 0xc0
      && (c1 & 0xc0) == 0x80)
    {
      *rune = (((c & 0x1f) << 6)
	       + (c1 & 0x3f));
      return 2;
    }
 
  if (len <= 2)
    return 1;
 
  c2 = str[2];
  if ((c & 0xf0) == 0xe0
      && (c1 & 0xc0) == 0x80
      && (c2 & 0xc0) == 0x80)
    {
      *rune = (((c & 0xf) << 12)
	       + ((c1 & 0x3f) << 6)
	       + (c2 & 0x3f));
      return 3;
    }
 
  if (len <= 3)
    return 1;
 
  c3 = str[3];
  if ((c & 0xf8) == 0xf0
      && (c1 & 0xc0) == 0x80
      && (c2 & 0xc0) == 0x80
      && (c3 & 0xc0) == 0x80)
    {
      *rune = (((c & 0x7) << 18)
	       + ((c1 & 0x3f) << 12)
	       + ((c2 & 0x3f) << 6)
	       + (c3 & 0x3f));
      return 4;
    }
 
  /* Invalid encoding.  Return 1 so that we advance.  */
  return 1;
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.