view src/gpf/misc/tok.c @ 72:7bf39f5e834d

backlight control on Luna: switch PWL instead of LEDB This change is preliminary toward upcoming rework of backlight control logic in our UI firmware. LEDB does not exist on Tango-based platforms (it is not brought out on Tango modules), thus turning it on and off produces absolutely no effect beyond making L1 disable deep sleep when LEDB is turned on. However, both iWOW DSK and our upcoming FC Caramel2 boards have a PWL LED, so let's switch that LED on and off to indicate the state of the UI firmware's backlight control. Note that we are NOT switching the actual Luna LCD backlight here, even though it is trivially controlled with a GPIO. The reason for this seemingly strange choice is that we don't want to turn this development board LCD backlight off until we bring the higher-level backlight control logic up to par, including new logic to "swallow" the first keypress that turns on the darkened LCD.
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 24 Oct 2020 07:39:54 +0000
parents 4e78acac3d88
children
line wrap: on
line source

/* 
+------------------------------------------------------------------------------
|  File:       tok.c
+------------------------------------------------------------------------------
|  Copyright 2002 Texas Instruments Berlin, AG 
|                 All rights reserved. 
| 
|                 This file is confidential and a trade secret of Texas 
|                 Instruments Berlin, AG 
|                 The receipt of or possession of this file does not convey 
|                 any rights to reproduce or disclose its contents or to 
|                 manufacture, use, or sell anything it may describe, in 
|                 whole, or in part, without the specific written consent of 
|                 Texas Instruments Berlin, AG. 
+----------------------------------------------------------------------------- 
|  Purpose :  This Modul performs Configuration string functions
+----------------------------------------------------------------------------- 
*/ 

#ifndef __TOK_C__
#define __TOK_C__

#include "typedefs.h"
#include <string.h>
#include <ctype.h>

#include "tok.h"

#ifdef _VXWORKS_
#undef ERROR     -1                   /* Token types               */
#undef EOS        1
#endif
#define ERROR     -1                   /* Token types               */
#define EOS        1
#define COMMA      2
#define EQUAL      3
#define IDENT      4
#define STRING     5
#define LBRACK     6
#define RBRACK     7

static SHORT tok_gettok (char **);
static SHORT tok_value  (char **);
static int tok_issep  (char);

/*
Format:
   List   ::= Token
          ::= Token , Token, ...

   Token  ::= Ident
          ::= Ident = Values

   Values ::= Value
          ::= (Value)
          ::= (Value , Value , ... )
          ::= ()

   Value  ::= Ident
          ::= "String"

*/

#ifndef RUN_INT_RAM
static TOK_DCB  tok_dcb;
static char     tok_buf[80];
#endif

#ifndef RUN_INT_RAM
/*
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
| PROJEKT : TETRA-PS (6143)            MODUL   : TOK.C              |
| STATUS  : code                       ROUTINE : tok_key            |
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

   PURPOSE : Return code value of a keyword from table.

*/

SHORT tok_key (KW_DATA * keytab, char * keyword)
{
  /*
   * Empty string terminates
   */
  while (keytab->keyword[0])
  {
    if (strcmp (keytab->keyword, keyword ) == 0)
      return (keytab->code);
    keytab++;
  }

  return (TOK_NOT_FOUND);
}
#endif


#ifndef RUN_INT_RAM
/*
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
| PROJEKT : TETRA-PS (6143)            MODUL   : TOK.C              |
| STATUS  : code                       ROUTINE : tok_init           |
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

   PURPOSE : Initialize token scanner.

*/

void tok_init (char * s)
{
   tok_dcb.tokbuf      = tok_buf;
   strncpy (tok_dcb.tokbuf, s, 79);
   tok_dcb.tokbuf[79]  = '\0';
   tok_dcb.nexttok     = tok_dcb.tokbuf;
   tok_dcb.lastchar    = 0;
}
#endif

#ifndef RUN_INT_RAM
/*
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
| PROJEKT : TETRA-PS (6143)            MODUL   : TOK.C              |
| STATUS  : code                       ROUTINE : tok_next           |
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

   PURPOSE : Get next token (and its values) from token string.
             Return number of value strings.

*/

SHORT tok_next (char ** keyw, char * value [])
{
  char * val;

  if (tok_dcb.nexttok == NULL)
    return (TOK_EOCS);

  if (tok_gettok (keyw) != IDENT)
  {
    tok_dcb.nexttok = NULL;
    return (TOK_EOCS);
  }

  /*
   * Check next token
   */
  switch (tok_gettok (&val))
  {
    /*
     * No value present
     */
    case COMMA:
      return (0);
    /*
     * Value(s) follows
     */
    case EQUAL:
      return (tok_value (value));
    /*
     * No value present and EOS
     */
    case EOS:
      tok_dcb.nexttok = NULL;
      return (0);
    /*
     * Syntax error
     */
    default:
      tok_dcb.nexttok = NULL;
      return (TOK_EOCS);
  }
}
#endif

