tFurther tweaks to tstring code - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 1cf917eb25286179db182405ef1ce84a53486e28
 (DIR) parent faf04e561d88902ff47cc6405b90896e096a9184
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Tue,  3 Oct 2000 00:42:06 +0000
       
       Further tweaks to tstring code
       
       
       Diffstat:
         M po/dopewars.pot                     |     500 ++++++++++++++++----------------
         M src/curses_client.c                 |      63 ++++++++++---------------------
         M src/gtk_client.c                    |      89 ++++++++++---------------------
         M src/message.c                       |      31 +++++++++++++------------------
         M src/serverside.c                    |      44 +++++++++++--------------------
         M src/tstring.c                       |     135 +++++++++++++++++++++++++++++++
         M src/tstring.h                       |       4 ++++
       
       7 files changed, 464 insertions(+), 402 deletions(-)
       ---
 (DIR) diff --git a/po/dopewars.pot b/po/dopewars.pot
       t@@ -6,7 +6,7 @@
        msgid ""
        msgstr ""
        "Project-Id-Version: PACKAGE VERSION\n"
       -"POT-Creation-Date: 2000-10-02 02:18+0100\n"
       +"POT-Creation-Date: 2000-10-02 22:34+0100\n"
        "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
        "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
        "Language-Team: LANGUAGE <LL@li.org>\n"
       t@@ -1002,378 +1002,378 @@ msgstr ""
        msgid "CLQP"
        msgstr ""
        
       -#: src/curses_client.c:372 src/gtk_client.c:822
       +#: src/curses_client.c:372 src/gtk_client.c:816
        msgid "Where to, dude ? "
        msgstr ""
        
       -#: src/curses_client.c:404
       +#: src/curses_client.c:403
        msgid "You can't get any cash for the following carried %tde :"
        msgstr ""
        
       -#: src/curses_client.c:419
       +#: src/curses_client.c:416
        msgid "What do you want to drop? "
        msgstr ""
        
       -#: src/curses_client.c:430
       +#: src/curses_client.c:427
        msgid "How many do you drop? "
        msgstr ""
        
       -#: src/curses_client.c:459 src/curses_client.c:845
       +#: src/curses_client.c:456 src/curses_client.c:834
        msgid "What do you wish to buy? "
        msgstr ""
        
       -#: src/curses_client.c:461 src/curses_client.c:847
       +#: src/curses_client.c:458 src/curses_client.c:836
        msgid "What do you wish to sell? "
        msgstr ""
        
       -#: src/curses_client.c:478
       +#: src/curses_client.c:475
        #, c-format
        msgid "You can afford %d, and can carry %d. "
        msgstr ""
        
       -#: src/curses_client.c:481
       +#: src/curses_client.c:478
        msgid "How many do you buy? "
        msgstr ""
        
       -#: src/curses_client.c:489
       +#: src/curses_client.c:486
        #, c-format
        msgid "You have %d. "
        msgstr ""
        
       -#: src/curses_client.c:491
       +#: src/curses_client.c:488
        msgid "How many do you sell? "
        msgstr ""
        
       -#: src/curses_client.c:516
       +#: src/curses_client.c:512
        msgid "Choose an errand to give one of your %tde..."
        msgstr ""
        
       -#: src/curses_client.c:524
       +#: src/curses_client.c:518
        #, c-format
        msgid "   S>py on another dealer                  (cost: %s)"
        msgstr ""
        
       -#: src/curses_client.c:528
       +#: src/curses_client.c:522
        #, c-format
        msgid "   T>ip off the cops to another dealer     (cost: %s)"
        msgstr ""
        
       -#: src/curses_client.c:531
       +#: src/curses_client.c:525
        msgid "   G>et stuffed"
        msgstr ""
        
       -#: src/curses_client.c:534
       +#: src/curses_client.c:528
        msgid "or C>ontact your spies and receive reports"
        msgstr ""
        
       -#: src/curses_client.c:536
       +#: src/curses_client.c:530
        msgid "or N>o errand ? "
        msgstr ""
        
       -#: src/curses_client.c:539
       +#: src/curses_client.c:533
        msgid "STGCN"
        msgstr ""
        
       -#: src/curses_client.c:542
       +#: src/curses_client.c:536
        msgid "Whom do you want to spy on? "
        msgstr ""
        
       -#: src/curses_client.c:547
       +#: src/curses_client.c:541
        msgid "Whom do you want to tip the cops off to? "
        msgstr ""
        
       -#: src/curses_client.c:552
       +#: src/curses_client.c:546
        msgid " Are you sure? "
        msgstr ""
        
       -#: src/curses_client.c:553 src/curses_client.c:571 src/curses_client.c:1736
       +#: src/curses_client.c:547 src/curses_client.c:565 src/curses_client.c:1713
        msgid "YN"
        msgstr ""
        
       -#: src/curses_client.c:569
       +#: src/curses_client.c:563
        msgid "Are you sure you want to quit? "
        msgstr ""
        
       -#: src/curses_client.c:577
       +#: src/curses_client.c:571
        msgid "New name: "
        msgstr ""
        
       -#: src/curses_client.c:633
       +#: src/curses_client.c:627
        msgid "You have been pushed from the server. Reverting to single player mode."
        msgstr ""
        
       -#: src/curses_client.c:643
       +#: src/curses_client.c:637
        msgid "The server has terminated. Reverting to single player mode."
        msgstr ""
        
       -#: src/curses_client.c:658 src/gtk_client.c:340 src/serverside.c:259
       +#: src/curses_client.c:652 src/gtk_client.c:339 src/serverside.c:259
        #, c-format
        msgid "%s joins the game!"
        msgstr ""
        
       -#: src/curses_client.c:663 src/gtk_client.c:346
       +#: src/curses_client.c:657 src/gtk_client.c:345
        #, c-format
        msgid "%s has left the game."
        msgstr ""
        
       -#: src/curses_client.c:668
       +#: src/curses_client.c:662
        #, c-format
        msgid "%s will now be known as %s."
        msgstr ""
        
       -#: src/curses_client.c:692
       +#: src/curses_client.c:686
        msgid "S U B W A Y"
        msgstr ""
        
       -#: src/curses_client.c:735
       +#: src/curses_client.c:729
        msgid ""
        "Unfortunately, somebody else is already using \"your\" name. Please change "
        "it."
        msgstr ""
        
       -#: src/curses_client.c:756
       +#: src/curses_client.c:750
        msgid "H I G H   S C O R E S"
        msgstr ""
        
       -#: src/curses_client.c:814
       +#: src/curses_client.c:807
        msgid "Will you B>uy, S>ell, or L>eave? "
        msgstr ""
        
       -#: src/curses_client.c:819
       +#: src/curses_client.c:812
        msgid "BSL"
        msgstr ""
        
       -#: src/curses_client.c:824
       +#: src/curses_client.c:817
        msgid "You don't have any %tde to sell!"
        msgstr ""
        
       -#: src/curses_client.c:834 src/gtk_client.c:1115
       +#: src/curses_client.c:825 src/gtk_client.c:1102
        msgid "You'll need more %tde to carry any more %tde!"
        msgstr ""
        
       -#: src/curses_client.c:858 src/gtk_client.c:1122
       +#: src/curses_client.c:847 src/gtk_client.c:1107
        msgid "You don't have enough space to carry that %tde!"
        msgstr ""
        
       -#: src/curses_client.c:868 src/gtk_client.c:1129
       +#: src/curses_client.c:855 src/gtk_client.c:1111
        msgid "You don't have enough cash to buy that %tde!"
        msgstr ""
        
       -#: src/curses_client.c:883 src/gtk_client.c:1134
       +#: src/curses_client.c:868 src/gtk_client.c:1115
        msgid "You don't have any to sell!"
        msgstr ""
        
       -#: src/curses_client.c:907
       +#: src/curses_client.c:892
        msgid "How much money do you pay back? "
        msgstr ""
        
       -#: src/curses_client.c:913 src/curses_client.c:943 src/gtk_client.c:1962
       +#: src/curses_client.c:898 src/curses_client.c:928 src/gtk_client.c:1943
        msgid "You don't have that much money!"
        msgstr ""
        
       -#: src/curses_client.c:933
       +#: src/curses_client.c:918
        msgid "Do you want to D>eposit money, W>ithdraw money, or L>eave ? "
        msgstr ""
        
       -#: src/curses_client.c:936
       +#: src/curses_client.c:921
        msgid "DWL"
        msgstr ""
        
       -#: src/curses_client.c:938
       +#: src/curses_client.c:923
        msgid "How much money? "
        msgstr ""
        
       -#: src/curses_client.c:946 src/gtk_client.c:1955
       +#: src/curses_client.c:931 src/gtk_client.c:1936
        msgid "There isn't that much money in the bank..."
        msgstr ""
        
       -#: src/curses_client.c:973
       +#: src/curses_client.c:958
        msgid "Yes"
        msgstr ""
        
       -#: src/curses_client.c:973
       +#: src/curses_client.c:958
        msgid "No"
        msgstr ""
        
       -#: src/curses_client.c:973
       +#: src/curses_client.c:958
        msgid "Run"
        msgstr ""
        
       -#: src/curses_client.c:974 src/gtk_client.c:525
       +#: src/curses_client.c:959 src/gtk_client.c:521
        msgid "Fight"
        msgstr ""
        
       -#: src/curses_client.c:974
       +#: src/curses_client.c:959
        msgid "Attack"
        msgstr ""
        
       -#: src/curses_client.c:974
       +#: src/curses_client.c:959
        msgid "Evade"
        msgstr ""
        
       -#: src/curses_client.c:1043
       +#: src/curses_client.c:1028
        msgid "Press any key..."
        msgstr ""
        
       -#: src/curses_client.c:1175
       +#: src/curses_client.c:1160
        msgid "Messages"
        msgstr ""
        
       -#: src/curses_client.c:1182 src/gtk_client.c:1415
       +#: src/curses_client.c:1167 src/gtk_client.c:1396
        msgid "Stats"
        msgstr ""
        
       -#: src/curses_client.c:1185
       +#: src/curses_client.c:1170
        #, c-format
        msgid "Cash %17s"
        msgstr ""
        
       -#: src/curses_client.c:1192
       +#: src/curses_client.c:1177
        #, c-format
        msgid "Health             %3d"
        msgstr ""
        
       -#: src/curses_client.c:1194
       +#: src/curses_client.c:1179
        #, c-format
        msgid "Bank %17s"
        msgstr ""
        
       -#: src/curses_client.c:1198
       +#: src/curses_client.c:1183
        #, c-format
        msgid "Debt %17s"
        msgstr ""
        
       -#: src/curses_client.c:1202
       +#: src/curses_client.c:1187
        #, c-format
        msgid "Space %6d"
        msgstr ""
        
       -#: src/curses_client.c:1204
       +#: src/curses_client.c:1189
        msgid "%Tde %3d  Space %6d"
        msgstr ""
        
       -#: src/curses_client.c:1215
       +#: src/curses_client.c:1198
        msgid "Trenchcoat"
        msgstr ""
        
       -#: src/curses_client.c:1217
       +#: src/curses_client.c:1200
        msgid "**Stats: Drugs** %Tde"
        msgstr ""
        
       -#: src/curses_client.c:1230 src/gtk_client.c:644
       +#: src/curses_client.c:1213 src/gtk_client.c:638
        msgid "**Stats: Guns** %Tde"
        msgstr ""
        
       -#: src/curses_client.c:1257
       +#: src/curses_client.c:1239
        #, c-format
        msgid "Spy reports for %s"
        msgstr ""
        
       -#: src/curses_client.c:1260 src/curses_client.c:1265
       +#: src/curses_client.c:1242 src/curses_client.c:1246
        msgid "%Tde..."
        msgstr ""
        
       -#: src/curses_client.c:1287
       +#: src/curses_client.c:1267
        msgid "No other players are currently logged on!"
        msgstr ""
        
       -#: src/curses_client.c:1292
       +#: src/curses_client.c:1272
        msgid "Players currently logged on:-"
        msgstr ""
        
       -#: src/curses_client.c:1441
       +#: src/curses_client.c:1420
        msgid "Hey dude, what's your name? "
        msgstr ""
        
       -#: src/curses_client.c:1476
       +#: src/curses_client.c:1455
        msgid "Hey dude, the prices of %tde here are:"
        msgstr ""
        
       -#: src/curses_client.c:1490
       +#: src/curses_client.c:1467
        msgid "Will you B>uy"
        msgstr ""
        
       -#: src/curses_client.c:1491
       +#: src/curses_client.c:1468
        msgid ", S>ell"
        msgstr ""
        
       -#: src/curses_client.c:1492
       +#: src/curses_client.c:1469
        msgid ", D>rop"
        msgstr ""
        
       -#: src/curses_client.c:1493
       +#: src/curses_client.c:1470
        msgid ", T>alk, P>age, L>ist"
        msgstr ""
        
       -#: src/curses_client.c:1496
       +#: src/curses_client.c:1473
        msgid ", G>ive"
        msgstr ""
        
       -#: src/curses_client.c:1499
       +#: src/curses_client.c:1476
        msgid ", F>ight"
        msgstr ""
        
       -#: src/curses_client.c:1503
       +#: src/curses_client.c:1480
        msgid ", J>et"
        msgstr ""
        
       -#: src/curses_client.c:1505 src/curses_client.c:1520
       +#: src/curses_client.c:1482 src/curses_client.c:1497
        msgid ", or Q>uit? "
        msgstr ""
        
       -#: src/curses_client.c:1513
       +#: src/curses_client.c:1490
        msgid "Do you "
        msgstr ""
        
       -#: src/curses_client.c:1515
       +#: src/curses_client.c:1492
        msgid "F>ight, "
        msgstr ""
        
       -#: src/curses_client.c:1516
       +#: src/curses_client.c:1493
        msgid "S>tand, "
        msgstr ""
        
       -#: src/curses_client.c:1518
       +#: src/curses_client.c:1495
        msgid "R>un, "
        msgstr ""
        
       -#: src/curses_client.c:1519
       +#: src/curses_client.c:1496
        msgid "D>eal "
        msgstr ""
        
       -#: src/curses_client.c:1562
       +#: src/curses_client.c:1539
        msgid "Connection to server lost! Reverting to single player mode"
        msgstr ""
        
       -#: src/curses_client.c:1591
       +#: src/curses_client.c:1568
        msgid "BSDTPLGFJQ"
        msgstr ""
        
       -#: src/curses_client.c:1593
       +#: src/curses_client.c:1570
        msgid "DRFSQ"
        msgstr ""
        
       -#: src/curses_client.c:1621
       +#: src/curses_client.c:1598
        msgid "List what? P>layers or S>cores? "
        msgstr ""
        
       -#: src/curses_client.c:1622
       +#: src/curses_client.c:1599
        msgid "PS"
        msgstr ""
        
       -#: src/curses_client.c:1631
       +#: src/curses_client.c:1608
        msgid "Whom do you want to page (talk privately to) ? "
        msgstr ""
        
       -#: src/curses_client.c:1646
       +#: src/curses_client.c:1623
        msgid "Talk: "
        msgstr ""
        
       -#: src/curses_client.c:1735
       +#: src/curses_client.c:1712
        msgid "Play again? "
        msgstr ""
        
       -#: src/curses_client.c:1747
       +#: src/curses_client.c:1724
        msgid ""
        "No curses client available - rebuild the binary passing the\n"
        "--enable-curses-client option to configure, or use a windowed\n"
       t@@ -1472,7 +1472,7 @@ msgstr ""
        msgid "Inventory"
        msgstr ""
        
       -#: src/gtk_client.c:238 src/gtk_client.c:2197 src/gtk_client.c:2578
       +#: src/gtk_client.c:238 src/gtk_client.c:2178 src/gtk_client.c:2543
        msgid "Close"
        msgstr ""
        
       t@@ -1480,199 +1480,199 @@ msgstr ""
        msgid "Connection to server lost - switching to single player mode"
        msgstr ""
        
       -#: src/gtk_client.c:314
       +#: src/gtk_client.c:313
        msgid "You have been pushed from the server."
        msgstr ""
        
       -#: src/gtk_client.c:319
       +#: src/gtk_client.c:318
        msgid "The server has terminated."
        msgstr ""
        
       -#: src/gtk_client.c:360
       +#: src/gtk_client.c:359
        msgid "Jetting to %tde"
        msgstr ""
        
       -#: src/gtk_client.c:370
       +#: src/gtk_client.c:367
        #, c-format
        msgid "_Spy\t(%s)"
        msgstr ""
        
       -#: src/gtk_client.c:374
       +#: src/gtk_client.c:371
        #, c-format
        msgid "_Tipoff\t(%s)"
        msgstr ""
        
       -#: src/gtk_client.c:408
       +#: src/gtk_client.c:405
        msgid "High Scores"
        msgstr ""
        
       -#: src/gtk_client.c:442 src/gtk_client.c:1057 src/gtk_client.c:1527
       -#: src/gtk_client.c:1872 src/gtk_client.c:2036 src/gtk_client.c:2317
       -#: src/gtk_client.c:2484
       +#: src/gtk_client.c:439 src/gtk_client.c:1048 src/gtk_client.c:1508
       +#: src/gtk_client.c:1853 src/gtk_client.c:2017 src/gtk_client.c:2293
       +#: src/gtk_client.c:2449
        msgid "OK"
        msgstr ""
        
       -#: src/gtk_client.c:552
       +#: src/gtk_client.c:548
        msgid "_Deal %Tde"
        msgstr ""
        
       -#: src/gtk_client.c:558 src/gtk_client.c:1165 src/gtk_client.c:1362
       +#: src/gtk_client.c:552 src/gtk_client.c:1146 src/gtk_client.c:1343
        msgid "_Fight"
        msgstr ""
        
       -#: src/gtk_client.c:561
       +#: src/gtk_client.c:555
        msgid "_Stand"
        msgstr ""
        
       -#: src/gtk_client.c:564 src/gtk_client.c:1164
       +#: src/gtk_client.c:558 src/gtk_client.c:1145
        msgid "_Run"
        msgstr ""
        
       -#: src/gtk_client.c:651
       +#: src/gtk_client.c:645
        msgid "**Stats: Bitches** %Tde"
        msgstr ""
        
       -#: src/gtk_client.c:813
       +#: src/gtk_client.c:807
        msgid "Jet to location"
        msgstr ""
        
       -#: src/gtk_client.c:883
       +#: src/gtk_client.c:876
        #, c-format
        msgid "at %s"
        msgstr ""
        
       -#: src/gtk_client.c:888
       +#: src/gtk_client.c:881
        msgid "You are currently carrying %d %tde"
        msgstr ""
        
       -#: src/gtk_client.c:895
       +#: src/gtk_client.c:886
        #, c-format
        msgid "Available space: %d"
        msgstr ""
        
       -#: src/gtk_client.c:900
       +#: src/gtk_client.c:891
        #, c-format
        msgid "You can afford %d"
        msgstr ""
        
       -#: src/gtk_client.c:949 src/gtk_client.c:1087
       +#: src/gtk_client.c:940 src/gtk_client.c:1077
        msgid "Buy"
        msgstr ""
        
       -#: src/gtk_client.c:950 src/gtk_client.c:1088
       +#: src/gtk_client.c:941 src/gtk_client.c:1078
        msgid "Sell"
        msgstr ""
        
       -#: src/gtk_client.c:951 src/gtk_client.c:1089
       +#: src/gtk_client.c:942 src/gtk_client.c:1079
        msgid "Drop"
        msgstr ""
        
       -#: src/gtk_client.c:1040
       +#: src/gtk_client.c:1031
        msgid "Buy how many?"
        msgstr ""
        
       -#: src/gtk_client.c:1042
       +#: src/gtk_client.c:1033
        msgid "Sell how many?"
        msgstr ""
        
       -#: src/gtk_client.c:1044
       +#: src/gtk_client.c:1035
        msgid "Drop how many?"
        msgstr ""
        
       -#: src/gtk_client.c:1063 src/gtk_client.c:1872 src/gtk_client.c:2047
       -#: src/gtk_client.c:2325
       +#: src/gtk_client.c:1054 src/gtk_client.c:1853 src/gtk_client.c:2028
       +#: src/gtk_client.c:2301
        msgid "Cancel"
        msgstr ""
        
       -#: src/gtk_client.c:1100
       +#: src/gtk_client.c:1090
        msgid "Buy %tde"
        msgstr ""
        
       -#: src/gtk_client.c:1101
       +#: src/gtk_client.c:1091
        msgid "Sell %tde"
        msgstr ""
        
       -#: src/gtk_client.c:1102
       +#: src/gtk_client.c:1092
        msgid "Drop %tde"
        msgstr ""
        
       -#: src/gtk_client.c:1108
       +#: src/gtk_client.c:1097
        msgid "You don't have any %tde!"
        msgstr ""
        
       -#: src/gtk_client.c:1164 src/gtk_client.c:1873
       +#: src/gtk_client.c:1145 src/gtk_client.c:1854
        msgid "_Yes"
        msgstr ""
        
       -#: src/gtk_client.c:1164 src/gtk_client.c:1873
       +#: src/gtk_client.c:1145 src/gtk_client.c:1854
        msgid "_No"
        msgstr ""
        
       -#: src/gtk_client.c:1165
       +#: src/gtk_client.c:1146
        msgid "_Attack"
        msgstr ""
        
       -#: src/gtk_client.c:1165
       +#: src/gtk_client.c:1146
        msgid "_Evade"
        msgstr ""
        
       -#: src/gtk_client.c:1183
       +#: src/gtk_client.c:1164
        msgid "Question"
        msgstr ""
        
       -#: src/gtk_client.c:1312
       +#: src/gtk_client.c:1293
        msgid "Space"
        msgstr ""
        
       -#: src/gtk_client.c:1317
       +#: src/gtk_client.c:1298
        msgid "Cash"
        msgstr ""
        
       -#: src/gtk_client.c:1322
       +#: src/gtk_client.c:1303
        msgid "Debt"
        msgstr ""
        
       -#: src/gtk_client.c:1327
       +#: src/gtk_client.c:1308
        msgid "Bank"
        msgstr ""
        
       -#: src/gtk_client.c:1342
       +#: src/gtk_client.c:1323
        msgid "Health"
        msgstr ""
        
       -#: src/gtk_client.c:1362
       +#: src/gtk_client.c:1343
        msgid "_Jet!"
        msgstr ""
        
       -#: src/gtk_client.c:1392
       +#: src/gtk_client.c:1373
        msgid "dopewars"
        msgstr ""
        
       -#: src/gtk_client.c:1474
       +#: src/gtk_client.c:1455
        msgid "Drug Dealing and Research"
        msgstr ""
        
       -#: src/gtk_client.c:1475
       +#: src/gtk_client.c:1456
        msgid "Play Testing"
        msgstr ""
        
       -#: src/gtk_client.c:1476
       +#: src/gtk_client.c:1457
        msgid "Extensive Play Testing"
        msgstr ""
        
       -#: src/gtk_client.c:1478
       +#: src/gtk_client.c:1459
        msgid "Constructive Criticism"
        msgstr ""
        
       -#: src/gtk_client.c:1480
       +#: src/gtk_client.c:1461
        msgid "Unconstructive Criticism"
        msgstr ""
        
       -#: src/gtk_client.c:1484
       +#: src/gtk_client.c:1465
        msgid "About dopewars"
        msgstr ""
        
       -#: src/gtk_client.c:1493
       +#: src/gtk_client.c:1474
        msgid ""
        "Based on John E. Dell's old Drug Wars game, dopewars is a simulation of an\n"
        "imaginary drug market.  dopewars is an All-American game which features\n"
       t@@ -1684,151 +1684,151 @@ msgid ""
        "have one month of game time to make your fortune.\n"
        msgstr ""
        
       -#: src/gtk_client.c:1501
       +#: src/gtk_client.c:1482
        #, c-format
        msgid ""
        "Version %s     Copyright (C) 1998-2000  Ben Webb ben@bellatrix.pcl.ox.ac.uk\n"
        "dopewars is released under the GNU General Public Licence\n"
        msgstr ""
        
       -#: src/gtk_client.c:1519
       +#: src/gtk_client.c:1500
        msgid ""
        "\n"
        "For information on the command line options, type dopewars -h at your\n"
        "Unix prompt. This will display a help screen, listing the available options."
        msgstr ""
        
       -#: src/gtk_client.c:1557 src/gtk_client.c:1580
       +#: src/gtk_client.c:1538 src/gtk_client.c:1561
        #, c-format
        msgid "Status: Could not connect (%s)"
        msgstr ""
        
       -#: src/gtk_client.c:1568
       +#: src/gtk_client.c:1549
        #, c-format
        msgid "Status: Attempting to contact %s..."
        msgstr ""
        
       -#: src/gtk_client.c:1628
       +#: src/gtk_client.c:1609
        #, c-format
        msgid "%d of %d"
        msgstr ""
        
       -#: src/gtk_client.c:1692 src/gtk_client.c:1733 src/gtk_client.c:1774
       +#: src/gtk_client.c:1673 src/gtk_client.c:1714 src/gtk_client.c:1755
        msgid "Server"
        msgstr ""
        
       -#: src/gtk_client.c:1693 src/gtk_client.c:1748
       +#: src/gtk_client.c:1674 src/gtk_client.c:1729
        msgid "Port"
        msgstr ""
        
       -#: src/gtk_client.c:1694
       +#: src/gtk_client.c:1675
        msgid "Version"
        msgstr ""
        
       -#: src/gtk_client.c:1695
       +#: src/gtk_client.c:1676
        msgid "Players"
        msgstr ""
        
       -#: src/gtk_client.c:1696
       +#: src/gtk_client.c:1677
        msgid "Comment"
        msgstr ""
        
       -#: src/gtk_client.c:1709
       +#: src/gtk_client.c:1690
        msgid "New Game"
        msgstr ""
        
       -#: src/gtk_client.c:1718
       +#: src/gtk_client.c:1699
        msgid "Hey dude, what's your _name?"
        msgstr ""
        
       -#: src/gtk_client.c:1740
       +#: src/gtk_client.c:1721
        msgid "Host name"
        msgstr ""
        
       -#: src/gtk_client.c:1763 src/gtk_client.c:1826
       +#: src/gtk_client.c:1744 src/gtk_client.c:1807
        msgid "_Connect"
        msgstr ""
        
       -#: src/gtk_client.c:1776 src/gtk_client.c:1797
       +#: src/gtk_client.c:1757 src/gtk_client.c:1778
        msgid "Single player"
        msgstr ""
        
       -#: src/gtk_client.c:1782
       +#: src/gtk_client.c:1763
        msgid "_Antique mode"
        msgstr ""
        
       -#: src/gtk_client.c:1789
       +#: src/gtk_client.c:1770
        msgid "_Start single-player game"
        msgstr ""
        
       -#: src/gtk_client.c:1799 src/gtk_client.c:1837
       +#: src/gtk_client.c:1780 src/gtk_client.c:1818
        msgid "Metaserver"
        msgstr ""
        
       -#: src/gtk_client.c:1816
       +#: src/gtk_client.c:1797
        msgid "_Update"
        msgstr ""
        
       -#: src/gtk_client.c:1841
       +#: src/gtk_client.c:1822
        msgid "Status: Waiting for user input"
        msgstr ""
        
       -#: src/gtk_client.c:1993
       +#: src/gtk_client.c:1974
        #, c-format
        msgid "Cash: %s"
        msgstr ""
        
       -#: src/gtk_client.c:2000
       +#: src/gtk_client.c:1981
        #, c-format
        msgid "Debt: %s"
        msgstr ""
        
       -#: src/gtk_client.c:2003
       +#: src/gtk_client.c:1984
        #, c-format
        msgid "Bank: %s"
        msgstr ""
        
       -#: src/gtk_client.c:2011
       +#: src/gtk_client.c:1992
        msgid "Pay back:"
        msgstr ""
        
       -#: src/gtk_client.c:2014
       +#: src/gtk_client.c:1995
        msgid "Deposit"
        msgstr ""
        
       -#: src/gtk_client.c:2018
       +#: src/gtk_client.c:1999
        msgid "Withdraw"
        msgstr ""
        
       -#: src/gtk_client.c:2042
       +#: src/gtk_client.c:2023
        msgid "Pay all"
        msgstr ""
        
       -#: src/gtk_client.c:2064
       +#: src/gtk_client.c:2045
        msgid "Player List"
        msgstr ""
        
       -#: src/gtk_client.c:2152
       +#: src/gtk_client.c:2133
        msgid "Talk to player(s)"
        msgstr ""
        
       -#: src/gtk_client.c:2174
       +#: src/gtk_client.c:2155
        msgid "Talk to all players"
        msgstr ""
        
       -#: src/gtk_client.c:2178
       +#: src/gtk_client.c:2159
        msgid "Message:-"
        msgstr ""
        
       -#: src/gtk_client.c:2191
       +#: src/gtk_client.c:2172
        msgid "Send"
        msgstr ""
        
       -#: src/gtk_client.c:2283
       +#: src/gtk_client.c:2263
        msgid "Spy On Player"
        msgstr ""
        
       -#: src/gtk_client.c:2285
       +#: src/gtk_client.c:2265
        msgid ""
        "Please choose the player to spy on. Your %tde will\n"
        "then offer his services to the player, and if successful,\n"
       t@@ -1837,11 +1837,11 @@ msgid ""
        "you, so any %tde or %tde that he's carrying may be lost!"
        msgstr ""
        
       -#: src/gtk_client.c:2295
       +#: src/gtk_client.c:2273
        msgid "Tip Off The Cops"
        msgstr ""
        
       -#: src/gtk_client.c:2297
       +#: src/gtk_client.c:2275
        msgid ""
        "Please choose the player to tip off the cops to. Your %tde will\n"
        "help the cops to attack that player, and then report back to you\n"
       t@@ -1849,71 +1849,71 @@ msgid ""
        "so any %tde or %tde that he's carrying may be lost!"
        msgstr ""
        
       -#: src/gtk_client.c:2339
       +#: src/gtk_client.c:2314
        msgid "Sack %Tde"
        msgstr ""
        
       -#: src/gtk_client.c:2343
       +#: src/gtk_client.c:2315
        msgid ""
        "Are you sure? (Any %tde or %tde carried\n"
        "by this %tde may be lost!)"
        msgstr ""
        
       -#: src/gtk_client.c:2366
       +#: src/gtk_client.c:2335
        msgid "Name"
        msgstr ""
        
       -#: src/gtk_client.c:2367
       +#: src/gtk_client.c:2336
        msgid "Price"
        msgstr ""
        
       -#: src/gtk_client.c:2368
       +#: src/gtk_client.c:2337
        msgid "Number"
        msgstr ""
        
       -#: src/gtk_client.c:2370
       +#: src/gtk_client.c:2339
        msgid "_Buy ->"
        msgstr ""
        
       -#: src/gtk_client.c:2371
       +#: src/gtk_client.c:2340
        msgid "<- _Sell"
        msgstr ""
        
       -#: src/gtk_client.c:2372
       +#: src/gtk_client.c:2341
        msgid "_Drop <-"
        msgstr ""
        
       -#: src/gtk_client.c:2377
       +#: src/gtk_client.c:2346
        msgid "%Tde here"
        msgstr ""
        
       -#: src/gtk_client.c:2382
       +#: src/gtk_client.c:2349
        msgid "%Tde carried"
        msgstr ""
        
       -#: src/gtk_client.c:2460
       +#: src/gtk_client.c:2425
        msgid "Change Name"
        msgstr ""
        
       -#: src/gtk_client.c:2470
       +#: src/gtk_client.c:2435
        msgid ""
        "Unfortunately, somebody else is already using \"your\" name. Please change "
        "it:-"
        msgstr ""
        
       -#: src/gtk_client.c:2507
       +#: src/gtk_client.c:2472
        msgid "**GunShop window title** %Tde"
        msgstr ""
        
       -#: src/gtk_client.c:2531
       +#: src/gtk_client.c:2496
        msgid "Done"
        msgstr ""
        
       -#: src/gtk_client.c:2564
       +#: src/gtk_client.c:2529
        msgid "Spy reports"
        msgstr ""
        
       -#: src/gtk_client.c:2630
       +#: src/gtk_client.c:2595
        msgid ""
        "No GTK+ client available - rebuild the binary passing the\n"
        "--enable-gtk-client option to configure, or use the curses\n"
       t@@ -2135,148 +2135,148 @@ msgstr ""
        msgid "(R.I.P.)"
        msgstr ""
        
       -#: src/serverside.c:1032
       +#: src/serverside.c:1031
        #, c-format
        msgid "%s: Tipoff from %s"
        msgstr ""
        
       -#: src/serverside.c:1050
       +#: src/serverside.c:1049
        msgid "One of your %tde was spying for %s.^The spy %s!"
        msgstr ""
        
       -#: src/serverside.c:1060
       +#: src/serverside.c:1056
        #, c-format
        msgid "Your spy working with %s has been discovered!^The spy %s!"
        msgstr ""
        
       -#: src/serverside.c:1083
       +#: src/serverside.c:1079
        #, c-format
        msgid " The lady next to you on the subway said,^ \"%s\"%s"
        msgstr ""
        
       -#: src/serverside.c:1086
       +#: src/serverside.c:1082
        msgid "^    (at least, you -think- that's what she said)"
        msgstr ""
        
       -#: src/serverside.c:1088
       +#: src/serverside.c:1084
        #, c-format
        msgid " You hear someone playing %s"
        msgstr ""
        
       -#: src/serverside.c:1097 src/serverside.c:1108 src/serverside.c:1119
       -#: src/serverside.c:1130
       +#: src/serverside.c:1093 src/serverside.c:1102 src/serverside.c:1111
       +#: src/serverside.c:1120
        msgid "YN^Would you like to visit %tde?"
        msgstr ""
        
       -#: src/serverside.c:1143
       +#: src/serverside.c:1131
        msgid "YN^^Would you like to hire a %tde for %s?"
        msgstr ""
        
       -#: src/serverside.c:1158
       +#: src/serverside.c:1144
        #, c-format
        msgid "AE^%s is already here!^Do you Attack, or Evade?"
        msgstr ""
        
       -#: src/serverside.c:1480
       +#: src/serverside.c:1466
        msgid "You were mugged in the subway!"
        msgstr ""
        
       -#: src/serverside.c:1491
       +#: src/serverside.c:1477
        #, c-format
        msgid "You meet a friend! He gives you %d %s."
        msgstr ""
        
       -#: src/serverside.c:1496
       +#: src/serverside.c:1482
        #, c-format
        msgid "You meet a friend! You give him %d %s."
        msgstr ""
        
       -#: src/serverside.c:1505
       +#: src/serverside.c:1491
        msgid "Sanitized away a RandomOffer"
        msgstr ""
        
       -#: src/serverside.c:1510
       +#: src/serverside.c:1496
        #, c-format
        msgid ""
        "Police dogs chase you for %d blocks! You dropped some %s! That's a drag, man!"
        msgstr ""
        
       -#: src/serverside.c:1526
       +#: src/serverside.c:1512
        #, c-format
        msgid "You find %d %s on a dead dude in the subway!"
        msgstr ""
        
       -#: src/serverside.c:1538
       +#: src/serverside.c:1524
        #, c-format
        msgid "Your mama made brownies with some of your %s! They were great!"
        msgstr ""
        
       -#: src/serverside.c:1548
       +#: src/serverside.c:1534
        msgid ""
        "YN^There is some weed that smells like paraquat here!^It looks good! Will "
        "you smoke it? "
        msgstr ""
        
       -#: src/serverside.c:1555
       +#: src/serverside.c:1541
        #, c-format
        msgid "You stopped to %s."
        msgstr ""
        
       -#: src/serverside.c:1576
       +#: src/serverside.c:1562
        #, c-format
        msgid "Would you like to buy a bigger trenchcoat for %s?"
        msgstr ""
        
       -#: src/serverside.c:1581
       +#: src/serverside.c:1567
        #, c-format
        msgid "YN^Hey dude! I'll help carry your %s for a mere %s. Yes or no?"
        msgstr ""
        
       -#: src/serverside.c:1593
       +#: src/serverside.c:1579
        #, c-format
        msgid "YN^Would you like to buy a %s for %s?"
        msgstr ""
        
       -#: src/serverside.c:1699 src/serverside.c:1792
       +#: src/serverside.c:1685 src/serverside.c:1778
        #, c-format
        msgid "%s: offer was on behalf of %s"
        msgstr ""
        
       -#: src/serverside.c:1702
       +#: src/serverside.c:1688
        #, c-format
        msgid "%s has accepted your %s!^Use the G key to contact your spy."
        msgstr ""
        
       -#: src/serverside.c:1748
       +#: src/serverside.c:1734
        msgid ""
        "You hallucinated for three days on the wildest trip you ever imagined!^Then "
        "you died because your brain disintegrated!"
        msgstr ""
        
       -#: src/serverside.c:1772
       +#: src/serverside.c:1758
        #, c-format
        msgid "Too late - %s has just left!"
        msgstr ""
        
       -#: src/serverside.c:1795
       +#: src/serverside.c:1781
        #, c-format
        msgid "%s has rejected your %s!"
        msgstr ""
        
       -#: src/serverside.c:1838
       +#: src/serverside.c:1824
        msgid "YN^Officer %%s spots you dropping %s, and chases you!"
        msgstr ""
        
       -#: src/serverside.c:1840
       +#: src/serverside.c:1826
        msgid ""
        "YN^Officer %%s and %%d of his deputies spot you dropping %s, and chase you!"
        msgstr ""
        
       -#: src/serverside.c:1999
       +#: src/serverside.c:1985
        msgid "Player removed due to idle timeout"
        msgstr ""
        
       -#: src/serverside.c:2009
       +#: src/serverside.c:1995
        msgid "Player removed due to connect timeout"
        msgstr ""
        
       t@@ -2321,114 +2321,114 @@ msgstr ""
        msgid "Do you run, or fight?"
        msgstr ""
        
       -#: src/message.c:1051
       +#: src/message.c:1050
        msgid "pitifully armed"
        msgstr ""
        
       -#: src/message.c:1052
       +#: src/message.c:1051
        msgid "lightly armed"
        msgstr ""
        
       -#: src/message.c:1053
       +#: src/message.c:1052
        msgid "moderately well armed"
        msgstr ""
        
       -#: src/message.c:1054
       +#: src/message.c:1053
        msgid "heavily armed"
        msgstr ""
        
       -#: src/message.c:1055
       +#: src/message.c:1054
        msgid "armed to the teeth"
        msgstr ""
        
       -#: src/message.c:1057
       +#: src/message.c:1056
        msgid "%s arrives with %d %tde, %s!"
        msgstr ""
        
       -#: src/message.c:1065
       +#: src/message.c:1063
        #, c-format
        msgid "%s stands and takes it"
        msgstr ""
        
       -#: src/message.c:1067
       +#: src/message.c:1065
        msgid "You stand there like a dummy."
        msgstr ""
        
       -#: src/message.c:1072
       +#: src/message.c:1070
        #, c-format
        msgid "%s has got away!"
        msgstr ""
        
       -#: src/message.c:1074
       +#: src/message.c:1072
        msgid "You got away!"
        msgstr ""
        
       -#: src/message.c:1079
       +#: src/message.c:1077
        msgid "Guns reloaded..."
        msgstr ""
        
       -#: src/message.c:1084
       +#: src/message.c:1082
        #, c-format
        msgid "%s shoots at %s... and misses!"
        msgstr ""
        
       -#: src/message.c:1087
       +#: src/message.c:1085
        #, c-format
        msgid "%s shoots at you... and misses!"
        msgstr ""
        
       -#: src/message.c:1090
       +#: src/message.c:1088
        #, c-format
        msgid "You missed %s!"
        msgstr ""
        
       -#: src/message.c:1096
       +#: src/message.c:1094
        #, c-format
        msgid "%s shoots %s dead."
        msgstr ""
        
       -#: src/message.c:1099
       +#: src/message.c:1097
        msgid "%s shoots at %s and kills a %tde!"
        msgstr ""
        
       -#: src/message.c:1104
       +#: src/message.c:1101
        #, c-format
        msgid "%s shoots at %s."
        msgstr ""
        
       -#: src/message.c:1109
       +#: src/message.c:1106
        #, c-format
        msgid "%s wasted you, man! What a drag!"
        msgstr ""
        
       -#: src/message.c:1113
       +#: src/message.c:1110
        msgid "%s shoots at you... and kills a %tde!"
        msgstr ""
        
       -#: src/message.c:1118
       +#: src/message.c:1114
        #, c-format
        msgid "%s hits you, man!"
        msgstr ""
        
       -#: src/message.c:1122
       +#: src/message.c:1118
        #, c-format
        msgid "You killed %s!"
        msgstr ""
        
       -#: src/message.c:1124
       +#: src/message.c:1120
        msgid "You hit %s, and killed a %tde!"
        msgstr ""
        
       -#: src/message.c:1129
       +#: src/message.c:1124
        #, c-format
        msgid "You hit %s!"
        msgstr ""
        
       -#: src/message.c:1132
       +#: src/message.c:1127
        msgid " You loot the body!"
        msgstr ""
        
       -#: src/message.c:1135
       +#: src/message.c:1130
        #, c-format
        msgid " (Health: %d)"
        msgstr ""
 (DIR) diff --git a/src/curses_client.c b/src/curses_client.c
       t@@ -395,16 +395,13 @@ static void DropDrugs(Player *Play) {
           int i,c,NumDrugs;
           GString *text;
           gchar *buf;
       -   gchar *tfmt,**tstr;
        
           attrset(TextAttr);
           clear_bottom();
           text=g_string_new("");
       -   tstring_fmt(&tfmt,&tstr,
       -               _("You can\'t get any cash for the following carried %tde :"),
       -               Names.Drugs);
       -   g_string_sprintf(text,tfmt,tstr[0]);
       -   tstring_free(tfmt,tstr);
       +   dpg_string_sprintf(text,
       +            _("You can\'t get any cash for the following carried %tde :"),
       +            Names.Drugs);
           mvaddstr(16,1,text->str);
           NumDrugs=0;
           for (i=0;i<NumDrug;i++) {
       t@@ -507,16 +504,13 @@ static void GiveErrand(Player *Play) {
           gchar *prstr;
           GString *text;
           Player *To;
       -   gchar *tfmt,**tstr;
        
           text=g_string_new("");
           attrset(TextAttr);
           clear_bottom();
           y=17;
       -   tstring_fmt(&tfmt,&tstr,_("Choose an errand to give one of your %tde..."),
       -               Names.Bitches);
       -   g_string_sprintf(text,tfmt,tstr[0]);
       -   tstring_free(tfmt,tstr);
       +   dpg_string_sprintf(text,_("Choose an errand to give one of your %tde..."),
       +                      Names.Bitches);
           mvaddstr(y++,1,text->str);
           attrset(PromptAttr);
           if (Play->Bitches.Carried>0) {
       t@@ -799,7 +793,6 @@ void GunShop(Player *Play) {
        /* decisions on to the server for sanity checking and implementation.  */
           int i,c,c2;
           gchar *text,*prstr;
       -   gchar *tfmt,**tstr;
        
           print_status(Play,0);
           attrset(TextAttr);
       t@@ -821,20 +814,16 @@ void GunShop(Player *Play) {
              if (c=='S' || c=='B') {
                 clear_line(22);
                 if (c=='S' && TotalGunsCarried(Play)==0) {
       -            tstring_fmt(&tfmt,&tstr,_("You don't have any %tde to sell!"),
       -                        Names.Guns);
       -            text=g_strdup_printf(tfmt,tstr[0]);
       -            tstring_free(tfmt,tstr);
       +            text=dpg_strdup_printf(_("You don't have any %tde to sell!"),
       +                                   Names.Guns);
                    mvaddstr(22,(Width-strlen(text))/2,text); g_free(text);
                    nice_wait();
                    clear_line(23);
                    continue;
                 } else if (c=='B' && TotalGunsCarried(Play)>=Play->Bitches.Carried+2) {
       -            tstring_fmt(&tfmt,&tstr,
       +            text=dpg_strdup_printf(
                                _("You'll need more %tde to carry any more %tde!"),
                                Names.Bitches,Names.Guns);
       -            text=g_strdup_printf(tfmt,tstr[0],tstr[1]);
       -            tstring_free(tfmt,tstr);
                    mvaddstr(22,(Width-strlen(text))/2,text); g_free(text);
                    nice_wait();
                    clear_line(23);
       t@@ -855,20 +844,16 @@ void GunShop(Player *Play) {
                    if (c=='B') {
                       if (Gun[c2].Space > Play->CoatSize) {
                          clear_line(22);
       -                  tstring_fmt(&tfmt,&tstr,_("You don't have enough space to "
       -                              "carry that %tde!"),Names.Gun);
       -                  text=g_strdup_printf(tfmt,tstr[0]);
       -                  tstring_free(tfmt,tstr);
       +                  text=dpg_strdup_printf(_("You don't have enough space to "
       +                                         "carry that %tde!"),Names.Gun);
                          mvaddstr(22,(Width-strlen(text))/2,text); g_free(text);
                          nice_wait();
                          clear_line(23);
                          continue;
                       } else if (Gun[c2].Price > Play->Cash) {
                          clear_line(22);
       -                  tstring_fmt(&tfmt,&tstr,_("You don't have enough cash to buy "
       -                              "that %tde!"),Names.Gun);
       -                  text=g_strdup_printf(tfmt,tstr[0]);
       -                  tstring_free(tfmt,tstr);
       +                  text=dpg_strdup_printf(_("You don't have enough cash to buy "
       +                                         "that %tde!"),Names.Gun);
                          mvaddstr(22,(Width-strlen(text))/2,text); g_free(text);
                          nice_wait();
                          clear_line(23);
       t@@ -1201,10 +1186,8 @@ void print_status(Player *Play,char DispDrug) {
           attrset(TitleAttr);
           if (WantAntique) g_string_sprintf(text,_("Space %6d"),Play->CoatSize);
           else {
       -      tstring_fmt(&tfmt,&tstr,_("%Tde %3d  Space %6d"),Names.Bitches);
       -      g_string_sprintf(text,tfmt,tstr[0],
       -                       Play->Bitches.Carried,Play->CoatSize);
       -      tstring_free(tfmt,tstr);
       +      dpg_string_sprintf(text,_("%Tde %3d  Space %6d"),Names.Bitches,
       +                         Play->Bitches.Carried,Play->CoatSize);
           }
           mvaddstr(0,Width-2-strlen(text->str),text->str);
           print_location(Location[(int)Play->IsAt].Name);
       t@@ -1249,7 +1232,6 @@ void DisplaySpyReports(char *Data,Player *From,Player *To) {
        /* Parses details about player "From" from string "Data" and then */
        /* displays the lot, drugs and guns.                              */
           gchar *text;
       -   gchar *tfmt,**tstr;
        
           ReceivePlayerData(To,Data,From);
        
       t@@ -1257,14 +1239,12 @@ void DisplaySpyReports(char *Data,Player *From,Player *To) {
           text=g_strdup_printf(_("Spy reports for %s"),GetPlayerName(From));
           mvaddstr(17,1,text); g_free(text);
        
       -   tstring_fmt(&tfmt,&tstr,_("%Tde..."),Names.Drugs);
       -   text=g_strdup_printf(tfmt,tstr[0]);
       -   mvaddstr(19,20,text); g_free(text); tstring_free(tfmt,tstr);
       +   text=dpg_strdup_printf(_("%Tde..."),Names.Drugs);
       +   mvaddstr(19,20,text); g_free(text);
           print_status(From,1); nice_wait();
           clear_line(19);
       -   tstring_fmt(&tfmt,&tstr,_("%Tde..."),Names.Guns);
       -   text=g_strdup_printf(tfmt,tstr[0]);
       -   mvaddstr(19,20,text); g_free(text); tstring_free(tfmt,tstr);
       +   text=dpg_strdup_printf(_("%Tde..."),Names.Guns);
       +   mvaddstr(19,20,text); g_free(text);
           print_status(From,0); nice_wait();
        
           print_status(To,1); refresh();
       t@@ -1415,7 +1395,6 @@ static void Curses_DoGame(Player *Play) {
           char HaveWorthless;
           Player *tmp;
           struct sigaction sact;
       -   gchar *tfmt,**tstr;
        
           DisplayMode=DM_NONE;
           QuitRequest=FALSE;
       t@@ -1473,11 +1452,9 @@ static void Curses_DoGame(Player *Play) {
                    NumDrugsHere=0;
                    for (i=0;i<NumDrug;i++) if (Play->Drugs[i].Price>0) NumDrugsHere++;
                    clear_bottom();
       -            tstring_fmt(&tfmt,&tstr,_("Hey dude, the prices of %tde here are:"),
       -                        Names.Drugs);
       -            g_string_sprintf(text,tfmt,tstr[0]);
       +            dpg_string_sprintf(text,_("Hey dude, the prices of %tde here are:"),
       +                               Names.Drugs);
                    mvaddstr(16,1,text->str);
       -            tstring_free(tfmt,tstr);
                    i=-1;
                    for (c=0;c<NumDrugsHere;c++) {
                       if ((i=GetNextDrugIndex(i,Play))==-1) break;
 (DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c
       t@@ -288,7 +288,6 @@ void HandleClientMessage(char *pt,Player *Play) {
           gboolean Handled;
           GtkWidget *MenuItem;
           GSList *list;
       -   gchar *tfmt,**tstr;
        
           if (ProcessMessage(pt,Play,&From,&AICode,&Code,&Data,FirstClient)==-1) {
              return;
       t@@ -357,11 +356,9 @@ void HandleClientMessage(char *pt,Player *Play) {
                    tmp=(Player *)list->data;
                    tmp->Flags &= ~FIGHTING;
                 }
       -         tstring_fmt(&tfmt,&tstr,_("Jetting to %tde"),
       -                     Location[(int)Play->IsAt].Name);
       -         text=g_strdup_printf(tfmt,tstr[0]);
       +         text=dpg_strdup_printf(_("Jetting to %tde"),
       +                                Location[(int)Play->IsAt].Name);
                 PrintMessage(text); g_free(text);
       -         tstring_free(tfmt,tstr);
                 break;
              case C_ENDLIST:
                 MenuItem=gtk_item_factory_get_widget(ClientData.Menu,
       t@@ -514,7 +511,6 @@ static void CreateFightDialog() {
           GtkAdjustment *adj;
           GtkAccelGroup *accel_group;
           gchar *buf;
       -   gchar *tfmt,**tstr;
        
           FightDialog=dialog=gtk_window_new(GTK_WINDOW_DIALOG);
           gtk_signal_connect(GTK_OBJECT(dialog),"delete_event",
       t@@ -549,11 +545,9 @@ static void CreateFightDialog() {
           gtk_widget_show(hsep);
        
           hbbox=gtk_hbutton_box_new();
       -   tstring_fmt(&tfmt,&tstr,_("_Deal %Tde"),Names.Drugs);
       -   buf=g_strdup_printf(tfmt,tstr[0]);
       -   tstring_free(tfmt,tstr);
       +   buf=dpg_strdup_printf(_("_Deal %Tde"),Names.Drugs);
           button=AddFightButton(buf,accel_group,GTK_BOX(hbbox),'D');
       -   gtk_widget_show(button);
       +   gtk_widget_show(button); g_free(buf);
        
           button=AddFightButton(_("_Fight"),accel_group,GTK_BOX(hbbox),'F');
           gtk_object_set_data(GTK_OBJECT(dialog),"fight",button);
       t@@ -873,7 +867,6 @@ static void UpdateDealDialog() {
           GtkAdjustment *spin_adj;
           gint DrugInd,CanDrop,CanCarry,CanAfford,MaxDrug;
           Player *Play;
       -   gchar *tfmt,**tstr;
        
           text=g_string_new(NULL);
           DrugInd=DealDialog.DrugInd;
       t@@ -885,10 +878,8 @@ static void UpdateDealDialog() {
           gtk_label_set_text(GTK_LABEL(DealDialog.cost),text->str);
        
           CanDrop=Play->Drugs[DrugInd].Carried;
       -   tstring_fmt(&tfmt,&tstr,_("You are currently carrying %d %tde"),
       -               Drug[DrugInd].Name);
       -   g_string_sprintf(text,tfmt,CanDrop,tstr[0]);
       -   tstring_free(tfmt,tstr);
       +   dpg_string_sprintf(text,_("You are currently carrying %d %tde"),
       +                      Drug[DrugInd].Name,CanDrop);
           gtk_label_set_text(GTK_LABEL(DealDialog.carrying),text->str);
        
           CanCarry=Play->CoatSize;
       t@@ -1081,7 +1072,6 @@ void DealGuns(GtkWidget *widget,gpointer data) {
           gint row,GunInd;
           gchar *Action,*Title;
           GString *text;
       -   gchar *tfmt,**tstr;
        
           dialog=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW);
           if (data==BT_BUY) Action=_("Buy");
       t@@ -1097,38 +1087,29 @@ void DealGuns(GtkWidget *widget,gpointer data) {
           } else return;
        
           
       -   if (data==BT_BUY) tstring_fmt(&tfmt,&tstr,_("Buy %tde"),Names.Guns);
       -   else if (data==BT_SELL) tstring_fmt(&tfmt,&tstr,_("Sell %tde"),Names.Guns);
       -   else tstring_fmt(&tfmt,&tstr,_("Drop %tde"),Names.Guns);
       -   Title=g_strdup_printf(tfmt,tstr[0]);
       -   tstring_free(tfmt,tstr);
       +   if (data==BT_BUY) Title=dpg_strdup_printf(_("Buy %tde"),Names.Guns);
       +   else if (data==BT_SELL) Title=dpg_strdup_printf(_("Sell %tde"),Names.Guns);
       +   else Title=dpg_strdup_printf(_("Drop %tde"),Names.Guns);
       +
           text=g_string_new("");
        
           if (data!=BT_BUY && TotalGunsCarried(ClientData.Play)==0) {
       -      tstring_fmt(&tfmt,&tstr,_("You don't have any %tde!"),Names.Guns);
       -      g_string_sprintf(text,tfmt,tstr[0]);
       -      tstring_free(tfmt,tstr);
       +      dpg_string_sprintf(text,_("You don't have any %tde!"),Names.Guns);
              MessageBox(dialog,Title,text->str,MB_OK);
           } else if (data==BT_BUY && TotalGunsCarried(ClientData.Play) >=
                                      ClientData.Play->Bitches.Carried+2) { 
       -      tstring_fmt(&tfmt,&tstr,
       -                  _("You'll need more %tde to carry any more %tde!"),
       -                  Names.Bitches,Names.Guns);
       -      g_string_sprintf(text,tfmt,tstr[0],tstr[1]);
       -      tstring_free(tfmt,tstr);
       +      dpg_string_sprintf(text,
       +                         _("You'll need more %tde to carry any more %tde!"),
       +                         Names.Bitches,Names.Guns);
              MessageBox(dialog,Title,text->str,MB_OK);
           } else if (data==BT_BUY && Gun[GunInd].Space > ClientData.Play->CoatSize) {
       -      tstring_fmt(&tfmt,&tstr,
       -                  _("You don't have enough space to carry that %tde!"),
       -                  Names.Gun);
       -      g_string_sprintf(text,tfmt,tstr[0]);
       -      tstring_free(tfmt,tstr);
       +      dpg_string_sprintf(text,
       +                         _("You don't have enough space to carry that %tde!"),
       +                         Names.Gun);
              MessageBox(dialog,Title,text->str,MB_OK);
           } else if (data==BT_BUY && Gun[GunInd].Price > ClientData.Play->Cash) {
       -      tstring_fmt(&tfmt,&tstr,
       -                  _("You don't have enough cash to buy that %tde!"),Names.Gun);
       -      g_string_sprintf(text,tfmt,tstr[0]);
       -      tstring_free(tfmt,tstr);
       +      dpg_string_sprintf(text,_("You don't have enough cash to buy that %tde!"),
       +                         Names.Gun);
              MessageBox(dialog,Title,text->str,MB_OK);
           } else if (data==BT_SELL && ClientData.Play->Guns[GunInd].Carried == 0) {
              MessageBox(dialog,Title,_("You don't have any to sell!"),MB_OK);
       t@@ -2268,7 +2249,6 @@ void TipOff(GtkWidget *widget,gpointer data) {
        void ErrandDialog(gint ErrandType) {
           GtkWidget *dialog,*clist,*button,*vbox,*hbbox,*hsep,*label;
           gchar *text;
       -   gchar *tfmt,**tstr;
        
           dialog=gtk_window_new(GTK_WINDOW_DIALOG);
           gtk_container_set_border_width(GTK_CONTAINER(dialog),7);
       t@@ -2281,26 +2261,22 @@ void ErrandDialog(gint ErrandType) {
        
           if (ErrandType==ET_SPY) {
              gtk_window_set_title(GTK_WINDOW(dialog),_("Spy On Player"));
       -      tstring_fmt(&tfmt,&tstr,
       +      text=dpg_strdup_printf(
        _("Please choose the player to spy on. Your %tde will\n"
        "then offer his services to the player, and if successful,\n"
        "you will be able to view the player's stats with the\n"
        "\"Get spy reports\" menu. Remember that the %tde will leave\n"
        "you, so any %tde or %tde that he's carrying may be lost!"),
        Names.Bitch,Names.Bitch,Names.Guns,Names.Drugs);
       -      text=g_strdup_printf(tfmt,tstr[0],tstr[1],tstr[2],tstr[3]);
       -      tstring_free(tfmt,tstr);
              label=gtk_label_new(text); g_free(text);
           } else {
              gtk_window_set_title(GTK_WINDOW(dialog),_("Tip Off The Cops"));
       -      tstring_fmt(&tfmt,&tstr,
       +      text=dpg_strdup_printf(
        _("Please choose the player to tip off the cops to. Your %tde will\n"
        "help the cops to attack that player, and then report back to you\n"
        "on the encounter. Remember that the %tde will leave you temporarily,\n"
        "so any %tde or %tde that he's carrying may be lost!"),
        Names.Bitch,Names.Bitch,Names.Guns,Names.Drugs);
       -      text=g_strdup_printf(tfmt,tstr[0],tstr[1],tstr[2],tstr[3]);
       -      tstring_free(tfmt,tstr);
              label=gtk_label_new(text); g_free(text);
           }
        
       t@@ -2335,16 +2311,10 @@ Names.Bitch,Names.Bitch,Names.Guns,Names.Drugs);
        
        void SackBitch(GtkWidget *widget,gpointer data) {
           char *title,*text;
       -   gchar *tfmt,**tstr;
       -   tstring_fmt(&tfmt,&tstr,_("Sack %Tde"),Names.Bitch);
       -   title=g_strdup_printf(tfmt,tstr[0]);
       -   tstring_free(tfmt,tstr);
       -   tstring_fmt(&tfmt,&tstr,
       -               _("Are you sure? (Any %tde or %tde carried\n"
       -                 "by this %tde may be lost!)"),Names.Guns,
       -               Names.Drugs,Names.Bitch);
       -   text=g_strdup_printf(tfmt,tstr[0],tstr[1],tstr[2]);
       -   tstring_free(tfmt,tstr);
       +   title=dpg_strdup_printf(_("Sack %Tde"),Names.Bitch);
       +   text=dpg_strdup_printf(_("Are you sure? (Any %tde or %tde carried\n"
       +                          "by this %tde may be lost!)"),Names.Guns,
       +                          Names.Drugs,Names.Bitch);
           if (MessageBox(ClientData.window,title,text,MB_YES|MB_NO)==MB_YES) {
              SendClientMessage(ClientData.Play,C_NONE,C_SACKBITCH,NULL,NULL);
           }
       t@@ -2361,7 +2331,6 @@ void CreateInventory(GtkWidget *hbox,gchar *Objects,GtkAccelGroup *accel_group,
           gchar *titles[2][2];
           gchar *button_text[3];
           gpointer button_type[3]  = { BT_BUY, BT_SELL, BT_DROP };
       -   gchar *tfmt,**tstr;
        
           titles[0][0]=titles[1][0]=_("Name");
           titles[0][1]=_("Price");
       t@@ -2374,14 +2343,10 @@ void CreateInventory(GtkWidget *hbox,gchar *Objects,GtkAccelGroup *accel_group,
           text=g_string_new("");
        
           if (CreateHere) {
       -      tstring_fmt(&tfmt,&tstr,_("%Tde here"),Objects);
       -      g_string_sprintf(text,tfmt,tstr[0]);
       -      tstring_free(tfmt,tstr);
       +      dpg_string_sprintf(text,_("%Tde here"),Objects);
              widgets->HereFrame=frame[0]=gtk_frame_new(text->str);
           }
       -   tstring_fmt(&tfmt,&tstr,_("%Tde carried"),Objects);
       -   g_string_sprintf(text,tfmt,tstr[0]);
       -   tstring_free(tfmt,tstr);
       +   dpg_string_sprintf(text,_("%Tde carried"),Objects);
           widgets->CarriedFrame=frame[1]=gtk_frame_new(text->str);
        
           widgets->HereList=widgets->CarriedList=NULL;
 (DIR) diff --git a/src/message.c b/src/message.c
       t@@ -1045,7 +1045,6 @@ void FormatFightMessage(Player *To,GString *text,
                                int Bitches,int BitchesKilled,int ArmPercent,
                                gchar FightPoint,gboolean Loot) {
           gchar *Armament;
       -   gchar *tfmt,**tstr;
           switch(FightPoint) {
              case F_ARRIVED:
                 Armament= ArmPercent<10 ? _("pitifully armed")       :
       t@@ -1054,10 +1053,9 @@ void FormatFightMessage(Player *To,GString *text,
                           ArmPercent<80 ? _("heavily armed")         :
                                           _("armed to the teeth");
                 if (DefendName[0]) {
       -            tstring_fmt(&tfmt,&tstr,_("%s arrives with %d %tde, %s!"),
       -                        Names.Bitches);
       -            g_string_sprintfa(text,tfmt,DefendName,Bitches,tstr[0],Armament);
       -            tstring_free(tfmt,tstr);
       +            dpg_string_sprintfa(text,_("%s arrives with %d %tde, %s!"),
       +                                Names.Bitches,
       +                                DefendName,Bitches,Armament);
                 }
                 break;
              case F_STAND:
       t@@ -1096,10 +1094,9 @@ void FormatFightMessage(Player *To,GString *text,
                       g_string_sprintfa(text,_("%s shoots %s dead."),
                                         AttackName,DefendName);
                    } else if (BitchesKilled) {
       -               tstring_fmt(&tfmt,&tstr,_("%s shoots at %s and kills a %tde!"),
       -                           Names.Bitch);
       -               g_string_sprintfa(text,tfmt,AttackName,DefendName,tstr[0]);
       -               tstring_free(tfmt,tstr);
       +               dpg_string_sprintfa(text,_("%s shoots at %s and kills a %tde!"),
       +                                   Names.Bitch,
       +                                   AttackName,DefendName);
                     } else {
                       g_string_sprintfa(text,_("%s shoots at %s."),
                                         AttackName,DefendName);
       t@@ -1109,11 +1106,10 @@ void FormatFightMessage(Player *To,GString *text,
                       g_string_sprintfa(text,_("%s wasted you, man! What a drag!"),
                                         AttackName);
                    } else if (BitchesKilled) {
       -               tstring_fmt(&tfmt,&tstr,
       -                           _("%s shoots at you... and kills a %tde!"),
       -                           Names.Bitch);
       -               g_string_sprintfa(text,tfmt,AttackName,tstr[0]);
       -               tstring_free(tfmt,tstr);
       +               dpg_string_sprintfa(text,
       +                                   _("%s shoots at you... and kills a %tde!"),
       +                                   Names.Bitch,
       +                                   AttackName);
                    } else {
                       g_string_sprintfa(text,_("%s hits you, man!"),AttackName);
                    }
       t@@ -1121,10 +1117,9 @@ void FormatFightMessage(Player *To,GString *text,
                    if (Health==0 && Bitches==0) {
                       g_string_sprintfa(text,_("You killed %s!"),DefendName);
                    } else if (BitchesKilled) {
       -               tstring_fmt(&tfmt,&tstr,_("You hit %s, and killed a %tde!"),
       -                           Names.Bitch);
       -               g_string_sprintfa(text,tfmt,DefendName,tstr[0]);
       -               tstring_free(tfmt,tstr);
       +               dpg_string_sprintfa(text,_("You hit %s, and killed a %tde!"),
       +                                   Names.Bitch,
       +                                   DefendName);
                    } else {
                       g_string_sprintfa(text,_("You hit %s!"),DefendName);
                    }
 (DIR) diff --git a/src/serverside.c b/src/serverside.c
       t@@ -1013,7 +1013,6 @@ void SendEvent(Player *To) {
           Player *Play;
           GSList *list;
           gchar *prstr;
       -   gchar *tfmt,**tstr;
        
           if (!To) return;
           if (To->EventNum==E_MAX) To->EventNum=E_NONE;
       t@@ -1046,13 +1045,10 @@ void SendEvent(Player *To) {
                           brandom(0,100)<10+To->SpyList.Data[i].Turns) {
                           if (TotalGunsCarried(To) > 0) j=brandom(0,NUMDISCOVER);
                           else j=brandom(0,NUMDISCOVER-1);
       -                   tstring_fmt(&tfmt,&tstr,
       -                               _("One of your %tde was spying for %s."
       -                                 "^The spy %s!"),Names.Bitches);
       -                   text=g_strdup_printf(tfmt,tstr[0],
       -                                        GetPlayerName(To->SpyList.Data[i].Play),
       -                                        _(Discover[j]));
       -                   tstring_free(tfmt,tstr);
       +                   text=dpg_strdup_printf(
       +                        _("One of your %tde was spying for %s.^The spy %s!"),
       +                        Names.Bitches,
       +                        GetPlayerName(To->SpyList.Data[i].Play),_(Discover[j]));
                           if (j!=DEFECT) LoseBitch(To,NULL,NULL);
                           SendPlayerData(To);
                           SendPrintMessage(NULL,C_NONE,To,text);
       t@@ -1094,10 +1090,8 @@ void SendEvent(Player *To) {
                    break;
                 case E_LOANSHARK:
                    if (To->IsAt+1==LoanSharkLoc && To->Debt>0) {
       -               tstring_fmt(&tfmt,&tstr,_("YN^Would you like to visit %tde?"),
       -                           Names.LoanSharkName);
       -               text=g_strdup_printf(tfmt,tstr[0]);
       -               tstring_free(tfmt,tstr);
       +               text=dpg_strdup_printf(_("YN^Would you like to visit %tde?"),
       +                                      Names.LoanSharkName);
                       SendQuestion(NULL,C_ASKLOAN,To,text);
                       g_free(text);
                       return;
       t@@ -1105,10 +1099,8 @@ void SendEvent(Player *To) {
                    break;
                 case E_BANK:
                    if (To->IsAt+1==BankLoc) {
       -               tstring_fmt(&tfmt,&tstr,_("YN^Would you like to visit %tde?"),
       -                           Names.BankName);
       -               text=g_strdup_printf(tfmt,tstr[0]);
       -               tstring_free(tfmt,tstr);
       +               text=dpg_strdup_printf(_("YN^Would you like to visit %tde?"),
       +                                      Names.BankName);
                       SendQuestion(NULL,C_ASKBANK,To,text);
                       g_free(text);
                       return;
       t@@ -1116,10 +1108,8 @@ void SendEvent(Player *To) {
                    break;
                 case E_GUNSHOP:
                    if (To->IsAt+1==GunShopLoc && !Sanitized && !WantAntique) {
       -               tstring_fmt(&tfmt,&tstr,_("YN^Would you like to visit %tde?"),
       -                           Names.GunShopName);
       -               text=g_strdup_printf(tfmt,tstr[0]);
       -               tstring_free(tfmt,tstr);
       +               text=dpg_strdup_printf(_("YN^Would you like to visit %tde?"),
       +                                      Names.GunShopName);
                       SendQuestion(NULL,C_ASKGUNSHOP,To,text);
                       g_free(text);
                       return;
       t@@ -1127,10 +1117,8 @@ void SendEvent(Player *To) {
                    break;
                 case E_ROUGHPUB:
                    if (To->IsAt+1==RoughPubLoc && !WantAntique) {
       -               tstring_fmt(&tfmt,&tstr,_("YN^Would you like to visit %tde?"),
       -                           Names.RoughPubName);
       -               text=g_strdup_printf(tfmt,tstr[0]);
       -               tstring_free(tfmt,tstr);
       +               text=dpg_strdup_printf(_("YN^Would you like to visit %tde?"),
       +                                      Names.RoughPubName);
                       SendQuestion(NULL,C_ASKPUB,To,text);
                       g_free(text);
                       return;
       t@@ -1139,12 +1127,10 @@ void SendEvent(Player *To) {
                 case E_HIREBITCH:
                    if (To->IsAt+1==RoughPubLoc && !WantAntique) {
                       To->Bitches.Price=brandom(Bitch.MinPrice,Bitch.MaxPrice);
       -               tstring_fmt(&tfmt,&tstr,
       +               text=g_strdup_printf(
                                   _("YN^^Would you like to hire a %tde for %s?"),
       -                           Names.Bitch);
       -               text=g_strdup_printf(tfmt,tstr[0],
       -                                    prstr=FormatPrice(To->Bitches.Price));
       -               tstring_free(tfmt,tstr);
       +                           Names.Bitch,
       +                           prstr=FormatPrice(To->Bitches.Price));
                       SendQuestion(NULL,C_ASKBITCH,To,text);
                       g_free(text); g_free(prstr);
                       return;
 (DIR) diff --git a/src/tstring.c b/src/tstring.c
       t@@ -108,3 +108,138 @@ void tstring_free(gchar *tformat,gchar **tstrings) {
           for (pt=tstrings;*pt;pt++) g_free(*pt);
           g_free(tstrings);
        }
       +
       +void GetNextFormat(int Index,gchar *str,int *StartPos,
       +                   int *EndPos,int *ArgNum,char *Code,gboolean *Caps) {
       +   int anum;
       +   *StartPos=*EndPos=*ArgNum=0;
       +   Code[0]=0;
       +   anum=0;
       +   while (str[Index]) {
       +      if (str[Index]=='%') {
       +         *StartPos=*EndPos=Index++;
       +         while (str[Index]>='0' && str[Index]<='9') {
       +            anum=anum*10+str[Index]-'0';
       +            Index++;
       +         }
       +         if (str[Index]=='$') {
       +            *EndPos=Index++; *ArgNum=anum;
       +         }
       +         if ((str[Index]=='T' || str[Index]=='t') && Index+2<strlen(str)) {
       +            *Caps=(str[Index]=='T');
       +            Code[0]=str[Index+1];
       +            Code[1]=str[Index+2];
       +            Code[2]=0;
       +            *EndPos=Index+2;
       +         }
       +         return;
       +      } else Index++;
       +   }
       +}
       +
       +void GetNextTString(gchar *str,int index,gchar *Code,gboolean *Caps,
       +                    int *NumArg,int *StartPos,int *EndPos) {
       +   int i;
       +   *StartPos=*EndPos=0;
       +   i=index;
       +   while (str[i]) {
       +      if (str[i]=='%') {
       +         i++;
       +         if ((str[i]=='T' || str[i]=='t')
       +             && i+2<strlen(str)) {
       +            (*NumArg)++;
       +            *StartPos=i-1;
       +            *Caps = (str[i]=='T');
       +            Code[0]=str[i+1];
       +            Code[1]=str[i+2];
       +            Code[2]='\0';
       +            i+=3;
       +            *EndPos=i;
       +            return;
       +         }
       +      } else i++;
       +   }
       +}
       +
       +int SkipNextTString(gchar *str,int index) {
       +   gchar Code[3];
       +   gboolean Caps;
       +   int NumArg,StartPos,EndPos;
       +   GetNextTString(str,index,Code,&Caps,&NumArg,&StartPos,&EndPos);
       +   return EndPos;
       +}
       +
       +void SubstNextTString(GString *string,int *NumArg,GPtrArray *strs) {
       +   gchar Code[3];
       +   gboolean Caps;
       +   int StartPos,EndPos;
       +   gchar *str,*tstr;
       +
       +   GetNextTString(string->str,0,Code,&Caps,NumArg,&StartPos,&EndPos);
       +   if (EndPos!=0 && *NumArg>=1 && *NumArg<=strs->len) {
       +      str=(gchar *)g_ptr_array_index(strs,*NumArg-1);
       +      tstr=GetTranslatedString(str,Code,Caps);
       +      g_string_erase(string,StartPos,EndPos-StartPos);
       +      g_string_insert(string,StartPos,tstr);
       +      g_free(tstr);
       +   }
       +}
       +
       +gchar *HandleTFmt(gchar *format, va_list args) {
       +   GString *string;
       +   gchar *retstr;
       +   GPtrArray *tstrs;
       +   int i,numtstr,NumArg;
       +
       +   string=g_string_new(format);
       +   tstrs=g_ptr_array_new();
       +   i=numtstr=0;
       +   while (1) {
       +      i=SkipNextTString(string->str,i);
       +      if (i!=0) numtstr++; else break;
       +   }
       +   for (i=0;i<numtstr;i++) {
       +      g_ptr_array_add(tstrs,(gpointer)va_arg(args,char *));
       +   }
       +   NumArg=0;
       +   for (i=0;i<numtstr;i++) {
       +      SubstNextTString(string,&NumArg,tstrs);
       +   }
       +   retstr=string->str;
       +   g_ptr_array_free(tstrs,FALSE);
       +   g_string_free(string,FALSE);
       +   return retstr;
       +}
       +
       +gchar *dpg_strdup_printf(gchar *format, ...) {
       +   va_list ap;
       +   gchar *newfmt,*retstr;
       +   va_start(ap,format);
       +   newfmt=HandleTFmt(format,ap);
       +   retstr=g_strdup_vprintf(newfmt,ap);
       +   g_free(newfmt);
       +   va_end(ap);
       +   return retstr;
       +}
       +
       +void dpg_string_sprintf(GString *string, gchar *format, ...) {
       +   va_list ap;
       +   gchar *newfmt,*retstr;
       +   va_start(ap,format);
       +   newfmt=HandleTFmt(format,ap);
       +   retstr=g_strdup_vprintf(newfmt,ap);
       +   g_string_assign(string,retstr);
       +   g_free(newfmt); g_free(retstr);
       +   va_end(ap);
       +}
       +
       +void dpg_string_sprintfa(GString *string, gchar *format, ...) {
       +   va_list ap;
       +   gchar *newfmt,*retstr;
       +   va_start(ap,format);
       +   newfmt=HandleTFmt(format,ap);
       +   retstr=g_strdup_vprintf(newfmt,ap);
       +   g_string_append(string,retstr);
       +   g_free(newfmt); g_free(retstr);
       +   va_end(ap);
       +}
 (DIR) diff --git a/src/tstring.h b/src/tstring.h
       t@@ -30,4 +30,8 @@
        void tstring_fmt(gchar **tformat,gchar ***tstrings,char *OrigFormat, ...);
        void tstring_free(gchar *tformat,gchar **tstrings);
        
       +gchar *dpg_strdup_printf(gchar *format, ...);
       +void dpg_string_sprintf(GString *string, gchar *format, ...);
       +void dpg_string_sprintfa(GString *string, gchar *format, ...);
       +
        #endif /* __TSTRING_H__ */