diff --git a/GNUmakef.def b/GNUmakef.def index 9377f52..0d5cc93 100644 --- a/GNUmakef.def +++ b/GNUmakef.def @@ -8,7 +8,7 @@ SHELL=bash EXEEXT=.exe OBJEXT=.o LIBEXT=.a -#CC=gcc -Zomf -Zcrtdll +#CC=gcc -Zomf #AR=emxomfar #PLATFORM=emx #SHELL=bash @@ -59,8 +59,8 @@ endif # force not to use coprocessor features in DOS, if you have one you may remove this ifeq ($(PLATFORM),djg) -CFLAGS+=-m386 -mno-80387 -mno-fp-ret-in-387 -mno-fancy-math-387 -LNKFLAGS+=-lemu +CFLAGS+=-m386 +LNKFLAGS+=-lwmemu endif BIN=bin diff --git a/GNUmakef.prg b/GNUmakef.prg index 93106e1..104bed8 100644 --- a/GNUmakef.prg +++ b/GNUmakef.prg @@ -10,7 +10,7 @@ else LIBS=$(addprefix -l,$(GLIBS)) endif LIBS+=$(STDLIBS) -FGLIBS=$(addprefix $(FLIBPATH)/lib, $(addsuffix .a, $(GLIBS))) +FGLIBS=$(addprefix $(FLIBPATH)/lib, $(addsuffix $(LIBEXT), $(GLIBS))) $(TOP)/$(BIN)/$(SHORTTARGET)$(PLATFORM)$(EXEEXT): $(OBJS) $(FGLIBS) $(ADDS) @echo -n Linking $(TARGET)... diff --git a/docs/notework.txt b/docs/notework.txt index d61e5d6..a797385 100644 --- a/docs/notework.txt +++ b/docs/notework.txt @@ -9,9 +9,70 @@ ______________________________________________________________________ ______________________________________________________________________ - Notes for GoldED+ 1.1.5, February xx 2001 + Notes for GoldED+ 1.1.5, March xx 2001 ______________________________________________________________________ +- Fixed small bug in parser. + ++ Added new keyword INTERNETGATEEXP to configure expansion of UUCP + gated e-mail into To: line: + + INTERNETGATEEXP Address // To: bob@fisher.com + INTERNETGATEEXP Address,Name // To: bob@fisher.com (Bob Fisher) + INTERNETGATEEXP Name,Address // To: "Bob Fisher" + + Other combinations treated as "Address, Name". Default assignment + "Name, Address". + +- Addressbook now more accurate with e-mail addresses in FTN areas, + it no longer update FTN address with Internetgate (define it in + the group if it is different from default) and put Internet address + in corresponding field. + +- Template keyword now properly extracts filename within random system + groups. + ++ @cfrom and @cto macroses added. Same as @ofrom and @oto but for + current message. + +! If @ofrom or @oto is about to expanding to nothing they expanded to + real name of person (if available). + +! @*addr macroses now expanded by default without domain, if you ever + need 5d addresses use @*addr{domain} scheme. + +- Fixed @ofrom, @oto recoding. + +! Header of message saved from Golded now defined in template, default + assignment (for built-in template, not for yours): + + @header= @oecho (@caddr) @align{79}{=} + @header Msg : @msgno of @msgs@align{44}@attr + @header From : @_oname @_oaddr @odate @otime + @header To : @dname + @header Subj : @subject + @header@align{79}{=} + + String beyond @header used when you asked for a header. You may also + use @write as prefix to store something special if you asked for a + message body (with or without header), though have no idea when + @write may be useful except of changing first line of template to: + + @write= @oecho (@caddr) @align{79}{=} + ++ Added new macroses: + + @msgno current message number in messagebase + @msgs number of messages in current messagebase + @attr attribute string + @align{pos}{char} align to `pos' with `char' + +- Fixed bug in expanding fixed lenght macroses. + +- Removed useless macroses: @serialno, @os2slash. + ++ Search speed significantly improved in Win32 version. + ! Window size in Win32 version now calculated from different parameters, you may need to adjust screen properties before running GoldED+ (especially in Win2k with it's defaults 300 rows :)). Though diff --git a/docs/rusfaq.txt b/docs/rusfaq.txt index 42d6c0a..0a777b4 100644 --- a/docs/rusfaq.txt +++ b/docs/rusfaq.txt @@ -1,131 +1,153 @@ This file mostly duplicates tips.txt but also answers on some russian specific -questions. The codepage used is koi8-r. Please read this before asking for +questions. The codepage used is cp866. Please read this before asking for assistance! >============================================================================== - F.A.Q. ╨╧ ╔╙╨╧╠╪┌╧╫┴╬╔└ GoldED+ ╫ ╦┴╥╘╔╬╦┴╚ (tm) + F.A.Q. по использованию GoldED+ в картинках (tm) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ->є╧─┼╥╓┴╬╔┼ +>Содержание >~~~~~~~~~~ - 1. ї╙╘┴╬╧╫╦┴ GoldED+. - 2. ь╧╦┴╠╪╬┘┼ ╒╙╘┴╬╧╫╦╔. - 3. ·┴═┼╬┴ SoftCR (╥╒╙╙╦╧╩ ┬╒╦╫┘ "H"), ╦┴╦ ▄╘╧ ─┼╠┴┼╘╙╤ ╫ GoldED+ ╨╥┴╫╔╠╪╬╧. - 4. э┴╦╥╧╙┘ ╔╠╔ ╦┴╦ Hх ╬┴─╧ ═┼╬╤╘╪ ╥╒╙╙╦╒└ ┬╒╦╫╒ "H". - 5. є╘╔╠┼╫┘┼ ╦╧─┘. + 1. Установка GoldED+. + 2. Локальные установки. + 3. Замена SoftCR (русской буквы "H"), как это делается в GoldED+ правильно. + 4. Макросы или как HЕ надо менять русскую букву "H". + 5. Стилевые коды. 6. CUA. - 7. K┴╦ ╬┼ ╦╫╧╘╔╘╪ ╘╔╥╠┴╩╬ ╔ ╧╥╔─╓╔╬ ╫ GoldED+. - 8. ч─┼ ╫┌╤╘╪ GoldED+. - 9. Ё╧╔╙╦ ╙╠╧╫: ▐╘╧-╘╧ ╬┼ ╘┴╦... -10. ■╘╧ ┌┴ ╠┼╫╔┌╬┴ ╫ ┴─╥┼╙┴╚ ╦╥╧╙╙╨╧╙╘╧╫, ╬┴▐╔╬┴╤ ╙ 1.1.3? -11. с ╨╧▐┼═╒ GoldED+ ╘┴╦ ╦╥╔╫╧ ╨╧──┼╥╓╔╫┴┼╘ hpt-█╬┘┼ ╦╧╬╞╔╟╔ (╬┼ ╨╧─ UNIX┴═╔)? -12. Ё╧▐┼═╒ ╬┼ ╫╫╧─╔╘╙╤ ╥╒╙╙╦┴╤ "№" ╨╧─ Win95? -13. Backspace ╫ Linux'e -14. с ┌┴▐┼═ ═╬┼ ▄╘╧╘ ╥┼─┴╦╘╧╥ ╬╒╓┼╬? ї я─╔╬╬┴ ┬┘╠╧ ╠╒▐█┼! -15. с ╫╧╘ ╤ ╚╧▐╒ ┴╬┴╠╧╟ MCITY ╫╙╘╥╧┼╬╬┘╩. -16. Ї╔╨┴ ▄╘┴... с ╨╔╙┴╘╪ ╦╒─┴ ┴╫╘╧╥╒? ;-) + 7. Kак не квотить тирлайн и ориджин в GoldED+. + 8. Где взять GoldED+. + 9. Поиск слов: что-то не так... +10. Что за левизна в адресах кросспостов, начиная с 1.1.3? +11. А почему GoldED+ так криво поддерживает hpt-шные конфиги (не под UNIXами)? +12. Почему не вводится русская "Э" под Win95? +13. Backspace в Linux'e +14. А зачем мне этот редактор нужен? У Одинна было лучше! +15. А вот я хочу аналог MCITY встроенный. +16. $^%$^*! Что ты сделал с сохранением сообщений в 1.1.5? +17. Типа эта... А писать куда автору? ;-) >============================================================================== -*Q:* с ╫╧╘ ╤ ─╧╙╘┴╠ GoldED+, ╦┴╦ ┼╟╧ ╙╘┴╫╔╘╪-╘╧? -*A:* Ё╥╧▐╔╘┴╩╘┼ Notework.txt, ╘┴═ ═╬╧╟╧ ╔╬╘┼╥┼╙╬╧╟╧ ╬┴╨╔╙┴╬╧. я╙╧┬┼╬╬╧ ╨╧╠┼┌╬╧ - ┼╟╧ ▐╔╘┴╘╪, ┼╙╠╔ ▐╘╧-╘╧ ╥┴┬╧╘┴┼╘ ╬┼ ╘┴╦. х╙╠╔ ╬┼ ┌╬┴┼╘┼ ┴╬╟╠╔╩╙╦╧╟╧, ╬╧ - ┌╬┴┼╘┼, ╦┴╦╧┼ ╦╠└▐┼╫╧┼ ╙╠╧╫╧ ╟╠└▐╔╘ - ╨╧╔▌╔╘┼ ┼╟╧, 3 ╨╥┼─╠╧╓┼╬╔╤ ╨┼╥┼╫┼╙╘╔ - ╙╧ ╙╠╧╫┴╥┼═ ╫╙┼╟─┴ ═╧╓╬╧. щ ╫╧╧┬▌┼: ▐╔╘┴╩╘┼ ─╧╦╔ - ╧╬╔ ╥╒╠┼┌. +*Q:* А вот я достал GoldED+, как его ставить-то? +*A:* Прочитайте Notework.txt, там много интересного написано. Особенно полезно + его читать, если что-то работает не так. Если не знаете английского, но + знаете, какое ключевое слово глючит - поищите его, 3 предложения перевести + со словарем всегда можно. И вообще: читайте доки - они рулез. -*Q:* с ╒ ═┼╬╤ ╥┼╟╔╙╘╥╧╬┼┌┴╫╔╙╔═┘╩ ╨╧╔╙╦ ╟╠└▐╔╘ ╔ ╫╥┼═╤ ╫ e-mail'┴╚ ╔ TZUTC - ╬┼╨╥┴╫╔╠╪╬╧┼. -*A:* ■╘╧┬┘ GoldED+ ╟╠└▐╔╠ ╨╧═┼╬╪█┼, ╬┴─╧ ╬┴╙╘╥╧╔╘╪ ╥┼╟╔╧╬┴╠╪╬┘┼ ╒╙╘┴╬╧╫╦╔: - ─╠╤ DPMI32: country.sys, ╨┼╥┼═┼╬╬┴╤ TZ - ─╠╤ Win32: control panel - ─╠╤ OS/2: [╬┼ ┌╬┴└ ╟─┼ ╬┴╙╘╥┴╔╫┴┼╘╙╤, ╬╧ ╥┼╟╔╧╬┴╠╪╬┘┼ ╬┴╙╘╥╧╩╦╔ - ╙╫╧╔], - ╨┼╥┼═┼╬╬┴╤ TZ - ─╠╤ UNIX: ╨┼╥┼═┼╬╬┘┼ LANG ╔ TZ. +*Q:* А у меня регистронезависимый поиск глючит и время в e-mail'ах и TZUTC + неправильное. +*A:* Чтобы GoldED+ глючил поменьше, надо настроить региональные установки: + для DPMI32: country.sys, переменная TZ + для Win32: control panel + для OS/2: [не знаю где настраивается, но региональные настройки - свои], + переменная TZ + для UNIX: переменные LANG и TZ. -*Q:* с ╦┴╦ ╓┼ ╫╙┼-╘┴╦╔ ╨╥┴╫╔╠╪╬╧ ═┼╬╤╘╪ SoftCR ╨╥╔ ╬┴┬╧╥┼ ╔ ╔═┼╘╪ ╙ ▄╘╔═ - ═┼╬╪█┼ ╫╙┼╟╧ ╨╥╧┬╠┼═? -*A:* ■╘╧┬┘ ┌┴═┼╬╤╘╪ SoftCR (─╠╤ ▐┴╩╬╔╦╧╫ - ▄╘╧ ┬╧╠╪█┴╤ ╥╒╙╙╦┴╤ ┬╒╦╫┴ "H") - ▐┼═-╬╔┬╒─╪ ╬┴─╧ ╨╧╠╪┌╧╫┴╘╪╙╤ ╦╠└▐┼╫┘═ ╙╠╧╫╧═ EDITSOFTCRXLAT. Ё╥╔ ▄╘╧═ - юхятшяфщэя (╙ ╫┼╥╙╔╔ 1.1.3) ╔═┼╘╪ DISPSOFTCR ╧╨╥┼─┼╠┼╬╬╧┼ ╫ yes. ў╙┼ - ╧╙╘┴╠╪╬┘┼ ╫┴╥╔┴╬╘┘ ┌┴═┼╬┘ GoldED+ ╬┼ ╬╒╓╬┘, ┴ ·сэхюс ■хЄх· MACRO ╔ - ╫╧╫╙┼ ЁЄяЇщўяЁяыс·сюс! (╙═. ╙╠┼─╒└▌╔╩ ╫╧╨╥╧╙). +*Q:* А как же все-таки правильно менять SoftCR при наборе и иметь с этим + меньше всего проблем? +*A:* Чтобы заменять SoftCR (для чайников - это большая русская буква "H") + чем-нибудь надо пользоваться ключевым словом EDITSOFTCRXLAT. При этом + НЕОБХОДИМО (с версии 1.1.3) иметь DISPSOFTCR определенное в yes. Все + остальные варианты замены GoldED+ не нужны, а ЗАМЕНА ЧЕРЕЗ MACRO и + вовсе ПРОТИВОПОКАЗАНА! (см. следующий вопрос). -*Q:* с ╨╧▐┼═╒ ╘┴╦ ╙╘╥┴╬╬╧ ╥┴┬╧╘┴┼╘ ┌┴═┼╬┴ ▐┼╥┼┌ MACRO, EDITMACRO, ╔ ╨╥.? -*A:* є╔═╫╧╠┘ ╔┌ ╫┼╥╚╬┼╩ ▐┴╙╘╔ ASCII-╘┴┬╠╔├┘ (─╠╤ ▐┴╩╬╔╦╧╫ - ╥╒╙╙╦╔┼ ┬╒╦╫┘) ╫ - ═┴╦╥╧╨╧─╙╘┴╬╧╫╦┴╚ ╬┘╬▐┼ ╥┴╙├┼╬╔╫┴└╘╙╤ ╦┴╦ ╥┼╟╔╙╘╥╧╬┼┌┴╫╔╙╔═┘┼, ╦┴╦ ▄╘╧ - ╫╙┼╟─┴ ┬┘╠╧ ─╠╤ ╙╔═╫╧╠╧╫ ╬╔╓╬┼╩ ╨╧╠╧╫╔╬┘ ASCII-╘┴┬╠╔├┘ (╠┴╘╔╬╙╦╔╚ ┬╒╦╫). - Ё╥╧┬╠┼═┴ ═┴╠┼╬╪╦╧╩ ╥╒╙╙╦╧╩ "╬" ╥┴╙╘┼╘ ╧╘╙└─┴. +*Q:* А почему так странно работает замена через MACRO, EDITMACRO, и пр.? +*A:* Символы из верхней части ASCII-таблицы (для чайников - русские буквы) в + макроподстановках нынче расцениваются как регистронезависимые, как это + всегда было для символов нижней половины ASCII-таблицы (латинских букв). + Проблема маленькой русской "н" растет отсюда. -*Q:* с ╦┴╦ ╔┌═┼╬╔╘╪ ╨╧╫┼─┼╬╔┼ ╙╘╔╠┼╫┘╚ ╦╧─╧╫? -*A:* GoldED+ ╨╧-╒═╧╠▐┴╬╔└ ╨╧╦┴┌┘╫┴┼╘ ╙╔═╫╧╠┘ ╫┘─┼╠┼╬╔╤ ╙╘╔╠┼╩ ╘┴╦ ╓┼, ╦┴╦ ▄╘╧ - ┬┘╠╧ ╫ GoldED 2.50. х╙╠╔ ▄╘╧ ╬┼ ╒╙╘╥┴╔╫┴┼╘, ╘╧ ╨╧▐╔╘┴╩╘┼ ╨╥╧ ╦╠└▐┼╫╧┼ - ╙╠╧╫╧ STYLECODES. +*Q:* А как изменить поведение стилевых кодов? +*A:* GoldED+ по-умолчанию показывает символы выделения стилей так же, как это + было в GoldED 2.50. Если это не устраивает, то почитайте про ключевое + слово STYLECODES. -*Q:* с ╟─┼ ╧┬┼▌┴╬╬╧┼ CUA? -*A:* ■╘╧┬┘ ╔╙╨╧╠╪┌╧╫┴╘╪ CUA ╨╥╔ ╫┘╦╠└▐┼╬╬╧═ KEYBDEFAULTS ╬┴─╧ ┼╟╧ ╧╨╥┼─┼╠╔╘╪. - ш╧╘╤ ╫╙╤╦╔┼ #Left ╬┼ ╧╨╔╙┴╬┘ ╫ ─╧╦╒═┼╬╘┴├╔╔, ╧╬╔ ┼╙╘╪ :) ў ь╔╬╒╦╙┼ - ╥┴┬╧╘┴┼╘ ╘╧╠╪╦╧ ╬┴ ╦╧╬╙╧╠╔, ─┴ ╔ ╘╧ ╬┼ ╫╙┼╟─┴ (╘╧▐╬╧ ╬┼ ╥┴┬╧╘┴┼╘, ┼╙╠╔ - ┌┴╨╒╙╦┴╘╪ ╔┌-╨╧─ midnight commander'┴). +*Q:* А где обещанное CUA? +*A:* Чтобы использовать CUA при выключенном KEYBDEFAULTS надо его определить. + Хотя всякие #Left не описаны в документации, они есть :) В Линуксе + работает только на консоли, да и то не всегда (точно не работает, если + запускать из-под midnight commander'а). -*Q:* с ▐╘╧ ┌┴ ╨╥╧┬╠┼═┘ ╙ INVALIDATE "" ""? Ё╧▐┼═╒ ╫╙┼-╥┴╫╬╧ ╦╫╧╘╔╘╙╤? -*A:* №╘╧ ╧╨╤╘╪ ╬┼─╧▐╔╘┴╬╬┴╤ ─╧ ╦╧╬├┴ ─╧╦╒═┼╬╘┴├╔╤. щ╙╨╧╠╪┌╒╩╘┼ ╦╠└▐┼╫╧┼ ╙╠╧╫╧ - QUOTECTRL, ╦╧╘╧╥╧┼, ╦╙╘┴╘╔, ═╧╓┼╘ ╔╙╨╧╠╪┌╧╫┴╘╪╙╤ ╔ ╫ Random System Group. - Ї╔╥╠┴╩╬┘ ╨╥┴╫╔╠╪╬╧ ╔╬╫┴╠╔─╔╥╒└╘╙╤ ╨╧ ╘╥┼═ ═╔╬╒╙┴═, GoldED+ ╙┴═ ┌╬┴┼╘, ▐╘╧ - ╨╧╙╠┼ ╬╔╚ ─╧╠╓┼╬ ┬┘╘╪ ╨╥╧┬┼╠ ╔╠╔ ╨┼╥┼╫╧─ ╙╘╥╧╦╔. +*Q:* А что за проблемы с INVALIDATE "" ""? Почему все-равно квотится? +*A:* Это опять недочитанная до конца документация. Используйте ключевое слово + QUOTECTRL, которое, кстати, может использоваться и в Random System Group. + Тирлайны правильно инвалидируются по трем минусам, GoldED+ сам знает, что + после них должен быть пробел или перевод строки. -*Q:* с ╟─┼ ═╧╓╬╧ ╫┌╤╘╪ GoldED+? с ═╧╓╬╧ ╨╧╔═┼╘╪ ╔╙╚╧─╬╔╦╔? с ▐┼═ ╨╧╘╧═ - ╙╧┬╔╥┴╘╪? -*A:* Є╧─╔╬┴ GoldED+ ╬┴╚╧─╔╘╙╤ ╬┴ http://asa.i-connect.com. Ї┴═ ╓┼ ╫┘ ═╧╓┼╘┼ - ╬┴╩╘╔ ╙╨╔╙╧╦ ═╔╥╥╧╥╧╫ ╔ ╫┌╤╘╪ ╔╙╚╧─╬╔╦╔. є╧┬╔╥┴╘╪ ╬┴─╧ GNU C/C++ (╬┼ ╬┴─╧ - ┬╥┴╘╪ ╬┼▐╘╧ ─╥┼╫╬┼┼ 2.8.x, ╠╒▐█┼ ╫╙┼╟╧ ╦┴╦╒└-╬╔┬╒─╪ ╙╫┼╓╒└ ╫┼╥╙╔└) ╔ ┼╟╧ - ╨╥╧╔┌╫╧─╬┘═╔ (djgpp, emx, mingw32). ф╥╒╟╔┼ ╦╧═╨╔╠╤╘╧╥┘ ┬╧╠┼┼ ╬┼ - ╨╧──┼╥╓╔╫┴└╘╙╤. ■╘╧┬┘ ╫╙┼ ╦╧═╨╔╠╔╥╧╫┴╠╧╙╪ ┬┼┌ ╦┴╦╔╚-╠╔┬╧ ╨╥╧┬╠┼═ - ┬┼╥╔╘┼ - ▐╘╧-╘╧ ╬╧╫┼┼ gcc 2.95 (╔╠╔ ╘┼ egcs, ╫ ╦╧╘╧╥┘╚ #pragma implementaion, - #pragma interface ╒╓┼ ┬┘╠╔ obsolete). ў╧╫╙┼ ╬┼ ╬┴─╧ ╦╧═╨╔╠╔╥╧╫┴╘╪ ╫╙┼ - ╦╧═┴╬─╧╩ "make 2>&1 | mail -s VERSION asa@eed.miee.ru", ╫╙┼ ╥┴╫╬╧ ╤ ▄╘╧ - ▐╔╘┴╘╪ ╬┼ ┬╒─╒ - ═╬┼ ╠┼╬╪ ╥┴┌┬╔╥┴╘╪ ▄╘╧╘ ╙╨┴═. +*Q:* А где можно взять GoldED+? А можно поиметь исходники? А чем потом + собирать? +*A:* Родина GoldED+ находится на http://asa.i-connect.com. Там же вы можете + найти список мирроров и взять исходники. Собирать надо GNU C/C++ (не надо + брать нечто древнее 2.8.x, лучше всего какую-нибудь свежую версию) и его + производными (djgpp, emx, mingw32). Другие компиляторы более не + поддерживаются. Чтобы все компилировалось без каких-либо проблем - берите + что-то новее gcc 2.95 (или те egcs, в которых #pragma implementaion, + #pragma interface уже были obsolete). Вовсе не надо компилировать все + командой "make 2>&1 | mail -s VERSION asa@eed.miee.ru", все равно я это + читать не буду - мне лень разбирать этот спам. -*Q:* с ╦┴╦-╘╧ ╨╧╔╙╦ ╬┼╘╥╔╫╔┴╠╪╬╧ ╥┴┬╧╘┴┼╘... -*A:* с ╫┘ ╒╫┼╥┼╬┘, ▐╘╧ ╨╥╧▐╔╘┴╠╔ Notework.txt ─╧ ╨╥┼─┘─╒▌┼╩ ╫┼╥╙╔╔, ╫ ╦╧╘╧╥╧╩ - ╫╙┼ ╥┴┬╧╘┴╠╧? H┴▐╔╬┴╤ ╙ 3.00b4 ╫╙┼ ╙╔╠╪╬╧ ╨╧═┼╬╤╠╧╙╪. K ╘╧═╒, ▐╘╧ ╘┴═ - ╧╨╔╙┴╬╧, ═╧╓╬╧ ─╧┬┴╫╔╘╪, ▐╘╧ GoldED+ ╨╥┴╫╔╠╪╬╧ ╨╧╬╔═┴┼╘ ╨╧╔╙╦ ╦╧═┬╔╬┴├╔╩ - ╘╔╨┴ "A & B | C & D & E" ╙ ╨╥╔╧╥╔╘┼╘╧═ & ╬┴─ | ╔ ▐╘╧ ╥╒╙╙╦╔┼ ╙╠╧╫┴ ═╧╓╬╧ - ╔╙╦┴╘╪ ╘┴╦╔═╔ ╦╧═┬╔╬┴├╔╤═╔: "?r [╨n][╥p][╔u][╫B][┼E][╘T]", ╟─┼ ╨┼╥╫┴╤ - ┬╒╦╫┴ ╥╒╙╙╦┴╤, ╫╘╧╥┴╤ ╠┴╘╔╬╙╦┴╤ (╦┴╫┘▐╦╔ ╫╫╧─╔╘╪ ╬┼ ╙╠┼─╒┼╘). +*Q:* А как-то поиск нетривиально работает... +*A:* А вы уверены, что прочитали Notework.txt до предыдущей версии, в которой + все работало? Hачиная с 3.00b4 все сильно поменялось. K тому, что там + описано, можно добавить, что GoldED+ правильно понимает поиск комбинаций + типа "A & B | C & D & E" с приоритетом & над | и что русские слова можно + искать такими комбинациями: "?r [пn][рp][иu][вB][еE][тT]", где первая + буква русская, вторая латинская (кавычки вводить не следует). -*Q:* ■╘╧ ┌┴ ╠┼╫╔┌╬┴ ╫ ┴─╥┼╙┴╚ ╦╥╧╙╙╨╧╙╘╧╫, ╬┴▐╔╬┴╤ ╙ 1.1.3? -*A:* ў goldlang.cfg ╨╧═┼╬╤╠╙╤ ╞╧╥═┴╘ ─╠╤ ╙╠╧╫ MS_LISTCC ("%s %s") ╔ - ST_STATUSCC ("CC: %s of %s"). Ё╥╧╫┼╥╪╘┼ ╙╫╧╩ ╦╧╬╞╔╟ ╔ ╨╧═┼╬╤╩╘┼ ╨╧ - ┴╬┴╠╧╟╔╔! +*Q:* Что за левизна в адресах кросспостов, начиная с 1.1.3? +*A:* В goldlang.cfg поменялся формат для слов MS_LISTCC ("%s %s") и + ST_STATUSCC ("CC: %s of %s"). Проверьте свой конфиг и поменяйте по + аналогии! -*Q:* Ё╧╙╘┴╫╔╠ ╙┼┬┼ hpt. щ ▐╘╧ ▄╘╧ ┌┴ ╠┴╓┴ ╨╥╔ ▐╘┼╬╔╔ ╦╧╬╞╔╟╧╫? -*A:* с ╫┘ ╒╫┼╥┼╬┘, ▐╘╧ ╫┘ ▐╔╘┴╠╔ ─╧╦╒ ╬┴ ╙╫╧╩ hpt? ў ─╧╦┼ ╤╫╬╧ ╬┴╨╔╙┴╬╧, ▐╘╧ - "\" ╔╬╔├╔╔╥╒┼╘ escape-╨╧╙╠┼─╧╫┴╘┼╠╪╬╧╙╘╪. GoldED+ ▐┼╙╘╬╧ ┼г ╧┬╥┴┬┴╘┘╫┴┼╘, - ╫ ╧╘╠╔▐╔╔ ╧╘ ╘┼╚, ╦╘╧ ╧┬┼▌┴╠... ў ╨╥╔╬├╔╨┼, ╫ 1.1.4.1 ╨╧╤╫╔╠╙╤ ╦╠└▐╔╦ - -lame, ╧╘╦╠└▐┴└▌╔╩ ╨┴╥╙╔╠╦╒ ╧┬╥┴╘╬┘╚ ╙╠▄█┼╩, ╨╧╨╥╧┬╒╩╘┼. +*Q:* Поставил себе hpt. И что это за лажа при чтении конфигов? +*A:* А вы уверены, что вы читали доку на свой hpt? В доке явно написано, что + "\" инициирует escape-последовательность. GoldED+ честно её обрабатывает, + в отличии от тех, кто обещал... В принципе, в 1.1.4.1 появился ключик + -lame, отключающий парсилку обратных слэшей, попробуйте. -*Q:* Ё╧▐┼═╒ ╬┼ ╫╫╧─╔╘╙╤ ╥╒╙╙╦┴╤ "№" ╨╧─ Win95? -*A:* Ё╧╙╘┴╫╪╘┼ ╘╔╨ ╦╠┴╫╔┴╘╒╥┘ 101 ╦╠┴╫╔█╬┘╩ є√с, ╙╦╧╥┼┼ ╫╙┼╟╧ ╨╧═╧╓┼╘. х╙╠╔ ╬┼ - ╨╧═╧╓┼╘ - ╨╧╙╘┴╫╪╘┼ ╙┼┬┼ ╬╧╥═┴╠╪╬┘╩ ╥╒╙╙╔╞╔╦┴╘╧╥: ▄╘╧ ┌┴╧─╬╧ ╙╨┴╙┼╘ ╧╘ - ╦╥╔╫╧╩ ╫╙╘┴╫╦╔ ╘┼╦╙╘┴ ╔┌ ╦╠╔╨┬╧╥─┴ ╫ DOS-╫┼╥╙╔╔ ╨╥╔ ╬┼╙╧╫╨┴─┼╬╔╔ ╤┌┘╦┴ - ╘┼╦╙╘┴ ╔ ╙╧─┼╥╓╔═╧╟╧ ╦╠╔╨┬╧╥─┴. +*Q:* Почему не вводится русская "Э" под Win95? +*A:* Поставьте тип клавиатуры 101 клавишный США, скорее всего поможет. Если не + поможет - поставьте себе нормальный руссификатор: это заодно спасет от + кривой вставки текста из клипборда в DOS-версии при несовпадении языка + текста и содержимого клипборда. -*Q:* ю┼ ╥┴┬╧╘┴┼╘ backspace, ╨╥╔╚╧─╔╘╙╤ ╨╧╠╪┌╧╫┴╘╙╤ ╙╘┴╬─┴╥╘╬┘═ Ctrl-? -*A:* Alexey Froloff: ``keycode 14 = delete delete delete delete'' ╫ keymap'┼ - ╨╥╧╨╔╙┴╘╪ ╬┴─╧. +*Q:* Не работает backspace, приходится пользоватся стандартным Ctrl-? +*A:* Alexey Froloff: ``keycode 14 = delete delete delete delete'' в keymap'е + прописать надо. -*Q:* с ┌┴▐┼═ ═╬┼ ▄╘╧╘ ╥┼─┴╦╘╧╥ ╬╒╓┼╬? ї я─╔╬╬┴ ┬┘╠╧ ╠╒▐█┼! -*A:* с ╦╘╧-╘╧ ┌┴╙╘┴╫╠╤┼╘ ╨╧╠╪┌╧╫┴╘╪╙╤? :-) ю┼ ╬╥┴╫╔╘╙╤ - ╙╬╧╙╔ ╔ ╨╧╠╪┌╒╩╙╤ ╘┼═, - ▐╘╧ ╬╥┴╫╔╘╙╤. +*Q:* А зачем мне этот редактор нужен? У Одинна было лучше! +*A:* А кто-то заставляет пользоваться? :-) Не нравится - сноси и пользуйся тем, + что нравится. -*Q:* с ╫╧╘ ╤ ╚╧▐╒ ┴╬┴╠╧╟ MCITY ╫╙╘╥╧┼╬╬┘╩. -*A:* є╟╔╬╪ ╬┼▐╔╙╘╪! ў╙┼╚ ╥┴┌╒═╬┘╚ ╠└─┼╩ ═╔╥╧╫╧╩ ╬╧─╠╔╙╘ ╒╙╘╥┴╔╫┴┼╘ ┬╧╠╪█┼. +*Q:* А вот я хочу аналог MCITY встроенный. +*A:* Сгинь нечисть! Всех разумных людей мировой нодлист устраивает больше. -*Q:* Ї╔╨┴ ▄╘┴... с ╨╔╙┴╘╪ ╦╒─┴ ┴╫╘╧╥╒? ;-) -*A:* Ё╔╙┴╘╪ ╠╒▐█┼ ╫╙┼╟╧ ╫ Ru.GoldED. ф┴╓┼ ╠╒▐█┼ ╙╬┴▐┴╠┴ ┼╟╧ ╨╧▐╔╘┴╘╪, ╨╧╘╧═ - ╨╔╙┴╘╪. х╙╠╔ ╒╓ ╙╔╠╪╬╧ ╨╥╔╙╨╔▐╔╘, ╘╧ ═╧╓╬╧ ╨╔╙┴╘╪ ╬┴ 2:5020/201.58, - 2:5020/604.19 ╔╠╔ aaganichev@netscape.net, ╬╧ ╤ ╙╧╫╙┼═ ╬┼ ╟┴╥┴╬╘╔╥╒└, ▐╘╧ - ╤ ╧╘╫┼▐╒. +*Q:* $^%$^*! Что ты сделал с сохранением сообщений в 1.1.5? +*A:* Теперь сообщения сохраняются по темплейту. Дополнения во встроенный + темплейт выглядят так: + + @header= @oecho (@caddr) @align{79}{=} + @header Msg : @msgno of @msgs@align{44}@attr + @header From : @_oname @_oaddr @odate @otime + @header To : @dname + @header Subj : @subject + @header@align{79}{=} + + Кроме @header есть ещё и @write, который расширяется при наличии запроса + к сохранению тела сообщения, но зачем оно может понадобиться я не + придумал. Разве что описать первую строчку как @write ;) + +*Q:* Типа эта... А писать куда автору? ;-) +*A:* Писать лучше всего в Ru.GoldED. Даже лучше сначала его почитать, дождаться + местного FAQ, баглиста и только потом писать. Если уж сильно приспичит, то + можно писать на 2:5020/201.58, 2:5020/604.19 или aaganichev@netscape.net, + но я совсем не гарантирую, что я отвечу. Ставьте RRq, Cfm, если хотите + знать, что ваше письмо дошло и я просто не стал на него отвечать. Я не + отвечаю на вопросы, описанные в этом FAQ или если я не знаю как что-то + работает в GoldED'е (я не использую слишком много его возможностей - МНЕ + они не нужны) - читайте документацию, спрашивайте в Ru.GoldED... У меня + слишком мало свободного времени, чтобы раскапывать для вас как что-то + работает. >============================================================================== diff --git a/golded3/gccfgg.cpp b/golded3/gccfgg.cpp index 97c0bae..81600e2 100644 --- a/golded3/gccfgg.cpp +++ b/golded3/gccfgg.cpp @@ -826,6 +826,7 @@ CfgGed::CfgGed() { else memcpy(color, gold_color1, sizeof(color)); *internetgate.name = 0; + internetgateexp = (RFCName << 2) | RFCAddress; // internetgate.addr.reset(); *internetserver.nntp.server = 0; *internetserver.smtp.server = 0; diff --git a/golded3/gccfgg.h b/golded3/gccfgg.h index 2076cb0..7200c4a 100644 --- a/golded3/gccfgg.h +++ b/golded3/gccfgg.h @@ -217,6 +217,7 @@ const word CRC_INTENSECOLORS = 0x5F70; const word CRC_INTERNETADDRESS = 0xA4D3; const word CRC_INTERNETDOMAIN = 0x50d7; const word CRC_INTERNETGATE = 0xF6C0; +const word CRC_INTERNETGATEEXP = 0x0797; const word CRC_INTERNETLOOKUP = 0x0E22; const word CRC_INTERNETMSGID = 0xC31F; const word CRC_INTERNETREPLY = 0x6253; diff --git a/golded3/gccfgg0.cpp b/golded3/gccfgg0.cpp index a32ea27..9d65621 100644 --- a/golded3/gccfgg0.cpp +++ b/golded3/gccfgg0.cpp @@ -374,6 +374,7 @@ SwitchI: case CRC_INTERNETADDRESS : CfgInternetaddress (); break; case CRC_INTERNETDOMAIN : CfgInternetdomain (); break; case CRC_INTERNETGATE : CfgInternetgate (); break; + case CRC_INTERNETGATEEXP : CfgInternetgateexp (); break; case CRC_INTERNETMSGID : CfgInternetmsgid (); break; case CRC_INTERNETRFCBODY : CfgInternetrfcbody (); break; case CRC_INTERNETSERVER : CfgInternetserver (); break; diff --git a/golded3/gccfgg5.cpp b/golded3/gccfgg5.cpp index 135348c..57a3ecc 100644 --- a/golded3/gccfgg5.cpp +++ b/golded3/gccfgg5.cpp @@ -170,6 +170,23 @@ void CfgInternetgate() { // ------------------------------------------------------------------ +void CfgInternetgateexp() { + + uint exp = 0; + char *key; + do { + getkeyval(&key, &val); + if(strieql(key, "Name")) + exp = (exp << 2) | RFCName; + if(strieql(key, "Address")) + exp = (exp << 2) | RFCAddress; + } + while(*val != NUL); + CFG->internetgateexp = exp; +} + +// ------------------------------------------------------------------ + void CfgInternetmsgid() { bool flag = GetYesno(val); diff --git a/golded3/gccfgg8.cpp b/golded3/gccfgg8.cpp index 2b16412..d751721 100644 --- a/golded3/gccfgg8.cpp +++ b/golded3/gccfgg8.cpp @@ -144,17 +144,17 @@ void CfgTearline() { void CfgTemplate() { + char* key; + getkeyval(&key, &val); if(cfgingroup) { Path buf; - strxcpy(buf, val, sizeof(buf)); + strxcpy(buf, key, sizeof(buf)); CFG->grp.AddItm(GRP_TEMPLATE, buf, strlen(buf)+1); } else { - char* key; Tpl tp; *tp.name = NUL; tp.match.reset(); - getkeyval(&key, &val); strcpy(tp.file, key); if((*val == '\'') or (*val == '\"')) { getkeyval(&key, &val); diff --git a/golded3/gcprot.h b/golded3/gcprot.h index cfaf8de..6b8f74a 100644 --- a/golded3/gcprot.h +++ b/golded3/gcprot.h @@ -209,6 +209,7 @@ void CfgIntensecolors (); void CfgInternetaddress (); void CfgInternetdomain (); void CfgInternetgate (); +void CfgInternetgateexp (); void CfgInternetlookup (); void CfgInternetmsgid (); void CfgInternetreply (); diff --git a/golded3/geall.h b/golded3/geall.h index 8a45ad1..155d2e6 100644 --- a/golded3/geall.h +++ b/golded3/geall.h @@ -73,6 +73,8 @@ const int MODE_VIEW = 116; const int MODE_WRITE = 117; const int MODE_PRINT = 118; const int MODE_APPEND = 119; +const int MODE_WRITEHEADER = 120; +const int MODE_HEADER = 121; const int MODE_NEW = 0x0100; const int MODE_CHANGE = 0x0200; @@ -1006,6 +1008,11 @@ struct FileSpec { }; +// ------------------------------------------------------------------ + +const int RFCAddress = 1; +const int RFCName = 2; + // ------------------------------------------------------------------ // Message written by/to me/you ? diff --git a/golded3/gecfgg.h b/golded3/gecfgg.h index 8d9980e..9c66c18 100644 --- a/golded3/gecfgg.h +++ b/golded3/gecfgg.h @@ -241,6 +241,7 @@ public: IAdr internetaddress; char internetdomain[96]; Node internetgate; + int internetgateexp; bool internetmsgid; bool internetrfcbody; InetServers internetserver; diff --git a/golded3/gectrl.cpp b/golded3/gectrl.cpp index 4607c8f..c125a21 100644 --- a/golded3/gectrl.cpp +++ b/golded3/gectrl.cpp @@ -207,13 +207,16 @@ char* mime_header_encode(char* dest, const char* source, GMsg* msg) { // ------------------------------------------------------------------ -char* get_informative_string(char* buf) { +const char* get_informative_string(void) { - sprintf(buf, "%s%s%s %s%i.%i.%i%s (%s)", - __gver_prename__, __gver_name__, __gver_postname__, - __gver_preversion__, __gver_major__, __gver_minor__, - __gver_release__, __gver_postversion__, ggetosstring()); - return buf; + static char informative_string[356] = ""; + + if(informative_string[0] == NUL) + sprintf(informative_string, "%s%s%s %s%i.%i.%i%s (%s)", + __gver_prename__, __gver_name__, __gver_postname__, + __gver_preversion__, __gver_major__, __gver_minor__, + __gver_release__, __gver_postversion__, ggetosstring()); + return informative_string; } @@ -335,7 +338,7 @@ void DoKludges(int mode, GMsg* msg, bool attronly) { } // The PID: (Product ID code) kludge - strcpy(msg->pid, __gver_shortpid__); + strxmerge(msg->pid, sizeof(msg->pid), __gver_shortpid__, " ", __gver_ver__, NULL); if(CFG->usepid and (CFG->switches.get(emptytearline) or not (striinc(__gver_longpid__, msg->tearline)))) { @@ -522,7 +525,7 @@ void DoKludges(int mode, GMsg* msg, bool attronly) { } if(AA->isnewsgroup() or AA->isemail()) { - sprintf(buf, "%sX-%s: %s", rfc, AA->isnewsgroup() ? "Newsreader" : "Mailer", get_informative_string(buf2)); + sprintf(buf, "%sX-%s: %s", rfc, AA->isnewsgroup() ? "Newsreader" : "Mailer", get_informative_string()); line = AddKludge(line, buf); line->kludge = GKLUD_RFC; } @@ -535,10 +538,13 @@ void DoKludges(int mode, GMsg* msg, bool attronly) { if(AA->isnet()) { if(*msg->iaddr and not AA->isinternet()) { - if(*msg->To() and (strpbrk(msg->iaddr, "<>()\"") == NULL) and not strieql(msg->To(), *AA->Internetgate().name ? AA->Internetgate().name : "UUCP")) { + if(not (CFG->internetgateexp == RFCAddress) and *msg->To() and (strpbrk(msg->iaddr, "<>()\"") == NULL) and not strieql(msg->To(), *AA->Internetgate().name ? AA->Internetgate().name : "UUCP")) { Name name; strcpy(name, msg->To()); - sprintf(buf, "To: \"%s\" <%s>\r", StripQuotes(name), msg->iaddr); + if(CFG->internetgateexp == ((RFCName << 2) | RFCAddress)) + sprintf(buf, "To: \"%s\" <%s>\r", StripQuotes(name), msg->iaddr); + else + sprintf(buf, "To: %s (%s)\r", msg->iaddr, StripQuotes(name)); } else sprintf(buf, "To: %s\r", msg->iaddr); @@ -607,14 +613,6 @@ void DoTearorig(int mode, GMsg* msg) { line = LastLine(msg->lin); if(line == NULL) msg->lin = line = AddLine(NULL, ""); -#if 0 - else { - ptr = line->txt.c_str(); - if(not strblank(ptr)) - if(not ((ptr[0] == ptr[1]) and (ptr[1] == ptr[2]))) - line = AddLine(line, ""); - } -#endif // Check and fix originline if(*msg->origin) { diff --git a/golded3/gedoit.cpp b/golded3/gedoit.cpp index 998efcd..9e4fb4a 100644 --- a/golded3/gedoit.cpp +++ b/golded3/gedoit.cpp @@ -61,12 +61,17 @@ void SaveLines(int mode, const char* savefile, GMsg* msg, bool clip) { } int lines=0; if(prnfp) { +#ifdef OLD_STYLE_HEADER if(mode == MODE_WRITE) { if(prnheader) DispHeader(msg, prn, prnfp, prnmargin); if(prn) lines = 6; } +#else + TemplateToText(((mode == MODE_WRITE) && prnheader) ? MODE_WRITEHEADER : ((prnheader & WRITE_ONLY_HEADER) ? MODE_HEADER : MODE_WRITE), msg, msg, AA->Tpl(), CurrArea); + msg->TextToLines(-prnmargin); +#endif int n = 0; Line** lin = msg->line; if(lin and not (prnheader & WRITE_ONLY_HEADER)) { diff --git a/golded3/geglob.cpp b/golded3/geglob.cpp index 4da837e..611cae1 100644 --- a/golded3/geglob.cpp +++ b/golded3/geglob.cpp @@ -50,8 +50,6 @@ char m_title[80]; // Menu title string int m_titlepos; // Menu title position int m_titleattr; // Menu title color -char* tconv; - int AreaKeys = 0; int ReadKeys = 0; int ListKeys = 0; diff --git a/golded3/geglob.h b/golded3/geglob.h index 46cd1b5..ed71c3a 100644 --- a/golded3/geglob.h +++ b/golded3/geglob.h @@ -100,8 +100,6 @@ extern char m_title[]; extern int m_titlepos; extern int m_titleattr; -extern char* tconv; - extern int AreaKeys, ReadKeys, ListKeys, NodeKeys, EditKeys, FileKeys; extern list::iterator AreaKey, ReadKey, ListKey, NodeKey, EditKey, FileKey; @@ -187,6 +185,8 @@ extern const char* __gver_date__; extern const char* __gver_time__; extern const char* __gver_longpid__; extern const char* __gver_shortpid__; +extern const char* __gver_ver__; +extern const char* __gver_shortver__; // ------------------------------------------------------------------ diff --git a/golded3/gehdre.cpp b/golded3/gehdre.cpp index 5022958..d784409 100644 --- a/golded3/gehdre.cpp +++ b/golded3/gehdre.cpp @@ -305,6 +305,10 @@ bool GMsgHeaderEdit::validate() { fromaddr.buf = ffromaddr->buf; fromaddr.update = false; subj.buf = fsubj->buf; subj.update = false; + INam iaddr, realto; + strcpy(iaddr, msg->iaddr); + strcpy(realto, msg->realto); + bool res = set_to_address(msg, &toname, &toaddr, &fromaddr, &subj, 0, LNG->SelectDestNode, lookup); vcurshow(); @@ -313,9 +317,13 @@ bool GMsgHeaderEdit::validate() { strsetsz(bot2, EDIT->HdrNodeLen()); window.prints(1, EDIT->HdrNodePos(), C_HEADW, bot2); - // once we changed name invalidate realto - if(not strieql(orig_toname.c_str(), toname.buf)) - *msg->realto = NUL; + // once we changed name invalidate realto and internet address + if(not strieql(orig_toname.c_str(), toname.buf)) { + if(strieql(realto, msg->realto)) + *msg->realto = NUL; + if(not AA->isinternet() and strieql(iaddr, msg->iaddr)) + *msg->iaddr = NUL; + } if(toname.update) current->update(); if(toaddr.update) ftoaddr->update(); @@ -442,8 +450,14 @@ int EditHeaderinfo(int mode, GMsgHeaderView &view) { strcpy(msg->realto, msg->to); strcpy(msg->iorig, from_addr.c_str()); strcpy(msg->idest, to_addr.c_str()); - strcpy(msg->ifrom, msg->iorig); - strcpy(msg->ito, msg->idest); + if(*msg->by) + sprintf(msg->ifrom, "%s (%s)", msg->iorig, msg->by); + else + sprintf(msg->ifrom, "%s", msg->iorig); + if(*msg->to) + sprintf(msg->ito, "%s (%s)", msg->idest, msg->to); + else + sprintf(msg->ito, "%s", msg->idest); if(msg->orig.net == 0) msg->orig = msg->oorig = AA->Aka().addr; if(msg->dest.net == 0) @@ -451,8 +465,9 @@ int EditHeaderinfo(int mode, GMsgHeaderView &view) { } else { if(strchr(to_name.c_str(), '@')) { - if(*AA->Internetgate().name) + if(*AA->Internetgate().name) { strcpy(msg->iaddr, to_name.c_str()); + } else { if(to_name.length() > 34) { strcpy(msg->to, "UUCP"); @@ -465,6 +480,16 @@ int EditHeaderinfo(int mode, GMsgHeaderView &view) { else strcpy(msg->to, to_name.c_str()); + if(*msg->iaddr) { + if(*msg->To() and (strpbrk(msg->iaddr, "<>()\"") == NULL) and not strieql(msg->To(), *AA->Internetgate().name ? AA->Internetgate().name : "UUCP")) { + Name name; + strcpy(name, msg->To()); + sprintf(msg->ito, "%s (%s)", msg->iaddr, StripQuotes(name)); + } + else + strcpy(msg->ito, msg->iaddr); + } + Addr address; address = AA->Aka().addr; diff --git a/golded3/gehdrs.cpp b/golded3/gehdrs.cpp index d10b776..1d9f979 100644 --- a/golded3/gehdrs.cpp +++ b/golded3/gehdrs.cpp @@ -24,18 +24,18 @@ // Header display. // ------------------------------------------------------------------ +#ifdef OLD_STYLE_HEADER + #include // ------------------------------------------------------------------ -char* strconv(char* str, char* conv) { +static char* strconv(char* str) { char* s=str; char* p = str; - NW(conv); // Dummy - while(*str) { if(iscntrl(*str) and (*str != '\n') and (*str != '\r')) // Control codes *p++ = '.'; @@ -79,39 +79,44 @@ void DispHeader(GMsg* msg, bool prn, FILE* fp, int width) { // Generate top line fields char buf[256]; - char top1[200]; + char buf1[200]; + char buf2[200]; strtrim(strcpy(buf, AA->desc())); if((CFG->dispareano == ALWAYS) or (CFG->dispareano and AA->board())) - sprintf(top1, " [%u] %s ", AA->board(), buf); + sprintf(buf1, " [%u] %s ", AA->board(), buf); else - sprintf(top1, " %s ", buf); - strtrim(top1); - strcat(top1, " (" /*)*/); + sprintf(buf1, " %s ", buf); + strtrim(buf1); + strcat(buf1, " (" /*)*/); if(AA->isinternet()) strcpy(buf, AA->Internetaddress()); else AA->Aka().addr.make_string(buf); - strcat(top1, buf); - strcat(top1, /*(*/ ") "); + strcat(buf1, buf); + strcat(buf1, /*(*/ ") "); - char top2[200]; if(msg->areakludgeid) - sprintf(top2, " %s (%s) ", AA->echoid(), msg->areakludgeid); + sprintf(buf2, " %s (%s) ", AA->echoid(), msg->areakludgeid); else - sprintf(top2, " %s ", AA->echoid()); + sprintf(buf2, " %s ", AA->echoid()); + + // Write the total header to a file + strcpy(stpcpy(buf, headerline), prn ? NL : "\n"); + strncpy(buf+1, buf1, strlen(buf1)); + strncpy(buf+width-strlen(buf2)-1, buf2, strlen(buf2)); + strconv(buf); + fwrite(buf, strlen(buf), 1, fp); // Generate message attributes string - char bot2[200]; - MakeAttrStr(bot2, &msg->attr); - int len2 = strlen(bot2); + MakeAttrStr(buf2, &msg->attr); + int len2 = strlen(buf2); if(len2 > width-CFG->disphdrnodeset.pos) { len2 = width-CFG->disphdrnodeset.pos; - strsetsz(bot2, len2); + strsetsz(buf2, len2); } // Generate message number and reply links string - char bot1[200]; - char* ptr = bot1; + char* ptr = buf1; int list_max = msg->link.list_max(); ulong* replies = (ulong*)throw_calloc(list_max+1, sizeof(ulong)); ulong replyto, replynext; @@ -139,106 +144,100 @@ void DispHeader(GMsg* msg, bool prn, FILE* fp, int width) { ptr += sprintf(ptr, " %s%lu", (plus++?"":"+"), replies[replyn]); if(replynext) sprintf(ptr, " *%lu", replynext); - int len1 = strlen(bot1)-8; + int len1 = strlen(buf1)-8; if((CFG->disphdrnameset.pos + len1) > CFG->disphdrnodeset.pos) { if(8 + len1 + len2 > width) { - strsetsz(bot1, width-len2-1); - strtrim(bot1); + strsetsz(buf1, width-len2-1); + strtrim(buf1); } - strcat(bot1, " "); - strcat(bot1, bot2); - *bot2 = NUL; + strcat(buf1, " "); + strcat(buf1, buf2); + *buf2 = NUL; } else { - strsetsz(bot1, namewidth+8); - strcat(bot1, bot2); - *bot2 = NUL; + strsetsz(buf1, namewidth+8); + strcat(buf1, buf2); + *buf2 = NUL; } - strsetsz(bot1, width); + strsetsz(buf1, width); throw_free(replies); - // Generate orig node data - char node1[200]; - if(msg->orig.net) - msg->orig.make_string(node1); - else - *node1 = NUL; - strsetsz(node1, nodewidth); + // Write message info + strcpy(stpcpy(buf, buf1), buf2); + strtrim(buf); + strcat(buf, prn ? NL : "\n"); + strconv(buf); + fwrite(buf, strlen(buf), 1, fp); + + // Generate orig node data + if(msg->orig.net) + msg->orig.make_string(buf1); + else + *buf1 = NUL; + strsetsz(buf1, nodewidth); - char date1[25] = ""; if(msg->written) - strftimei(date1, CFG->disphdrdateset.len, LNG->DateTimeFmt, gmtime(&msg->written)); - strsetsz(date1, datewidth); + strftimei(buf2, CFG->disphdrdateset.len, LNG->DateTimeFmt, gmtime(&msg->written)); + strsetsz(buf2, datewidth); + + // write from line + sprintf(buf, "%s%s%s%s", + LNG->From, whofrom, + ((not (*msg->ifrom and (*msg->realby or *msg->iorig))) and not AA->isinternet()) ? buf1 : "", + buf2 + ); + strtrim(buf); + strcat(buf, prn ? NL : "\n"); + strconv(buf); + fwrite(buf, strlen(buf), 1, fp); // Generate dest node data - char node2[200]; if(msg->dest.net and AA->isnet()) { - msg->dest.make_string(node2); + msg->dest.make_string(buf2); if(msg->odest.net) { if(msg->odest.net != msg->dest.net or msg->odest.node != msg->dest.node) { sprintf(buf, " %s %u/%u", LNG->Via, msg->odest.net, msg->odest.node); - strcat(node2, buf); + strcat(buf2, buf); } } } else - *node2 = NUL; - strsetsz(node2, nodewidth); + *buf2 = NUL; + strsetsz(buf2, nodewidth); - char date2[25] = ""; if(msg->arrived) - strftimei(date2, CFG->disphdrdateset.len, LNG->DateTimeFmt, gmtime(&msg->arrived)); - strsetsz(date2, datewidth); + strftimei(buf2, CFG->disphdrdateset.len, LNG->DateTimeFmt, gmtime(&msg->arrived)); + strsetsz(buf2, datewidth); + + // write to line + sprintf(buf, "%s%s%s%s", LNG->To, whoto, + ((not (*msg->ito and (*msg->realto or *msg->idest))) and not AA->isinternet()) ? buf2 : "", + buf2 + ); + strtrim(buf); + strcat(buf, prn ? NL : "\n"); + strconv(buf); + fwrite(buf, strlen(buf), 1, fp); // Generate subjectline - char subj[200], lngsubj[10]; - strcpy(lngsubj, (msg->attr.att() or msg->attr.frq() or msg->attr.urq()) ? LNG->File : LNG->Subj); - strxcpy(subj, msg->re, sizeof(subj)); - strsetsz(subj, width-strlen(lngsubj)); + strcpy(buf2, (msg->attr.att() or msg->attr.frq() or msg->attr.urq()) ? LNG->File : LNG->Subj); + strxcpy(buf1, msg->re, sizeof(buf1)); + strsetsz(buf1, width-strlen(buf2)); - // Write the total header to a file + // write subject line + strcpy(stpcpy(buf, buf2), buf1); + strtrim(buf); + strcat(buf, prn ? NL : "\n"); + strconv(buf); + fwrite(buf, strlen(buf), 1, fp); + + // write bottom line strcpy(stpcpy(buf, headerline), prn ? NL : "\n"); - strncpy(buf+1, top1, strlen(top1)); - strncpy(buf+width-strlen(top2)-1, top2, strlen(top2)); - strconv(buf, tconv); - fwrite(buf, strlen(buf), 1, fp); - - strcpy(stpcpy(buf, bot1), bot2); - strtrim(buf); - strcat(buf, prn ? NL : "\n"); - strconv(buf, tconv); - fwrite(buf, strlen(buf), 1, fp); - - sprintf(buf, "%s%s%s%s", - LNG->From, whofrom, - ((not (*msg->ifrom and (*msg->realby or *msg->iorig))) and not AA->isinternet()) ? node1 : "", - date1 - ); - strtrim(buf); - strcat(buf, prn ? NL : "\n"); - strconv(buf, tconv); - fwrite(buf, strlen(buf), 1, fp); - - sprintf(buf, "%s%s%s%s", LNG->To, whoto, - ((not (*msg->ito and (*msg->realto or *msg->idest))) and not AA->isinternet()) ? node2 : "", - date2 - ); - strtrim(buf); - strcat(buf, prn ? NL : "\n"); - strconv(buf, tconv); - fwrite(buf, strlen(buf), 1, fp); - - strcpy(stpcpy(buf, lngsubj), subj); - strtrim(buf); - strcat(buf, prn ? NL : "\n"); - strconv(buf, tconv); - fwrite(buf, strlen(buf), 1, fp); - - strcpy(stpcpy(buf, headerline), prn ? NL : "\n"); - strconv(buf, tconv); + strconv(buf); fwrite(buf, strlen(buf), 1, fp); } // ------------------------------------------------------------------ +#endif diff --git a/golded3/geinit.cpp b/golded3/geinit.cpp index 8a12532..c93ebe0 100644 --- a/golded3/geinit.cpp +++ b/golded3/geinit.cpp @@ -506,7 +506,7 @@ void Initialize(int argc, char* argv[]) { srand((unsigned)time(NULL)); // Display startup banner - cout << __gver_longpid__ << endl; + cout << __gver_longpid__ << " " << __gver_ver__ << endl; // Check environment commandline ptr = getenv("GEDCMD"); @@ -685,7 +685,7 @@ void Initialize(int argc, char* argv[]) { // Start the log static char buf[200]; - sprintf(buf, "%s (%s %s)", __gver_longpid__, __gver_date__, __gver_time__); + sprintf(buf, "%s %s (%s %s)", __gver_longpid__, __gver_ver__, __gver_date__, __gver_time__); LOG.open(CFG->logfile, buf, __gver_shortlogname__, CFG->logformat); // Read/compile various configs diff --git a/golded3/geline.cpp b/golded3/geline.cpp index a146352..ec47e79 100644 --- a/golded3/geline.cpp +++ b/golded3/geline.cpp @@ -1592,8 +1592,6 @@ void ScanKludges(GMsg* msg, int getvalue) { KludgeFROM(msg, tmp ? tmp : ptr); if(tmp) throw_free(tmp); - if(not AA->isinternet()) - *msg->ifrom = NUL; } else if(strnieql(line->txt.c_str(), "To:", 3)) { const char* ptr = line->txt.c_str() + 3; @@ -1602,8 +1600,6 @@ void ScanKludges(GMsg* msg, int getvalue) { KludgeTO(msg, tmp ? tmp : ptr); if(tmp) throw_free(tmp); - if(not AA->isinternet()) - *msg->ito = NUL; } else if(strnieql(line->txt.c_str(), "Reply-To:", 9)) { const char* ptr = line->txt.c_str() + 9; @@ -2549,6 +2545,8 @@ void MakeLineIndex(GMsg* msg, int margin, bool header_recode) { strxmimecpy(msg->realto, msg->realto, 0, sizeof(INam), true); strxmimecpy(msg->by, msg->by, level, sizeof(INam), true); strxmimecpy(msg->to, msg->to, level, sizeof(INam), true); + strxmimecpy(msg->ifrom, msg->ifrom, 0, sizeof(INam), true); + strxmimecpy(msg->ito, msg->ito, 0, sizeof(msg->ito), true); if(not (msg->attr.frq() or msg->attr.att() or msg->attr.urq())) strxmimecpy(msg->re, msg->re, level, sizeof(ISub), true); diff --git a/golded3/gemsgs.cpp b/golded3/gemsgs.cpp index fcbd645..485ce80 100644 --- a/golded3/gemsgs.cpp +++ b/golded3/gemsgs.cpp @@ -59,9 +59,9 @@ static bool tokenxchg(char*& dst, char* tok, const char* src, int len = 0, int c if(dst[toklen] == '{') { char *p = strchr(dst+toklen, '}'); if(p) { - uint len = p-dst-toklen-1; - if(use && len) { - strxcpy (buf, dst+toklen+1, len+1); + uint dstlen = p-dst-toklen-1; + if(use && dstlen) { + strxcpy (buf, dst+toklen+1, dstlen+1); src = buf; } toklen = p-dst+1; @@ -74,33 +74,31 @@ static bool tokenxchg(char*& dst, char* tok, const char* src, int len = 0, int c uint srclen = (len == 0) ? sl : len; memmove(dst+srclen, dst+toklen, strlen(dst+toklen)+1); memset(dst, ' ', srclen); - memcpy(dst, src, sl); + memcpy(dst, src, ((len != 0) and (len < sl)) ? len : sl); dst += srclen; return true; } +// ------------------------------------------------------------------ + +static bool domain_requested(const char *str) { + + return strnieql(str, "{domain}", 8); +} + // ------------------------------------------------------------------ char* TokenXlat(int mode, char* input, GMsg* msg, GMsg* oldmsg, int __origarea) { - char longpid[100]; - sprintf(longpid, "%s%s%s%s", __gver_prename__, __gver_name__, __gver_postname__, __gver_platform__); + static char revbuf[5] = ""; + if(revbuf[0] == NUL) + sprintf(revbuf, "%02d%02d", str2mon(__gver_date__), atoi(&__gver_date__[4])); - char shortpid[100]; - sprintf(shortpid, "%s%s", __gver_shortname__, __gver_shortplatform__); + char attr[80]; + MakeAttrStr(attr, &msg->attr); - char longverbuf[100]; - sprintf(longverbuf, "%s%i.%i.%i%s", __gver_preversion__, __gver_major__, __gver_minor__, __gver_release__, __gver_postversion__); - - char verbuf[100]; - sprintf(verbuf, "%i.%i.%i", __gver_major__, __gver_minor__, __gver_release__); - - char revbuf[100]; - sprintf(revbuf, "%02d%02d", str2mon(__gver_date__), atoi(&__gver_date__[4])); - - char xmailer[356]; - get_informative_string(xmailer); + const char *xmailer = get_informative_string(); time_t t = time(NULL); struct tm* written_tm = localtime(&t); @@ -114,13 +112,17 @@ char* TokenXlat(int mode, char* input, GMsg* msg, GMsg* oldmsg, int __origarea) char otime[80]; strftimei(otime, 80, LNG->TimeFmt, written_tm); - const char* osslashbuf = __gver_platform__; - const char* origareaid = AL.AreaIdToPtr(__origarea)->echoid(); bool origareaisinet = AL.AreaIdToPtr(__origarea)->isinternet(); bool currareaisinet = AA->isinternet(); char* modereptr = oldmsg->re; + char msgno[16]; + sprintf(msgno, "%u", msg->attr.nwm() ? AA->Msgn.Count() + 1 : AA->Msgn.ToReln(msg->msgno)); + + char msgs[16]; + sprintf(msgs, "%u", AA->Msgn.Count() + (msg->attr.nwm() ? 1 : 0)); + if((mode == MODE_QUOTE) or (mode == MODE_REPLYCOMMENT) or (mode == MODE_REPLY)) { if(AL.AreaIdToPtr(__origarea)->Areareplydirect() and oldmsg->areakludgeid) origareaid = oldmsg->areakludgeid; @@ -151,16 +153,16 @@ char* TokenXlat(int mode, char* input, GMsg* msg, GMsg* oldmsg, int __origarea) if(tokenxchg(dst, "@odesc", AL.AreaEchoToPtr(origareaid)->desc())) continue; if(origareaisinet) { - if(tokenxchg(dst, "@oaddr", oldmsg->iorig, 19)) + if(tokenxchg(dst, "@oaddr", oldmsg->iorig, 19, 1, 0)) continue; } else { - if(tokenxchg(dst, "@oaddr", oldmsg->orig.make_string(buf, oldmsg->odom), 19)) + if(tokenxchg(dst, "@oaddr", oldmsg->orig.make_string(buf, domain_requested(dst+6) ? oldmsg->odom : NULL), 19, 1, 0)) continue; if(strnieql(dst, "@o3daddr", 8)) { ftn_addr boss = oldmsg->orig; boss.point = 0; - tokenxchg(dst, "@o3daddr", boss.make_string(buf, oldmsg->odom), 19); + tokenxchg(dst, "@o3daddr", boss.make_string(buf, domain_requested(dst+8) ? oldmsg->odom : NULL), 19, 1, 0); continue; } } @@ -179,25 +181,25 @@ char* TokenXlat(int mode, char* input, GMsg* msg, GMsg* oldmsg, int __origarea) continue; if(tokenxchg(dst, "@otzoffset", (oldmsg->tzutc == -32767) ? "" : (sprintf(buf, " %+05d", oldmsg->tzutc), buf))) continue; - if(tokenxchg(dst, "@ofrom", oldmsg->ifrom)) + if(tokenxchg(dst, "@ofrom", *oldmsg->ifrom ? oldmsg->ifrom : oldmsg->By())) continue; - if(tokenxchg(dst, "@oto", oldmsg->ito)) + if(tokenxchg(dst, "@oto", *oldmsg->ito ? oldmsg->ito : oldmsg->To())) continue; if(tokenxchg(dst, "@omessageid", oldmsg->messageid ? oldmsg->messageid : "")) continue; if(tokenxchg(dst, "@omsgid", *msg->replys ? msg->replys : "")) continue; if(origareaisinet) { - if(tokenxchg(dst, "@daddr", oldmsg->iaddr, 19)) + if(tokenxchg(dst, "@daddr", oldmsg->iaddr, 19, 1, 0)) continue; } else { - if(tokenxchg(dst, "@daddr", oldmsg->dest.make_string(buf, oldmsg->ddom), 19)) + if(tokenxchg(dst, "@daddr", oldmsg->dest.make_string(buf, domain_requested(dst+6) ? oldmsg->ddom : NULL), 19, 1, 0)) continue; if(strnieql(dst, "@d3daddr", 8)) { ftn_addr boss = oldmsg->dest; boss.point = 0; - tokenxchg(dst, "@d3daddr", boss.make_string(buf, oldmsg->ddom), 19); + tokenxchg(dst, "@d3daddr", boss.make_string(buf, domain_requested(dst+8) ? oldmsg->ddom : NULL), 19, 1, 0); continue; } } @@ -211,16 +213,16 @@ char* TokenXlat(int mode, char* input, GMsg* msg, GMsg* oldmsg, int __origarea) msg->to_me(), msg->to_you(), oldmsg->to_all())) continue; if(currareaisinet) { - if(tokenxchg(dst, "@taddr", msg->iaddr, 19)) + if(tokenxchg(dst, "@taddr", msg->iaddr, 19, 1, 0)) continue; } else { - if(tokenxchg(dst, "@taddr", msg->dest.make_string(buf, msg->ddom), 19)) + if(tokenxchg(dst, "@taddr", msg->dest.make_string(buf, domain_requested(dst+6) ? msg->ddom : NULL), 19, 1, 0)) continue; if(strnieql(dst, "@t3daddr", 8)) { ftn_addr boss = msg->dest; boss.point = 0; - tokenxchg(dst, "@t3daddr", boss.make_string(buf, msg->ddom), 19); + tokenxchg(dst, "@t3daddr", boss.make_string(buf, domain_requested(dst+8) ? msg->ddom : NULL), 19, 1, 0); continue; } } @@ -234,16 +236,17 @@ char* TokenXlat(int mode, char* input, GMsg* msg, GMsg* oldmsg, int __origarea) false, false, msg->to_all())) continue; if(currareaisinet) { - if(tokenxchg(dst, "@caddr", AA->Internetaddress(), 19)) + if(tokenxchg(dst, "@caddr", AA->Internetaddress(), 19, 1, 0)) continue; } else { - if(tokenxchg(dst, "@caddr", AA->Aka().addr.make_string(buf), 19)) + const gaka &caka=AA->Aka(); + if(tokenxchg(dst, "@caddr", caka.addr.make_string(buf, domain_requested(dst+6) ? caka.domain : NULL), 19, 1, 0)) continue; if(strnieql(dst, "@c3daddr", 8)) { - ftn_addr boss = AA->Aka().addr; + ftn_addr boss = caka.addr; boss.point = 0; - tokenxchg(dst, "@c3daddr", boss.make_string(buf), 19); + tokenxchg(dst, "@c3daddr", boss.make_string(buf, domain_requested(dst+8) ? caka.domain : NULL), 19, 1, 0); continue; } } @@ -253,6 +256,10 @@ char* TokenXlat(int mode, char* input, GMsg* msg, GMsg* oldmsg, int __origarea) continue; if(tokenxchg(dst, "@clname", strrword(strcpy(buf, AA->Username().name)))) continue; + if(tokenxchg(dst, "@cfrom", *msg->ifrom ? msg->ifrom : msg->By())) + continue; + if(tokenxchg(dst, "@cto", *msg->ito ? msg->ito : msg->To())) + continue; if(tokenxchg(dst, "@cdate", cdate)) continue; if(tokenxchg(dst, "@ctime", ctime)) @@ -260,16 +267,16 @@ char* TokenXlat(int mode, char* input, GMsg* msg, GMsg* oldmsg, int __origarea) if(tokenxchg(dst, "@ctzoffset", AA->Usetzutc() ? (sprintf(buf, " %+05d", tzoffset()), buf) : "")) continue; if(currareaisinet) { - if(tokenxchg(dst, "@faddr", msg->iorig, 19)) + if(tokenxchg(dst, "@faddr", msg->iorig, 19, 1, 0)) continue; } else { - if(tokenxchg(dst, "@faddr", msg->orig.make_string(buf, msg->odom), 19)) + if(tokenxchg(dst, "@faddr", msg->orig.make_string(buf, domain_requested(dst+6) ? msg->odom : NULL), 19, 1, 0)) continue; if(strnieql(dst, "@f3daddr", 8)) { ftn_addr boss = msg->orig; boss.point = 0; - tokenxchg(dst, "@f3daddr", boss.make_string(buf, msg->odom), 19); + tokenxchg(dst, "@f3daddr", boss.make_string(buf, domain_requested(dst+8) ? msg->odom : NULL), 19, 1, 0); continue; } } @@ -310,28 +317,47 @@ char* TokenXlat(int mode, char* input, GMsg* msg, GMsg* oldmsg, int __origarea) tokenxchg(dst, "@fpseudo", msg->pseudofrom); continue; } + if(tokenxchg(dst, "@msgno", msgno)) + continue; + if(tokenxchg(dst, "@msgs", msgs)) + continue; if(tokenxchg(dst, "@cpseudo", *AA->Nickname() ? AA->Nickname() : strlword(strcpy(buf, AA->Username().name), " @"))) continue; - if(tokenxchg(dst, "@version", longverbuf)) + if(tokenxchg(dst, "@version", __gver_ver__)) continue; - if(tokenxchg(dst, "@ver", verbuf)) + if(tokenxchg(dst, "@ver", __gver_shortver__)) continue; if(tokenxchg(dst, "@rev", revbuf)) continue; - if(tokenxchg(dst, "@pid", shortpid)) + if(strnieql(dst, "@align{", 6)) { + char *ptr = strchr(dst, '}'); + if(ptr) { + int size = atoi(dst+7) - (dst-input); + if(size > 0) { + char filler = ' '; + if((ptr[1] == '{') and (ptr[3] == '}')) { + filler = ptr[2]; + ptr += 3; + } + memmove(dst+size, ptr+1, strlen(ptr+1)+1); + memset(dst, filler, size); + dst += size; + } + } continue; - if(tokenxchg(dst, "@longpid", longpid)) + } + if(tokenxchg(dst, "@pid", __gver_shortpid__)) + continue; + if(tokenxchg(dst, "@longpid", __gver_longpid__)) continue; if(tokenxchg(dst, "@widepid", xmailer)) continue; - if(tokenxchg(dst, "@serialno", "")) - continue; - if(tokenxchg(dst, "@os2slash", osslashbuf)) - continue; - if(tokenxchg(dst, "@osslash", osslashbuf)) + if(tokenxchg(dst, "@osslash", __gver_platform__)) continue; if(tokenxchg(dst, "@subject", modereptr)) continue; + if(tokenxchg(dst, "@attr", attr)) + continue; if(tokenxchg(dst, "@tagline", HandleRandomLine(strxcpy(buf, AA->Tagline(), sizeof(buf)), sizeof(buf)))) continue; diff --git a/golded3/gepost.cpp b/golded3/gepost.cpp index 7393d4f..41571d8 100644 --- a/golded3/gepost.cpp +++ b/golded3/gepost.cpp @@ -689,7 +689,7 @@ void MakeMsg(int mode, GMsg* omsg, bool ignore_replyto) { GFTRK("MakeMsg"); - // Tell DispHeader not to show msg size + // Tell GMsgHeaderView not to show msg size _in_editor = YES; // Allocate some msgs @@ -762,7 +762,7 @@ void MakeMsg(int mode, GMsg* omsg, bool ignore_replyto) { msg->inreplyto = NULL; msg->references = NULL; msg->attr.tou0(); - msg->TextToLines(CFG->dispmargin-1, false); + msg->TextToLines(CFG->dispmargin-1); *msg->iorig = NUL; *msg->idest = NUL; *msg->ireplyto = NUL; @@ -788,7 +788,7 @@ void MakeMsg(int mode, GMsg* omsg, bool ignore_replyto) { msg->inreplyto = NULL; msg->references = NULL; msg->attr.tou0(); - msg->TextToLines(CFG->dispmargin-1, false); + msg->TextToLines(CFG->dispmargin-1); break; case MODE_NEW: wfill(MINROW, 0, MAXROW-2, MAXCOL-1, ' ', C_READW); @@ -830,7 +830,7 @@ void MakeMsg(int mode, GMsg* omsg, bool ignore_replyto) { case MODE_QUOTE: case MODE_REPLYCOMMENT: omsg->attr.tou0(); - omsg->TextToLines(-CFG->quotemargin, false); + omsg->TextToLines(-CFG->quotemargin); if(ignore_replyto) omsg->ireplyto[0] = NUL; if(omsg->attr.rot()) diff --git a/golded3/geprot.h b/golded3/geprot.h index 65a48bc..d3d1363 100644 --- a/golded3/geprot.h +++ b/golded3/geprot.h @@ -100,7 +100,7 @@ void DoTearorig(int mode, GMsg* msg); void GetRandom(int mode, GMsg* msg); char* GetRandomLine(char* __buf, size_t __bufsize, const char* __file); char* HandleRandomLine(char* buf, size_t bufsize); -char* get_informative_string(char* buf); +const char* get_informative_string(void); // ------------------------------------------------------------------ @@ -275,7 +275,9 @@ int MsgIsTwit(GMsg* msg, bool& istwitto, bool& istwitsubj); ulong MsgHasReplies(GMsg* msg); gkey ViewMessage(int istwit=NOT_TWIT); int LoadMessage(GMsg* msg, int margin); +#ifdef OLD_STYLE_HEADER void DispHeader(GMsg* msg, bool prn, FILE* fp=NULL, int width=-1); +#endif void LoadRawMsg(GMsg* msg, int margin); void make_pathreport(char* reportfile); @@ -387,7 +389,6 @@ void ScanMsgTxtForAddr(GMsg* msg); gkey SearchKey(gkey key, list::iterator keys, int totkeys); int SearchTaglist(Echo* taglist, char* tag); void set_title(const char* t, int p, int a); -char* strconv(char* str, char* conv); void title_shadow(); void update_statusline(const char* info); void update_statuslinef(const char* format, ...) __attribute__ ((format (printf, 1, 2))); diff --git a/golded3/getpls.cpp b/golded3/getpls.cpp index ecf6369..f97c393 100644 --- a/golded3/getpls.cpp +++ b/golded3/getpls.cpp @@ -114,7 +114,9 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa TPLTOKEN_QUOTE, TPLTOKEN_INCLUDE, TPLTOKEN_MESSAGE, - TPLTOKEN_MODERATOR + TPLTOKEN_MODERATOR, + TPLTOKEN_WRITE, + TPLTOKEN_HEADER }; #define CSTR_COMMA_SIZEOF_CSTR(s) s, (sizeof(s)-1) @@ -150,7 +152,9 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa { CSTR_COMMA_SIZEOF_CSTR("quote") }, { CSTR_COMMA_SIZEOF_CSTR("include") }, { CSTR_COMMA_SIZEOF_CSTR("message") }, - { CSTR_COMMA_SIZEOF_CSTR("moderator") } + { CSTR_COMMA_SIZEOF_CSTR("moderator") }, + { CSTR_COMMA_SIZEOF_CSTR("write") }, + { CSTR_COMMA_SIZEOF_CSTR("header") } }; int end_token = sizeof(token_list) / sizeof(tpl_token); @@ -197,6 +201,12 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa mktemp(strcpy(tplfile, AddPath(CFG->templatepath, "GDXXXXXX"))); fp = fsopen(tplfile, "wt", CFG->sharemode); if(fp) { + fputs("@header= @oecho (@caddr) @align{79}{=}\n", fp); + fputs("@header Msg : @msgno of @msgs@align{44}@attr\n", fp); + fputs("@header From : @_oname @_oaddr @odate @otime\n", fp); + fputs("@header To : @dname\n", fp); + fputs("@header Subj : @subject\n", fp); + fputs("@header@align{79}{=}\n", fp); fputs("@moved* Replying to a msg in @oecho (@odesc)\n@moved\n", fp); fputs("@changed* Changed by @cname (@caddr), @cdate @ctime.\n@changed\n", fp); fputs("@forward* Forwarded from @oecho by @fname (@faddr).\n", fp); @@ -334,6 +344,20 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa token = end_token; break; + case TPLTOKEN_HEADER: + if((mode != MODE_HEADER) and (mode != MODE_WRITEHEADER)) + goto loop_next; + chg = YES; + token = end_token; + break; + + case TPLTOKEN_WRITE: + if((mode != MODE_WRITE) and (mode != MODE_WRITEHEADER)) + goto loop_next; + chg = YES; + token = end_token; + break; + case TPLTOKEN_NET: if(not AA->isnet()) goto loop_next; @@ -682,7 +706,8 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa continue; case TPLTOKEN_MESSAGE: - if(mode == MODE_FORWARD or mode == MODE_CHANGE) { + if((mode == MODE_FORWARD) or (mode == MODE_CHANGE) or + (mode == MODE_WRITEHEADER) or (mode == MODE_WRITE)) { n = 0; while(oldmsg->line[n]) { if(oldmsg->line[n]->txt.c_str()) { @@ -734,7 +759,7 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa } } - if(mode == MODE_CHANGE) + if((mode == MODE_CHANGE) or (mode == MODE_WRITEHEADER) or (mode == MODE_WRITE)) if(chg == NO) continue; if((mode == MODE_QUOTEBUF) and not quotebufline) @@ -751,7 +776,9 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa } fclose(fp); - if((mode != MODE_CHANGE) and (mode != MODE_QUOTEBUF)) { + if((mode != MODE_CHANGE) and (mode != MODE_QUOTEBUF) and + (mode != MODE_HEADER) and (mode != MODE_WRITEHEADER) and + (mode != MODE_WRITE) and (mode != MODE_WRITEHEADER)) { ctrlinfo = AA->Ctrlinfo(); ctrlinfo |= CI_TAGL; if(ctrlinfo & (CI_TAGL|CI_TEAR|CI_ORIG)) { diff --git a/golded3/geusrbse.cpp b/golded3/geusrbse.cpp index 8cf384a..d55eb09 100644 --- a/golded3/geusrbse.cpp +++ b/golded3/geusrbse.cpp @@ -779,9 +779,9 @@ void guserbase::update_addressbook(GMsg* msg, bool reverse, bool force) { return; // Update address - if(AA->isinternet()) + if(AA->isinternet() or (not *entry.iaddr and *iaddr)) strxcpy(entry.iaddr, iaddr, sizeof(entry.iaddr)); - else + if(not AA->isinternet() and not (AA->Internetgate().addr.valid() and (fidoaddr == AA->Internetgate().addr))) entry.fidoaddr = fidoaddr; lock(); @@ -824,8 +824,12 @@ bool guserbase::lookup_addressbook(GMsg* msg, char* name, char* aka, bool browse if(strblank(aka) and not strblank(entry.iaddr)) { // do UUCP addressing strcpy(msg->realto, entry.name); - strcpy(name, entry.iaddr); + strcpy(msg->idest, entry.iaddr); strcpy(msg->iaddr, entry.iaddr); + if(AA->Internetgate().addr.valid()) + AA->Internetgate().addr.make_string(aka); + if(*AA->Internetgate().name) + strcpy(name, AA->Internetgate().name); } } } @@ -852,9 +856,11 @@ void guserbase::build_pseudo(GMsg* msg, char* name, char* aka, bool direction) { return; } else { - Addr AKA = aka; - if(entry.fidoaddr != AKA) - return; + if(entry.fidoaddr.valid()) { + Addr AKA = aka; + if(entry.fidoaddr != AKA) + return; + } } strcpy(direction ? msg->pseudoto : msg->pseudofrom, entry.pseudo); diff --git a/golded3/geutil2.cpp b/golded3/geutil2.cpp index 6f8b1ee..8a05339 100644 --- a/golded3/geutil2.cpp +++ b/golded3/geutil2.cpp @@ -257,7 +257,7 @@ void ScreenBlankIdle() { char blankmsg1[80]; char blankmsg2[80]; time_t t = time(NULL); - sprintf(blankmsg1, " %s %s ", __gver_longpid__, strftimei(blankmsg2, 40, LNG->StatusLineTimeFmt, localtime(&t))); + sprintf(blankmsg1, " %s %s %s ", __gver_longpid__, __gver_ver__, strftimei(blankmsg2, 40, LNG->StatusLineTimeFmt, localtime(&t))); sprintf(blankmsg2, " %s ", LNG->BlankMsg); if(strblank(blankmsg2)) { *blankmsg2 = NUL; diff --git a/golded3/geview.cpp b/golded3/geview.cpp index 50622b2..f9411cf 100644 --- a/golded3/geview.cpp +++ b/golded3/geview.cpp @@ -101,18 +101,18 @@ void GMsgHeaderView::Paint() { headerline[width] = NUL; INam whofrom; - if(*msg->ifrom and *msg->realby) + if(not area->isecho() and *msg->ifrom and *msg->realby) sprintf(whofrom, "%s <%s>", msg->realby, msg->iorig); - else if(*msg->ifrom and *msg->iorig) + else if(not area->isecho() and *msg->ifrom and *msg->iorig) strcpy(whofrom, msg->iorig); else strcpy(whofrom, msg->By()); strsetsz(whofrom, (area->isinternet() or *msg->ifrom) ? (namewidth+nodewidth) : namewidth); INam whoto; - if(*msg->ito and *msg->realto) + if(not area->isecho() and *msg->ito and *msg->realto) sprintf(whoto, "%s <%s>", msg->realto, msg->idest); - else if(*msg->ito and *msg->idest) + else if(not area->isecho() and *msg->ito and *msg->idest) strcpy(whoto, msg->idest); else strcpy(whoto, msg->To()); @@ -266,9 +266,9 @@ void GMsgHeaderView::Paint() { window.prints(3, 0, window_color, LNG->To); window.prints(3, CFG->disphdrnameset.pos, ((msg->foundwhere&GFIND_TO) or msg->attr.tou()) ? highlight_color : to_color, whoto); if(not area->isinternet()) { - if(not (*msg->ifrom and (*msg->realby or *msg->iorig))) + if(area->isecho() or not (*msg->ifrom and (*msg->realby or *msg->iorig))) window.prints(2, CFG->disphdrnodeset.pos, from_color, node1); - if(not (*msg->ito and (*msg->realto or *msg->idest))) + if(area->isecho() or not (*msg->ito and (*msg->realto or *msg->idest))) window.prints(3, CFG->disphdrnodeset.pos, to_color, node2); } window.prints(2, CFG->disphdrdateset.pos, from_color, date1); diff --git a/golded3/golded3.cpp b/golded3/golded3.cpp index 59df3fd..34c0207 100644 --- a/golded3/golded3.cpp +++ b/golded3/golded3.cpp @@ -29,15 +29,18 @@ // ------------------------------------------------------------------ -#define __GVER_PID__(A,B,C,SIZE) __GVER_PRE##SIZE##NAME__ __GVER_##SIZE##NAME__ __GVER_POST##SIZE##NAME__ __GVER_##SIZE##PLATFORM__ " " \ - __GVER_PREVERSION__ #A "." #B "." #C __GVER_POSTVERSION__ +#define __GVER_PID__(A,SIZE) __GVER_PRE##SIZE##NAME__ __GVER_##SIZE##NAME__ __GVER_POST##SIZE##NAME__ __GVER_##SIZE##PLATFORM__ +#define __GVER_VER__(A,B,C) __GVER_PREVERSION__ #A "." #B "." #C __GVER_POSTVERSION__ +#define __GVER_SVER__(A,B,C) #A "." #B "." #C #define __GVER__(__GVER_MAJOR__,__GVER_MINOR__,__GVER_RELEASE__) \ int __gver_major__ = __GVER_MAJOR__; \ int __gver_minor__ = __GVER_MINOR__; \ int __gver_release__ = __GVER_RELEASE__; \ -const char* __gver_longpid__ = __GVER_PID__(__GVER_MAJOR__,__GVER_MINOR__,__GVER_RELEASE__,); \ -const char* __gver_shortpid__ = __GVER_PID__(__GVER_MAJOR__,__GVER_MINOR__,__GVER_RELEASE__,SHORT); +const char* __gver_longpid__ = __GVER_PID__(,); \ +const char* __gver_shortpid__ = __GVER_PID__(,SHORT); \ +const char* __gver_ver__ = __GVER_VER__(__GVER_MAJOR__,__GVER_MINOR__,__GVER_RELEASE__); +const char* __gver_shortver__ = __GVER_SVER__(__GVER_MAJOR__,__GVER_MINOR__,__GVER_RELEASE__); // ------------------------------------------------------------------ diff --git a/goldlib/gall/gcrckeyv.cpp b/goldlib/gall/gcrckeyv.cpp index d37a7a4..206166a 100644 --- a/goldlib/gall/gcrckeyv.cpp +++ b/goldlib/gall/gcrckeyv.cpp @@ -74,7 +74,7 @@ void getkeyvaleql(char** key, char** val, bool eql) { // Get straight keyword default: *key = p; - while(*p and not isspace(*p)) { + while(*p and not isspace(*p) and (*p != ',')) { if(eql and (*p == '=')) break; p++;