#ifndef RUN_INT_RAM
/*
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
| PROJEKT : TETRA-PS (6143)            MODUL   : TOK.C              |
| STATUS  : code                       ROUTINE : tok_value          |
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

   PURPOSE : Get list of values for token.
             Return number of values found.

             Formats:  Value
                       (Value)
                       (Value, Value,...)
                       ()
*/

static SHORT tok_value (char * value [])
{
  SHORT   count;
  SHORT   tok;
  SHORT   inbrack;
  char  * val;
  char  * val2;

  inbrack = 0;
  /*
   * Get next token
   */
  tok = tok_gettok (&val);

  switch (tok)
  {
    case LBRACK:
      inbrack++;
      break;

    case IDENT  :
    case STRING :
      tok = tok_gettok (&val2);
      if ((tok != COMMA) && (tok != EOS))
      {
        tok_dcb.nexttok = NULL;
        return (0);
      }

      value[0] = val;
      return (1);

    case EOS :
    default  :
      tok_dcb.nexttok = NULL;
      return (0);
  }

  /*
   * Get first token of list
   */

   tok = tok_gettok (&val);
   count = 0;
   for(;;)
   {
     if ((tok == IDENT) || (tok == STRING))
       value[count++] = val;
     else
     {
       tok_dcb.nexttok = NULL;
       return (0);
     }

     tok = tok_gettok (&val);
     switch (tok)
     {
       case COMMA:
         break;

       case RBRACK :
         if (inbrack)
         {
           if (((tok = tok_gettok (&val)) == COMMA) ||
                (tok == EOS))
             return (count);
         }
         /*
          * Fall through
          */
       /*lint -fallthrough */
       default:
         tok_dcb.nexttok = NULL;
         return (0);
     }
     tok = tok_gettok (&val);
   }
   /*lint -e527 suppress Warning -- Unreachable */
   return (0);
   /*lint +e527 */

}
#endif

#ifndef RUN_INT_RAM
/*
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
| PROJEKT : TETRA-PS (6143)            MODUL   : TOK.C              |
| STATUS  : code                       ROUTINE : tok_gettok         |
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

   PURPOSE : Return next token in input string.

*/

static SHORT tok_gettok (char ** token)
{
  SHORT   tok;
  char   hadnull;
  char  * cp;

  cp      = tok_dcb.nexttok;
  hadnull = tok_dcb.lastchar != 0;

  if (tok_dcb.lastchar)
  {
    * tok_dcb.nexttok = tok_dcb.lastchar;
    tok_dcb.lastchar = 0;
  }
  /*
   * Skip leading white space
   */
  while (isspace (* tok_dcb.nexttok))
    tok_dcb.nexttok++;

  * token = tok_dcb.nexttok++;

  switch (** token)
  {
    case '\0':                         /* End of string             */
    case '\n':
      tok = EOS;
      break;

    case ',':
      ** token = '\0';
      tok = COMMA;
      break;

    case '=':
      ** token = '\0';
         tok = EQUAL;
         break;

      case '(':
      case '<':
      case '[':
        ** token = '\0';
        tok = LBRACK;
        break;

      case ')':
      case '>':
      case ']':
        ** token = '\0';
        tok = RBRACK;
        break;

      case '"':
        /*
         * Get first char of string
         */
        * token = tok_dcb.nexttok;
        while ((* tok_dcb.nexttok != '\0') && (* tok_dcb.nexttok != '"'))
          tok_dcb.nexttok++;

        if (* tok_dcb.nexttok != '\0')
            * tok_dcb.nexttok++ = '\0';

        tok = STRING;
        break;

      default:
        /*
         * Read an identifier
         */
        if (!tok_issep (** token))
        {
          while (!tok_issep (* tok_dcb.nexttok))
            tok_dcb.nexttok++;

          tok_dcb.lastchar = * tok_dcb.nexttok;
          * tok_dcb.nexttok = '\0';

          tok = IDENT;
        }
        else
          tok = ERROR;
        break;
   }
   /*
    * '\0 was replaced with char
    * Replace original '\0'
    */

   if (hadnull)
     * cp = '\0';

   return (tok);
}
#endif

#ifndef RUN_INT_RAM
/*
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
| PROJEKT : TETRA-PS (6143)            MODUL   : TOK.C              |
| STATUS  : code                       ROUTINE : tok_issep          |
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

   PURPOSE : Return 1 if special character.

*/

static int tok_issep (char c)
{
   switch (c)
   {
      case '\0' :
      case '\n' :
      case ','  :
      case '='  :
      case '('  :
      case '<'  :
      case '['  :
      case ')'  :
      case '>'  :
      case ']'  :
      case '"'  : return (1);

      default   : return (isspace (c));
   }
}
#endif
#endif