#!/bin/sh
#
#  This is a part of ChiTeX.
#  This script is created by 
#    Hung-Yih Chen ()  (yih@math.ncu.edu.tw)
#               (Dept. of Mathematics, National Central Univ.)
#  Last revised on April. 25, 2000
# 
#                All rights preserved   
#

rm -f filename@  filenameext@

echo "yes" > tmp@
filename=$1

basename $filename|
gawk '
BEGIN{FS="."}
{
 fnum=1 
 while (fnum <NF)
  {printf $fnum > "filename@"
   fnum = fnum + 1
  }
 if (NF>1)
    {print $NF > "filenameext@"}
 else
    {print "" > "filenameext@"}
}' 

if test ! -s filename@; then
   filename=$1
else
   filename=`cat filename@`
fi


if test ! -s $filename.tex; then
 if test ! -s $filename; then 
    :
 else
   filename=$filename
 fi
else 
 filename=$filename.tex
fi

filea=$filename
filenameext=`cat filenameext@`


new="y"
if test "$new" = "y"; then
newfilename=""
newfilename=`
gawk -v filename=$filename '
{
 llen=length(filename)
 i=1; chinese=0
 for (i;i<=llen;i++)
   {ch=substr(filename,i)
    if (ch > "\240" && ch < "\372")
       {chinese=1; break}
   } 
 if (chinese==1)
    {
     while (getline inline < ".tmp00/texf.tab">0)
      {++recno
       sp=index(inline," ")
       chfilename=substr(inline,1,sp-1)
       if (filename==chfilename)
          {rinline=substr(inline,sp+1)
#           gsub("^ *","",rinline)
           newfname=rinline; found=1
          }
      }        
     print newfname
    }
}' tmp@ `  


if test "$newfilename" != ""; then
   oldfilename=$filea
#   chinesef=1
   bname=`basename $filea `                    
   oldfilea=`echo $bname|cut -d. -f 1` 
   filea=`echo $newfilename|cut -d. -f 1`
#   cp $oldfilea.bib $filea.bib
else 
   filea=`echo $filea|cut -d. -f 1`
fi
fi

  if test "$filenameext" != "tex" -a "$filenameext" != ""; then
     ext="."$filenameext
  else
     ext=""
  fi

bibdata=`fgrep "bibdata{" $filea$ext.aux|cut -d{ -f 2|cut -d} -f 1`
chbibdata=` 
gawk -v bibdata=$bibdata '
{
# if (chinese==1)
    {
     while (getline inline < ".tmp00/texf.tab">0)
      {
       sp=index(inline," ")
       enfilename=substr(inline,sp+1)
       if (bibdata".tex"==enfilename)
          {chfilename=substr(inline,1,sp-1)
           newfname=chfilename
           gsub(".tex","",newfname)
           print newfname
          }
      }        
    }
}' tmp@ ` 


 if test "$chbibdata" != ""; then
    if test -f  $bibdata.bib; then
       chmod +w  $bibdata.bib
    fi
    cp $chbibdata.bib $bibdata.bib
    chmod +w  $bibdata.bib
 fi

  if test ! -s $bibdata".bib"; then
     echo "   "
     echo "  could not find $bibdat.bib"
     echo "   "
     exit
  fi

#echo $bibdata".bib"

gawkbin="gawk"
export gawkbin


chlabtr="1"

if test -r bibtmp@; then
   rm -f bibtmp@
fi

#$gawkbin  -v chlabtr=$chlabtr '

