github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/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 <stdarg.h>
    15  #include <string.h>
    16  #include "utf.h"
    17  #include "utfdef.h"
    18  
    19  int
    20  utfnlen(const char *s, long m)
    21  {
    22  	int c;
    23  	long n;
    24  	Rune rune;
    25  	const char *es;
    26  
    27  	es = s + m;
    28  	for(n = 0; s < es; n++) {
    29  		c = *(uchar*)s;
    30  		if(c < Runeself){
    31  			if(c == '\0')
    32  				break;
    33  			s++;
    34  			continue;
    35  		}
    36  		if(!fullrune(s, es-s))
    37  			break;
    38  		s += chartorune(&rune, s);
    39  	}
    40  	return n;
    41  }