Macroses update, addressbook fixes, other changes

This commit is contained in:
Alexander S. Aganichev 2001-02-24 18:37:28 +00:00
parent 61b129311f
commit feb27a793a
29 changed files with 509 additions and 311 deletions

View File

@ -8,7 +8,7 @@ SHELL=bash
EXEEXT=.exe EXEEXT=.exe
OBJEXT=.o OBJEXT=.o
LIBEXT=.a LIBEXT=.a
#CC=gcc -Zomf -Zcrtdll #CC=gcc -Zomf
#AR=emxomfar #AR=emxomfar
#PLATFORM=emx #PLATFORM=emx
#SHELL=bash #SHELL=bash
@ -59,8 +59,8 @@ endif
# force not to use coprocessor features in DOS, if you have one you may remove this # force not to use coprocessor features in DOS, if you have one you may remove this
ifeq ($(PLATFORM),djg) ifeq ($(PLATFORM),djg)
CFLAGS+=-m386 -mno-80387 -mno-fp-ret-in-387 -mno-fancy-math-387 CFLAGS+=-m386
LNKFLAGS+=-lemu LNKFLAGS+=-lwmemu
endif endif
BIN=bin BIN=bin

View File

@ -10,7 +10,7 @@ else
LIBS=$(addprefix -l,$(GLIBS)) LIBS=$(addprefix -l,$(GLIBS))
endif endif
LIBS+=$(STDLIBS) LIBS+=$(STDLIBS)
FGLIBS=$(addprefix $(FLIBPATH)/lib, $(addsuffix .a, $(GLIBS))) FGLIBS=$(addprefix $(FLIBPATH)/lib, $(addsuffix $(LIBEXT), $(GLIBS)))
$(TOP)/$(BIN)/$(SHORTTARGET)$(PLATFORM)$(EXEEXT): $(OBJS) $(FGLIBS) $(ADDS) $(TOP)/$(BIN)/$(SHORTTARGET)$(PLATFORM)$(EXEEXT): $(OBJS) $(FGLIBS) $(ADDS)
@echo -n Linking $(TARGET)... @echo -n Linking $(TARGET)...

View File

@ -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" <bob@fisher.com>
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 ! Window size in Win32 version now calculated from different
parameters, you may need to adjust screen properties before running parameters, you may need to adjust screen properties before running
GoldED+ (especially in Win2k with it's defaults 300 rows :)). Though GoldED+ (especially in Win2k with it's defaults 300 rows :)). Though

View File

