예제 #1
0
int rtt_crossref_channel(unsigned long ctx, pwr_tObjid objid, void* arg1,
    void* arg2, void* arg3, void* arg4)
{
  pwr_tAName hiername;
  int sts;
  pwr_sAttrRef signal_aref;

  sts = gdh_ObjidToName(objid, hiername, sizeof(hiername), cdh_mNName);
  if (EVEN(sts)) {
    rtt_message('E', "Cross reference not defined");
    return RTT__NOPICTURE;
  }
  strcat(hiername, ".SigChanCon");
  sts = gdh_GetObjectInfo(
      hiername, (pwr_tAddress)&signal_aref, sizeof(signal_aref));
  if (EVEN(sts))
    return sts;

  sts = gdh_AttrrefToName(&signal_aref, hiername, sizeof(hiername), cdh_mNName);
  if (EVEN(sts)) {
    rtt_message('E', "Cross reference not defined");
    return RTT__NOPICTURE;
  }

  sts = rtt_crr_signal(NULL, hiername);
  return sts;
}
예제 #2
0
int	rtt_view_search( view_ctx ctx,
			 char	*search_string)
{
	int	i;
	char	*s;
	int	offset;

	if ( !ctx->buff_read_complete)
	{
	  rtt_message('E',"File too large");
	  return RTT__NOPICTURE;
	}
	else
	{
	  /* Find the current offset */
	  if ( ctx->start_row >= ctx->buffrow_count -1)
	  {
	    rtt_message('E',"String not found");
	    return RTT__NOPICTURE;
	  }
	
	  offset = ctx->buffrow[ctx->start_row +1];

	  s = strstr( &ctx->buff[offset], search_string);
	  if ( !s)
	  {
	    rtt_message('E',"String not found");
	    return RTT__NOPICTURE;
	  }

	  /* Find the line */
	  offset = s - ctx->buff;

	  for ( i = 0; i < ctx->buffrow_count; i ++)
	  {
	    if ( ctx->buffrow[i] > offset )
	    {
	      ctx->start_row = i - 1;
	      if ( ctx->start_row < 0) 
	        ctx->start_row = 0;
	      break;
	    }
	  }
	}
	return RTT__SUCCESS;
}
예제 #3
0
int rtt_crossref_signal(unsigned long ctx, pwr_tObjid objid, void* arg1,
    void* arg2, void* arg3, void* arg4)
{
  pwr_tOName hiername;
  int sts;

  sts = gdh_ObjidToName(objid, hiername, sizeof(hiername), cdh_mNName);
  if (EVEN(sts)) {
    rtt_message('E', "Cross reference not defined");
    return RTT__NOPICTURE;
  }

  sts = rtt_crr_signal(NULL, hiername);
  return sts;
}
예제 #4
0
int rtt_show_signals(
    menu_ctx parent_ctx, char* filename, char* windowname, int debug)
{
  pwr_tFileName default_filename;
  FILE* file;
  char line[500];
  int window_spaces;
  pwr_tOName window;
  pwr_tOName object;
  pwr_tOName objname;
  int spaces = 30;
  int sts;
  char* s;
  int wildcard;
  char title[250];
  char classname[32];
  int j;
  int index = 0;
  pwr_tObjid objid;
  pwr_tObjid childobjid;
  rtt_t_menu* menulist = 0;
  char filestr[80];
  int lines;
  int window_found;
  pwr_tVolumeId volid;

  window_found = 0;
  rtt_toupper(windowname, windowname);

  /* Check if wildcard */
  s = strchr(windowname, '*');
  if (s == 0)
    wildcard = 0;
  else
    wildcard = 1;

  /* Open file */
  if (filename == NULL) {
    /* Open file, first get the volume id */
    if (!wildcard) {
      sts = gdh_NameToObjid(windowname, &objid);
      if (EVEN(sts)) {
        rtt_message('E', "Window not found");
        return RTT__NOPICTURE;
      }
      volid = objid.vid;
    } else {
      sts = gdh_GetNodeObject(0, &objid);
      if (EVEN(sts))
        return sts;
      volid = objid.vid;
    }

    sprintf(default_filename, "%srtt_plc_%s.dat", rtt_pwr_dir("pwrp_load"),
        rtt_VolumeIdToStr(volid));
    rtt_get_defaultfilename(default_filename, filestr, NULL);
    file = fopen(filestr, "r");
  } else {
    rtt_get_defaultfilename(filename, filestr, ".lis");
    file = fopen(filestr, "r");
  }

  if (file == 0) {
    rtt_message('E', "Unable to open file");
    return RTT__NOPICTURE;
  }

  /* First line is a header, skip it */
  sts = rtt_get_signal_line(
      file, line, sizeof(line), &window_spaces, object, &lines);
  if (EVEN(sts))
    return RTT__NOFILE;

  /* Get the hierarchy */
  while (spaces >= 30) {
    /* This is still the header */
    sts = rtt_get_signal_line(
        file, line, sizeof(line), &spaces, object, &lines);
    if (EVEN(sts))
      return RTT__NOFILE;
  }
  window_spaces = spaces;

  while (1) {
    while (spaces != window_spaces) {
      sts = rtt_get_signal_line(
          file, line, sizeof(line), &spaces, object, &lines);
      if (EVEN(sts))
        goto finish;
    }
    strcpy(window, object);
    rtt_toupper(window, window);

    sts = rtt_wildcard(windowname, window);
    if (!sts) {
      window_found = 1;
      /* Hit, print the window */
      /* Get objid for the object */
      sts = gdh_NameToObjid(window, &objid);
      if (EVEN(sts)) {
        sts = rtt_get_signal_line(
            file, line, sizeof(line), &spaces, object, &lines);
        if (EVEN(sts))
          goto finish;
        continue;
      }

      /* Get the object name */
      sts = gdh_ObjidToName(objid, objname, sizeof(objname), cdh_mNName);
      if (EVEN(sts))
        return sts;

      /* Get class name */
      sts = rtt_objidtoclassname(objid, classname);
      if (EVEN(sts))
        return sts;

      /* Add class name to objname in title */
      strcpy(title, objname);
      for (j = strlen(title); j < 45; j++)
        strcat(title, " ");
      strcat(title, " ");
      strcat(title, classname);

      /* Mark if the object has children */
      sts = gdh_GetChild(objid, &childobjid);
      if (ODD(sts))
        strcat(title, " *");

      if (!debug) {
        sts = rtt_menu_list_add(&menulist, index, 0, title,
            &rtt_hierarchy_child, &rtt_object_parameters, &rtt_crossref_signal,
            objid, 0, 0, 0, 0);
        if (EVEN(sts))
          return sts;
        index++;
      }

      /* Find the signal list */
      sts = rtt_get_signal_line(
          file, line, sizeof(line), &spaces, object, &lines);
      if (EVEN(sts))
        goto finish;
      while (spaces > window_spaces) {
        if (streq(object, "Signals")) {
          /* This is the signals */
          sts = rtt_get_signal_line(
              file, line, sizeof(line), &spaces, object, &lines);
          if (EVEN(sts))
            goto finish;
          lines = 1;
          while ((spaces > window_spaces) && (lines == 1)) {
            /* Insert the object in menulist */

            /* Get objid for the object */
            sts = gdh_NameToObjid(object, &objid);
            if (EVEN(sts)) {
              /* End of this list, read next line and continue */
              sts = rtt_get_signal_line(
                  file, line, sizeof(line), &spaces, object, &lines);
              if (EVEN(sts))
                goto finish;
              continue;
            }
            /* Get the object name */
            sts = gdh_ObjidToName(objid, objname, sizeof(objname), cdh_mNName);
            if (EVEN(sts))
              return sts;

            /* Get class name */
            sts = rtt_objidtoclassname(objid, classname);
            if (EVEN(sts))
              return sts;

            /* Add class name to objname in title */
            strcpy(title, "    ");
            strcat(title, objname);
            for (j = strlen(title); j < 45; j++)
              strcat(title, " ");
            strcat(title, " ");
            strcat(title, classname);

            if (!debug) {
              sts = rtt_menu_list_add(&menulist, index, 0, title,
                  &rtt_hierarchy_child, &rtt_object_parameters,
                  &rtt_crossref_signal, objid, 0, 0, 0, 0);
              if (EVEN(sts))
                return sts;
              index++;
            } else {
              sts = rtt_debug_object_add(
                  objid, (rtt_t_menu_upd**)&menulist, &index, &one, 0, 0);
              if (EVEN(sts))
                return sts;
            }

            sts = rtt_get_signal_line(
                file, line, sizeof(line), &spaces, object, &lines);
            if (EVEN(sts))
              goto finish;
            /* Check if end of signals !! */
          }
        } else {
          sts = rtt_get_signal_line(
              file, line, sizeof(line), &spaces, object, &lines);
          if (EVEN(sts))
            goto finish;
        }
      }
      if (!wildcard)
        goto finish;
    } else {
      if (window_found)
        goto finish;

      sts = rtt_get_signal_line(
          file, line, sizeof(line), &spaces, object, &lines);
      if (EVEN(sts))
        goto finish;
    }
  }

finish:
  fclose(file);

  if (menulist != 0) {
    strcpy(title, "LIST OF SIGNALS");
    /*	  sts = rtt_menu_bubblesort( menulist);*/
    if (!debug)
      sts = rtt_menu_new(
          parent_ctx, pwr_cNObjid, &menulist, title, 0, RTT_MENUTYPE_DYN);
    else
      sts = rtt_menu_upd_new(parent_ctx, pwr_cNObjid,
          (rtt_t_menu_upd**)&menulist, title, 0, RTT_MENUTYPE_DYN);
    if (sts == RTT__FASTBACK)
      return sts;
    else if (sts == RTT__BACKTOCOLLECT)
      return sts;
    else if (EVEN(sts))
      return sts;
  } else {
    rtt_message('E', "No windows found");
    return RTT__NOPICTURE;
  }

  return RTT__SUCCESS;
}
예제 #5
0
int rtt_crr_code(
    char* filename, char* str, int brief, int func, int case_sensitive)
{
  pwr_tFileName default_filename;
  FILE* file;
  char line[500];
  char tst_line[500];
  pwr_tAName object;
  pwr_tOName objname;
  int spaces;
  int first;
  int sts;
  char* s;
  int signalcount = 0;
  char filestr[80];
  int lines;
  char* buff;
  pwr_tVolumeId volid;
  pwr_tObjid objid;
  int buffcnt = 0;
  int len;
  int i;
  int objname_written;
  int hit;
  char* tst_char;

  /* Open file */
  if (filename == NULL) {
    sts = gdh_GetNodeObject(0, &objid);
    if (EVEN(sts))
      return sts;
    volid = objid.vid;

    sprintf(default_filename, "%srtt_crrc_%s.dat", rtt_pwr_dir("pwrp_load"),
        rtt_VolumeIdToStr(volid));
    rtt_get_defaultfilename(default_filename, filestr, NULL);
    file = fopen(filestr, "r");
  } else {
    rtt_get_defaultfilename(filename, filestr, ".lis");
    file = fopen(filestr, "r");
  }

  if (file == 0) {
    rtt_message('E', "Unable to open file");
    return RTT__NOPICTURE;
  }

  /* Case sensitive if any lowercase */
  if (!case_sensitive)
    for (s = str; *s != 0; s++) {
      if (!isupper(*s))
        case_sensitive = 1;
    }

  buff = calloc(1, CRR_BUFF_SIZE);
  if (!buff) {
    rtt_message('E', "Unable to allocate memory");
    fclose(file);
    return RTT__NOPICTURE;
  }

  /* Get the hierarchy */
  while (!str_StartsWith(line, " _Obj_ ")) {
    sts = rtt_get_signal_line(
        file, line, sizeof(line), &spaces, object, &lines);
    if (EVEN(sts))
      goto finish;
  }

  first = 1;
  while (1) {
    strcpy(objname, &line[7]);
    for (s = objname; !(*s == 32 || *s == 9 || *s == 0); s++)
      ;
    *s = 0;

    sts = rtt_get_signal_line(
        file, line, sizeof(line), &spaces, object, &lines);
    objname_written = 0;
    while (!str_StartsWith(line, " _Obj_ ")) {
      if (!case_sensitive)
        rtt_toupper(tst_line, line);
      else
        strcpy(tst_line, line);

      hit = 0;
      if (!func) {
        if (strstr(tst_line, str) != 0)
          hit = 1;
      } else {
        if ((s = strstr(tst_line, str)) != 0) {
          hit = 1;
          /* Check char after */
          tst_char = s + strlen(str);
          if (isalpha(*tst_char) || isdigit(*tst_char) || *tst_char == '_')
            hit = 0;
          /* Check char before */
          if (s != tst_line) {
            tst_char = s - 1;
            if (isalpha(*tst_char) || isdigit(*tst_char) || *tst_char == '_')
              hit = 0;
          }
        }
      }
      if (hit) {
        /* Hit, print this object */
        if (signalcount == 0) {
          rtt_clear_screen();
          if (func)
            buffcnt
                = sprintf(buff, "Crossreferens list Function  \"%s\"\n\n", str);
          else
            buffcnt
                = sprintf(buff, "Crossreferens list String    \"%s\"\n\n", str);
        }
        signalcount++;

        if (buffcnt > CRR_BUFF_SIZE - 100) {
          buffcnt += sprintf(
              buff + buffcnt, "RTT-E-QUOTAEXC, Crossref quota exceeded");
          goto finish;
        }
        if (!objname_written) {
          len = sprintf(buff + buffcnt, " %s", objname);
          objname_written = 1;
        } else
          len = 0;
        for (i = len; i < 45; i++) {
          strcat(buff + buffcnt + len, " ");
          len++;
        }
        buffcnt += len;

        buffcnt += sprintf(buff + buffcnt, " \"%s\"\n", line);

        if (brief) {
          while (!str_StartsWith(line, " _Obj_ ")) {
            sts = rtt_get_signal_line(
                file, line, sizeof(line), &spaces, object, &lines);
            if (EVEN(sts))
              goto finish;
          }
        } else {
          sts = rtt_get_signal_line(
              file, line, sizeof(line), &spaces, object, &lines);
          if (EVEN(sts))
            goto finish;
        }
      } else {
        sts = rtt_get_signal_line(
            file, line, sizeof(line), &spaces, object, &lines);
        if (EVEN(sts))
          goto finish;
      }
    }
  }

finish:
  fclose(file);

  if (signalcount > 0) {
    sts = rtt_view(0, 0, buff, "Crossreference list", RTT_VIEWTYPE_BUF);
    return sts;
  } else {
    if (func)
      rtt_message('E', "String not found");
    else
      rtt_message('E', "Function not found");
    return RTT__NOPICTURE;
  }
}
예제 #6
0
int rtt_crr_object(char* filename, char* objectname)
{
  pwr_tFileName default_filename;
  FILE* file;
  char line[200];
  int object_spaces;
  char object[80];
  pwr_tOName objname;
  char show_objname[80];
  int spaces;
  int first;
  int sts;
  char* s;
  int wildcard;
  int signalcount = 0;
  pwr_tFileName filestr;
  int lines;
  char* buff;
  pwr_tVolumeId volid;
  pwr_tObjid objid;
  int buffcnt = 0;

  rtt_toupper(objectname, objectname);

  /* Check if wildcard */
  s = strchr(objectname, '*');
  if (s == 0)
    wildcard = 0;
  else
    wildcard = 1;

  /* Open file */
  if (filename == NULL) {
    /* Open file, first get the volume id */
    if (!wildcard) {
      sts = gdh_NameToObjid(objectname, &objid);
      if (EVEN(sts)) {
        rtt_message('E', "Object not found");
        return RTT__NOPICTURE;
      }
      volid = objid.vid;
    } else {
      sts = gdh_GetNodeObject(0, &objid);
      if (EVEN(sts))
        return sts;
      volid = objid.vid;
    }

    sprintf(default_filename, "%srtt_crro_%s.dat", rtt_pwr_dir("pwrp_load"),
        rtt_VolumeIdToStr(volid));
    rtt_get_defaultfilename(default_filename, filestr, NULL);
    file = fopen(filestr, "r");
  } else {
    rtt_get_defaultfilename(filename, filestr, ".lis");
    file = fopen(filestr, "r");
  }

  if (file == 0) {
    rtt_message('E', "Unable to open file");
    return RTT__NOPICTURE;
  }

  buff = calloc(1, CRR_BUFF_SIZE);
  if (!buff) {
    rtt_message('E', "Unable to allocate memory");
    fclose(file);
    return RTT__NOPICTURE;
  }

  /* Get the object */
  sts = rtt_get_signal_line(file, line, sizeof(line), &spaces, object, &lines);
  if (EVEN(sts))
    goto finish;
  object_spaces = spaces;

  first = 1;
  while (1) {
    if ((s = strchr(object, ':')))
      strcpy(objname, s + 1);
    else
      strcpy(objname, object);

    strcpy(show_objname, objname);
    rtt_toupper(objname, objname);

    sts = rtt_wildcard(objectname, objname);
    if (sts) {
      pwr_tAName subname;
      strcpy(subname, objectname);
      strcat(subname, ".*");

      sts = rtt_wildcard(subname, objname);
    }
    if (!sts) {
      /* Hit, print this object */
      if (signalcount == 0) {
        rtt_clear_screen();
        buffcnt = sprintf(buff, "Crossreferens list   %s\n\n", show_objname);
      }
      signalcount++;

      sts = rtt_get_signal_line(
          file, line, sizeof(line), &spaces, object, &lines);
      if (EVEN(sts))
        goto finish;
      while (spaces > object_spaces) {
        str_trim(line, line);

        if (buffcnt > CRR_BUFF_SIZE - 100) {
          buffcnt += sprintf(
              buff + buffcnt, "RTT-E-QUOTAEXC, Crossref quota exceeded");
          goto finish;
        }

        buffcnt += sprintf(buff + buffcnt, " %s\n", line);

        sts = rtt_get_signal_line(
            file, line, sizeof(line), &spaces, object, &lines);
        if (EVEN(sts))
          goto finish;
      }
    } else {
      if (!wildcard && signalcount)
        goto finish;

      sts = rtt_get_signal_line(
          file, line, sizeof(line), &spaces, object, &lines);
      if (EVEN(sts))
        goto finish;
    }

    while (spaces != object_spaces) {
      sts = rtt_get_signal_line(
          file, line, sizeof(line), &spaces, object, &lines);
      if (EVEN(sts))
        goto finish;
    }
  }

finish:
  fclose(file);

  if (signalcount > 0) {
    sts = rtt_view(0, 0, buff, "Crossreference list", RTT_VIEWTYPE_BUF);
    return sts;
  } else {
    rtt_message('E', "Object not found");
    return RTT__NOPICTURE;
  }
}
예제 #7
0
int	rtt_view(	menu_ctx	parent_ctx,
			char		*filename, 
			char		*inbuff,
			char		*intitle,
			int		type)
{
	view_ctx	ctx;
	unsigned long	terminator;
	char		input_str[80];
	int		maxlen = 30;
	unsigned long	option;
	int		sts;
	int	i, start_i, end_i;
	int	size, offset;
	int	left_marg;
	int	page_size = 21;
	int	row_change;
	int	redraw = 1;
	char	str[100];
	char	title[80];
	FILE	*infile;
	char	last_char;
	char	pagestr[80];

	
	if ( type == RTT_VIEWTYPE_FILE)
	{
	  infile = fopen( filename, "r");
	  if ( !infile)
	  {
	    rtt_message('E',"Unable to open file");
	    return RTT__NOPICTURE;
	  }
	  rtt_fgetname( infile, title, filename);
	}
	else
	{
	  strcpy( title, intitle);
	}

	ctx = calloc( 1, sizeof( *ctx));
	if ( !ctx)
	{
	  rtt_message('E',"Unable to allocate memory");
	  return RTT__NOPICTURE;
	}
	rtt_ctx_push( (menu_ctx) ctx);
	ctx->ctx_type = RTT_CTXTYPE_VIEW;
	strcpy( ctx->title, title); 
	ctx->parent_ctx = parent_ctx;
	ctx->first = 1;
	if ( type == RTT_VIEWTYPE_FILE)
	  ctx->infile = infile;
	else
	  ctx->inbuff = inbuff;
	ctx->read_sts = (char *) 1;
	ctx->buff = calloc( 1, RTTVIEW_BUFF_SIZE);
	if ( !ctx->buff)
	{
	  rtt_ctx_pop();
	  rtt_message('E',"Unable to allocate memory");
	  return RTT__NOPICTURE;
	}
	ctx->buffrow = calloc( RTTVIEW_BUFFROW_SIZE, sizeof(*ctx->buffrow));
	if ( !ctx->buffrow)
	{
	  rtt_ctx_pop();
	  rtt_message('E',"Unable to allocate memory");
	  return RTT__NOPICTURE;
	}
	ctx->buffrow_count = 0;
	ctx->start_row = 0;
	left_marg = 0;
	row_change = 0;

	if ( type == RTT_VIEWTYPE_FILE)
	  rtt_read_file( ctx, ctx->buff, RTTVIEW_BUFF_SIZE, ctx->buffrow,
		RTTVIEW_BUFFROW_SIZE, &ctx->buffrow_count,
		0, page_size, &ctx->start_row);
	else
	  rtt_read_buff( ctx, ctx->buff, RTTVIEW_BUFF_SIZE, ctx->buffrow,
		RTTVIEW_BUFFROW_SIZE, &ctx->buffrow_count,
		0, page_size, &ctx->start_row);

	option = RTT_OPT_NORECALL | RTT_OPT_NOEDIT | RTT_OPT_NOECHO | 
		RTT_OPT_TIMEOUT;

	while (1)
	{

	  if ( ctx->start_row + page_size > ctx->buffrow_count )
	  {
	    if ( type == RTT_VIEWTYPE_FILE)
	      rtt_read_file( ctx, ctx->buff, RTTVIEW_BUFF_SIZE, ctx->buffrow,
		RTTVIEW_BUFFROW_SIZE, &ctx->buffrow_count,
		0, page_size, &ctx->start_row);
	    else
	      ctx->start_row = max( 0, ctx->buffrow_count - page_size);
/*
	      rtt_read_buff( ctx, ctx->buff, RTTVIEW_BUFF_SIZE, ctx->buffrow,
		RTTVIEW_BUFFROW_SIZE, &ctx->buffrow_count,
		0, page_size, &ctx->start_row);
*/
	    redraw = 1;
	  }
	  else if ( ctx->start_row < 0)
	  {
	    if ( type == RTT_VIEWTYPE_FILE)
	      rtt_read_file( ctx, ctx->buff, RTTVIEW_BUFF_SIZE, ctx->buffrow,
		RTTVIEW_BUFFROW_SIZE, &ctx->buffrow_count,
		1, page_size, &ctx->start_row);
	    else
	      ctx->start_row = 0;
/*
	      rtt_read_buff( ctx, ctx->buff, RTTVIEW_BUFF_SIZE, ctx->buffrow,
		RTTVIEW_BUFFROW_SIZE, &ctx->buffrow_count,
		1, page_size, &ctx->start_row);
*/
	    redraw = 1;
	  }
	  if ( redraw || row_change != 0)
	  {
	    redraw = 0;
	    rtt_display_erase();
	    start_i = ctx->start_row;
	    end_i = min(ctx->start_row+page_size, ctx->buffrow_count);
	    rtt_cursor_abs( 1, 22-page_size);
	    for ( i = ctx->start_row; i < end_i; i++)
	    {
	      if ( i == ctx->buffrow_count - 1)
	      {
	        offset = ctx->buffrow[i] + left_marg;
		rtt_view_get_row_size( &ctx->buff[offset], 80, &size, &last_char);
	        size = min( size, 80);
	        if ( last_char != 10)
	          r_print("%.*s\n\r", size,  &ctx->buff[offset]);
	        else
	          r_print("%.*s\r", size,  &ctx->buff[offset]);
/*
	        str[80] = 0;
	        r_print("%80s\n", str);
*/
	      }
	      else
	      {
	        offset = min( ctx->buffrow[i+1] - 1, ctx->buffrow[i] + left_marg);
	        size = min( ctx->buffrow[i+1] - offset, 80);
		rtt_view_get_row_size( &ctx->buff[offset], 80, &size, &last_char);
	        size = min( size, 80);
	        if ( last_char != 10)
	          r_print("%.*s\n\r", size,  &ctx->buff[offset]);
	        else
	          r_print("%.*s\r", size,  &ctx->buff[offset]);
	      }
	    }
	    rtt_cursor_abs( 1, 22);
	    rtt_char_inverse_start();
	    if ( end_i == ctx->buffrow_count)
	      sprintf( pagestr, "%d-EOF(%d)", start_i+1, ctx->buffrow_count);
	    else
	      sprintf( pagestr, "%d-%d(%d)", start_i+1, end_i, ctx->buffrow_count);
	    sprintf( str, 
"                                                 |%12s | Ctrl/R back", pagestr);
	    strncpy( &str[1], title, min( strlen( title), 49));
	    r_print( "%80s", str);
	    rtt_char_inverse_end();
	    
	    rtt_cursor_abs( 1, 23);
	    rtt_eofline_erase();
	    rtt_cursor_abs( 1, 24);
	    rtt_eofline_erase();
	  }

	  row_change = 0;
	  r_print_buffer();


	  rtt_command_get_input_string( (char *) &rtt_chn, 
		input_str, &terminator, maxlen, 
		rtt_recallbuff, option, rtt_scantime, &rtt_scan, ctx, 
		NULL, RTT_COMMAND_PICTURE);
	  rtt_message('S',"");

	  switch ( terminator)
	  {
	    case RTT_K_ARROW_UP:
	      if ( type == RTT_VIEWTYPE_BUF)
	      {
	        if ( ctx->start_row - RTTVIEW_ARROW_INC < 0) 
	        {
		  ctx->start_row = 0;
	          row_change = RTTVIEW_ARROW_INC - ctx->start_row;
	        }
	        else
	        {
	          ctx->start_row -= RTTVIEW_ARROW_INC;
	          row_change = -RTTVIEW_ARROW_INC;
	        }
	        redraw = 0;
	      }
	      else
	      {
	        ctx->start_row -= RTTVIEW_ARROW_INC;
	        row_change = -RTTVIEW_ARROW_INC;
	        redraw = 0;
	      }
	      break;
	    case RTT_K_ARROW_DOWN:
	      ctx->start_row += RTTVIEW_ARROW_INC;
	      row_change = RTTVIEW_ARROW_INC;
	      redraw = 0;
	      break;
	    case RTT_K_ARROW_RIGHT:
	      left_marg += 8;
	      redraw = 1;
	      break;
	    case RTT_K_ARROW_LEFT:
	      redraw = 1;
	      left_marg -= 8;
	      if ( left_marg < 0)
	        left_marg = 0;
	      break;
	    case RTT_K_NEXTPAGE:
	      /* Next page */
	      ctx->start_row += RTTVIEW_PAGE_INC;
	      row_change = RTTVIEW_PAGE_INC;
	      redraw = 0;
	      break;
	    case RTT_K_PREVPAGE:
	      /* Previous page */
	      ctx->start_row -= RTTVIEW_PAGE_INC;
	      row_change = -RTTVIEW_PAGE_INC;
	      redraw = 0;
	      break;
	    case RTT_K_RETURN:
	      break;
	    case RTT_K_PF1:
	      /* Top */
	      ctx->buffstart_row = 0;
	      ctx->start_row = 0;
	      rtt_read_buff( ctx, ctx->buff, RTTVIEW_BUFF_SIZE, ctx->buffrow,
		  RTTVIEW_BUFFROW_SIZE, &ctx->buffrow_count,
		  1, page_size, &ctx->start_row);
	      redraw = 1;
	      break;
	    case RTT_K_PF2:
	      /* Bottom */
	      ctx->start_row = max( 0, ctx->buffrow_count - page_size);
	      if ( type == RTT_VIEWTYPE_FILE)
	      {
	        while( ctx->read_sts != NULL)
	        {
	          rtt_read_buff( ctx, ctx->buff, RTTVIEW_BUFF_SIZE, ctx->buffrow,
		    RTTVIEW_BUFFROW_SIZE, &ctx->buffrow_count,
		    0, page_size, &ctx->start_row);
	          ctx->start_row = ctx->buffrow_count - page_size + 1;
	        }
	      }
	      redraw = 1;
	      break;
	    case RTT_K_PF3:
	      rtt_message('E', "Function not defined");
	      break;
	    case RTT_K_PF4:
	      if ( type == RTT_VIEWTYPE_FILE)
	        fclose( ctx->infile);
	      free( ctx->buff);
	      free( ctx->buffrow);
	      free( ctx);
	      rtt_ctx_pop();
	      return RTT__SUCCESS;
	    case RTT_K_FAST_1:
	    case RTT_K_FAST_2:
	    case RTT_K_FAST_3:
	    case RTT_K_FAST_4:
	    case RTT_K_FAST_5:
	    case RTT_K_FAST_6:
	    case RTT_K_FAST_7:
	    case RTT_K_FAST_8:
	    case RTT_K_FAST_9:
	    case RTT_K_FAST_10:
	    case RTT_K_FAST_11:
	    case RTT_K_FAST_12:
	    case RTT_K_FAST_13:
	    case RTT_K_FAST_14:
	    case RTT_K_FAST_15:
	      rtt_fastkey = terminator - RTT_K_FAST;
	      sts = rtt_get_fastkey_type();
	      if ( sts == RTT__NOPICTURE)
	      {
	        sts = rtt_get_fastkey_picture( (menu_ctx) ctx);
	        if ( EVEN(sts)) return sts;
	        break;
	      }
	    case RTT_K_CTRLZ:
	      if ( type == RTT_VIEWTYPE_FILE)
	        fclose( ctx->infile);
	      free( ctx->buff);
	      free( ctx->buffrow);
	      free( ctx);
	      rtt_ctx_pop();
	      return RTT__FASTBACK;
	    case RTT_K_CTRLW:
	      redraw = 1;
	      break;
	    case RTT_K_CTRLK:
	      /* Acknowledge last alarm */
	      sts = rtt_alarm_ack_last();
	      break;
	    case RTT_K_CTRLL:
	      /* Change description mode */
	      if ( !rtt_description_on)
	        sts = rtt_cli( rtt_command_table, "SET DESCRIPTION", (void *) ctx, 0);
	      else
	        sts = rtt_cli( rtt_command_table, "SET NODESCRIPTION", (void *) ctx, 0);
	      break;
	    case RTT_K_CTRLV:
	      break;
	    case RTT_K_CTRLN:
	      break;
	    case RTT_K_DELETE:
	      break;
	    case RTT_K_COMMAND:
	      sts = rtt_get_command( (menu_ctx) ctx, (char *) &rtt_chn, 
		rtt_recallbuff,  
		0, 0, ctx, 
	    	"pwr_rtt> ", 0, RTT_ROW_COMMAND, rtt_command_table);
	      /* menu_ptr might have been changed */
	      if ( EVEN(sts)) return sts;
	      if ( sts == RTT__FASTBACK)
	      {
	        if ( type == RTT_VIEWTYPE_FILE)
	          fclose( ctx->infile);
	        free( ctx->buff);
	        free( ctx->buffrow);
	        free( ctx);
	        rtt_ctx_pop();
	        return RTT__FASTBACK;
	      }
	      if ( sts == RTT__BACK)
	      {
	        if ( type == RTT_VIEWTYPE_FILE)
	          fclose( ctx->infile);
	        free( ctx->buff);
	        free( ctx->buffrow);
	        free( ctx);
	        rtt_ctx_pop();
	        return RTT__SUCCESS;
	      }
	      if ( sts == RTT__BACKTOCOLLECT)
	      {
	        if ( type == RTT_VIEWTYPE_FILE)
	          fclose( ctx->infile);
	        free( ctx->buff);
	        free( ctx->buffrow);
	        free( ctx);
	        rtt_ctx_pop();
	        return RTT__BACKTOCOLLECT;
	      }
	      if ( sts != RTT__NOPICTURE)
	      {
	        redraw = 1;
	      } 
	      break;
	    case RTT_K_HELP:
	      /* Try to find subject in application help */
	      sts = rtt_help( parent_ctx, "VIEW WINDOW", rtt_appl_helptext);
	      if ( sts == RTT__NOHELPSUBJ)
	          rtt_help( parent_ctx, "OBJECT MENU", 
			(rtt_t_helptext *) rtt_command_helptext);
	      redraw = 1;
	      break;
	  } 
	}

	return RTT__SUCCESS;
}