! ---------------------------------------------------------------------------
! printf("string", values...) ! print formatted
!
! printf("The %o jumped over the %s %n times.", objectCow, "moon", 5)
! printf("The user entered the '%c' key.", ch)
! printf("%#Please pass the %o,%# said the %o.", objectSalt, objectElf) !double quotes
! printf("Note the <b>warning</b>!") ! bold (or italics or underline)
!
! regular text printchar text in primary string
! %c character printchar character
! %d decimal number print number decimal integer
! %h hexadecimal number print hex word in hex
! %o object print object.name object name
! %s string print string dictionary entry
! html:
! %# double-quote printchar '"' double-quote (open)
! %% '%' printchar percent character
! %; no newline at end no newline override default newline
! %n newline print newline overt newline at position
! <b> font bold Font() set bold font
! </b> font bold off Font() set bold font off
! <i> font italics Font() set italics font
! </i> font italics off Font() set italics font off
! <u> font underline Font() set underline font
! </u> font underline off Font() set underline font off
!
! Notes: a newline is printed at the end of the line, unless "%:" is in the line.
! Values %c %d %h %o %s should be matched by a value in the matching position.
! 0 to 9 %-values (with matching operands) are handled.
! More than 9 %-values will result in default values of zero.
! Items %# %% %; %n <b> <i> <u> </b> </i> </u> do not match operands.
array printf_array[10] ! work array
!----------------------------------------------------------------------------
routine printf(str, v1, v2, v3, v4, v5, v6, v7, v8, v9)
{ local c, i, k, lens, n, nl
! put the operands in the work array:
printf_array[1] = v1
printf_array[2] = v2
printf_array[3] = v3
printf_array[4] = v4
printf_array[5] = v5
printf_array[6] = v6
printf_array[7] = v7
printf_array[8] = v8
printf_array[9] = v9
k=1 ! point to the first operand
lens = string(_temp_string, str, 255) ! convert base text to a work string
for (i=0 ; i<lens; ) ! for each character of the primary string
{ c = _temp_string[i++] ! get the next character
if c='%' ! if current byte is '%'
{ c = _temp_string[i++] ! get the following character (format code)
select c ! per format character:
case '%': printchar '%' ! print a literal '%'
case '#': printchar '"' ! print a double-quote
case 'd': print number printf_array[k++]; ! print a decimal number
case 'h': print hex printf_array[k++]; ! print a hexadecimal number
case 'n': print newline ! print a line break
case 'o': print printf_array[k++].name; ! print an object name
case ';': nl=true ! set no-newline flag
case 'c'
{ n=printf_array[k++] ! print a character
if n>=32 and n<=126: printchar(n)
else: print number n;
}
case 's'
{ print printf_array[k++]; ! print the inner-string
}
case else ' %-escape char not recognized
{ printchar '%' ! so just print '%' and char
printchar c
}
! end select
if k>10: "\n<ERROR: printf() too many operands (max is 9)"
}
elseif c='<' ! if current byte is '<' ! check for HTML
{ if _temp_string[i]='b' and _temp_string[i+1]='>'
{ Font(BOLD_ON)
i=i+2
}
elseif _temp_string[i]='i' and _temp_string[i+1]='>'
{ Font(ITALIC_ON)
i=i+2
}
elseif _temp_string[i]='u' and _temp_string[i+1]='>'
{ Font(UNDERLINE_ON)
i=i+2
}
elseif _temp_string[i]='/' and _temp_string[i+1]='b' and _temp_string[i+2]='>'
{ Font(BOLD_OFF)
i=i+3
}
elseif _temp_string[i]='/' and _temp_string[i+1]='i' and _temp_string[i+2]='>'
{ Font(ITALIC_OFF)
i=i+3
}
elseif _temp_string[i]='/' and _temp_string[i+1]='u' and _temp_string[i+2]='>'
{ Font(UNDERLINE_OFF)
i=i+3
}
else ! got a '<', but it wasn't a proper font-html sequence
{ printchar c ! so just print the '<'
}
}
else ! if the current byte is neither '%' nor '<'
printchar c ! just print it
}
if nl=false: print newline ! print line break
}