1 /*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
5 * Function:..WorldWideWeb-X.500-Gateway - HTML-Procedures *
6 * Based on web500gw.c 1.3 written by Frank Richter, TU Chemmniz *
7 * which is based on go500gw by Tim Howes, University of *
8 * Michigan - All rights reserved *
10 * Authors:...Dr. Kurt Spanier & Bernhard Winkler, *
11 * Zentrum fuer Datenverarbeitung, Bereich Entwicklung *
12 * neuer Dienste, Universitaet Tuebingen, GERMANY *
15 * Creation date: Z D D V V *
16 * August 16 1995 Z D D V V *
17 * Last modification: Z D D V V *
18 * May 28 1999 ZZZZ DDD V *
20 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/
23 * $Id: html.c,v 1.6 1999/09/10 15:01:17 zrnsk01 Exp $
31 #include "support_exp.h"
34 #include "tueTel_exp.h"
37 PUBLIC void print_attr(ld, fp, dn, label, tattr, e, flag, doNotShow, glob)
49 int i, gotone = 0, firstline = TRUE, valid_label = FALSE;
53 int first_of_same = TRUE;
55 nlabel = ldap_friendly_name(glob->friendlyfile, label, &fm);
57 if ( (val = ldap_get_values( ld, e, tattr )) == NULL )
60 /* check if only 1 value and this one is in "doNotShow"
61 if((doNotShow) && (val[1] == NULL) && (strcmp(val[0],doNotShow) == 0))
65 for ( i = 0; val[i]; i++ ) {
67 sprintf(strbuf, "(%s)", glob->la[0]);
68 if(!strncasecmp(val[i], strbuf, 4)) {
69 strcpy(val[i], val[i]+4);
71 else if(val[i][0] == '(' && val[i][3] == ')' ) {
76 if (!doNotShow || strncasecmp (val[i], doNotShow, strlen (val[i])))
84 ldap_value_free (val);
89 fprintf( fp, "\n<DT><B>%s</B><DD>", nlabel );
91 /* handle photo-requests */
92 if((flag == BMP) || (flag == JPEG2GIF) || (flag == JPEG)) {
93 photof(fp, flag, imageChar, dn, tattr);
97 for ( i = 0; val[i] != NULL; i++ ) {
101 if(!*label ) first_of_same = FALSE;
103 if(!*val[i]) continue;
105 vali = char2html(val[i]);
111 } else if (flag == TFUNCPERS) {
112 tfuncpersf(fp, vali, ld, glob);
115 } else if (flag == DYNAMICDN) {
116 dynamicdnf(fp, vali, glob);
118 } else if (flag == INDEXURL) {
119 indexurlf(fp, vali, dn, glob);
121 } else if (flag == URI) {
122 urif(fp, vali, glob);
124 } else if (flag == PGPKEY) {
125 pgpkeyf(fp, vali, &firstline);
127 } else if ( ( flag == MULTILINE ) || (strchr(vali, '$') &&
128 strncmp(vali, "{T.61}", 6) != 0 )) {
129 multilinef(fp, vali, &first_of_same, &firstline, &gotone, nlabel);
131 } else if (flag == BOOLEAN) {
132 booleanf(fp, val[i], glob);
134 } else if (flag == DATE) {
137 } else if (flag == MAILTO) {
138 mailtof(fp, val[i], vali);
140 } else if (flag == HREF) {
141 hreff(fp, val[i], vali, glob);
143 } else if (flag == MOVETO) {
144 movetof(fp, val[i], vali, glob);
146 } else if (flag == PRE) {
147 pref(fp, vali, glob);
149 } else if (flag == HEADER) {
150 headerf(fp, vali, glob);
152 } else if (flag == REFERRAL) {
153 referralf(fp, vali, glob);
156 } else if(flag == FAXTABLE) {
157 faxtablef(fp, val, &firstline);
161 defaultf(fp, vali, &firstline);
163 ldap_value_free( val );
165 /* end of function: print_attr */
167 PUBLIC void form_attr(ld, fp, label, tattr, e, multiline, add_empty, glob)
179 int i, gotone = 0, line = 0;
181 nlabel = ldap_friendly_name(glob->friendlyfile, label, &fm);
182 if ( (val = ldap_get_values( ld, e, tattr )) == NULL ) {
185 fprintf( fp, "<DT><B>%s</B><DD><TEXTAREA NAME=\"%s=\" ROWS=4 COLS=30></TEXTAREA><BR>\n",
188 fprintf( fp, "<DT><B>%s</B><DD><INPUT NAME=\"%s=\" SIZE=30 ><BR>\n",
192 fprintf( fp, "\n<DT><B>%s</B><DD>", nlabel );
194 for ( i = 0; val[i] != NULL; i++ ) {
199 fprintf( fp, "<DT><B>%s</B><DD>", nlabel);
201 while ( ( s = strchr( s, '$' )) ) {
203 while ( isspace( *s ) )
206 sprintf(buffer, "%s", p);
209 sprintf(buffer, "%s\n%s", buffer, p);
215 sprintf(buffer, "%s", p);
217 sprintf(buffer, "%s\n%s", buffer, p);
219 s = form_encode(buffer);
221 "<TEXTAREA NAME=\"%s=%s\" ROWS=%d COLS=30>%s</TEXTAREA><BR>\n",
222 tattr, s, line + 1, s);
223 /* fprintf( fp, "<INPUT NAME=\"%s=%s\" SIZE=30,%d VALUE=\"%s\"> <BR>\n", tattr, s, line + 1, s); */
227 s = form_encode(val[i]);
228 fprintf( fp, "<INPUT NAME=\"%s=%s\" SIZE=\"%d\" VALUE=\"%s\"><BR>\n", tattr, s,
229 strlen(val[i]) > 30 ? strlen(val[i]) + 3 : 30, s);
233 fprintf( fp, "<INPUT NAME=\"%s=\" SIZE=30 ><BR>\n", tattr);
234 ldap_value_free( val );
236 /* end of function: form_attr */
238 PUBLIC void do_pict(ld, fp, dn, type, glob)
247 char cmd[128], buffer[1024];
250 LDAPMessage *res, *e;
255 if ( (rc = ldap_search_s( ld, dn, LDAP_SCOPE_BASE, "objectClass=*",
256 NULL, 0, &res )) != LDAP_SUCCESS ) {
257 do_error(fp, rc, NOT_FOUND, glob);
261 if ( (e = ldap_first_entry( ld, res )) == NULL ) {
262 do_error(fp, -2, SERVER_ERROR, glob);
267 * old behaviour: use "photo" or "jpegPhoto" attribute
268 * as indicated by type-argument.
270 tattr = (type == 0 ? "photo" : "jpegPhoto");
272 /* NEW: if attr is added to URL via "+" use that attribute */
273 if( ( cPtr = strQuoteChr(dn,'+')) )
276 if ( (val = ldap_get_values_len( ld, e, tattr)) == NULL )
280 tp = fopen( s, "w+");
282 if (type == 0) { /* g3fax photo -> xbm */
283 sprintf(cmd, "%s > %s", G3TOXBM, s);
284 if (debug) fprintf(stderr, "%ld bytes FAX!! %s\n",
285 val[0]->bv_len, cmd);
287 } else if (type == 1) { /* jpeg -> gif */
288 sprintf(cmd, "%s > %s", JPEGTOGIF, s);
289 if (debug) fprintf(stderr, "%ld bytes JPEG!! %s\n",
290 val[0]->bv_len, cmd);
292 } else { /* jpeg direct */
293 sprintf(cmd, "cat > %s", s);
294 if (debug) fprintf(stderr, "%ld bytes JPEG!! %s\n",
295 val[0]->bv_len, cmd);
302 fprintf(fp, "HTTP/1.0 %d OK<br>MIME-Version: 1.0<br>",
304 fprintf(fp, "Content-type: image/%s<br>", ptype );
306 if (request == HEAD) {
310 if ((op = popen(cmd, "w")) == NULL )
312 fwrite(val[0]->bv_val, val[0]->bv_len, 1, op);
314 if (stat(s, &st) == 0 && http == 1) {
315 fprintf(fp, "Content-length: %lu<br>", st.st_size);
316 if (debug) fprintf(stderr, "Image size: %lu\n", st.st_size);
318 fprintf(fp, "<br>\n\n");
320 while (( i = fread(buffer, 1, 1024, tp))) fwrite(buffer, 1, i, fp);
322 if (unlink(s) == -1) {
323 if (debug) perror("Couldn't unlink temp image file");
327 /* end of function: do_pict */
331 PUBLIC void do_audio(ld, fp, dn, type, glob)
340 LDAPMessage *res, *e;
341 struct timeval timeout;
343 timeout.tv_sec = glob->timeout;
345 if ( (rc = ldap_search_st( ld, dn, LDAP_SCOPE_BASE, "objectClass=*",
346 NULL, 0, &timeout, &res )) != LDAP_SUCCESS ) {
347 do_error(fp, rc, NOT_FOUND, glob);
351 if ( (e = ldap_first_entry( ld, res )) == NULL ) {
352 do_error(fp, -2, SERVER_ERROR, glob);
355 if ( (val = ldap_get_values_len( ld, e, "audio" )) == NULL )
358 fprintf(fp, "HTTP/1.0 %d OK\nMIME-Version: 1.0\nServer: %s\n",
359 DOCUMENT_FOLLOWS, version);
360 fprintf(fp, "Content-type: audio/basic<P>Content-length: %ld\n\n",
363 if (request == HEAD) {
367 fwrite(val[0]->bv_val, val[0]->bv_len, 1, fp);
370 /* end of function: do_audio */
372 PUBLIC void do_sizelimit(fp, type, glob)
378 fprintf(fp, type ? glob->la[21] : glob->la[20]);
380 /* end of function: do_sizelimit */
382 PUBLIC void do_error(fp, code, status, glob)
392 case BAD_REQUEST: s = "Bad request"; break;
393 case AUTH_REQUIRED: s = "Authorization required"; break;
394 case FORBIDDEN: s = "Forbidden"; break;
395 case NOT_FOUND: s = "Not found"; break;
396 case SERVER_ERROR: s = "Server error"; break;
397 case NOT_IMPLEMENTED: s = "Not implemented"; break;
398 default: s = "Unknown error";
401 fprintf(fp, "HTTP/1.0 %03d %s\nMIME-Version: 1.0\nContent-Type: text/html\n\n", status, s);
404 if (request == HEAD) {
409 fprintf( fp, HTML_HEAD_TITLE, glob->la[22], glob->la[100]);
410 fprintf( fp, "\n<H2>%s %s</H2>\n%s <P>%s <EM> %d: %s.</EM><P>%s<br></BODY></HTML>", glob->la[23], s, glob->la[24], glob->la[25], code, ldap_err2string( code ), glob->la[26] );
412 /* end of function: do_error */
414 PUBLIC void explain_error (fp, error, status, glob )
421 char *s = "Unknown error";
424 case BAD_REQUEST: s = "Bad request"; break;
425 case AUTH_REQUIRED: s = "Authorization required"; break;
426 case FORBIDDEN: s = "Forbidden"; break;
427 case NOT_FOUND: s = "Not found"; break;
428 case SERVER_ERROR: s = "Server error"; break;
429 case NOT_IMPLEMENTED: s = "Not implemented"; break;
430 default: s = "Unknown error";
432 fprintf(fp, "HTTP/1.0 %03d %s\n",status, s);
433 fprintf(fp, "MIME-Version: 1.0\n");
434 fprintf(fp, "Content-Type: text/html\n\n");
436 if (request == HEAD) {
440 fprintf( fp, HTML_HEAD_TITLE, glob->la[22], glob->la[100]);
441 fprintf( fp, "<H2>%s: %s</H2>\n", glob->la[22], s);
442 fprintf( fp, "%s</BODY>\n</HTML>", error);
444 /* end of function: explain_error */
446 /* Make "Move upwards" Header */
447 PUBLIC void make_header (fp, dn, action, glob)
453 char **s, **t, hrdn[1024];
455 pGW_SWITCH_LINE gw_ptr;
458 if(glob->pull_down_menus) {
459 make_header_pull_down(fp, dn, action, glob);
464 if ( strlen(dn) == 0) /* the root */
466 s = ldap_explode_dn( dn, 1 );
467 t = ldap_explode_dn( dn, 0 );
470 for(gw_ptr = glob->gw_switch->list; gw_ptr; gw_ptr = gw_ptr->next)
471 if (!strcasecmp(gw_ptr->dn, "ROOT"))
472 strcpy(url, gw_ptr->url);
474 fprintf( fp, "<strong>%s </strong><MENU>\n<LI> <A HREF=\"%s\">%s</A>\n",
475 glob->la[27], url, glob->la[77]);
478 for (cnt=0; t[cnt]; cnt++);
479 for (i = cnt - 1; i > 0 && s[i]; i--) {
480 strcpy(hrdn, hex_encode(t[i]));
481 for (j = i + 1; j < cnt ; j++) {
482 strcat(hrdn, hex_encode(", "));
483 strcat(hrdn,hex_encode(t[j]));
487 for(gw_ptr = glob->gw_switch->list; gw_ptr; gw_ptr = gw_ptr->next)
488 if (!dn_cmp(hex_encode (gw_ptr->dn), hrdn))
489 strcpy(url, url_complete(gw_ptr->url, hrdn, "M"));
491 fprintf( fp, "<LI> <A HREF=\"%s\">%s</A>\n",
493 ldap_friendly_name( glob->friendlyfile, s[i], &fm ) :
496 fprintf( fp, "<LI> <A HREF=\"%sM%s\">%s</A>\n",
497 url, hrdn, i == cnt - 1 ?
498 ldap_friendly_name( glob->friendlyfile, s[i], &fm ) :
502 fprintf( fp, "</MENU>\n");
506 /* end of function: make_header */
508 /* Make "Move upwards" Header with pull-down-menus*/
509 PUBLIC void make_header_pull_down (fp, dn, action, glob)
515 char **s, **t, hrdn[1024];
517 pGW_SWITCH_LINE gw_ptr;
521 if ( strlen(dn) == 0) /* the root */
523 s = ldap_explode_dn( dn, 1 );
524 t = ldap_explode_dn( dn, 0 );
527 for(gw_ptr = glob->gw_switch->list; gw_ptr; gw_ptr = gw_ptr->next)
528 if (!strcasecmp(gw_ptr->dn, "ROOT"))
529 strcpy(url, gw_ptr->url);
531 fprintf( fp, "<FORM ACTION=\"/D\">\n");
533 "<INPUT TYPE=submit VALUE=\"%s\"> -> <SELECT NAME=\"H\">\n",
535 fprintf( fp, "<OPTION VALUE=\"%s\">%s\n", url, glob->la[77]);
537 for (cnt=0; t[cnt]; cnt++);
538 for (i = cnt - 1; i > 0 && s[i]; i--) {
539 strcpy(hrdn, hex_encode(t[i]));
540 for (j = i + 1; j < cnt ; j++) {
541 strcat(hrdn, hex_encode(", "));
542 strcat(hrdn,hex_encode(t[j]));
546 for(gw_ptr = glob->gw_switch->list; gw_ptr; gw_ptr = gw_ptr->next)
547 if (!dn_cmp(hex_encode (gw_ptr->dn), hrdn))
548 strcpy(url, url_complete(gw_ptr->url, hrdn, "M"));
550 fprintf( fp, "<OPTION VALUE=\"%s\" %s>%s\n", url,
551 i==1 ? "SELECTED" : "", i == cnt - 1 ?
552 ldap_friendly_name( glob->friendlyfile, s[i], &fm ) :s[i]);
554 fprintf( fp, "<OPTION VALUE=\"%sM%s\" %s>%s\n",
555 url, hrdn, i==1 ? "SELECTED" : "", i == cnt - 1 ?
556 ldap_friendly_name( glob->friendlyfile, s[i], &fm ) :s[i]);
559 fprintf( fp, "</SELECT></FORM>\n");
564 /* end of function: make_header_pull_down */
566 PUBLIC char * url_complete (gwp_url, rdn, separator)
567 char *gwp_url, *rdn, *separator;
569 static char url[BUFSIZ];
572 strcpy(url, gwp_url);
574 if(!strchr (gwp_url, '=')) {
576 if (!strncasecmp (url, "http://", 7)) {
578 if ( ( strptr = strchr (url+7, '/')) ) *(++strptr) = '\0';
579 else strcat (url, "/");
583 sprintf (url, "%s%s%s", url, separator, rdn);
590 /* end of function: url_complete */
592 PRIVATE void photof(fp, flag, imageChar, dn, tattr)
600 case BMP : imageChar = 'G'; break;
601 case JPEG2GIF: imageChar = 'I'; break;
602 case JPEG : imageChar = 'J'; break;
604 fprintf( fp, "<IMG ALT=\"Photo\" SRC=\"%c%s\"+%s>\n",
605 imageChar, hex_encode(dn), tattr);
607 /* end of function: photof */
609 PRIVATE void urlf(fp, vali)
615 if ((cp = strchr(vali, '$')) != NULL) {
617 fprintf( fp, "%s%c\n", vali,
618 (vali[0] ? ':' : ' '));
619 fprintf(fp," <A HREF=\"%s\"> %s</A><BR>\n",
622 fprintf( fp, "%s<BR>\n", vali);
624 /* end of function: urlf */
626 PRIVATE void dynamicdnf(fp, vali, glob)
631 fprintf(fp," <A HREF=\"%s/M%s\"> %s</A><BR>\n",
634 dn2server(vali, glob),
641 /* end of function: dynamicdnf */
643 /* Allow href dn-lable flexible configuration via INDEXURL */
644 PRIVATE void indexurlf(fp, vali, entrydn, glob)
651 char dnbuf[BUFSIZ], *strptr, **dn;
652 char rulebuf[BUFSIZ], *disp_item;
654 char entrydnbuf[BUFSIZ], dit_dnbuf[BUFSIZ];
657 if (((cp = strchr(vali, ' ')) != NULL) && glob->index_url) {
662 if ( index < 0 || index >= INDEX_RULE_SIZE )
664 if (!glob->index_url->rarr[index].rule) {
668 /* case entrydn out of range */
669 strcpy(entrydnbuf, entrydn);
670 strcpy(dit_dnbuf, glob->index_url->rarr[index].dit_dn);
671 dn_normalize(entrydnbuf);
672 dn_normalize(dit_dnbuf);
673 if(!dn_issuffix(entrydnbuf, dit_dnbuf)){
674 fprintf(fp," <A HREF=\"%s\"> %s</A><BR>\n", vali, cp);
678 /* return if url doesn't contain cn= ( no dn ) */
679 if(!(strptr = strstr(vali, "cn=")))
681 strcpy(dnbuf, strptr);
683 dn = ldap_explode_dn(dnbuf, 1);
685 for(arrsize=0; dn[arrsize]; arrsize++)
688 if(arrsize && glob->strip_pin)
689 trimright(dn[0], " 1234567890");
691 fprintf(fp," <A HREF=\"%s\">", vali);
692 strcpy(rulebuf, glob->index_url->rarr[index].rule);
695 for(disp_item = strtok(rulebuf, ","); disp_item;
696 disp_item = strtok(NULL, ",")) {
697 if(abs(atoi(disp_item)) >= arrsize) continue;
699 if(*disp_item == '-') {
700 fprintf(fp,"%s%s", !first ? ", " : "",
701 dn[arrsize + atoi(disp_item) - 1]);
703 fprintf(fp,"%s%s", !first ? ", " : "", dn[atoi(disp_item)]);
708 fprintf(fp,"</A><BR>\n");
710 fprintf( fp, "%s<BR>\n", vali);
712 /* end of function: indexurlf */
714 PRIVATE void urif(fp, vali, glob)
721 if(glob->gw_switch->dynamic && strstr(vali, "(gw"))
723 if ((cp = strchr(vali, ' ')) != NULL) {
725 fprintf(fp," <A HREF=\"%s\"> %s</A><BR>\n", vali, cp);
727 fprintf( fp, "%s<BR>\n", vali);
729 /* end of function: urif */
731 /* function for ldap-referrals etc. */
732 PRIVATE void referralf(fp, vali, glob)
739 if(glob->gw_switch->dynamic && strstr(vali, "(gw"))
741 if ((cp = strchr(vali, ' ')) != NULL) {
743 fprintf(fp," <A HREF=\"http://%s:%d/W%s\"> %s</A><BR>\n",
744 glob->hostname, glob->webport, vali, cp);
746 fprintf(fp," <A HREF=\"http://%s:%d/W%s\"> %s</A><BR>\n",
747 glob->hostname, glob->webport, vali, vali);
749 /* end of function: referralf */
751 PRIVATE void pgpkeyf(fp, vali, firstline)
758 fprintf( fp, "<TT>\n");
760 while ( ( s = strstr( s, " $" )) ) {
761 *s++ = '\0'; /* delete BLANK */
762 *s++ = '\0'; /* delete DOLLAR */
763 while ( isspace( *s ) )
765 if ( *firstline == TRUE ) {
766 fprintf( fp, "<DT>%s<BR>\n", p );
768 } else if (!strncasecmp(p, "Version", 7)) {
769 fprintf( fp, "%s<BR><BR>\n", p );
771 fprintf( fp, "%s<BR>\n", p );
775 if ( *firstline == TRUE ) {
776 fprintf( fp,"<DT>%s<BR>", p );
779 fprintf( fp, "%s\n", p );
781 fprintf( fp, "</TT>\n");
783 /* end of function: pgpkeyf */
785 PRIVATE void multilinef(fp, vali, first_of_same, firstline, gotone, nlabel)
795 if ( !*first_of_same && *gotone)
796 fprintf( fp, "<BR>");
797 if ( *gotone && *first_of_same)
798 fprintf( fp, "<DT><B>%s</B><DD>", nlabel);
799 else if (!*first_of_same)
800 fprintf( fp, "<BR>");
803 /* PATCH to process MULTILINE correctly:
804 replace strstr() instead of strchr(), in order not to missinterpret
805 DOLLAR in Text ; /KSp, 95/06/28
809 while ( s = strchr( s, '$' ) ) {
811 while ( ( s = strstr( s, " $" )) ) {
812 *s++ = '\0'; /* delete BLANK */
813 *s++ = '\0'; /* delete DOLLAR */
814 while ( isspace( *s ) )
819 syslog (LOG_INFO, "multiLineAttr: %s", p);
822 fprintf( fp, "%s<BR>\n", p );
823 if ( *firstline == TRUE )
828 fprintf( fp, "%s<BR>\n", p );
830 fprintf( fp, "%s", p );
834 *first_of_same = FALSE;
836 /* end of function: multilinef */
838 PRIVATE void booleanf(fp, val_i, glob)
843 if (!strcmp(val_i, "TRUE")) fprintf( fp, "%s<BR>\n", glob->la[78]);
844 else fprintf( fp, "%s<BR>\n", glob->la[79]);
846 /* end of function: booleanf */
848 PRIVATE void datef(fp, val_i)
852 fprintf( fp, "%s<BR>\n", format_date(&val_i, "%A, %d-%h-%y %T GMT"));
854 /* end of function: datef */
856 PRIVATE void mailtof(fp, val_i, vali)
861 fprintf (fp, "<A HREF=\"mailto:%s\">%s</A><BR>\n", val_i, vali);
863 /* end of function: mailtof */
865 PRIVATE void hreff(fp, val_i, vali, glob)
874 ufn = friendly_dn( val_i, glob );
875 fprintf( fp, "<A HREF=\"/%c%s\">%s</A><BR>\n", op,
876 hex_encode(val_i), ufn ? ufn : vali);
881 /* end of function: hreff */
883 PRIVATE void movetof(fp, val_i, vali, glob)
892 ufn = friendly_dn( val_i, glob );
893 fprintf( fp, "<A HREF=\"/%c%s\">%s</A><BR>\n", op,
894 hex_encode(val_i), ufn ? ufn : vali);
899 /* end of function: movetof */
902 PRIVATE void headerf(fp, vali, firstline)
907 fprintf( fp, "<DT>");
908 fprintf( fp, "<H1>");
909 fprintf( fp,"%s", vali );
910 fprintf( fp, "</H1>\n");
912 /* end of function: headerf */
914 PRIVATE void pref(fp, vali, firstline)
919 fprintf( fp, "<DT>");
920 fprintf( fp, "<PRE>");
921 fprintf( fp,"%s", vali );
922 fprintf( fp, "</PRE>\n");
924 /* end of function: pref */
926 PRIVATE void defaultf(fp, vali, firstline)
931 if ( *firstline == TRUE ) {
932 fprintf( fp,"%s", vali );
935 fprintf( fp, "<BR>\n%s", vali );
938 /* end of function: defaultf */