halsh.c
来自「CNC 的开放码,EMC2 V2.2.8版」· C语言 代码 · 共 186 行
C
186 行
#include <string.h>#include <stdlib.h>#include <stdio.h>#include <tcl.h>#include "halcmd.h"Tcl_Interp *target_interp = NULL;static int pending_cr = 0;static void halError(Tcl_Interp *interp, int result) { switch(result) { case HAL_SUCCESS: Tcl_SetResult(interp, "Call Successful", TCL_STATIC); break; case HAL_UNSUP: Tcl_SetResult(interp, "Function not supported", TCL_STATIC); break; case HAL_BADVAR: Tcl_SetResult(interp, "Duplicate or not-found variable name", TCL_STATIC); break; case HAL_INVAL: Tcl_SetResult(interp, "Invalid argument", TCL_STATIC); break; case HAL_NOMEM: Tcl_SetResult(interp, "Not enough memory", TCL_STATIC); break; case HAL_LIMIT: Tcl_SetResult(interp, "Resource limit reached", TCL_STATIC); break; case HAL_PERM: Tcl_SetResult(interp, "Permission Denied", TCL_STATIC); break; case HAL_BUSY: Tcl_SetResult(interp, "Resources is busy or locked", TCL_STATIC); break; case HAL_NOTFND: Tcl_SetResult(interp, "Object not found", TCL_STATIC); break; case HAL_FAIL: Tcl_SetResult(interp, "Operation failed", TCL_STATIC); break; default: { char buf[80]; snprintf(buf, 80, "Unknown HAL error code %d", result); Tcl_SetResult(interp, buf, TCL_VOLATILE); break; } }}static int refcount = 0;static void shutdown(void) { if(refcount > 0) { refcount --; if(refcount == 0) halcmd_shutdown(); }}static int init() { int result = HAL_SUCCESS; if(refcount == 0) { result = halcmd_startup(); atexit(shutdown); } if(result == HAL_SUCCESS) { refcount ++; } return result;}static void halExit(ClientData d) { shutdown();}static int halCmd(ClientData cd, Tcl_Interp *interp, int argc, const char **argv) { int result; Tcl_ResetResult(interp); if(argc < 2) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " command ...\"", NULL); return TCL_ERROR; } target_interp = interp; pending_cr = 0; result = halcmd_parse_cmd((char **)argv+1); target_interp = NULL; if(result == HAL_SUCCESS) return TCL_OK; halError(interp, result); return TCL_ERROR;}int Hal_Init(Tcl_Interp *interp) { int result = init(); if(result != HAL_SUCCESS) { Tcl_ResetResult(interp); halError(interp, result); return TCL_ERROR; } Tcl_CreateCommand(interp, "hal", halCmd, 0, halExit); return TCL_OK;}#ifndef BUFFERLEN#define BUFFERLEN 1024#endifvoid halcmd_output(const char *format, ...) { char buf[BUFFERLEN + 1]; va_list ap; int len; va_start(ap, format); vsnprintf(buf, BUFFERLEN, format, ap); va_end(ap); if(pending_cr) Tcl_AppendResult(target_interp, "\n", NULL); len = strlen(buf); if(buf[len-1] == '\n') { buf[len-1] = 0; pending_cr = 1; } else { pending_cr = 0; } Tcl_AppendResult(target_interp, buf, NULL);}void halcmd_error(const char *format, ...) { char buf[BUFFERLEN + 1]; va_list ap; int len; va_start(ap, format); vsnprintf(buf, BUFFERLEN, format, ap); va_end(ap); if(pending_cr) Tcl_AppendResult(target_interp, "\n", NULL); len = strlen(buf); if(buf[len-1] == '\n') { buf[len-1] = 0; pending_cr = 1; } else { pending_cr = 0; } Tcl_AppendResult(target_interp, buf, NULL);}void halcmd_warning(const char *format, ...) { char buf[BUFFERLEN + 1]; va_list ap; int len; va_start(ap, format); vsnprintf(buf, BUFFERLEN, format, ap); va_end(ap); if(pending_cr) Tcl_AppendResult(target_interp, "\n", NULL); len = strlen(buf); if(buf[len-1] == '\n') { buf[len-1] = 0; pending_cr = 1; } else { pending_cr = 0; } Tcl_AppendResult(target_interp, buf, NULL);}void halcmd_info(const char *format, ...) { char buf[BUFFERLEN + 1]; va_list ap; int len; va_start(ap, format); vsnprintf(buf, BUFFERLEN, format, ap); va_end(ap); if(pending_cr) Tcl_AppendResult(target_interp, "\n", NULL); len = strlen(buf); if(buf[len-1] == '\n') { buf[len-1] = 0; pending_cr = 1; } else { pending_cr = 0; } Tcl_AppendResult(target_interp, buf, NULL);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?