/* Verify anti-symmetry and transitivity for comparator CMP on sorted array of N SIZE-sized elements pointed to by BASE. */ void qsort_chk (void *base, size_t n, size_t size, int (*cmp)(const void *, const void *)) { #if 0 #define LIM(n) (n) #else /* Limit overall time complexity to O(n log n). */ #define LIM(n) ((n) <= 16 ? (n) : 12 + floor_log2 (n)) #endif #define ELT(i) ((const char *) base + (i) * size) #define CMP(i, j) cmp (ELT (i), ELT (j)) #define ERR2(i, j) qsort_chk_error (ELT (i), ELT (j), NULL, cmp) #define ERR3(i, j, k) qsort_chk_error (ELT (i), ELT (j), ELT (k), cmp) size_t i1, i2, i, j; /* This outer loop iterates over maximum spans [i1, i2) such that elements within each span compare equal to each other. */ for (i1 = 0; i1 < n; i1 = i2) { /* Position i2 one past last element that compares equal to i1'th. */ for (i2 = i1 + 1; i2 < n; i2++) if (CMP (i1, i2)) break; else if (CMP (i2, i1)) return ERR2 (i1, i2); size_t lim1 = LIM (i2 - i1), lim2 = LIM (n - i2); /* Verify that other pairs within current span compare equal. */ for (i = i1 + 1; i + 1 < i2; i++) for (j = i + 1; j < i1 + lim1; j++) if (CMP (i, j)) return ERR3 (i, i1, j); else if (CMP (j, i)) return ERR2 (i, j); /* Verify that elements within this span compare less than elements beyond the span. */ for (i = i1; i < i2; i++) for (j = i2; j < i2 + lim2; j++) if (CMP (i, j) >= 0) return ERR3 (i, i1, j); else if (CMP (j, i) <= 0) return ERR2 (i, j); } #undef ERR3 #undef ERR2 #undef CMP #undef ELT #undef LIM }
/** * Open a connection to the display and print error if it fails. * * @return True on success or False otherwise. */ Bool getDisplay(int argc, char **argv) { int major, minor, why; major = XkbMajorVersion; minor = XkbMinorVersion; dpy = XkbOpenDisplay(settings.display.value, NULL, NULL, &major, &minor, &why); if (!dpy) { if (settings.display.value == NULL) settings.display.value = getenv("DISPLAY"); if (settings.display.value == NULL) settings.display.value = "default display"; switch (why) { case XkbOD_BadLibraryVersion: ERR3("%s was compiled with XKB version %d.%02d\n", argv[0], XkbMajorVersion, XkbMinorVersion); ERR2("Xlib supports incompatible version %d.%02d\n", major, minor); break; case XkbOD_ConnectionRefused: ERR1("Cannot open display \"%s\"\n", settings.display.value); break; case XkbOD_NonXkbServer: ERR1("XKB extension not present on %s\n", settings.display.value); break; case XkbOD_BadServerVersion: ERR3("%s was compiled with XKB version %d.%02d\n", argv[0], XkbMajorVersion, XkbMinorVersion); ERR3("Server %s uses incompatible version %d.%02d\n", settings.display.value, major, minor); break; default: ERR1("Unknown error %d from XkbOpenDisplay\n", why); break; } return False; } if (synch) XSynchronize(dpy, True); return True; }
static int get_translated_line1(InputSource s) { unsigned int c; /* can't use Char, it might be >0x10000 */ unsigned char *inbuf = s->inbuf; int nextin = s->nextin, insize = s->insize; int startin = s->nextin; Char *outbuf = s->line; int outsize = s->line_alloc; int nextout = 0; int remaining = 0; int ignore_linefeed = s->line_end_was_cr; #if CHAR_SIZE == 16 int *to_unicode = 0; /* initialize to shut gcc up */ CharacterEncoding enc = s->entity->encoding; int more, i; s->complicated_utf8_line = 0; if(enc >= CE_ISO_8859_2 && enc <= CE_ISO_8859_9) to_unicode = iso_to_unicode[enc - CE_ISO_8859_2]; #endif s->line_end_was_cr = 0; s->bytes_before_current_line = s->bytes_consumed; while(1) { /* There are never more characters than bytes in the input */ if(outsize < nextout + (insize - nextin)) { outsize = nextout + (insize - nextin); outbuf = Realloc(outbuf, outsize * sizeof(Char)); } while(nextin < insize) { #if CHAR_SIZE == 8 c = inbuf[nextin++]; #else switch(enc) { case CE_ISO_10646_UCS_2B: case CE_UTF_16B: if(nextin+2 > insize) goto more_bytes; c = (inbuf[nextin] << 8) + inbuf[nextin+1]; nextin += 2; break; case CE_ISO_10646_UCS_2L: case CE_UTF_16L: if(nextin+2 > insize) goto more_bytes; c = (inbuf[nextin+1] << 8) + inbuf[nextin]; nextin += 2; break; case CE_ISO_8859_1: case CE_unspecified_ascii_superset: c = inbuf[nextin++]; break; case CE_ISO_8859_2: case CE_ISO_8859_3: case CE_ISO_8859_4: case CE_ISO_8859_5: case CE_ISO_8859_6: case CE_ISO_8859_7: case CE_ISO_8859_8: case CE_ISO_8859_9: c = to_unicode[inbuf[nextin++]]; if(c == (unsigned int)-1) ERR3("Illegal %s character <0x%x> " "at file offset %d\n", CharacterEncodingName[enc], inbuf[nextin-1], s->bytes_consumed + nextin - 1 - startin); break; case CE_UTF_8: c = inbuf[nextin++]; if(c <= 0x7f) break; if(c <= 0xc0 || c >= 0xfe) { ERR2("Illegal UTF-8 start byte <0x%x> " "at file offset %d\n", c, s->bytes_consumed + nextin - 1 - startin); return -1; } if(c <= 0xdf) { c &= 0x1f; more = 1; } else if(c <= 0xef) { c &= 0x0f; more = 2; } else if(c <= 0xf7) { c &= 0x07; more = 3; } else if(c <= 0xfb) { c &= 0x03; more = 4; } else { c &= 0x01; more = 5; } if(nextin+more > insize) { nextin--; goto more_bytes; } s->complicated_utf8_line = 1; for(i=0; i<more; i++) c = (c << 6) + (inbuf[nextin++] & 0x3f); break; default: ERR("read from entity with unsupported encoding!\n"); return -1; } if(c > 0x110000 || (c < 0x10000 && !is_xml_legal(c))) if(!(enc == CE_UTF_16L || enc == CE_UTF_16B) || c < 0xd800 || c > 0xdfff) /* We treat the surrogates as legal because we didn't combine them when translating from UTF-16. XXX */ { ERR2("Error: illegal character <0x%x> " "immediately before file offset %d\n", c, s->bytes_consumed + nextin - startin); return -1; } #endif if(c == '\n' && ignore_linefeed) { /* Ignore lf at start of line if last line ended with cr */ ignore_linefeed = 0; s->bytes_before_current_line += (nextin - startin); } else { ignore_linefeed = 0; if(c == '\r') { s->line_end_was_cr = 1; c = '\n'; } #if CHAR_SIZE == 16 if(c >= 0x10000) { /* Use surrogates */ outbuf[nextout++] = ((c - 0x10000) >> 10) + 0xd800; outbuf[nextout++] = ((c - 0x10000) & 0x3ff) + 0xdc00; } else outbuf[nextout++] = c; #else outbuf[nextout++] = c; #endif if(c == '\n') { s->nextin = nextin; s->insize = insize; s->bytes_consumed += (nextin - startin); s->line = outbuf; s->line_alloc = outsize; s->line_length = nextout; return 0; } } }