@ -1,131 +1,153 @@
This file mostly duplicates tips.txt but also answers on some russian specific 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! assistance!
>============================================================================== >==============================================================================
F.A.Q. по использованию GoldED+ в картинках (tm) F.A.Q. ¯® ¨á¯®«ì§®¢ ­¨î GoldED+ ¢ ª à⨭ª å (tm)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>Содержание >‘®¤¥à¦ ­¨¥
>~~~~~~~~~~ >~~~~~~~~~~
1. Установка GoldED+. 1. “áâ ­®¢ª  GoldED+.
2. Локальные установки. 2. ‹®ª «ì­ë¥ ãáâ ­®¢ª¨.
3. Замена SoftCR (русской буквы "H"), как это делается в GoldED+ правильно. 3. ‡ ¬¥­  SoftCR (àãá᪮© ¡ãª¢ë "H"), ª ª íâ® ¤¥« ¥âáï ¢ GoldED+ ¯à ¢¨«ì­®.
4. Макросы или как HЕ надо менять русскую букву "H". 4. Œ ªà®áë ¨«¨ ª ª H… ­ ¤® ¬¥­ïâì àãááªãî ¡ãª¢ã "H".
5. Стилевые коды. 5. ‘⨫¥¢ë¥ ª®¤ë.
6. CUA. 6. CUA.
7. Kак не квотить тирлайн и ориджин в GoldED+. 7. K ª ­¥ ª¢®â¨âì â¨à« ©­ ¨ ®à¨¤¦¨­ ¢ GoldED+.
8. Где взять GoldED+. 8. ƒ¤¥ ¢§ïâì GoldED+.
9. Поиск слов: что-то не так... 9. <20>®¨áª á«®¢: çâ®-â® ­¥ â ª...
10. Что за левизна в адресах кросспостов, начиная с 1.1.3? 10. —â® §  «¥¢¨§­  ¢  ¤à¥á å ªà®áᯮá⮢, ­ ç¨­ ï á 1.1.3?
11. А почему GoldED+ так криво поддерживает hpt-шные конфиги (не под UNIXами)? 11. € ¯®ç¥¬ã GoldED+ â ª ªà¨¢® ¯®¤¤¥à¦¨¢ ¥â hpt-è­ë¥ ª®­ä¨£¨ (­¥ ¯®¤ UNIX ¬¨)?
12. Почему не вводится русская "Э" под Win95? 12. <20>®ç¥¬ã ­¥ ¢¢®¤¨âáï àãá᪠ï "<22>" ¯®¤ Win95?
13. Backspace в Linux'e 13. Backspace ¢ Linux'e
14. А зачем мне этот <censored> редактор нужен? У Одинна было лучше! 14. € § ç¥¬ ¬­¥ íâ®â <censored> । ªâ®à ­ã¦¥­? “ Ž¤¨­­  ¡ë«® «ãçè¥!
15. А вот я хочу аналог MCITY встроенный. 15. € ¢®â ï å®çã  ­ «®£ MCITY ¢áâ஥­­ë©.
16. Типа эта... А писать куда автору? ;-) 16. $^%$^*! —â® âë ᤥ« « á á®åà ­¥­¨¥¬ á®®¡é¥­¨© ¢ 1.1.5?
17. ’¨¯  íâ ... € ¯¨á âì ªã¤   ¢â®àã? ;-)
>============================================================================== >==============================================================================
*Q:* А вот я достал GoldED+, как его ставить-то? *Q:* € ¢®â ï ¤®áâ « GoldED+, ª ª ¥£® áâ ¢¨âì-â®?
*A:* Прочитайте Notework.txt, там много интересного написано. Особенно полезно *A:* <EFBFBD>à®ç¨â ©â¥ Notework.txt, â ¬ ¬­®£® ¨­â¥à¥á­®£® ­ ¯¨á ­®. Žá®¡¥­­® ¯®«¥§­®
его читать, если что-то работает не так. Если не знаете английского, но ¥£® ç¨â âì, ¥á«¨ çâ®-â® à ¡®â ¥â ­¥ â ª. …᫨ ­¥ §­ ¥â¥  ­£«¨©áª®£®, ­®
знаете, какое ключевое слово глючит - поищите его, 3 предложения перевести §­ ¥â¥, ª ª®¥ ª«î祢®¥ á«®¢® £«îç¨â - ¯®¨é¨â¥ ¥£®, 3 ¯à¥¤«®¦¥­¨ï ¯¥à¥¢¥áâ¨
со словарем всегда можно. И вообще: читайте доки - они рулез. á® á«®¢ à¥¬ ¢á¥£¤  ¬®¦­®. ˆ ¢®®¡é¥: ç¨â ©â¥ ¤®ª¨ - ®­¨ àã«¥§.
*Q:* А у меня регистронезависимый поиск глючит и время в e-mail'ах и TZUTC *Q:* € ã ¬¥­ï ॣ¨áâà®­¥§ ¢¨á¨¬ë© ¯®¨áª £«îç¨â ¨ ¢à¥¬ï ¢ e-mail' å ¨ TZUTC
неправильное. ­¥¯à ¢¨«ì­®¥.
*A:* Чтобы GoldED+ глючил поменьше, надо настроить региональные установки: *A:* —⮡ë GoldED+ £«î稫 ¯®¬¥­ìè¥, ­ ¤® ­ áâநâì ॣ¨®­ «ì­ë¥ ãáâ ­®¢ª¨:
для DPMI32: country.sys, переменная TZ ¤«ï DPMI32: country.sys, ¯¥à¥¬¥­­ ï TZ
для Win32: control panel ¤«ï Win32: control panel
для OS/2: [не знаю где настраивается, но региональные настройки - свои], ¤«ï OS/2: [­¥ §­ î £¤¥ ­ áâà ¨¢ ¥âáï, ­® ॣ¨®­ «ì­ë¥ ­ áâனª¨ - ᢮¨],
переменная TZ ¯¥à¥¬¥­­ ï TZ
для UNIX: переменные LANG и TZ. ¤«ï UNIX: ¯¥à¥¬¥­­ë¥ LANG ¨ TZ.
*Q:* А как же все-таки правильно менять SoftCR при наборе и иметь с этим *Q:* € ª ª ¦¥ ¢á¥-â ª¨ ¯à ¢¨«ì­® ¬¥­ïâì SoftCR ¯à¨ ­ ¡®à¥ ¨ ¨¬¥âì á í⨬
меньше всего проблем? ¬¥­ìè¥ ¢á¥£® ¯à®¡«¥¬?
*A:* Чтобы заменять SoftCR (для чайников - это большая русская буква "H") *A:* —â®¡ë § ¬¥­ïâì SoftCR (¤«ï ç ©­¨ª®¢ - íâ® ¡®«ìè ï àãááª ï ¡ãª¢  "H")
чем-нибудь надо пользоваться ключевым словом EDITSOFTCRXLAT. При этом 祬-­¨¡ã¤ì ­ ¤® ¯®«ì§®¢ âìáï ª«îç¥¢ë¬ á«®¢®¬ EDITSOFTCRXLAT. <20>ਠí⮬
НЕОБХОДИМО (с версии 1.1.3) иметь DISPSOFTCR определенное в yes. Все <EFBFBD>…Ž<EFBFBD>•Ž„ˆŒŽ (á ¢¥àᨨ 1.1.3) ¨¬¥âì DISPSOFTCR ®¯à¥¤¥«¥­­®¥ ¢ yes. ‚á¥
остальные варианты замены GoldED+ не нужны, а ЗАМЕНА ЧЕРЕЗ MACRO и ®áâ «ì­ë¥ ¢ à¨ ­âë § ¬¥­ë GoldED+ ­¥ ­ã¦­ë,   ‡€Œ…<C592>€ —…<E28094>…‡ MACRO ¨
вовсе ПРОТИВОПОКАЗАНА! (см. следующий вопрос). ¢®¢á¥ <20><>ŽˆŽ<E2809A>ŽŠ€‡€<E280A1>€! (á¬. á«¥¤ãî騩 ¢®¯à®á).
*Q:* А почему так странно работает замена через MACRO, EDITMACRO, и пр.? *Q:* € ¯®ç¥¬ã â ª áâà ­­® à ¡®â ¥â § ¬¥­  ç¥à¥§ MACRO, EDITMACRO, ¨ ¯à.?
*A:* Символы из верхней части ASCII-таблицы (для чайников - русские буквы) в *A:* ‘¨¬¢®«ë ¨§ ¢¥àå­¥© ç á⨠ASCII-â ¡«¨æë (¤«ï ç ©­¨ª®¢ - àãá᪨¥ ¡ãª¢ë) ¢
макроподстановках нынче расцениваются как регистронезависимые, как это ¬ ªà®¯®¤áâ ­®¢ª å ­ë­ç¥ à á業¨¢ îâáï ª ª ॣ¨áâà®­¥§ ¢¨á¨¬ë¥, ª ª íâ®
всегда было для символов нижней половины ASCII-таблицы (латинских букв). ¢á¥£¤  ¡ë«® ¤«ï ᨬ¢®«®¢ ­¨¦­¥© ¯®«®¢¨­ë ASCII-â ¡«¨æë (« â¨­áª¨å ¡ãª¢).
Проблема маленькой русской "н" растет отсюда. <EFBFBD>஡«¥¬  ¬ «¥­ìª®© àãá᪮© "­" à áâ¥â ®âá.
*Q:* А как изменить поведение стилевых кодов? *Q:* € ª ª ¨§¬¥­¨âì ¯®¢¥¤¥­¨¥ á⨫¥¢ëå ª®¤®¢?
*A:* GoldED+ по-умолчанию показывает символы выделения стилей так же, как это *A:* GoldED+ ¯®-㬮«ç ­¨î ¯®ª §ë¢ ¥â ᨬ¢®«ë ¢ë¤¥«¥­¨ï á⨫¥© â ª ¦¥, ª ª íâ®
было в GoldED 2.50. Если это не устраивает, то почитайте про ключевое ¡ë«® ¢ GoldED 2.50. …᫨ íâ® ­¥ ãáâà ¨¢ ¥â, â® ¯®ç¨â ©â¥ ¯à® ª«î祢®¥
слово STYLECODES. á«®¢® STYLECODES.
*Q:* А где обещанное CUA? *Q:* € £¤¥ ®¡¥é ­­®¥ CUA?
*A:* Чтобы использовать CUA при выключенном KEYBDEFAULTS надо его определить. *A:* —â®¡ë ¨á¯®«ì§®¢ âì CUA ¯à¨ ¢ëª«î祭­®¬ KEYBDEFAULTS ­ ¤® ¥£® ®¯à¥¤¥«¨âì.
Хотя всякие #Left не описаны в документации, они есть :) В Линуксе •®âï ¢á直¥ #Left ­¥ ®¯¨á ­ë ¢ ¤®ªã¬¥­â æ¨¨, ®­¨ ¥áâì :) ‹¨­ãªá¥
работает только на консоли, да и то не всегда (точно не работает, если à ¡®â ¥â ⮫쪮 ­  ª®­á®«¨, ¤  ¨ â® ­¥ ¢á¥£¤  (â®ç­® ­¥ à ¡®â ¥â, ¥á«¨
запускать из-под midnight commander'а). § ¯ã᪠âì ¨§-¯®¤ midnight commander' ).
*Q:* А что за проблемы с INVALIDATE <token> "" ""? Почему все-равно квотится? *Q:* € çâ® §  ¯à®¡«¥¬ë á INVALIDATE <token> "" ""? <20>®ç¥¬ã ¢á¥-à ¢­® ª¢®â¨âáï?
*A:* Это опять недочитанная до конца документация. Используйте ключевое слово *A:* <EFBFBD>â® ®¯ïâì ­¥¤®ç¨â ­­ ï ¤® ª®­æ  ¤®ªã¬¥­â æ¨ï. ˆá¯®«ì§ã©â¥ ª«î祢®¥ á«®¢®
QUOTECTRL, которое, кстати, может использоваться и в Random System Group. QUOTECTRL, ª®â®à®¥, ªáâ â¨, ¬®¦¥â ¨á¯®«ì§®¢ âìáï ¨ ¢ Random System Group.
Тирлайны правильно инвалидируются по трем минусам, GoldED+ сам знает, что ’¨à« ©­ë ¯à ¢¨«ì­® ¨­¢ «¨¤¨àãîâáï ¯® â६ ¬¨­ãá ¬, GoldED+ á ¬ §­ ¥â, çâ®
после них должен быть пробел или перевод строки. ¯®á«¥ ­¨å ¤®«¦¥­ ¡ëâì ¯à®¡¥« ¨«¨ ¯¥à¥¢®¤ áâப¨.
*Q:* А где можно взять GoldED+? А можно поиметь исходники? А чем потом *Q:* € £¤¥ ¬®¦­® ¢§ïâì GoldED+? € ¬®¦­® ¯®¨¬¥âì ¨á室­¨ª¨? € 祬 ¯®â®¬
собирать? ᮡ¨à âì?
*A:* Родина GoldED+ находится на http://asa.i-connect.com. Там же вы можете *A:* <EFBFBD>®¤¨­  GoldED+ ­ å®¤¨âáï ­  http://asa.i-connect.com. ’ ¬ ¦¥ ¢ë ¬®¦¥â¥
найти список мирроров и взять исходники. Собирать надо GNU C/C++ (не надо ­ ©â¨ ᯨ᮪ ¬¨àà®à®¢ ¨ ¢§ïâì ¨á室­¨ª¨. ‘®¡¨à âì ­ ¤® GNU C/C++ (­¥ ­ ¤®
брать нечто древнее 2.8.x, лучше всего какую-нибудь свежую версию) и его ¡à âì ­¥çâ® ¤à¥¢­¥¥ 2.8.x, «ãçè¥ ¢á¥£® ª ªãî-­¨¡ã¤ì ᢥ¦ãî ¢¥àá¨î) ¨ ¥£®
производными (djgpp, emx, mingw32). Другие компиляторы более не ¯à®¨§¢®¤­ë¬¨ (djgpp, emx, mingw32). „à㣨¥ ª®¬¯¨«ïâ®àë ¡®«¥¥ ­¥
поддерживаются. Чтобы все компилировалось без каких-либо проблем - берите ¯®¤¤¥à¦¨¢ îâáï. —â®¡ë ¢á¥ ª®¬¯¨«¨à®¢ «®áì ¡¥§ ª ª¨å-«¨¡® ¯à®¡«¥¬ - ¡¥à¨â¥
что-то новее gcc 2.95 (или те egcs, в которых #pragma implementaion, çâ®-â® ­®¢¥¥ gcc 2.95 (¨«¨ ⥠egcs, ¢ ª®â®àëå #pragma implementaion,
#pragma interface уже были obsolete). Вовсе не надо компилировать все #pragma interface 㦥 ¡ë«¨ obsolete). ‚®¢á¥ ­¥ ­ ¤® ª®¬¯¨«¨à®¢ âì ¢á¥
командой "make 2>&1 | mail -s VERSION asa@eed.miee.ru", все равно я это ª®¬ ­¤®© "make 2>&1 | mail -s VERSION asa@eed.miee.ru", ¢á¥ à ¢­® ï íâ®
читать не буду - мне лень разбирать этот спам. ç¨â âì ­¥ ¡ã¤ã - ¬­¥ «¥­ì à §¡¨à âì íâ®â ᯠ¬.
*Q:* А как-то поиск нетривиально работает... *Q:* € ª ª-â® ¯®¨áª ­¥âਢ¨ «ì­® à ¡®â ¥â...
*A:* А вы уверены, что прочитали Notework.txt до предыдущей версии, в которой *A:* € ¢ë 㢥७ë, çâ® ¯à®ç¨â «¨ Notework.txt ¤® ¯à¥¤ë¤ã饩 ¢¥àᨨ, ¢ ª®â®à®©
все работало? Hачиная с 3.00b4 все сильно поменялось. K тому, что там ¢á¥ à ¡®â «®? H ç¨­ ï á 3.00b4 ¢á¥ ᨫ쭮 ¯®¬¥­ï«®áì. K ⮬ã, çâ® â ¬
описано, можно добавить, что GoldED+ правильно понимает поиск комбинаций ®¯¨á ­®, ¬®¦­® ¤®¡ ¢¨âì, çâ® GoldED+ ¯à ¢¨«ì­® ¯®­¨¬ ¥â ¯®¨áª ª®¬¡¨­ æ¨©
типа "A & B | C & D & E" с приоритетом & над | и что русские слова можно ⨯  "A & B | C & D & E" á ¯à¨®à¨â¥â®¬ & ­ ¤ | ¨ çâ® àãá᪨¥ á«®¢  ¬®¦­®
искать такими комбинациями: "?r [пn][рp][иu][вB][еE][тT]", где первая ¨áª âì â ª¨¬¨ ª®¬¡¨­ æ¨ï¬¨: "?r [¯n][àp][¨u][¢B][¥E][âT]", £¤¥ ¯¥à¢ ï
буква русская, вторая латинская (кавычки вводить не следует). ¡ãª¢  àãá᪠ï, ¢â®à ï « â¨­áª ï (ª ¢ë窨 ¢¢®¤¨âì ­¥ á«¥¤ã¥â).
*Q:* Что за левизна в адресах кросспостов, начиная с 1.1.3? *Q:* —â® §  «¥¢¨§­  ¢  ¤à¥á å ªà®áᯮá⮢, ­ ç¨­ ï á 1.1.3?
*A:* В goldlang.cfg поменялся формат для слов MS_LISTCC ("%s %s") и *A:* goldlang.cfg ¯®¬¥­ï«áï ä®à¬ â ¤«ï á«®¢ MS_LISTCC ("%s %s") ¨
ST_STATUSCC ("CC: %s of %s"). Проверьте свой конфиг и поменяйте по ST_STATUSCC ("CC: %s of %s"). <EFBFBD>஢¥àì⥠᢮© ª®­ä¨£ ¨ ¯®¬¥­ï©â¥ ¯®
аналогии!  ­ «®£¨¨!
*Q:* Поставил себе hpt. И что это за лажа при чтении конфигов? *Q:* <EFBFBD>®áâ ¢¨« ᥡ¥ hpt. ˆ çâ® íâ® §  « ¦  ¯à¨ ç⥭¨¨ ª®­ä¨£®¢?
*A:* А вы уверены, что вы читали доку на свой hpt? В доке явно написано, что *A:* € ¢ë 㢥७ë, çâ® ¢ë ç¨â «¨ ¤®ªã ­  ᢮© hpt? ¤®ª¥ ® ­ ¯¨á ­®, çâ®
"\" инициирует escape-последовательность. GoldED+ честно её обрабатывает, "\" ¨­¨æ¨¨àã¥â escape-¯®á«¥¤®¢ â¥«ì­®áâì. GoldED+ ç¥áâ­® ¥ñ ®¡à ¡ â뢠¥â,
в отличии от тех, кто обещал... В принципе, в 1.1.4.1 появился ключик ¢ ®â«¨ç¨¨ ®â â¥å, ªâ® ®¡¥é «... ¯à¨­æ¨¯¥, ¢ 1.1.4.1 ¯®ï¢¨«áï ª«î稪
-lame, отключающий парсилку обратных слэшей, попробуйте. -lame, ®âª«îç î騩 ¯ àᨫªã ®¡à â­ëå á«í襩, ¯®¯à®¡ã©â¥.
*Q:* Почему не вводится русская "Э" под Win95? *Q:* <EFBFBD>®ç¥¬ã ­¥ ¢¢®¤¨âáï àãá᪠ï "<22>" ¯®¤ Win95?
*A:* Поставьте тип клавиатуры 101 клавишный США, скорее всего поможет. Если не *A:* <EFBFBD>®áâ ¢ì⥠⨯ ª« ¢¨ âãàë 101 ª« ¢¨è­ë© ‘˜€, ᪮॥ ¢á¥£® ¯®¬®¦¥â. …᫨ ­¥
поможет - поставьте себе нормальный руссификатор: это заодно спасет от ¯®¬®¦¥â - ¯®áâ ¢ì⥠ᥡ¥ ­®à¬ «ì­ë© àãáá¨ä¨ª â®à: íâ® § ®¤­® ᯠá¥â ®â
кривой вставки текста из клипборда в DOS-версии при несовпадении языка ªà¨¢®© ¢áâ ¢ª¨ ⥪áâ  ¨§ ª«¨¯¡®à¤  ¢ DOS-¢¥àᨨ ¯à¨ ­¥á®¢¯ ¤¥­¨¨ ï§ëª 
текста и содержимого клипборда. ⥪áâ  ¨ ᮤ¥à¦¨¬®£® ª«¨¯¡®à¤ .
*Q:* Не работает backspace, приходится пользоватся стандартным Ctrl-? *Q:* <EFBFBD>¥ à ¡®â ¥â backspace, ¯à¨å®¤¨âáï ¯®«ì§®¢ âáï áâ ­¤ àâ­ë¬ Ctrl-?
*A:* Alexey Froloff: ``keycode 14 = delete delete delete delete'' в keymap'е *A:* Alexey Froloff: ``keycode 14 = delete delete delete delete'' ¢ keymap'¥
прописать надо. ¯à®¯¨á âì ­ ¤®.
*Q:* А зачем мне этот <censored> редактор нужен? У Одинна было лучше! *Q:* € § ç¥¬ ¬­¥ íâ®â <censored> । ªâ®à ­ã¦¥­? “ Ž¤¨­­  ¡ë«® «ãçè¥!
*A:* А кто-то заставляет пользоваться? :-) Не нравится - сноси и пользуйся тем, *A:* € ªâ®-â® § áâ ¢«ï¥â ¯®«ì§®¢ âìáï? :-) <20>¥ ­à ¢¨âáï - ᭮ᨠ¨ ¯®«ì§ã©áï ⥬,
что нравится. çâ® ­à ¢¨âáï.
*Q:* А вот я хочу аналог MCITY встроенный. *Q:* € ¢®â ï å®çã  ­ «®£ MCITY ¢áâ஥­­ë©.
*A:* Сгинь нечисть! Всех разумных людей мировой нодлист устраивает больше. *A:* ‘£¨­ì ­¥ç¨áâì! ‚á¥å ࠧ㬭ëå «î¤¥© ¬¨à®¢®© ­®¤«¨áâ ãáâà ¨¢ ¥â ¡®«ìè¥.
*Q:* Типа эта... А писать куда автору? ;-) *Q:* $^%$^*! —â® âë ᤥ« « á á®åà ­¥­¨¥¬ á®®¡é¥­¨© ¢ 1.1.5?
*A:* Писать лучше всего в Ru.GoldED. Даже лучше сначала его почитать, потом *A:* ’¥¯¥àì á®®¡é¥­¨ï á®åà ­ïîâáï ¯® ⥬¯«¥©âã. „®¯®«­¥­¨ï ¢® ¢áâ஥­­ë©
писать. Если уж сильно приспичит, то можно писать на 2:5020/201.58, ⥬¯«¥©â ¢ë£«ï¤ïâ â ª:
2:5020/604.19 или aaganichev@netscape.net, но я совсем не гарантирую, что
я отвечу. @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, ª®â®àë© à áè¨àï¥âáï ¯à¨ ­ «¨ç¨¨ § ¯à®á 
ª á®åà ­¥­¨î ⥫  á®®¡é¥­¨ï, ­® § ç¥¬ ®­® ¬®¦¥â ¯®­ ¤®¡¨âìáï ï ­¥
¯à¨¤ã¬ «. <20> §¢¥ çâ® ®¯¨á âì ¯¥à¢ãî áâà®çªã ª ª @write ;)
*Q:* ’¨¯  íâ ... € ¯¨á âì ªã¤   ¢â®àã? ;-)
*A:* <20>¨á âì «ãçè¥ ¢á¥£® ¢ Ru.GoldED. „ ¦¥ «ãçè¥ á­ ç «  ¥£® ¯®ç¨â âì, ¤®¦¤ âìáï
¬¥áâ­®£® FAQ, ¡ £«¨áâ  ¨ ⮫쪮 ¯®â®¬ ¯¨á âì. …᫨ 㦠ᨫ쭮 ¯à¨á¯¨ç¨â, â®
¬®¦­® ¯¨á âì ­  2:5020/201.58, 2:5020/604.19 ¨«¨ aaganichev@netscape.net,
­® ï ᮢᥬ ­¥ £ à ­â¨àãî, çâ® ï ®â¢¥çã. ‘â ¢ì⥠RRq, Cfm, ¥á«¨ å®â¨â¥
§­ âì, çâ® ¢ è¥ ¯¨á쬮 ¤®è«® ¨ ï ¯à®áâ® ­¥ áâ « ­  ­¥£® ®â¢¥ç âì. Ÿ ­¥
®â¢¥ç î ­  ¢®¯à®áë, ®¯¨á ­­ë¥ ¢ í⮬ FAQ ¨«¨ ¥á«¨ ï ­¥ §­ î ª ª çâ®-â®
à ¡®â ¥â ¢ GoldED'¥ (ï ­¥ ¨á¯®«ì§ãî ᫨誮¬ ¬­®£® ¥£® ¢®§¬®¦­®á⥩ - Œ<>
®­¨ ­¥ ­ã¦­ë) - ç¨â ©â¥ ¤®ªã¬¥­â æ¨î, á¯à è¨¢ ©â¥ ¢ Ru.GoldED... “ ¬¥­ï
᫨誮¬ ¬ «® ᢮¡®¤­®£® ¢à¥¬¥­¨, ç⮡ë à áª ¯ë¢ âì ¤«ï ¢ á ª ª çâ®-â®
à ¡®â ¥â.
>============================================================================== >==============================================================================