$gawkbin  '
BEGIN{
# if (chlabtr == 1)
# {
#  i=0
#  while (getline inl < "ch@label" > 0)
#        {++i
#         per=index(inl,"%")
#         enlabel[i]=substr(inl,1,per-1)
#         chlabel[i]=substr(inl,per+1,length(inl)-per)
#        }
#  fileno=i
# }
}
{
if (NR==1)
{
 if (chlabtr == 1)
 {
  i=0
  while (getline inl < "ch@label" > 0)
        {++i
         per=index(inl,"%")
         enlabel[i]=substr(inl,1,per-1)
         chlabel[i]=substr(inl,per+1,length(inl)-per)
        }
  fileno=i
 }
}  # end of if (NR==1)

 inline=$0
if (chlabtr == 1)
{ j = 1
  for (j; j<=fileno; j++)
      {ll1=index(inline,chlabel[j])
       inlinenew=""; k=1
       lenn=length(inline)
       for (k; k<=lenn; k++)
         {ch=substr(inline,k,1)
          if (ch != " ")
             {firstnonspace=k;break}
         }
       inlinenew=substr(inline,firstnonspace,length(inline)-firstnonspace+1)
       ll2=index(inlinenew,"@")
       if (ll1 > 0 && ll2 == 1)
          {gsub(chlabel[j],enlabel[j],inline); meet=1}
      }
}
   print inline >> "bibtmp@"
}
END{} ' chlabtr=$chlabtr $bibdata.bib 

mv -f $bibdata.bib $bibdata.bib.tmp@

chicode -u bibtmp@ > $bibdata.tmp@

#cp bibtmp@ $bibdata.tmp@

trap 'test -s $bibdata.bib.tmp@ && mv $bibdata.bib.tmp@ $bibdata.bib ; trap '' 0; exit 0' 0 1 2 15

#mv -f $bibdata.tmp@ $bibdata.bib

#bibtex $filea

#exit

gawk '
BEGIN{}
{inline=$0
 eqpos=index($0,"=")
 if (eqpos > 0)
    {gsub(" ","",inline)
#     eqquote=index(inline,"=\"")
#     eqlbr=index(inline,"={")
     author=index(tolower(inline),"author=")
     if (author == 1)
        {print $0 > "tempa@"
         next
        }

     llen=length($0)
     i=1; sec=0; str=""
     for (i; i<=llen; i++)
       {ch=substr($0,i,1)
        if (sec == 0)
          {if (ch > "\240" && ch < "\372")
             {sec=1; chpost=substr($0,i+1,1)
              str=str "{" ch chpost "}"
             }
           else
             {str=str ch}
          }
        else
          {sec=0}
       }
     outline=str
    }
 else
    {outline=$0}

 print outline > "tempa@"
}
END{}' $bibdata.tmp@

cp -f tempa@ $bibdata.bib

bibtex $filea$ext

#echo $filea$ext.aux

#unsrt=`egrep '\\\bibstyle{unsrt}' $filea$ext.aux`
#alpha=`egrep '\\\bibstyle{alpha}' $filea$ext.aux`
unsrt=`grep '\\\bibstyle{unsrt}' $filea$ext.aux`
alpha=`grep '\\\bibstyle{alpha}' $filea$ext.aux`


