Logo Search packages:      
Sourcecode: maxdb-7.5.00 version File versions

ven18.c

Go to the documentation of this file.
/*!
  @file           ven18.c
  @author         JoergM
  @brief          Client RunTime: sqlcharsetname
  @see            


                Find <charsetname> corresponding to DBTERM or TERM

\if EMIT_LICENCE

    ========== licence begin  GPL
    Copyright (c) 2001-2005 SAP AG

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    ========== licence end



\endif
*/

#define MOD__ "ven18.c:"

#include "gen00.h"
#include "hen40.h"
#include <ctype.h>
#include <string.h>
#include <memory.h>
#include <errno.h>
#include "geo007_1.h"
#include "heo01.h"

/*
 *  DECLARATION OF GLOBAL PROCEDURES/FUNCTIONS (Entrys)
 */
void sqlcharsetname ( tsp00_KnlIdentifier CharSetName );

/*
 *  DECLARATION OF EXTERNAL PROCEDURES/FUNCTIONS (Entrys)
 */
extern char     *getenv ();

/*
 *  DECLARATION OF INTERNAL PROCEDURES/FUNCTIONS (Entrys)
 */
static int        sqlBlackLen( char *Pstring );

#define CHARSETNAME_ENV       "DBCHARSET"
#define CHARSETNAME_FNAME     "term/charsetnames"
#define C_SPACE   ' '

/* sqlcharsetname
 * File has 2 words per line: <terminal type> and <charsetname>.
 * The <terminal type> is DBTERM. If DBTERM is not set, use TERM.
 * Caller wants <charsetname> copied to given buffer (pad on right with
 *          spaces, do NOT terminate with null char)
 */
#undef MF__
#define MF__ MOD__"sqlcharsetname"
void
sqlcharsetname( 
tsp00_KnlIdentifier CharSetName )         /* copy of <charsetname> */
{
      char              readbuf[256];
      char              *Pc;              /* moveable ptr to readbuf */
      char              *Ptermtype;       /* DBTERM or TERM */
      int                     termlen;
      int                     charsetlen;
      tsp00_Pathc       fname;                  /* charsetname file name */
      FILE              *Pfile;                 /* charsetname file id */
        tsp00_Pathc     terminfoPath;
        tsp01_RteError  rteError;

    memset( CharSetName, ' ', sizeof (tsp00_KnlIdentifier));

      /* If DBCHARSET is in environment, use this as the charsetname */
      Pc = getenv ( CHARSETNAME_ENV );
      if ( Pc )
      {
        DBG3 (( MF__, "%s = '%s' ", CHAR_SET_ENV_VAR, Pc));
        eo46CtoP ( CharSetName, Pc, sizeof(tsp00_KnlIdentifier) );
        DBGOUT;
        return;
      }

        /* PTS 1108088 */
      /* Build filename */
        if ( !sqlGetIndependentTerminfoPath(terminfoPath, true, &rteError) )
        {
          DBG3 (( MF__, "IndependentTerminfoPath not found:(%d)%s (%d)%s", 
                  rteError.RteErrCode, rteError.RteErrText,
                  rteError.OsErrCode, rteError.OsErrText ));
          DBGOUT;
        return;
      }

    /* PTS 1105566 */
    if ( strlen(CHARSETNAME_FNAME) + strlen (terminfoPath) < sizeof ( fname ) ) 
      strcat(strcpy((char *)fname, terminfoPath), CHARSETNAME_FNAME);
    else
    {
        MSGD(( -11117, ERR_TYPE, "CHARSET ", "Path to long\n" ));
      return;
    }

    /* If DBTERM is not set, use TERM */
      if(!(Ptermtype = getenv("DBTERM")))
      {
            DBG1(( MF__,"warning: DBTERM not set\n" ));
            if(!(Ptermtype = getenv("TERM")))
            {
            MSGD(( -11117, ERR_TYPE, "CHARSET ", "DBTERM and TERM not set\n" ));
                  return;
            }
      }

      /* Open charsetname file for reading */
      if(!(Pfile = fopen((char *)fname, "r")))
      {
        /* PTS 1106084 */
            DBG1(( MF__, "open charset %s error, %s\n", fname, sqlerrs() ));
            return;
      }

      /* For each line, 1st word is <term type> and 2nd word is <charsetname> */
      termlen = strlen(Ptermtype);
      Pc = fgets(readbuf, sizeof(readbuf), Pfile);
      while(Pc)
      {
            /* Skip white space */
            while(isspace(*Pc))
            {
                  Pc++;
            }
            if(termlen == sqlBlackLen(Pc) && !memcmp(Pc, Ptermtype, termlen))
            {
                  /* 1st word matches our termtype: skip 1st word and white space */
                  Pc += termlen;
                  while(isspace(*Pc))
                  {
                        Pc++;
                  }

                  /* Look at 2nd word */
                  if( !sqlBlackLen(Pc) )
                  {
                        /* Can't find 2nd word: try next line */
                        MSGD(( -11317, INFO_TYPE, "CHARSET ", "charset <term type> is '%s'\n", Ptermtype ));
                        DBG1(( -11317, INFO_TYPE, "CHARSET ", "warning: <charsetname> is missing\n" ));
                  }
                  else
                  {
                eo46CtoP ( CharSetName, Pc, sizeof(tsp00_KnlIdentifier) );
                        break;
                  }
            }
            /* Get next line */
            Pc = fgets(readbuf, sizeof(readbuf), Pfile);
      }

      /* Close file */
      (void)fclose(Pfile);
}

static int
sqlBlackLen(
char *Pstring)
{
      char  *Pc;

      for(Pc = Pstring; *Pc && !isspace(*Pc); Pc++)
      {
            ;
      }
      return(Pc - Pstring);
}

Generated by  Doxygen 1.6.0   Back to index