View File

@ -826,6 +826,7 @@ CfgGed::CfgGed() {
else else
memcpy(color, gold_color1, sizeof(color)); memcpy(color, gold_color1, sizeof(color));
*internetgate.name = 0; *internetgate.name = 0;
internetgateexp = (RFCName << 2) | RFCAddress;
// internetgate.addr.reset(); // internetgate.addr.reset();
*internetserver.nntp.server = 0; *internetserver.nntp.server = 0;
*internetserver.smtp.server = 0; *internetserver.smtp.server = 0;

View File

@ -217,6 +217,7 @@ const word CRC_INTENSECOLORS = 0x5F70;
const word CRC_INTERNETADDRESS = 0xA4D3; const word CRC_INTERNETADDRESS = 0xA4D3;
const word CRC_INTERNETDOMAIN = 0x50d7; const word CRC_INTERNETDOMAIN = 0x50d7;
const word CRC_INTERNETGATE = 0xF6C0; const word CRC_INTERNETGATE = 0xF6C0;
const word CRC_INTERNETGATEEXP = 0x0797;
const word CRC_INTERNETLOOKUP = 0x0E22; const word CRC_INTERNETLOOKUP = 0x0E22;
const word CRC_INTERNETMSGID = 0xC31F; const word CRC_INTERNETMSGID = 0xC31F;
const word CRC_INTERNETREPLY = 0x6253; const word CRC_INTERNETREPLY = 0x6253;

View File

@ -374,6 +374,7 @@ SwitchI:
case CRC_INTERNETADDRESS : CfgInternetaddress (); break; case CRC_INTERNETADDRESS : CfgInternetaddress (); break;
case CRC_INTERNETDOMAIN : CfgInternetdomain (); break; case CRC_INTERNETDOMAIN : CfgInternetdomain (); break;
case CRC_INTERNETGATE : CfgInternetgate (); break; case CRC_INTERNETGATE : CfgInternetgate (); break;
case CRC_INTERNETGATEEXP : CfgInternetgateexp (); break;
case CRC_INTERNETMSGID : CfgInternetmsgid (); break; case CRC_INTERNETMSGID : CfgInternetmsgid (); break;
case CRC_INTERNETRFCBODY : CfgInternetrfcbody (); break; case CRC_INTERNETRFCBODY : CfgInternetrfcbody (); break;
case CRC_INTERNETSERVER : CfgInternetserver (); break; case CRC_INTERNETSERVER : CfgInternetserver (); break;

View File

@ -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() { void CfgInternetmsgid() {
bool flag = GetYesno(val); bool flag = GetYesno(val);

View File

@ -144,17 +144,17 @@ void CfgTearline() {
void CfgTemplate() { void CfgTemplate() {
char* key;
getkeyval(&key, &val);
if(cfgingroup) { if(cfgingroup) {
Path buf; Path buf;
strxcpy(buf, val, sizeof(buf)); strxcpy(buf, key, sizeof(buf));
CFG->grp.AddItm(GRP_TEMPLATE, buf, strlen(buf)+1); CFG->grp.AddItm(GRP_TEMPLATE, buf, strlen(buf)+1);
} }
else { else {
char* key;
Tpl tp; Tpl tp;
*tp.name = NUL; *tp.name = NUL;
tp.match.reset(); tp.match.reset();
getkeyval(&key, &val);
strcpy(tp.file, key); strcpy(tp.file, key);
if((*val == '\'') or (*val == '\"')) { if((*val == '\'') or (*val == '\"')) {
getkeyval(&key, &val); getkeyval(&key, &val);

View File

@ -209,6 +209,7 @@ void CfgIntensecolors ();
void CfgInternetaddress (); void CfgInternetaddress ();
void CfgInternetdomain (); void CfgInternetdomain ();
void CfgInternetgate (); void CfgInternetgate ();
void CfgInternetgateexp ();
void CfgInternetlookup (); void CfgInternetlookup ();
void CfgInternetmsgid (); void CfgInternetmsgid ();
void CfgInternetreply (); void CfgInternetreply ();

View File

@ -73,6 +73,8 @@ const int MODE_VIEW = 116;
const int MODE_WRITE = 117; const int MODE_WRITE = 117;
const int MODE_PRINT = 118; const int MODE_PRINT = 118;
const int MODE_APPEND = 119; const int MODE_APPEND = 119;
const int MODE_WRITEHEADER = 120;
const int MODE_HEADER = 121;
const int MODE_NEW = 0x0100; const int MODE_NEW = 0x0100;
const int MODE_CHANGE = 0x0200; 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 ? // Message written by/to me/you ?

View File

@ -241,6 +241,7 @@ public:
IAdr internetaddress; IAdr internetaddress;
char internetdomain[96]; char internetdomain[96];
Node internetgate; Node internetgate;
int internetgateexp;
bool internetmsgid; bool internetmsgid;
bool internetrfcbody; bool internetrfcbody;
InetServers internetserver; InetServers internetserver;

View File

@ -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)", 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_prename__, __gver_name__, __gver_postname__,
__gver_preversion__, __gver_major__, __gver_minor__, __gver_preversion__, __gver_major__, __gver_minor__,
__gver_release__, __gver_postversion__, ggetosstring()); __gver_release__, __gver_postversion__, ggetosstring());
return buf; return informative_string;
} }
@ -335,7 +338,7 @@ void DoKludges(int mode, GMsg* msg, bool attronly) {
} }
// The PID: (Product ID code) kludge // 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)))) { 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()) { 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 = AddKludge(line, buf);
line->kludge = GKLUD_RFC; line->kludge = GKLUD_RFC;
} }
@ -535,10 +538,13 @@ void DoKludges(int mode, GMsg* msg, bool attronly) {
if(AA->isnet()) { if(AA->isnet()) {
if(*msg->iaddr and not AA->isinternet()) { 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; Name name;
strcpy(name, msg->To()); strcpy(name, msg->To());
if(CFG->internetgateexp == ((RFCName << 2) | RFCAddress))
sprintf(buf, "To: \"%s\" <%s>\r", StripQuotes(name), msg->iaddr); sprintf(buf, "To: \"%s\" <%s>\r", StripQuotes(name), msg->iaddr);
else
sprintf(buf, "To: %s (%s)\r", msg->iaddr, StripQuotes(name));
} }
else else
sprintf(buf, "To: %s\r", msg->iaddr); sprintf(buf, "To: %s\r", msg->iaddr);
@ -607,14 +613,6 @@ void DoTearorig(int mode, GMsg* msg) {
line = LastLine(msg->lin); line = LastLine(msg->lin);
if(line == NULL) if(line == NULL)
msg->lin = line = AddLine(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 // Check and fix originline
if(*msg->origin) { if(*msg->origin) {

View File

@ -61,12 +61,17 @@ void SaveLines(int mode, const char* savefile, GMsg* msg, bool clip) {
} }
int lines=0; int lines=0;
if(prnfp) { if(prnfp) {
#ifdef OLD_STYLE_HEADER
if(mode == MODE_WRITE) { if(mode == MODE_WRITE) {
if(prnheader) if(prnheader)
DispHeader(msg, prn, prnfp, prnmargin); DispHeader(msg, prn, prnfp, prnmargin);
if(prn) if(prn)
lines = 6; 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; int n = 0;
Line** lin = msg->line; Line** lin = msg->line;
if(lin and not (prnheader & WRITE_ONLY_HEADER)) { if(lin and not (prnheader & WRITE_ONLY_HEADER)) {

View File

@ -50,8 +50,6 @@ char m_title[80]; // Menu title string
int m_titlepos; // Menu title position int m_titlepos; // Menu title position
int m_titleattr; // Menu title color int m_titleattr; // Menu title color
char* tconv;
int AreaKeys = 0; int AreaKeys = 0;
int ReadKeys = 0; int ReadKeys = 0;
int ListKeys = 0; int ListKeys = 0;

View File

@ -100,8 +100,6 @@ extern char m_title[];
extern int m_titlepos; extern int m_titlepos;
extern int m_titleattr; extern int m_titleattr;
extern char* tconv;
extern int AreaKeys, ReadKeys, ListKeys, NodeKeys, EditKeys, FileKeys; extern int AreaKeys, ReadKeys, ListKeys, NodeKeys, EditKeys, FileKeys;
extern list<CmdKey>::iterator AreaKey, ReadKey, ListKey, NodeKey, EditKey, FileKey; extern list<CmdKey>::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_time__;
extern const char* __gver_longpid__; extern const char* __gver_longpid__;
extern const char* __gver_shortpid__; extern const char* __gver_shortpid__;
extern const char* __gver_ver__;
extern const char* __gver_shortver__;
// ------------------------------------------------------------------ // ------------------------------------------------------------------

View File

@ -305,6 +305,10 @@ bool GMsgHeaderEdit::validate() {
fromaddr.buf = ffromaddr->buf; fromaddr.update = false; fromaddr.buf = ffromaddr->buf; fromaddr.update = false;
subj.buf = fsubj->buf; subj.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); bool res = set_to_address(msg, &toname, &toaddr, &fromaddr, &subj, 0, LNG->SelectDestNode, lookup);
vcurshow(); vcurshow();
@ -313,9 +317,13 @@ bool GMsgHeaderEdit::validate() {
strsetsz(bot2, EDIT->HdrNodeLen()); strsetsz(bot2, EDIT->HdrNodeLen());
window.prints(1, EDIT->HdrNodePos(), C_HEADW, bot2); window.prints(1, EDIT->HdrNodePos(), C_HEADW, bot2);
// once we changed name invalidate realto // once we changed name invalidate realto and internet address
if(not strieql(orig_toname.c_str(), toname.buf)) if(not strieql(orig_toname.c_str(), toname.buf)) {
if(strieql(realto, msg->realto))
*msg->realto = NUL; *msg->realto = NUL;
if(not AA->isinternet() and strieql(iaddr, msg->iaddr))
*msg->iaddr = NUL;
}
if(toname.update) current->update(); if(toname.update) current->update();
if(toaddr.update) ftoaddr->update(); if(toaddr.update) ftoaddr->update();
@ -442,8 +450,14 @@ int EditHeaderinfo(int mode, GMsgHeaderView &view) {
strcpy(msg->realto, msg->to); strcpy(msg->realto, msg->to);
strcpy(msg->iorig, from_addr.c_str()); strcpy(msg->iorig, from_addr.c_str());
strcpy(msg->idest, to_addr.c_str()); strcpy(msg->idest, to_addr.c_str());
strcpy(msg->ifrom, msg->iorig); if(*msg->by)
strcpy(msg->ito, msg->idest); 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) if(msg->orig.net == 0)
msg->orig = msg->oorig = AA->Aka().addr; msg->orig = msg->oorig = AA->Aka().addr;
if(msg->dest.net == 0) if(msg->dest.net == 0)
@ -451,8 +465,9 @@ int EditHeaderinfo(int mode, GMsgHeaderView &view) {
} }
else { else {
if(strchr(to_name.c_str(), '@')) { if(strchr(to_name.c_str(), '@')) {
if(*AA->Internetgate().name) if(*AA->Internetgate().name) {
strcpy(msg->iaddr, to_name.c_str()); strcpy(msg->iaddr, to_name.c_str());
}
else { else {
if(to_name.length() > 34) { if(to_name.length() > 34) {
strcpy(msg->to, "UUCP"); strcpy(msg->to, "UUCP");
@ -465,6 +480,16 @@ int EditHeaderinfo(int mode, GMsgHeaderView &view) {
else else
strcpy(msg->to, to_name.c_str()); 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; Addr address;
address = AA->Aka().addr; address = AA->Aka().addr;

View File

@ -24,18 +24,18 @@
// Header display. // Header display.
// ------------------------------------------------------------------ // ------------------------------------------------------------------
#ifdef OLD_STYLE_HEADER
#include <golded.h> #include <golded.h>
// ------------------------------------------------------------------ // ------------------------------------------------------------------
char* strconv(char* str, char* conv) { static char* strconv(char* str) {
char* s=str; char* s=str;
char* p = str; char* p = str;
NW(conv); // Dummy
while(*str) { while(*str) {
if(iscntrl(*str) and (*str != '\n') and (*str != '\r')) // Control codes if(iscntrl(*str) and (*str != '\n') and (*str != '\r')) // Control codes
*p++ = '.'; *p++ = '.';
@ -79,39 +79,44 @@ void DispHeader(GMsg* msg, bool prn, FILE* fp, int width) {
// Generate top line fields // Generate top line fields
char buf[256]; char buf[256];
char top1[200]; char buf1[200];
char buf2[200];
strtrim(strcpy(buf, AA->desc())); strtrim(strcpy(buf, AA->desc()));
if((CFG->dispareano == ALWAYS) or (CFG->dispareano and AA->board())) 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 else
sprintf(top1, " %s ", buf); sprintf(buf1, " %s ", buf);
strtrim(top1); strtrim(buf1);
strcat(top1, " (" /*)*/); strcat(buf1, " (" /*)*/);
if(AA->isinternet()) if(AA->isinternet())
strcpy(buf, AA->Internetaddress()); strcpy(buf, AA->Internetaddress());
else else
AA->Aka().addr.make_string(buf); AA->Aka().addr.make_string(buf);
strcat(top1, buf); strcat(buf1, buf);
strcat(top1, /*(*/ ") "); strcat(buf1, /*(*/ ") ");
char top2[200];
if(msg->areakludgeid) if(msg->areakludgeid)
sprintf(top2, " %s (%s) ", AA->echoid(), msg->areakludgeid); sprintf(buf2, " %s (%s) ", AA->echoid(), msg->areakludgeid);
else 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 // Generate message attributes string
char bot2[200]; MakeAttrStr(buf2, &msg->attr);
MakeAttrStr(bot2, &msg->attr); int len2 = strlen(buf2);
int len2 = strlen(bot2);
if(len2 > width-CFG->disphdrnodeset.pos) { if(len2 > width-CFG->disphdrnodeset.pos) {
len2 = width-CFG->disphdrnodeset.pos; len2 = width-CFG->disphdrnodeset.pos;
strsetsz(bot2, len2); strsetsz(buf2, len2);
} }
// Generate message number and reply links string // Generate message number and reply links string
char bot1[200]; char* ptr = buf1;
char* ptr = bot1;
int list_max = msg->link.list_max(); int list_max = msg->link.list_max();
ulong* replies = (ulong*)throw_calloc(list_max+1, sizeof(ulong)); ulong* replies = (ulong*)throw_calloc(list_max+1, sizeof(ulong));
ulong replyto, replynext; 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]); ptr += sprintf(ptr, " %s%lu", (plus++?"":"+"), replies[replyn]);
if(replynext) if(replynext)
sprintf(ptr, " *%lu", replynext); sprintf(ptr, " *%lu", replynext);
int len1 = strlen(bot1)-8; int len1 = strlen(buf1)-8;
if((CFG->disphdrnameset.pos + len1) > CFG->disphdrnodeset.pos) { if((CFG->disphdrnameset.pos + len1) > CFG->disphdrnodeset.pos) {
if(8 + len1 + len2 > width) { if(8 + len1 + len2 > width) {
strsetsz(bot1, width-len2-1); strsetsz(buf1, width-len2-1);
strtrim(bot1); strtrim(buf1);
} }
strcat(bot1, " "); strcat(buf1, " ");
strcat(bot1, bot2); strcat(buf1, buf2);
*bot2 = NUL; *buf2 = NUL;
} }
else { else {
strsetsz(bot1, namewidth+8); strsetsz(buf1, namewidth+8);
strcat(bot1, bot2); strcat(buf1, buf2);
*bot2 = NUL; *buf2 = NUL;
} }
strsetsz(bot1, width); strsetsz(buf1, width);
throw_free(replies); throw_free(replies);
// Generate orig node data // Write message info
char node1[200]; strcpy(stpcpy(buf, buf1), buf2);
if(msg->orig.net) strtrim(buf);
msg->orig.make_string(node1); strcat(buf, prn ? NL : "\n");
else strconv(buf);
*node1 = NUL; fwrite(buf, strlen(buf), 1, fp);
strsetsz(node1, nodewidth);
// 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) if(msg->written)
strftimei(date1, CFG->disphdrdateset.len, LNG->DateTimeFmt, gmtime(&msg->written)); strftimei(buf2, CFG->disphdrdateset.len, LNG->DateTimeFmt, gmtime(&msg->written));
strsetsz(date1, datewidth); 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 // Generate dest node data
char node2[200];
if(msg->dest.net and AA->isnet()) { 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) {
if(msg->odest.net != msg->dest.net or msg->odest.node != msg->dest.node) { 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); sprintf(buf, " %s %u/%u", LNG->Via, msg->odest.net, msg->odest.node);
strcat(node2, buf); strcat(buf2, buf);
} }
} }
} }
else else
*node2 = NUL; *buf2 = NUL;
strsetsz(node2, nodewidth); strsetsz(buf2, nodewidth);
char date2[25] = "";
if(msg->arrived) if(msg->arrived)
strftimei(date2, CFG->disphdrdateset.len, LNG->DateTimeFmt, gmtime(&msg->arrived)); strftimei(buf2, CFG->disphdrdateset.len, LNG->DateTimeFmt, gmtime(&msg->arrived));
strsetsz(date2, datewidth); 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 // Generate subjectline
char subj[200], lngsubj[10]; strcpy(buf2, (msg->attr.att() or msg->attr.frq() or msg->attr.urq()) ? LNG->File : LNG->Subj);
strcpy(lngsubj, (msg->attr.att() or msg->attr.frq() or msg->attr.urq()) ? LNG->File : LNG->Subj); strxcpy(buf1, msg->re, sizeof(buf1));
strxcpy(subj, msg->re, sizeof(subj)); strsetsz(buf1, width-strlen(buf2));
strsetsz(subj, width-strlen(lngsubj));
// 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"); strcpy(stpcpy(buf, headerline), prn ? NL : "\n");
strncpy(buf+1, top1, strlen(top1)); strconv(buf);
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);
fwrite(buf, strlen(buf), 1, fp); fwrite(buf, strlen(buf), 1, fp);
} }
// ------------------------------------------------------------------ // ------------------------------------------------------------------
#endif

View File

@ -506,7 +506,7 @@ void Initialize(int argc, char* argv[]) {
srand((unsigned)time(NULL)); srand((unsigned)time(NULL));
// Display startup banner // Display startup banner
cout << __gver_longpid__ << endl; cout << __gver_longpid__ << " " << __gver_ver__ << endl;
// Check environment commandline // Check environment commandline
ptr = getenv("GEDCMD"); ptr = getenv("GEDCMD");
@ -685,7 +685,7 @@ void Initialize(int argc, char* argv[]) {
// Start the log // Start the log
static char buf[200]; 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); LOG.open(CFG->logfile, buf, __gver_shortlogname__, CFG->logformat);
// Read/compile various configs // Read/compile various configs

View File

@ -1592,8 +1592,6 @@ void ScanKludges(GMsg* msg, int getvalue) {
KludgeFROM(msg, tmp ? tmp : ptr); KludgeFROM(msg, tmp ? tmp : ptr);
if(tmp) if(tmp)
throw_free(tmp); throw_free(tmp);
if(not AA->isinternet())
*msg->ifrom = NUL;
} }
else if(strnieql(line->txt.c_str(), "To:", 3)) { else if(strnieql(line->txt.c_str(), "To:", 3)) {
const char* ptr = line->txt.c_str() + 3; const char* ptr = line->txt.c_str() + 3;
@ -1602,8 +1600,6 @@ void ScanKludges(GMsg* msg, int getvalue) {
KludgeTO(msg, tmp ? tmp : ptr); KludgeTO(msg, tmp ? tmp : ptr);
if(tmp) if(tmp)
throw_free(tmp); throw_free(tmp);
if(not AA->isinternet())
*msg->ito = NUL;
} }
else if(strnieql(line->txt.c_str(), "Reply-To:", 9)) { else if(strnieql(line->txt.c_str(), "Reply-To:", 9)) {
const char* ptr = line->txt.c_str() + 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->realto, msg->realto, 0, sizeof(INam), true);
strxmimecpy(msg->by, msg->by, level, sizeof(INam), true); strxmimecpy(msg->by, msg->by, level, sizeof(INam), true);
strxmimecpy(msg->to, msg->to, 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())) if(not (msg->attr.frq() or msg->attr.att() or msg->attr.urq()))
strxmimecpy(msg->re, msg->re, level, sizeof(ISub), true); strxmimecpy(msg->re, msg->re, level, sizeof(ISub), true);

View File

@ -59,9 +59,9 @@ static bool tokenxchg(char*& dst, char* tok, const char* src, int len = 0, int c
if(dst[toklen] == '{') { if(dst[toklen] == '{') {
char *p = strchr(dst+toklen, '}'); char *p = strchr(dst+toklen, '}');
if(p) { if(p) {
uint len = p-dst-toklen-1; uint dstlen = p-dst-toklen-1;
if(use && len) { if(use && dstlen) {
strxcpy (buf, dst+toklen+1, len+1); strxcpy (buf, dst+toklen+1, dstlen+1);
src = buf; src = buf;
} }
toklen = p-dst+1; 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; uint srclen = (len == 0) ? sl : len;
memmove(dst+srclen, dst+toklen, strlen(dst+toklen)+1); memmove(dst+srclen, dst+toklen, strlen(dst+toklen)+1);
memset(dst, ' ', srclen); memset(dst, ' ', srclen);
memcpy(dst, src, sl); memcpy(dst, src, ((len != 0) and (len < sl)) ? len : sl);
dst += srclen; dst += srclen;
return true; 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* TokenXlat(int mode, char* input, GMsg* msg, GMsg* oldmsg, int __origarea) {
char longpid[100]; static char revbuf[5] = "";
sprintf(longpid, "%s%s%s%s", __gver_prename__, __gver_name__, __gver_postname__, __gver_platform__); if(revbuf[0] == NUL)
char shortpid[100];
sprintf(shortpid, "%s%s", __gver_shortname__, __gver_shortplatform__);
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])); sprintf(revbuf, "%02d%02d", str2mon(__gver_date__), atoi(&__gver_date__[4]));
char xmailer[356]; char attr[80];
get_informative_string(xmailer); MakeAttrStr(attr, &msg->attr);
const char *xmailer = get_informative_string();
time_t t = time(NULL); time_t t = time(NULL);
struct tm* written_tm = localtime(&t); 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]; char otime[80];
strftimei(otime, 80, LNG->TimeFmt, written_tm); strftimei(otime, 80, LNG->TimeFmt, written_tm);
const char* osslashbuf = __gver_platform__;
const char* origareaid = AL.AreaIdToPtr(__origarea)->echoid(); const char* origareaid = AL.AreaIdToPtr(__origarea)->echoid();
bool origareaisinet = AL.AreaIdToPtr(__origarea)->isinternet(); bool origareaisinet = AL.AreaIdToPtr(__origarea)->isinternet();
bool currareaisinet = AA->isinternet(); bool currareaisinet = AA->isinternet();
char* modereptr = oldmsg->re; 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((mode == MODE_QUOTE) or (mode == MODE_REPLYCOMMENT) or (mode == MODE_REPLY)) {
if(AL.AreaIdToPtr(__origarea)->Areareplydirect() and oldmsg->areakludgeid) if(AL.AreaIdToPtr(__origarea)->Areareplydirect() and oldmsg->areakludgeid)
origareaid = 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())) if(tokenxchg(dst, "@odesc", AL.AreaEchoToPtr(origareaid)->desc()))
continue; continue;
if(origareaisinet) { if(origareaisinet) {
if(tokenxchg(dst, "@oaddr", oldmsg->iorig, 19)) if(tokenxchg(dst, "@oaddr", oldmsg->iorig, 19, 1, 0))
continue; continue;
} }
else { 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; continue;
if(strnieql(dst, "@o3daddr", 8)) { if(strnieql(dst, "@o3daddr", 8)) {
ftn_addr boss = oldmsg->orig; ftn_addr boss = oldmsg->orig;
boss.point = 0; 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; continue;
} }
} }
@ -179,25 +181,25 @@ char* TokenXlat(int mode, char* input, GMsg* msg, GMsg* oldmsg, int __origarea)
continue; continue;
if(tokenxchg(dst, "@otzoffset", (oldmsg->tzutc == -32767) ? "" : (sprintf(buf, " %+05d", oldmsg->tzutc), buf))) if(tokenxchg(dst, "@otzoffset", (oldmsg->tzutc == -32767) ? "" : (sprintf(buf, " %+05d", oldmsg->tzutc), buf)))
continue; continue;
if(tokenxchg(dst, "@ofrom", oldmsg->ifrom)) if(tokenxchg(dst, "@ofrom", *oldmsg->ifrom ? oldmsg->ifrom : oldmsg->By()))
continue; continue;
if(tokenxchg(dst, "@oto", oldmsg->ito)) if(tokenxchg(dst, "@oto", *oldmsg->ito ? oldmsg->ito : oldmsg->To()))
continue; continue;
if(tokenxchg(dst, "@omessageid", oldmsg->messageid ? oldmsg->messageid : "")) if(tokenxchg(dst, "@omessageid", oldmsg->messageid ? oldmsg->messageid : ""))
continue; continue;
if(tokenxchg(dst, "@omsgid", *msg->replys ? msg->replys : "")) if(tokenxchg(dst, "@omsgid", *msg->replys ? msg->replys : ""))
continue; continue;
if(origareaisinet) { if(origareaisinet) {
if(tokenxchg(dst, "@daddr", oldmsg->iaddr, 19)) if(tokenxchg(dst, "@daddr", oldmsg->iaddr, 19, 1, 0))
continue; continue;
} }
else { 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; continue;
if(strnieql(dst, "@d3daddr", 8)) { if(strnieql(dst, "@d3daddr", 8)) {
ftn_addr boss = oldmsg->dest; ftn_addr boss = oldmsg->dest;
boss.point = 0; 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; 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())) msg->to_me(), msg->to_you(), oldmsg->to_all()))
continue; continue;
if(currareaisinet) { if(currareaisinet) {
if(tokenxchg(dst, "@taddr", msg->iaddr, 19)) if(tokenxchg(dst, "@taddr", msg->iaddr, 19, 1, 0))
continue; continue;
} }
else { 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; continue;
if(strnieql(dst, "@t3daddr", 8)) { if(strnieql(dst, "@t3daddr", 8)) {
ftn_addr boss = msg->dest; ftn_addr boss = msg->dest;
boss.point = 0; 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; continue;
} }
} }
@ -234,16 +236,17 @@ char* TokenXlat(int mode, char* input, GMsg* msg, GMsg* oldmsg, int __origarea)
false, false, msg->to_all())) false, false, msg->to_all()))
continue; continue;
if(currareaisinet) { if(currareaisinet) {
if(tokenxchg(dst, "@caddr", AA->Internetaddress(), 19)) if(tokenxchg(dst, "@caddr", AA->Internetaddress(), 19, 1, 0))
continue; continue;
} }
else { 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; continue;
if(strnieql(dst, "@c3daddr", 8)) { if(strnieql(dst, "@c3daddr", 8)) {
ftn_addr boss = AA->Aka().addr; ftn_addr boss = caka.addr;
boss.point = 0; 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; continue;
} }
} }
@ -253,6 +256,10 @@ char* TokenXlat(int mode, char* input, GMsg* msg, GMsg* oldmsg, int __origarea)
continue; continue;
if(tokenxchg(dst, "@clname", strrword(strcpy(buf, AA->Username().name)))) if(tokenxchg(dst, "@clname", strrword(strcpy(buf, AA->Username().name))))
continue; 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)) if(tokenxchg(dst, "@cdate", cdate))
continue; continue;
if(tokenxchg(dst, "@ctime", ctime)) 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) : "")) if(tokenxchg(dst, "@ctzoffset", AA->Usetzutc() ? (sprintf(buf, " %+05d", tzoffset()), buf) : ""))
continue; continue;
if(currareaisinet) { if(currareaisinet) {
if(tokenxchg(dst, "@faddr", msg->iorig, 19)) if(tokenxchg(dst, "@faddr", msg->iorig, 19, 1, 0))
continue; continue;
} }
else { 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; continue;
if(strnieql(dst, "@f3daddr", 8)) { if(strnieql(dst, "@f3daddr", 8)) {
ftn_addr boss = msg->orig; ftn_addr boss = msg->orig;
boss.point = 0; 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; continue;
} }
} }
@ -310,28 +317,47 @@ char* TokenXlat(int mode, char* input, GMsg* msg, GMsg* oldmsg, int __origarea)
tokenxchg(dst, "@fpseudo", msg->pseudofrom); tokenxchg(dst, "@fpseudo", msg->pseudofrom);
continue; 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), " @"))) if(tokenxchg(dst, "@cpseudo", *AA->Nickname() ? AA->Nickname() : strlword(strcpy(buf, AA->Username().name), " @")))
continue; continue;
if(tokenxchg(dst, "@version", longverbuf)) if(tokenxchg(dst, "@version", __gver_ver__))
continue; continue;
if(tokenxchg(dst, "@ver", verbuf)) if(tokenxchg(dst, "@ver", __gver_shortver__))
continue; continue;
if(tokenxchg(dst, "@rev", revbuf)) if(tokenxchg(dst, "@rev", revbuf))
continue; 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; continue;
if(tokenxchg(dst, "@longpid", longpid)) }
if(tokenxchg(dst, "@pid", __gver_shortpid__))
continue;
if(tokenxchg(dst, "@longpid", __gver_longpid__))
continue; continue;
if(tokenxchg(dst, "@widepid", xmailer)) if(tokenxchg(dst, "@widepid", xmailer))
continue; continue;
if(tokenxchg(dst, "@serialno", "")) if(tokenxchg(dst, "@osslash", __gver_platform__))
continue;
if(tokenxchg(dst, "@os2slash", osslashbuf))
continue;
if(tokenxchg(dst, "@osslash", osslashbuf))
continue; continue;
if(tokenxchg(dst, "@subject", modereptr)) if(tokenxchg(dst, "@subject", modereptr))
continue; continue;
if(tokenxchg(dst, "@attr", attr))
continue;
if(tokenxchg(dst, "@tagline", if(tokenxchg(dst, "@tagline",
HandleRandomLine(strxcpy(buf, AA->Tagline(), sizeof(buf)), sizeof(buf)))) HandleRandomLine(strxcpy(buf, AA->Tagline(), sizeof(buf)), sizeof(buf))))
continue; continue;