if test "$unsrt" = ""; then
chicoder -u $filea$ext.bbl > $filea$ext.bbl.tmp@
gawk '
BEGIN{
lineno=0
}
{
 bibitem=index($0,"\\bibitem")
 if (bibitem>0 && havebibitem == 1)
    {outline=""; jjj=2; 
     outline=outline bibfield[1]
     for (jjj; jjj<=kkk; jjj++)
         {outline=outline " " bibfield[jjj]}
     sub("\\\\newblock","\376\376\\newblock",outline)
     print outline " " bibfieldlast > "sortfile@"
     havebibitem=0; lineno=0
    }

 if (bibitem>0 && havebibitem == 0)
    {havebibitem=1
     bibfieldlast=$0
     lineno=1
     next
    }

 if (havebibitem == 1)
    {++lineno;
     if (lineno == 2)
        {kkk=1
         newblock=index($0,"\\newblock")
         if (newblock==0)
            {
             inline=$0
             m=split(inline,subauthor,",")
             if (m==1)
                {mm=split(subauthor[1],subsubauthor," and ")
                 i=1
                 for (i;i<=mm;i++)
                   {subauthor[i]=subsubauthor[i]}
                 m=mm
                 }
             else
                {andpos=index(subauthor[m]," and ")
                 subauthor[m]=substr(subauthor[m],andpos+5)
                }
             i=1
             authorstr=""
             for (i; i<=m; i++)
             {
              inlinenew=subauthor[i]
              n=split(inlinenew,field,".")
#              if (n==1 || field[2]=="")
#                 {subbibfield=field[1] "."}
#              else
                 {j=1; tmpfield=""
                  if (field[n]=="")
                     {lastno=n-1
#                      field[n-1]=field[n-1] "."
                     }
                  else 
                     {lastno=n
#                      field[n]=substr(field[n],1,length(field[n])-1)
                     }
                  lastfield=field[lastno]
                  k=split(lastfield,lastf," ")
                  if (k==1)
                    {lastfield=lastf[1];dot="."}
                  else
                    {kk=1; lastfield=lastf[k] "."
                     for (kk;kk<=k-1;kk++)  
                       {lastfield=lastfield " " lastf[kk]}
                     dot=""
                    }

#                  tmpfield=tmpfield field[lastno] ". "
                     tmpfield=tmpfield lastfield dot
                     for (j; j<=lastno-1; j++)
                         {tmpfield=tmpfield field[j] "."}
                     subbibfield=tmpfield
                 }
              if (i==1){comma=""} else {comma=", "}
              
              authorstr=authorstr comma subbibfield
             }
             bibfield[1]=authorstr
            }
        }
     else
        {inline=$0
         end=index(inline,"\\end")
         gsub(" ","",inline)
         if (inline != "" && end == 0)
            {kkk=kkk+1
             bibfield[kkk]=$0
            }
        }
    }


}
END{
    {outline=""; jjj=2;  #bibfield[2]="}" bibfield[2]
     outline=outline bibfield[1]
     for (jjj; jjj<=kkk; jjj++)
         {outline=outline " " bibfield[jjj]}
     sub("\\\\newblock","\376\376\\newblock",outline)
     print outline " " bibfieldlast > "sortfile@"
     havebibitem=0; lineno=0
    }
} ' $filea$ext.bbl.tmp@


sort "sortfile@" > "sortf@"


/bin/rm -f sortfile@

filebbl="$filea$ext.bbl"

if test "$alpha" != ""; then
   alpha="y"
fi

gawk '
BEGIN{}
{ inline=$0
  gsub("\376","",inline)
  print inline > "sortfa@"
}
END{}' sortf@ 

#gawk -v filea=$filebbl -v alpha=$alpha '

