symbols.c

来自「CNC 的开放码,EMC2 V2.2.8版」· C语言 代码 · 共 247 行

C
247
字号
/* Classic Ladder Project *//* Copyright (C) 2001-2006 Marc Le Douarain *//* http://www.multimania.com/mavati/classicladder *//* http://www.sourceforge.net/projects/classicladder *//* October 2006 *//* ------- *//* Symbols *//* ------- *//* Utilities functions to convert between variables names (starting with % character) *//* and symbols names *//* A symbol name can be set for a complete variable (ex %B45) or for a partial variable *//* (ex: "zzz"=%T5 -> partial variable name before "." character : after this symbols will *//* be available zzz.D zzz.V zzz.P etc...) *//* ------- *//* This library is free software; you can redistribute it and/or *//* modify it under the terms of the GNU Lesser General Public *//* License as published by the Free Software Foundation; either *//* version 2.1 of the License, or (at your option) any later version. *//* This library 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 *//* Lesser General Public License for more details. *//* You should have received a copy of the GNU Lesser General Public *//* License along with this library; if not, write to the Free Software *//* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#ifndef MODULE#include <stdio.h>#include <string.h>#endif#include "classicladder.h"#include "global.h"#include "symbols.h"#include "hal/hal_priv.h"void InitSymbols( void ){	int ScanSymb;	for ( ScanSymb=0; ScanSymb<NBR_SYMBOLS; ScanSymb++ )	{		SymbolArray[ ScanSymb ].VarName[ 0 ] = '\0';		SymbolArray[ ScanSymb ].Symbol[ 0 ] = '\0';		SymbolArray[ ScanSymb ].Comment[ 0 ] = '\0';	}}// search symbol (partial or complete) for the var name parameterStrSymbol * ConvVarNameInSymbolPtr( char * tcVarNameVar ){	StrSymbol * pFoundSymbol = NULL;	if ( tcVarNameVar[0]=='%' )	{		int ScanSymbol = 0;		StrSymbol *pCurrentSymbol;		char bFound = FALSE;		char tcVarNamePartial[ LGT_VAR_NAME ];		// creating partial var name (before '.' attribute)		char * pVarNameSrc = tcVarNameVar;		char * pVarNameDest = tcVarNamePartial;		do		{			*pVarNameDest++ = *pVarNameSrc++;		}		while( *pVarNameSrc!=VAR_ATTRIBUTE_SEP && *pVarNameSrc!='\0' );		*pVarNameDest = '\0';		// searching complete or partial in symbols list		do		{			pCurrentSymbol = &SymbolArray[ ScanSymbol ];			// verify strings for complete & partial			if ( strcmp( tcVarNameVar, pCurrentSymbol->VarName )==0				|| strcmp(tcVarNamePartial, pCurrentSymbol->VarName )==0 )			{				bFound = TRUE;				pFoundSymbol = pCurrentSymbol;			}			ScanSymbol++;		}		while( !bFound && ScanSymbol<NBR_SYMBOLS );	}	return pFoundSymbol;}// search symbol (partial or complete) for the symbol parameter (partial or complete)StrSymbol * ConvSymbolParamInSymbolPtr( char * tcMnemoSaisi )//, char bPartiel ){	StrSymbol * pFoundSymbol = NULL;	int ScanSymbol = 0;	StrSymbol *pCurrentSymbol;	char bFound = FALSE;	char tcPartialSymbolString[ LGT_SYMBOL_STRING ];	// creating partial var name (before '.' attribute)	char * pVarNameSrc = tcMnemoSaisi;	char * pVarNameDest = tcPartialSymbolString;	do	{		*pVarNameDest++ = *pVarNameSrc++;	}	while( *pVarNameSrc!=VAR_ATTRIBUTE_SEP && *pVarNameSrc!='\0' );	*pVarNameDest = '\0';	// searching complete or partial in symbols list	do	{		pCurrentSymbol = &SymbolArray[ ScanSymbol ];		// not an empty symbol ?		if ( pCurrentSymbol->Symbol[ 0 ]!='\0' )		{			// verify strings for complete & partial			if ( strcmp( tcMnemoSaisi, pCurrentSymbol->Symbol )==0				|| strcmp(tcPartialSymbolString, pCurrentSymbol->Symbol )==0 )			{				bFound = TRUE;				pFoundSymbol = pCurrentSymbol;			}		}		ScanSymbol++;	}	while( !bFound && ScanSymbol<NBR_SYMBOLS );	return pFoundSymbol;}char tcBufferResult[ 100 ];// return a symbol (completed with attribute if it is a partial symbol)// for the var name parameter.char * ConvVarNameToSymbol( char * VarNameParam ){	StrSymbol * pSymbol = ConvVarNameInSymbolPtr( VarNameParam );        if( VarNameParam[0] == '%') {            char pin_name[100] = {0};            int arrowside=0;            int idx;            switch(VarNameParam[1]) {            case 'I':                sscanf(VarNameParam+2, "%d", &idx);                snprintf(pin_name, 100, "classicladder.0.in-%02d", idx);                arrowside = 1;                break;            case 'Q':                sscanf(VarNameParam+2, "%d", &idx);                snprintf(pin_name, 100, "classicladder.0.out-%02d", idx);                arrowside = 0;                break;            case 'W':                sscanf(VarNameParam+2, "%d", &idx);                if(idx > InfosGene->SizesInfos.nbr_s32in) {                    snprintf(pin_name, 100, "classicladder.0.s32out-%02d",                            idx - InfosGene->SizesInfos.nbr_s32in);                    arrowside = 0;                } else {                    snprintf(pin_name, 100, "classicladder.0.s32in-%02d", idx);                    arrowside = 1;                }                break;            }            if(*pin_name) {                hal_pin_t *pin = halpr_find_pin_by_name(pin_name);                if(pin && pin->signal) {                    hal_sig_t *sig = SHMPTR(pin->signal);                    if(sig->name) {                        static char sig_name[100];                        // char *arrow = "\xe2\x86\x90";                        char *arrow = "\xe2\x87\x92";                        if(arrowside == 0) {                            snprintf(sig_name, 100, "%s%s", sig->name, arrow);                        } else {                            snprintf(sig_name, 100, "%s%s", arrow, sig->name);                        }                        return sig_name;                    }                }            }        }	if ( pSymbol )	{		// if partial symbol, add the attribute taken from the var name		if ( strcmp( VarNameParam, pSymbol->VarName )!=0 )		{			char * pAttrStart = VarNameParam;			// copy partial symbol			strcpy( tcBufferResult, pSymbol->Symbol );			// search the '.' separator			do			{				pAttrStart++;			}			while( *pAttrStart!=VAR_ATTRIBUTE_SEP && *pAttrStart!='\0' );			// add the attribute to the symbol			if ( *pAttrStart==VAR_ATTRIBUTE_SEP )				strcpy( &tcBufferResult[ strlen( pSymbol->Symbol ) ], pAttrStart );		}		else		{			// simple copy (a symbol = a var name directly)			strcpy( tcBufferResult, pSymbol->Symbol );		}		return tcBufferResult;	}	else	{		return NULL;	}}// return a var name for the symbol parameter (partial or complete symbol)char * ConvSymbolToVarName( char * SymbolParam ){	StrSymbol * pSymbol = ConvSymbolParamInSymbolPtr( SymbolParam );	if ( pSymbol )	{		// if partial symbol, add the attribute following the Symbol parameter		if ( strcmp( SymbolParam, pSymbol->Symbol )!=0 )		{			char * pAttrStart = SymbolParam;			// copy partial symbol			strcpy( tcBufferResult, pSymbol->VarName );			// search the '.' separator			do			{				pAttrStart++;			}			while( *pAttrStart!=VAR_ATTRIBUTE_SEP && *pAttrStart!='\0' );			// add the attribute to the var name			if ( *pAttrStart==VAR_ATTRIBUTE_SEP )				strcpy( &tcBufferResult[ strlen( pSymbol->VarName ) ], pAttrStart );		}		else		{			// simple copy (a symbol = a var name directly)			strcpy( tcBufferResult, pSymbol->VarName );		}		return tcBufferResult;	}	else	{		return NULL;	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?