github.com/akaros/go-akaros@v0.0.0-20181004170632-85005d477eab/src/lib9/utf/utfnlen.c (about)

     1  /*
     2   * The authors of this software are Rob Pike and Ken Thompson.
     3   *              Copyright (c) 2002 by Lucent Technologies.
     4   * Permission to use, copy, modify, and distribute this software for any
     5   * purpose without fee is hereby granted, provided that this entire notice
     6   * is included in all copies of any software which is or includes a copy
     7   * or modification of this software and in all copies of the supporting
     8   * documentation for such software.
     9   * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
    10   * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
    11   * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
    12   * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
    13   */
    14  #include "utf.h"
    15  #include "utfdef.h"
    16  
    17  int
    18  utfnlen(const char *s, long m)
    19  {
    20  	int c;
    21  	int n;
    22  	Rune rune;
    23  	const char *es;
    24  
    25  	es = s + m;
    26  	for(n = 0; s < es; n++) {
    27  		c = *(uchar*)s;
    28  		if(c < Runeself){
    29  			if(c == '\0')
    30  				break;
    31  			s++;
    32  			continue;
    33  		}
    34  		if(!fullrune(s, (int)(es-s)))
    35  			break;
    36  		s += chartorune(&rune, s);
    37  	}
    38  	return n;
    39  }