gawk  '
BEGIN{
#   while (getline inline < filea >0)
#      {if (index(inline,"\\begin{thebibliography}")>0)
#          {firstoutline=inline}
#       if (index(inline,"\\end{thebibliography}")>0)
#          {lastoutline=inline}
#      }
#   print firstoutline > "bibfile@"
#   print "" > "bibfile@"
#   FS="\\\\newblock "
#
   FS="\\\\newblock "
print "\\makeatletter%" > "bibfile@"
print "\\bc@active\\bc@cdefine%" > "bibfile@"
print "\\makeatother%" > "bibfile@"
}
{
if (NR==1)
{
   while (getline inline < filea >0)
      {if (index(inline,"\\begin{thebibliography}")>0)
          {firstoutline=inline}
       if (index(inline,"\\end{thebibliography}")>0)
          {lastoutline=inline}
      }
   print firstoutline > "bibfile@"
   print "" > "bibfile@"
#   FS="\\\\newblock "
} # end of if (NR==1)   


#   author=$1

 k=split($1,subauthor,",")

 j=1; authorstr=""
 for (j; j<=k; j++)
  {author=subauthor[j]
   dotpos=index(author,".")
   field[1]=substr(author,1,dotpos)
   field[2]=substr(author,dotpos+1,length(author)-dotpos)

#   if (substr(field[1],1,1)==" ")
#      {field[1]=substr(field[1],2,length(field[1])-1)}
   if (substr(field[1],length(field[1]),1)==".")
      {field[1]=substr(field[1],1,length(field[1])-1)}

#   if (substr(field[2],1,1)==" ")
#      {field[2]=substr(field[2],2,length(field[2])-1)}
   if (substr(field[2],length(field[2]),1)!=".")
      {field[2]=field[2] " "}

   author=field[2] field[1]
   if (j==1)
     {firstname=field[1]
      if (substr(firstname,1,1)==" ")
         {firstname=substr(firstname,2,length(firstname)-1)}
     }

   if (k==1)
     {comma="."}
   else
     {if (k==2) 
         {if (j==1)
            {comma=" and "} 
          else
            {comma="."}
         }
      else
         {if (j < k-1)
           {comma=", "}
          else 
           {if (j==k-1)
             {comma=", and "}
            else
             {comma="."}
           }
         }
     }
   authorstr=authorstr author comma
   gsub("  "," ",authorstr)
   gsub("  "," ",authorstr)
   if (substr(authorstr,1,1)==" ")
      {authorstr=substr(authorstr,2,length(authorstr)-1)}
   if (substr(authorstr,length(authorstr)-2,3)==", .")
     {authorstr=substr(authorstr,1,length(authorstr)-3)}
  }

   bibitem=index(authorstr,"\\bibitem")
   if (bibitem > 0)
      {authorstr=substr(authorstr,1,bibitem-1)}
 

  bibitem=index($NF,"\\bibitem")
  lastblock=substr($NF,1,bibitem-1)
  if (alpha == "y")
     {numno=0; yeara=0; yearb=0
      bibitemblock=substr($NF,bibitem)
      bibbr=index(bibitemblock,"\\bibitem[")
      bibitemstra=substr(bibitemblock,bibbr+9,length(bibitemblock)-bibbr-8)
      bibbrr=index(bibitemstra,"]")
      bibitemstr=substr(bibitemstra,1,bibbrr-1)
      rbibitemblock=substr(bibitemstra,bibbrr+1,length(bibitemstra)-bibbrr)

      i=1; llen=length(bibitemstr)
      for (i; i<=llen; i++)
          {ch[i]=substr(bibitemstr,llen-i+1,1)}
      i=1
      for (i; i<=llen; i++)
          {chtmp=ch[i]
           if (chtmp < "\060" || chtmp > "\071")
              {continue}
           else
              {++numno
               if (numno==1)
                  {yearb=llen-i+1}
               else
                  {yeara=llen-i+1}
              }
          }

      if (yeara >0 && yearb > 0)
         {
          firstnamestr=substr(bibitemstr,1,yeara-1)
          lenn=length(firstnamestr)
          ii =1; allasc=0
          for (ii; ii<=lenn; ii++)
              {
               chh=substr(firstnamestr,ii,1)
               {if (chh > "\240" && chh < "\376")
                 {if (ii==1)
                     {labelname=substr(firstname,1,2); break}
                  else
                     {if (ii==2)
                       {labelname=substr(firstnamestr,1,1) \
                        substr(firstname,1,2); break
                       }
                      else
                       {labelname=substr(firstnamestr,1,2)\
                        substr(firstname,1,2)
                       }
                     }
                 }
               else
                {allasc=1}
               }
              } 

          if (allasc == 1)
             {chh=substr(firstname,1,1)

              if (chh > "\240" && chh < "\376")
                 {labelname=substr(firstname,1,2) firstnamestr
                 } 
              else
                 {labelname=firstnamestr}          
             }

#          bibitemblock="\\bibitem[" firstname \
          bibitemblock="\\bibitem[" labelname \
            substr(bibitemstr,yeara,llen-yeara+1) "]" rbibitemblock
          print bibitemblock > "bibfile@"
         }
      else
         {print substr($NF,bibitem) > "bibfile@"}
     }
  else
     {print substr($NF,bibitem) > "bibfile@"}

  print authorstr  > "bibfile@"


   i=2
   for (i; i<=NF-1; i++)
       {print "\\newblock " $i > "bibfile@"
       }
   print "\\newblock " lastblock > "bibfile@" 
   print "" > "bibfile@"
}
END{
   print lastoutline > "bibfile@"
}' filea=$filebbl alpha=$alpha sortfa@


/bin/rm -f sortf@

chicode -u bibfile@ > $filea$ext.bbl

/bin/rm -f  bibfile@

fi # end of nonunsrt

#mv $filea.bbl.tmp@ $filea.bbl

if test -s ".tmp00/$filea$ext.aux"; then
   cp -f $filea$ext.bbl .tmp00/$filea$ext.bbl
fi


mv $bibdata.bib.tmp@ $bibdata.bib

/bin/rm -f m@@ch@*.bib *.tmp@ *@

exit














