========================================================================
                        Kpathsea.DLL  for Win32
                             Version 2.00

                                                                KM
                                              momozono@mse.biglobe.ne.jp
                                                    paf32385@pcvan.or.jp
                                                               1997.10.7
========================================================================

1. ͂߂

  t@CTCu Kpathsea  DLL łłBKarl Berry 
  Kpathsea 3.0 x[XɂĂ܂B
  { DLL ́Aȉ̊ł̓삪mFĂ܂B

    EMicrosoft Windows 95
    EMicrosoft Windows NT 4.0

2. IWiƂ̑_

  E ݒt@C texmf.cnf gp܂B܂Aϐݒ肳Ă
     Ăgp܂B̑pƂăWXggp܂B
     ݒ͎̃WXgL[ɕۑ܂B

         HKEY_LOCAL_MACHINE\Software\momo\Kpathsea\Config
         HKEY_CURRENT_USER\Software\momo\Kpathsea\Config

     Kpathsea.dll ̓[U̐ݒ HKEY_CURRENT_USER T[`A
     Ȃ΁A}VŗL̐ݒ HKEY_LOCAL_MACHINE T[`܂B

  E }`XbhɑΉĂ܂BMDI ̃vr[A쐬邱Ƃ
     \łBKpathsea.dll  C ^CCu֐gpĂ
     ߁AXbh쐬ꍇ _beginthreadex ֐AI
      _endthreadex ֐gpĂB

  E vZX̐A܂̓Xbh̐ɁAKpathsea.dll Ŏgp
     ÓIϐ^O[oϐ̊mۂs܂B̕ϐ̓Xbh
     Ɋmۂ܂B

  E Kpathsea.dll mۂ DLL J܂BGNX|[g
     ֐ւ̃|C^ԂꍇAAvP[V
     JKv͂܂B܂Ԓlۑꍇ͒ӂĂB
     DLL ́AvZX܂̓Xbh̏IɃ̊Js܂B
     AvP[VŖIɃNAsꍇ́Å֐Ăяo
     Ăiʏ͌ĂяoKv͂܂jB

         VOID WINAPI kpse_clear_context(VOID);

  E q̂ƂAKpathsea.dll ̓XbhPʂœϐ̊Ǘs
     ܂BAvP[VɂĂ̓XbhI̓ϐ̏Ԃ
     ۑĂAēxgpƂꍇ邩܂Bȉ
     ֐p΁Aϐ̊ǗAvP[VōsƂł
     ܂B

         LPVOID WINAPI kpse_get_context(VOID);
         - JgXbh̓ϐւ̃|C^擾܂B̊֐
           ĂяoƁAXbhIĂϐ̏ԂJ
           B擾Ɏsꍇ NULL Ԃ܂BJꍇ
           kpse_free_context() ֐gp܂Bkpse_get_context() 
           Ăяo񐔂 kpse_free_context() ֐Ăяo
           ΂Ȃ܂B

         LPVOID WINAPI kpse_set_context(LPVOID context);
         - kpse_get_context() ֐Ŏ擾|C^ context 
           ZbgČĂяoƁAJgXbh̓ϐ context
           ƒu܂BƒuO̓ϐԂ܂B
           sꍇiNULL nꂽAJgXbhƓ|C
           ^nꂽjꍇ NULL Ԃ܂B

         BOOL WINAPI kpse_free_context(LPVOID context);
         -  context œnꂽϐJ܂B TRUE
           As FALSE Ԃ܂B

     ̊֐́ÃXbhœϐLigpjۏ؂
     ̂ł͂܂BqXbh̏I҂eXbȟpA
     邢͈ȑÕXbhIԂpꍇ̂ݎgpĂB
     ܂O҂̏ꍇAqXbhő삵ϐ̏ԂŐeXbh̎
     sĊJ܂B

     [ 1] eXbh̓ϐqXbhɌpꍇ

       DWORD WINAPI ChildThread(LPVOID lpvThreadParam)
       {
         /* 3. eXbh󂯎ϐZbg */
         LPVOID old_context = kpse_set_context(lpvThreadParam);
         /* 4. qXbh쐬 DLL 쐬ϐJ */
         kpse_free_context(old_context);
         /* 5. ȉAqXbh̏s */
       }

       int WINAPI WinMain(...)
       {
         /* 1. Xbh쐬 DLL 쐬ϐ擾 */
         LPVOID context = kpse_get_context();
         /* 2. qXbh쐬AeijXbh̓ϐp */
         HANDLE hThread = _beginthreadex(..., ChildThread, context, ...);
         /* 6. qXbh̏I҂ */
         WaitForSingleObject(hThread);
         /* 7. ȉAXbh̏s */
       }

     [ 2] ȑÕXbhI̓ϐpꍇ

       DWORD WINAPI ChildThread(LPVOID lpvThreadParam)
       {
         static LPVOID context = NULL;
         LPVOID old_context;
         /* 2. Pڂ̌Ăяo DLL 쐬ϐ擾 */
         if (context == NULL)
           context = kpse_get_context();
         /* 3. Qڈȍ~ł́AۑĂϐgp */
         /*    DLL Xbh쐬ɍ쐬ϐ͊J */
         else {
           old_context = kpse_set_context(context);
           kpse_free_context(old_context);
         }
         /* 4. ȉAqXbh̏s */
       }

       int WINAPI WinMain(...)
       {
         while (1) {
           /* 1. qXbh쐬 */
           HANDLE hThread = _beginthreadex(..., ChildThread, ...);
           /* 5. qXbh̏I҂ */
           WaitForSingleObject(hThread);
         }
       }

  E getenv() ֐Aputenv() ֐̓vZXŜɉe邽߁Aꂼ
     XbhPʂŏs悤ɂ܂B
     xgetenv() ֐ xputenv() ֐ɂZbgꂽl擾܂B
     xputenv() ֐ɂZbgꂽl݂Ȃꍇ́Anull Ԃ
     BSetEnvironmentVariable()֐ putenv() ֐ɂZbgꂽ
     l擾邱Ƃ͂܂B܂Aϐ̒l擾邱Ƃ
     ܂B
     ̊֐pƊϐ̂݌p邱Ƃł܂BLϐ
     ̌pƈقȂAϐ̕쐬܂B܂eXbhp
     ̂qXbhő삵ƂĂAeXbh̊ϐ̓e
     ω邱Ƃ͂܂B

         BOOL WINAPI kpse_set_environment(LPVOID context);
         -  context œnꂽϐ𕡐܂B TRUE
           As FALSE Ԃ܂B

     []

       DWORD WINAPI ChildThread(LPVOID lpvThreadParam)
       {
         /* 3. eXbh󂯎ϐZbg */
         kpse_set_environment(lpvThreadParam);
         /* 4. eXbh󂯎ϐigpȂjJ */
         kpse_free_context(lpvThreadParam);
         /* 5. ȉAqXbh̏s */
       }

       int WINAPI WinMain(...)
       {
         /* 1. Xbh쐬 DLL 쐬ϐ擾 */
         LPVOID context = kpse_get_context();
         xputenv("FOO", "VAR");
         /* 2. qXbh쐬AeijXbh̓ϐp */
         HANDLE hThread = _beginthreadex(..., ChildThread, context, ...);
         /* 6. qXbh̏I҂ */
         WaitForSingleObject(hThread);
         /* ȉAXbh̏s */
       }

  E DLL ĂяoAvP[VƂ̏ɁAR[obN𗘗p
     Ƃł܂BR[obN֐ݒ肵ȂꍇAKpathsea.dll 
     ftHg̏܂B

         LONG WINAPI callback(UINT msg, DWORD param1, DWORD param2,
                              DWORD usr_param);

     R[obN֐͈ȉ̒lԂĂB

       - ꍇF
       - ftHg̏ꍇFO
       - sꍇF

     ݁Aȉ̂̂T|[gĂ܂B

       a). R\[ւ̏o

           msg  KPSE_CONSOLE_WRITE ̂ƂAR\[ւ̏o͂s
           Bparam1 ɂ͏o͕ւ̃|C^Aparam2 ɂ͕
           n܂B
           ftHgł stderr ւ̏o͂s܂B

       b). R\[̃tbV

           msg  KPSE_CONSOLE_FLUSH ̂ƂAR\[̃tbVs
           ܂Bparam1, param2 ͎gp܂B
           ftHgł stderr tbV܂B

       c). I

           msg  KPSE_TERMINATE ̂ƂAAvP[V̋Is
           ܂Bparam1 ɂ͏IR[hn܂i܂Ӗ͂
           jBparam2 ͎gp܂B
           ̃bZ[WŃR[obN֐ĂяoꂽꍇAAvP[
           VI̎葱ƂĂBR[obN֐琧䂪
           ߂莟ADLL AvP[VI܂B
           ܂AXbhƂ͕ʂ̃XbhŌĂяoꂽꍇÃXb
           hI΁AAvP[V͌pď𑱂邱
           Ƃł܂B
           ftHgł Win32 ̗O𔭐iqj܂B

       d). MakeTeX... ̎s

           msg  KPSE_MAKETEX ̂ƂAMakeTeX... ̎ss܂BR
           \[Ȃ GUI AvP[Vł́Apipe p
           MakeTeX... ̎słȂ߁ȂpƂėp܂B
           param1 ɂ MakeTeX... sΏۂ̃tH[}bgn܂B
           param2 ͎̂悤ȍ\̂ɂȂĂ܂B

               typedef struct {
                 kpse_file_format_type format;
                 LPCTSTR lpszCmdLine;
                 LPCTSTR lpszProgram;
                 LPCTSTR lpszFontName;
                 DWORD dwDpi;
                 DWORD dwModeDpi;
                 LPCTSTR lpszMag;
                 LPCTSTR lpszMode;
                 DWORD dwLen;
                 LPTSTR lpszPathName;
               } kpse_maketex_type;

           R[obN֐ param2  MakeTeX... sA
           ꍇ́A쐬t@C̃tpXZbg ̒l
           ܂Bsꍇ͕̒lԂ܂BOԂ popen 
            MakeTeX... ̎ss܂B
           lpszCmdLine ɂ͎s̃R}hĈ܂ܓn܂B
           lpszProgname  kpszMode ͂ʂɐ؂ôłB
           t@Ci[̈ lpszPathName DLL Ŋmۂēn
           ܂Bt@C len oCgȉ NULL ŏI镶łB
           ftHgł popen() ֐ɂ MakeTe... ̌Ăяos
           ܂B
             jMakeTeX... ̃R[obN֐ł Kpathsea.dll 
                 Ăяoꍇ́AʃXbh쐬ĂB

     R[obN֐w肷ꍇɂ́Aȉ̊֐gp܂B
     usr_param ɃZbgĺAR[obN֐̑Sɂ̂܂
     n܂B

         VOID WINAPI kpse_set_callback(KpseCallBack *func, DWORD usr_param);

     []

       DWORD WINAPI ChildThread(LPVOID lpvThreadParam)
       {
         kpse_maketex_type *kpse_maketex
             = (kpse_maketex_type *)lpvThreadParm;
         char *sep = " ";        /* Zp[^̓Xy[X */
         char *token;

         token = strtok(kpse_maketex->cmd, sep);
         while (token != NULL) {
           /* MakeTeX... sp̏ */
           token = strtok(NULL, sep);
         }
         /* MakeTeX... sAΐ΃pXi[ */
         if (do_maketex == true) {
           strcpy(kpse_maketex->path, ...);
           return 1;
         }
         return 0;
       }

       LONG WINAPI callback(UINT msg, DWORD param1, DWORD param2,
                            DWORD usr_param)
       {
         kpse_maketex_type *kpse_maketex;
         HANDLE hThread;
         DWORD dwExitCode;

         switch (msg) {
         case KPSE_CONSOLE_WRITE:
           fwrite((char *)param1, param2, 1, stdout);
           break;
         case KPSE_CONSOLE_FLUSH:
           fflush(stdout);
           break;
         case KPSE_MAKETEX:
           kpse_maketex = (kpse_maketex_type *)param2;
           HANDLE hThread =
               _beginthreadex(..., ChildThread, kpse_maketex, ...);
           WaitForSingleObject(hThread);
           if (GetExitCodeThread(hThread, &dwExitCode))
             return dwExitCode;
           else
             return 0;
           break;
         default:
           return 0;
         }
         return 1;
       }

       int main(int argc, char *argv)
       {
         kpse_set_callback(callback, 0);
         kpse_set_progname (progname);
         kpse_make_tex(...);
       }

  E PK or GF t@CT[`ۂ̌p^[ݒł܂BW
     Xg (texmf.cnf)  BITPAM_SPECS Ŏw肵܂Bݒ肷ꍇ
      `;' ŋ؂AɋLq̂珇ɃT[`܂B
     ݒ肵Ȃꍇ́Aȉ̃p^[ŃT[`܂iۂ͂PsŋLqjB

       BITMAP_SPECS = $KPATHSEA_NAME.$KPATHSEA_DPI$KPATHSEA_FORMAT;
                      dpi$KPATHSEA_DPI/$KPATHSEA_NAME.$KPATHSEA_FORMAT
       i cmr10.300pk AȂ΃fBNg dpi300
         ɂ cmr10.pk ܂Bj

  E tHgɎsꍇɁAČs𑜓xݒł܂B
     WXg (texmf.cnf)  FONT_SIZES Ŏw肵܂Bݒ肷
      `;' ŋ؂܂B

       FONT_SIZES = 300;600

     ݒ肵Ȃꍇ́ARpCɐݒ肵𑜓xgp܂B[
     Xłł͐ݒ肵Ă܂B

  E Kpathsea.dll ŃG[ہAR[obN֐w肳
     ĂȂA܂̓R[obN֐ 0 ԂꂽꍇADLL  Win32
     ̗O𐶐܂BOR[hȉɎ܂iR[ḧ
     ͂܂dvł͂܂jB̗O͍Ďss\łB

               KPSE_EXCEPTION_EXIT          0xE04B0001
               KPSE_EXCEPTION_ABORT         0xE04B0003
               KPSE_EXCEPTION_MALLOC        0xE04B004B
               KPSE_EXCEPTION_REALLOC       0xE04B0042

     OtB^ EXCEPTION_RECORD \̂ NumberParametersA
     ExceptionInformation ogāAG[擾邱Ƃ
     ܂B

         ExceptionInformation[0]
         - G[bZ[WBNULL ŏI镶łBLPTSTR ^ɃL
           XgĂB

         ExceptionInformation[1]
         - [UŗLBkpse_set_callback() ֐̑Q̒lA
           ̂܂܃Zbg܂BR[obN֐̂pӂȂ
           ꍇ kpse_set_callback() ֐̑P NULL Zbg
           ĂB

  E kpse_set_progname() ֐̌ĂяoŁAt@C̑݃`FbNs
     ܂B݂Ȃꍇ́AGetModuleHandle() ֐ŌĂяo App
     ̃fBNgJgƂĈ܂B

  E JgfBNǵAXbhPʂŎƂł܂BfBN
     g̕ύX́Å֐ōs܂BύX̃fBNgiNULL ŏI
     镶j dir ɃZbgČĂяo܂B TRUEAs
      FALSE Ԃ܂B

         BOOL kpse_change_dir(LPCTSTR dir);

  E SJIS ̃fBNgɑΉĂ܂B


3. ύX_ꗗ

  E absolute.c
     -G[̋IpR[obN֐AO̒ǉB

  E basename.c
     -SJIS fBNgΉB

  E callback.c  <<NEW>>
     -R[obN֐̒ǉiO܂ށjB

  E cnf.c
     -texmf.cnf ̃WXgB
     -ÓIϐ̃_Ci~bN TLS B
     -texmf.cnf ̓ǂݍ݂ŁA`ƃRgsɂꍇ̕s
      ΉiWXggp邽ߎۂ͎gpȂjB

  E config.h
     -windows.h ǂݍݎAboolean ^Փ˂Ȃ悤ɂB

  E current.c <<NEW>>
     -Xbh̃JgfBNg̕ύXpB

  E db.c
     -SJIS fBNgΉB
     -ÓIϐ̃_Ci~bN TLS B
     -dpi<dpi>/<name>.<type> TہAԈt@Cƈv邱Ƃ
      ̂CB܂AJȂ̂CB

  E debug.c
     -R\[o̓R[obNǉB

  E dir.c
     -ÓIϐ̃_Ci~bN TLS B

  E find_suffix.c
     -SJIS fBNgΉB

  E fontmap.c
     -ÓIϐ̃_Ci~bN TLS B

  E getopt.c  getopt.h
     -O[oϐ̃_Ci~bN TLS B

  E hash.c
     -O[oϐ̃_Ci~bN TLS B

  E kpse-api.h  <<NEW>>
     -C|[gpwb_[t@C

  E kpse-dll.c  kpse-dll.h  <<NEW>>
     -DLL pR[hȂǁB

  E line.c
     -XbhPʂ̃q[vǗ̑Ήifree() ֐̃vg^Cv錾폜jB

  E make-suffix.c
     -SJIS fBNgΉB

  E path_elt.c
     -SJIS fBNgΉB
     -ÓIϐ̃_Ci~bN TLS B

  E pathsearch.c
     -ÓIϐ̃_Ci~bN TLS B

  E proginit.c
     -O[oϐ̃_Ci~bN TLS B

  E progname.c  progname.h
     -SJIS fBNgΉB
     -O[oϐ̃_Ci~bN TLS B
     -kpse_set_progname() ֐̌ĂяoŁAt@C̑݃`FbN
      sȂ悤ɕύXBfBNg̎擾 GetModuleHandle() ֐
      gpB܂A擾fBNgJgfBNg
      B
     -fobOpϐ KPATHSEA_DEBUG  texmf.cnfiWXgjɐݒ
      ł悤CB

  E tilde.c
     -`~' PƂ̂Ƃ̓WJŁAϐ HOME ݒ肳ĂȂꍇA
      NULL  strlen() ֐ĂяoĂ̂CB

  E tex-file.c
     -O[oϐ̃_Ci~bN TLS B
     -fallback resolution p̃tHgTCY texmf.cnfiWXgj
      ɐݒł悤CB
     -PK tHgȂǂoCi[[hŃI[vĂȂ̂
      CB

  E tex-glyph.c
     -tHgp^[ texmf.cnfiWXgjɐݒł悤CB

  E tex-make.c
     -O[oϐ̃_Ci~bN TLS B
     -R[obN֐ɂ MakeTeX... ̎sΉB

  E truncate.c
     -SJIS fBNgΉB

  E variable.c
     -O[oϐ̃_Ci~bN TLS B

  E xcalloc.c
     -XbhPʂ̃q[vǗΉB

  E xfopen.c
     -G[̋IpR[obN֐AO̒ǉB

  E xfseek.c
     -G[̋IpR[obN֐AO̒ǉB

  E xftell.c
     -G[̋IpR[obN֐AO̒ǉB

  E xmalloc.c
     -XbhPʂ̃q[vǗΉB

  E xputenv.c
     -XbhPʂ̊ϐǗΉ

  E xrealloc.c
     -XbhPʂ̃q[vǗΉB

  E xstat.c
     -G[̋IpR[obN֐AO̒ǉB


4. 쌠Eۏ؁EĔzz

  Kpathsea Cu GNU general public license ̂Ƃɔzz
  ܂BDLL Ή̉ρ^ǉ̒쌠͓ɂ܂ADLL y
  DLL ̃vO̔zz GNU general public license ɏ]܂B
  GNU general public license ɂĂ͕t COPYING Ƃt@C
  B

  {pbP[W͖ۏ؂łB{pbP[W܂͂̉ϕpƂ
  钼ځEԐړIȂȂ鑹Qɑ΂Ă҂͐ӔC𕉂܂Bp
  ҂̐ӔČɎgpĂB


5. 

  Version 1.00 Alpha                                       1996/11/18
  EDLL o[W(kpathsea.lib Version 2.6)B
  Etexmf.cnf ̑ɃWXggp悤ɕύXB
  EϐNA@\ǉBɃ}`XbhɂΉB
  Edpi<dpi>/<name>.<type>  <dpi>/<name>.<type> Tۂ̕s
    CB

  Version 1.00 Alpha 2                                     1997/01/18
  E֐̌Ăяo __cdecl()  __stdcall() ֕ύXB
  EDLL  exit()  abort() Ă Win32 ̗O𐶐
    悤ɕύXB
  EMakeTeXPK ̌ĂяołȂ߁AApp ŃR[obN֐w
    ł悤ɕύXB
  E[UʂɃWXgݒł悤ɕύXB
  ENT4.0 ł DLL  alloc() ֐ɂmۂq[v App iDLL
    ďoj free() ֐ɂJłȂ߁Aq[v̊Ǘׂ
    DLL ōs悤ɕύXB

  Version 1.00 Beta                                        1997/02/09
  Epɂ VC++ p Ήgݍ񂾁B
  EWXg̃L[ύX

  Version 2.00 Alpha                                       1997/02/23
  EKpathsea.lib Version 3.0 ΉB
  Eϐ̊mۂ kpse_set_progname() ֐̌ĂяoAvZX
    уXbh̐ɕύXB܂Akpse_set_progname() ֐̌Ă
    oŃNAsȂ悤ɕύXB

  Version 2.00 Alpha 2                                     1997/03/02
  ER[obN֐ɂR\[o͂ɑΉB
  EDLL G[ɂ鋭IAWin32 ̗OR[obN
    ̌ĂяoɕύXB
  ER[obN֐ɂ MakeTeXPK ̌Ăяo@ύXijB
  Etexmf.cnf ̓ǂݍݕsCiWXggp̂œɖ
    ͂ȂjB

  Version 2.00 Alpha 3                                     1997/03/20
  Eϐ̌ps֐ǉB
  ER[obN֐̕Ԓl 0 ̂ƂAftHg̏悤ɕύXB
  EDLL G[ɂ鋭I Win32 ̗O𐶐悤ɖ߂B
    R[obN֐w肳ĂȂƂAO𐶐B
  Ekpse_set_progname() ֐Ńt@C̑݃`FbNAWin95 ɂ
    argv[0]  long filename ƂȂȂꍇ̑Ή폜B
  ESJIS ̃fBNgɑΉB
  EHeapAlloc() ֐Ŋmۂ free() ֐ŊJĂ
    CB

  Version 2.00 Alpha 4                                     1997/03/31
  Ekpse_set_callback() ֐Ƀ[UŗLZbg悤ɂB
    ɃZbgꂽĺAR[obN֐̑Sɂ̂܂ܓnB
  ELɔAR[obN֐̈ύXB
  EPK or GF t@CT[`ۂ̌p^[ texmf.cnf Ŏw
    悤ɂB
  ETlsGetValue() ֐Ăяo^C~OύXAsvȃI[o[wb
    h炷悤ɂB
  ER[obN֐ɂ MakeTeX... ̎sǉB
  EFallback Resolution  texmf.cnf Ŏwł悤ɂB

  Version 2.00 Beta 1                                      1997/04/06
  EXbhɃJgfBNgǗ悤ɕύXB
  ER[obN֐ (KPSE_MAKETEX) ĂяöύXB
  ER[obN֐ (KPSE_CONSOLE_WRITE) ĂяoŁAĊmۂs
    ĂȂ̂CB
  EMISSFONT_LOG  TEXMFLOG ̃t@Co͂R[obN֐
    (KPSE_CONSOLE_WRITE) ŌĂяoĂ̂CB
  EMISSFONT_LOG  TEXMFLOG ̔r~[ebNXōs悤
    ɂB̃t@C̓vZXPʂɑ݂܂B
  E`~' WJ̕sCB
  Ex[^łƂB

  Version 2.00 Beta 2                                      1997/04/13
  EftHg̃JgfBNgAW[̑݃fBNg
    ƂȂĂ̂ŁAvZXÑfBNgɏCB

  Version 2.00 Beta 3                                      1997/05/14
  Ekpse_fallback_resolutions_string_get() Ȃǂ̒l App ύX
    悤ɁA|C^̃|C^Ԃ悤ɂB

  Version 2.00
  E琳łƂiɕύXȂjB
