/** * idna_to_unicode_4z4z: * @input: zero-terminated Unicode string. * @output: pointer to newly allocated output Unicode string. * @flags: IDNA flags, e.g. IDNA_ALLOW_UNASSIGNED or IDNA_USE_STD3_ASCII_RULES. * * Convert possibly ACE encoded domain name in UCS-4 format into a * UCS-4 string. The domain name may contain several labels, * separated by dots. The output buffer must be deallocated by the * caller. * * Return value: Returns IDNA_SUCCESS on success, or error code. **/ int idna_to_unicode_4z4z (const uint32_t * input, uint32_t ** output, int flags) { const uint32_t *start = input; const uint32_t *end = input; uint32_t *buf; size_t buflen; uint32_t *out = NULL; size_t outlen = 0; *output = NULL; do { end = start; for (; *end && !DOTP (*end); end++) ; buflen = end - start; buf = malloc (sizeof (buf[0]) * (buflen + 1)); if (!buf) return IDNA_MALLOC_ERROR; idna_to_unicode_44i (start, end - start, buf, &buflen, flags); /* don't check return value as per specification! */ if (out) { uint32_t *newp = realloc (out, sizeof (out[0]) * (outlen + 1 + buflen + 1)); if (!newp) { free (buf); free (out); return IDNA_MALLOC_ERROR; } out = newp; out[outlen++] = 0x002E; /* '.' (full stop) */ memcpy (out + outlen, buf, sizeof (buf[0]) * buflen); outlen += buflen; out[outlen] = 0x0; free (buf); } else { out = buf; outlen = buflen; out[outlen] = 0x0; } start = end + 1; } while (*end); *output = out; return IDNA_SUCCESS; }
/** * idna_to_ascii_4z: * @input: zero terminated input Unicode string. * @output: pointer to newly allocated output string. * @flags: IDNA flags, e.g. IDNA_ALLOW_UNASSIGNED or IDNA_USE_STD3_ASCII_RULES. * * Convert UCS-4 domain name to ASCII string. The domain name may * contain several labels, separated by dots. The output buffer must * be deallocated by the caller. * * Return value: Returns IDNA_SUCCESS on success, or error code. **/ int idna_to_ascii_4z (const uint32_t * input, char **output, int flags) { const uint32_t *start = input; const uint32_t *end = input; char buf[64]; char *out = NULL; int rc; /* 1) Whenever dots are used as label separators, the following characters MUST be recognized as dots: U+002E (full stop), U+3002 (ideographic full stop), U+FF0E (fullwidth full stop), U+FF61 (halfwidth ideographic full stop). */ if (input[0] == 0) { /* Handle implicit zero-length root label. */ *output = malloc (1); if (!*output) return IDNA_MALLOC_ERROR; strcpy (*output, ""); return IDNA_SUCCESS; } if (DOTP (input[0]) && input[1] == 0) { /* Handle explicit zero-length root label. */ *output = malloc (2); if (!*output) return IDNA_MALLOC_ERROR; strcpy (*output, "."); return IDNA_SUCCESS; } *output = NULL; do { end = start; for (; *end && !DOTP (*end); end++) ; if (*end == '\0' && start == end) { /* Handle explicit zero-length root label. */ buf[0] = '\0'; } else { rc = idna_to_ascii_4i (start, end - start, buf, flags); if (rc != IDNA_SUCCESS) return rc; } if (out) { char *newp = realloc (out, strlen (out) + 1 + strlen (buf) + 1); if (!newp) { free (out); return IDNA_MALLOC_ERROR; } out = newp; strcat (out, "."); strcat (out, buf); } else { out = (char *) malloc (strlen (buf) + 1); if (!out) return IDNA_MALLOC_ERROR; strcpy (out, buf); } start = end + 1; } while (*end); *output = out; return IDNA_SUCCESS; }
main(int argc, char *argv[]){ int i,j,k; int nr, n_run; int n,m; double **A, **At, **G, **Gt, **GtG, **U, **Ut, **UtU, *w, **V, norm; double *v; FILE *stream; if (argc <4){ fprintf(stderr,"Usage: %s m n n_run <datfile>\n", argv[0]); exit(EXIT_FAILURE); } m = atoi(argv[1]); n = atoi(argv[2]); n_run = atoi(argv[3]); if (argc == 5){ if ((stream = fopen(argv[4], "r")) == NULL){ fprintf(stderr, "Can't open file %s.\n", argv[4]); exit(EXIT_FAILURE); } } else { stream = stdin; } A = ALLOC_MATRIX(m,n); /* for(i=0; i<m; ++i){ */ /* for(j=0; j<n; ++j){ */ /* if (fscanf(stream,"%lf", A[i]+j) != 1){ */ /* fprintf(stderr,"Error occured in reading the data.\n"); */ /* exit(EXIT_FAILURE); */ /* } */ /* } */ /* } */ for(i=0; i<m; ++i){ for(j=0; j<n; ++j){ A[i][j] = RANDOM(-10.0,10.0); } } /* print A */ U = ALLOC_MATRIX(m,n); COPY_VECTOR(A[0], U[0], m*n); for(i=0; i<m; ++i){ for(j=0; j<n; ++j) printf("%8.2f ", U[i][j]); printf("\n"); } printf("Using Gram-Schmidt\n"); /* gram-schmidt */ At = RECT_TRANSPOSE(A, m,n); Gt = ALLOC_MATRIX(n,m); for(i=0; i<n_run; ++i){ COPY_VECTOR(At[0], Gt[0], n*m); GRAM_SCHMIDT(Gt,n,m); } printf("Orthogonal vectors are \n"); for (i=0; i<n; ++i){ for(j=0, norm=0.0; j<m; ++j){ norm += SQR(Gt[i][j]); printf("%.6f ", Gt[i][j]); } printf(" %f\n",norm); } G = RECT_TRANSPOSE(Gt,n,m); GtG = ALLOC_MATRIX(n,n); printf("S=\n"); for(i=0; i<n; ++i){ for(j=0; j<n; ++j){ GtG[i][j]=0.0; for(k=0; k<m; ++k) GtG[i][j]+=Gt[i][k]*G[k][j]; printf("%8.1e ", GtG[i][j]); } printf("\n"); } /* project random vector against orthogonal basis */ v = ALLOC_VECTOR(m); for(i=0; i<m; ++i) v[i] = RANDOM(-10,10); PROJECT(v, m, Gt, n); for(i=0; i<n; ++i) printf("v.G[%2d] = %9.2e\n", i, DOTP(v,Gt[i],m)); }