+static int is_ad_sublang(
+ struct berval *sublangbv,
+ struct berval *suplangbv )
+{
+ const char *suplang, *supp, *supdelimp;
+ const char *sublang, *subp, *subdelimp;
+ int suplen, sublen;
+
+ if( suplangbv->bv_len == 0 ) return 1;
+ if( sublangbv->bv_len == 0 ) return 0;
+
+ sublang =sublangbv->bv_val;
+ suplang =suplangbv->bv_val;
+
+ for( supp=suplang ; supp; supp=supdelimp ) {
+ supdelimp = strchrlen( supp, ';', &suplen );
+ if( supdelimp ) supdelimp++;
+
+ for( subp=sublang ; subp; subp=subdelimp ) {
+ subdelimp = strchrlen( subp, ';', &sublen );
+ if( subdelimp ) subdelimp++;
+
+ if ((( suplen < sublen && supp[suplen-1] == '-' ) ||
+ suplen == sublen ) && strncmp( supp, subp, suplen ) == 0 )
+ {
+ goto match;
+ }
+ }
+
+ return 0;
+match:;
+ }
+ return 1;