View File

@ -689,7 +689,7 @@ void MakeMsg(int mode, GMsg* omsg, bool ignore_replyto) {
GFTRK("MakeMsg"); GFTRK("MakeMsg");
// Tell DispHeader not to show msg size // Tell GMsgHeaderView not to show msg size
_in_editor = YES; _in_editor = YES;
// Allocate some msgs // Allocate some msgs
@ -762,7 +762,7 @@ void MakeMsg(int mode, GMsg* omsg, bool ignore_replyto) {
msg->inreplyto = NULL; msg->inreplyto = NULL;
msg->references = NULL; msg->references = NULL;
msg->attr.tou0(); msg->attr.tou0();
msg->TextToLines(CFG->dispmargin-1, false); msg->TextToLines(CFG->dispmargin-1);
*msg->iorig = NUL; *msg->iorig = NUL;
*msg->idest = NUL; *msg->idest = NUL;
*msg->ireplyto = NUL; *msg->ireplyto = NUL;
@ -788,7 +788,7 @@ void MakeMsg(int mode, GMsg* omsg, bool ignore_replyto) {
msg->inreplyto = NULL; msg->inreplyto = NULL;
msg->references = NULL; msg->references = NULL;
msg->attr.tou0(); msg->attr.tou0();
msg->TextToLines(CFG->dispmargin-1, false); msg->TextToLines(CFG->dispmargin-1);
break; break;
case MODE_NEW: case MODE_NEW:
wfill(MINROW, 0, MAXROW-2, MAXCOL-1, ' ', C_READW); 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_QUOTE:
case MODE_REPLYCOMMENT: case MODE_REPLYCOMMENT:
omsg->attr.tou0(); omsg->attr.tou0();
omsg->TextToLines(-CFG->quotemargin, false); omsg->TextToLines(-CFG->quotemargin);
if(ignore_replyto) if(ignore_replyto)
omsg->ireplyto[0] = NUL; omsg->ireplyto[0] = NUL;
if(omsg->attr.rot()) if(omsg->attr.rot())

View File

@ -100,7 +100,7 @@ void DoTearorig(int mode, GMsg* msg);
void GetRandom(int mode, GMsg* msg); void GetRandom(int mode, GMsg* msg);
char* GetRandomLine(char* __buf, size_t __bufsize, const char* __file); char* GetRandomLine(char* __buf, size_t __bufsize, const char* __file);
char* HandleRandomLine(char* buf, size_t bufsize); 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); ulong MsgHasReplies(GMsg* msg);
gkey ViewMessage(int istwit=NOT_TWIT); gkey ViewMessage(int istwit=NOT_TWIT);
int LoadMessage(GMsg* msg, int margin); int LoadMessage(GMsg* msg, int margin);
#ifdef OLD_STYLE_HEADER
void DispHeader(GMsg* msg, bool prn, FILE* fp=NULL, int width=-1); void DispHeader(GMsg* msg, bool prn, FILE* fp=NULL, int width=-1);
#endif
void LoadRawMsg(GMsg* msg, int margin); void LoadRawMsg(GMsg* msg, int margin);
void make_pathreport(char* reportfile); void make_pathreport(char* reportfile);
@ -387,7 +389,6 @@ void ScanMsgTxtForAddr(GMsg* msg);
gkey SearchKey(gkey key, list<CmdKey>::iterator keys, int totkeys); gkey SearchKey(gkey key, list<CmdKey>::iterator keys, int totkeys);
int SearchTaglist(Echo* taglist, char* tag); int SearchTaglist(Echo* taglist, char* tag);
void set_title(const char* t, int p, int a); void set_title(const char* t, int p, int a);
char* strconv(char* str, char* conv);
void title_shadow(); void title_shadow();
void update_statusline(const char* info); void update_statusline(const char* info);
void update_statuslinef(const char* format, ...) __attribute__ ((format (printf, 1, 2))); void update_statuslinef(const char* format, ...) __attribute__ ((format (printf, 1, 2)));

View File

@ -114,7 +114,9 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa
TPLTOKEN_QUOTE, TPLTOKEN_QUOTE,
TPLTOKEN_INCLUDE, TPLTOKEN_INCLUDE,
TPLTOKEN_MESSAGE, TPLTOKEN_MESSAGE,
TPLTOKEN_MODERATOR TPLTOKEN_MODERATOR,
TPLTOKEN_WRITE,
TPLTOKEN_HEADER
}; };
#define CSTR_COMMA_SIZEOF_CSTR(s) s, (sizeof(s)-1) #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("quote") },
{ CSTR_COMMA_SIZEOF_CSTR("include") }, { CSTR_COMMA_SIZEOF_CSTR("include") },
{ CSTR_COMMA_SIZEOF_CSTR("message") }, { 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); 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"))); mktemp(strcpy(tplfile, AddPath(CFG->templatepath, "GDXXXXXX")));
fp = fsopen(tplfile, "wt", CFG->sharemode); fp = fsopen(tplfile, "wt", CFG->sharemode);
if(fp) { 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("@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("@changed* Changed by @cname (@caddr), @cdate @ctime.\n@changed\n", fp);
fputs("@forward* Forwarded from @oecho by @fname (@faddr).\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; token = end_token;
break; 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: case TPLTOKEN_NET:
if(not AA->isnet()) if(not AA->isnet())
goto loop_next; goto loop_next;
@ -682,7 +706,8 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa
continue; continue;
case TPLTOKEN_MESSAGE: 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; n = 0;
while(oldmsg->line[n]) { while(oldmsg->line[n]) {
if(oldmsg->line[n]->txt.c_str()) { 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) if(chg == NO)
continue; continue;
if((mode == MODE_QUOTEBUF) and not quotebufline) 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); 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 = AA->Ctrlinfo();
ctrlinfo |= CI_TAGL; ctrlinfo |= CI_TAGL;
if(ctrlinfo & (CI_TAGL|CI_TEAR|CI_ORIG)) { if(ctrlinfo & (CI_TAGL|CI_TEAR|CI_ORIG)) {

View File

@ -779,9 +779,9 @@ void guserbase::update_addressbook(GMsg* msg, bool reverse, bool force) {
return; return;
// Update address // Update address
if(AA->isinternet()) if(AA->isinternet() or (not *entry.iaddr and *iaddr))
strxcpy(entry.iaddr, iaddr, sizeof(entry.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; entry.fidoaddr = fidoaddr;
lock(); 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)) { if(strblank(aka) and not strblank(entry.iaddr)) {
// do UUCP addressing // do UUCP addressing
strcpy(msg->realto, entry.name); strcpy(msg->realto, entry.name);
strcpy(name, entry.iaddr); strcpy(msg->idest, entry.iaddr);
strcpy(msg->iaddr, 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,10 +856,12 @@ void guserbase::build_pseudo(GMsg* msg, char* name, char* aka, bool direction) {
return; return;
} }
else { else {
if(entry.fidoaddr.valid()) {
Addr AKA = aka; Addr AKA = aka;
if(entry.fidoaddr != AKA) if(entry.fidoaddr != AKA)
return; return;
} }
}
strcpy(direction ? msg->pseudoto : msg->pseudofrom, entry.pseudo); strcpy(direction ? msg->pseudoto : msg->pseudofrom, entry.pseudo);

View File

@ -257,7 +257,7 @@ void ScreenBlankIdle() {
char blankmsg1[80]; char blankmsg1[80];
char blankmsg2[80]; char blankmsg2[80];
time_t t = time(NULL); 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); sprintf(blankmsg2, " %s ", LNG->BlankMsg);
if(strblank(blankmsg2)) { if(strblank(blankmsg2)) {
*blankmsg2 = NUL; *blankmsg2 = NUL;

View File

@ -101,18 +101,18 @@ void GMsgHeaderView::Paint() {
headerline[width] = NUL; headerline[width] = NUL;
INam whofrom; 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); 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); strcpy(whofrom, msg->iorig);
else else
strcpy(whofrom, msg->By()); strcpy(whofrom, msg->By());
strsetsz(whofrom, (area->isinternet() or *msg->ifrom) ? (namewidth+nodewidth) : namewidth); strsetsz(whofrom, (area->isinternet() or *msg->ifrom) ? (namewidth+nodewidth) : namewidth);
INam whoto; 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); 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); strcpy(whoto, msg->idest);
else else
strcpy(whoto, msg->To()); strcpy(whoto, msg->To());
@ -266,9 +266,9 @@ void GMsgHeaderView::Paint() {
window.prints(3, 0, window_color, LNG->To); 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); 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 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); 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(3, CFG->disphdrnodeset.pos, to_color, node2);
} }
window.prints(2, CFG->disphdrdateset.pos, from_color, date1); window.prints(2, CFG->disphdrdateset.pos, from_color, date1);

View File

@ -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__ " " \ #define __GVER_PID__(A,SIZE) __GVER_PRE##SIZE##NAME__ __GVER_##SIZE##NAME__ __GVER_POST##SIZE##NAME__ __GVER_##SIZE##PLATFORM__
__GVER_PREVERSION__ #A "." #B "." #C __GVER_POSTVERSION__ #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__) \ #define __GVER__(__GVER_MAJOR__,__GVER_MINOR__,__GVER_RELEASE__) \
int __gver_major__ = __GVER_MAJOR__; \ int __gver_major__ = __GVER_MAJOR__; \
int __gver_minor__ = __GVER_MINOR__; \ int __gver_minor__ = __GVER_MINOR__; \
int __gver_release__ = __GVER_RELEASE__; \ int __gver_release__ = __GVER_RELEASE__; \
const char* __gver_longpid__ = __GVER_PID__(__GVER_MAJOR__,__GVER_MINOR__,__GVER_RELEASE__,); \ const char* __gver_longpid__ = __GVER_PID__(,); \
const char* __gver_shortpid__ = __GVER_PID__(__GVER_MAJOR__,__GVER_MINOR__,__GVER_RELEASE__,SHORT); 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__);
// ------------------------------------------------------------------ // ------------------------------------------------------------------

View File

@ -74,7 +74,7 @@ void getkeyvaleql(char** key, char** val, bool eql) {
// Get straight keyword // Get straight keyword
default: default:
*key = p; *key = p;
while(*p and not isspace(*p)) { while(*p and not isspace(*p) and (*p != ',')) {
if(eql and (*p == '=')) if(eql and (*p == '='))
break; break;
p++; p++;