Index: class.doc ================================================================== --- class.doc +++ class.doc @@ -1561,10 +1561,13 @@ Display a picture. Consumes two arguments, being first a class and then the image number. If either argument is not valid, displays nothing. The picture may take up multiple lines of space; the lines will be moved farther apart to make room if necessary. +%R + Display a roman number. + %s Display a string. If the value is not a string, it will display it as whatever type it is. %u Index: exec.c ================================================================== --- exec.c +++ exec.c @@ -1235,10 +1235,22 @@ Class*c=classes[vstack[vstackptr+argi].u]; int n=vstack[vstackptr+argi+1].u&255; if(nnimages) sqlite3_str_appendf(s,"\x0E\x07:%d\\",c->images[n]&0x7FFF); } argi+=2; + break; + case 'R': + if(argi==argc) break; + v=vstack[vstackptr+argi++]; + if(v.t==TY_NUMBER) { + static const char*const r1000[10]={"","M","MM","MMM","MMMM","MMMMM","MMMMMM","MMMMMMM","MMMMMMMM","MMMMMMMMM"}; + static const char*const r100[10]={"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"}; + static const char*const r10[10]={"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"}; + static const char*const r1[10]={"","I","II","III","IV","V","VI","VII","VIII","IX"}; + if(v.u) sqlite3_str_appendf(s,"%s%s%s%s",r1000[(v.u/1000)%10],r100[(v.u/100)%10],r10[(v.u/10)%10],r1[v.u%10]); + else sqlite3_str_appendchar(s,1,'N'); + } break; case 's': if(argi==argc) break; v=vstack[vstackptr+argi++]; switch(v.t) { @@ -1252,12 +1264,10 @@ sqlite3_str_appendf(s,"%s",classes[v.u]->name); break; case TY_MESSAGE: sqlite3_str_appendf(s,"%s",v.u<256?standard_message_names[v.u]:messages[v.u-256]); break; - default: - Throw("Type mismatch"); } break; case 'u': if(argi==argc) break; v=vstack[vstackptr+argi++];