% fox-listings.sty — Listings language definition for COSYScript (COSY INFINITY)
%
% Copyright (c) 2026 Eremey Valetov
%
% This work may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, version 1.3c or later.
% The latest version is at https://www.latex-project.org/lppl/
% This work has the LPPL maintenance status "maintained".
% The Current Maintainer is Eremey Valetov.
%
% Usage:
%   \usepackage{fox-listings}
%   \begin{lstlisting}[language=FOX]
%     VARIABLE X 1 ;
%     X := SIN(0.5) ;
%     WRITE 6 X ;
%   \end{lstlisting}
%
% Or inline: \lstinline[language=FOX]{VARIABLE X 1 ;}
%
% Styles: FOXcolor (screen), FOXmono (print)
%   \lstset{style=FOXcolor}

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{fox-listings}[2026/03/21 v1.4 Listings language definition for COSYScript (COSY INFINITY)]

\RequirePackage{listings}
\RequirePackage{xcolor}

% ── Language Definition ──────────────────────────────────────────────────────

\lstdefinelanguage{FOX}{
  % Case insensitive
  sensitive=false,
  % Comments: nested { ... }
  morecomment=[n]{\{}{\}},
  % Strings: single-quoted with '' escape
  morestring=[b]',
  % Keywords: control flow and declarations
  morekeywords=[1]{
    BEGIN, END, VARIABLE, FUNCTION, ENDFUNCTION, PROCEDURE, ENDPROCEDURE,
    IF, ELSEIF, ENDIF, WHILE, ENDWHILE, LOOP, ENDLOOP,
    FIT, ENDFIT, PURE, ENDPURE, PLOOP, ENDPLOOP,
    INCLUDE, SAVE, QUIT, DEBUG, WRITE, READ,
    OPENF, OPENFB, CLOSEF, REWF, BACKF,
    GUIIO, GUISET
  },
  % Intrinsic functions (compiler + cosy.fox FUNCTIONs)
  morekeywords=[2]{
    ABS, INT, NINT, SQRT, ISRT, ISRT3, SQR, SIN, COS, TAN,
    ASIN, ACOS, ATAN, ATAN2, VATAN2, SINH, COSH, TANH,
    LOG, EXP, MOD, ERF, WERF, NOT, TRIM, LTRIM,
    RE, ST, LO, CM, VE, DA, CD,
    CONS, REAL, IMAG, CMPLX, CONJ, NORM,
    TYPE, LENGTH, VARMEM, VARPOI, GRIU,
    VMIN, VMAX, SIG, IM, COEF,
    LRE, LST, LLO, LCM, LVE, LDA, LCD, LGR,
    MAX, MIN, SS, R, S, SF, SI, WABS, ILAST, IPOS,
    FACT, ENGE, POLY, GAUSS, GAUSS1,
    BETHEBLOCH, HAMILTONIAN, FOURIERGAUSS,
    PARA, LEXP, MEP, VELC
  },
  % Intrinsic procedures
  morekeywords=[3]{
    MEMALL, MEMFRE, MEMDPV, MEMWRT, SCRLEN,
    CPUSEC, PWTIME, PNPRO, PROOT, SLEEP, MOS,
    ARGGET, READS, READB, WRITEB, READM, WRITEM,
    DAINI, DANOT, DANOTW, DAEPS, MEPSMIN,
    DAFSET, DAFILT, DAPEW, DAREA, DAPRV, DAREV,
    DAFLO, CDFLO, DAGMD, RERAN, DARAN,
    DADIU, DADMU, DADER, DAINT, DAPLU, DASCL,
    DATRN, DASGN, DAPEE, DAPEA, DACODE, DANORO,
    DANORS, DACLIW, DACQLC, DAPEP, DANOW, DAEST,
    MTREE, CDF2, CDNF, CDNFDA, CDNFDS,
    LINV, LDET, LEV, MBLOCK, LSLINE, SUBST,
    RSTCRE, RECST, VELSET, VELGET, VEDOT, VEUNIT, VEZERO,
    IMUNIT, LTRUE, LFALSE, INTPOL, CLEAR, CONTINUE,
    SVSCR, TRCAP, WORDS, FIELDS, MI, FOURIERTRANS,
    POLVAL, POLSET, RKCO,
    CONFIG_SET, CONFIG_SET_ECHO, CONFIG_Q, IN_CONFIG, CONFIG
  },
  % Beam physics procedures
  morekeywords=[4]{
    OV, DEF, CO, RP, RPP, RPE, RPR, RPM, RPS, RPMU, RPPI,
    UM, SM, SNM, AM, ANM, PM, PSM, WM, RM, MR,
    FM, NF, BM, DANF, SYMP, UMS,
    GFM, MGF, MLF, LFM, CATR, TRCA, COCR, CRCO,
    PNM, RNM, WNM, SSM, SSNM, RS, RSM,
    MT, PA, PT, SB, SP, SBE, DL, DC,
    RK, RK4, ODE,
    MQ, MH, MO, MD, MZ, M5, MM, MMS,
    MQK, MDK, MOK, MZK, MSK, MMK, MMSK,
    BEND, EBEND,
    EQ, EH, EO, ED, EZ, E5, EM, EMS, MS, ES, EL,
    EC, ECL, ESP, DI, DP, MC,
    WF, WC, WI, RF, CMR, CML, CMS, CMSI, CMST, CMG,
    CMSP, CMSTP,
    CEL, CEA, CEG, GLS, GL, GP, GMS, GMP, GMF, GM,
    GLASS, MFFLD, MFFLDIN, MGE, MPL, MSL, MSS, MSEM, FFELE,
    FR, FC, FC2, FD, FD2, FP, FG,
    PS, PG, PGE, BP, EP, PTY,
    CR, SR, SSR, ER, SCDE,
    ADDRAYS, ADDSPIS, STW,
    ENVEL, ENCL, TR, TRT, TRR, TRAP, AP,
    PRAY, WRAY, RRAY, SRAY, LRAY, ARAY,
    PSPI, WSPI, RSPI, SSPI, LSPI, ASPI,
    DMAP, DRAY, DSPI, PR, PLOT2D,
    RA, SA, TA,
    TS, TSC, RFILT, GT, MCM, ECM, AR, RR,
    WA, WAS, WL, TSP, TSS
  },
  % Graphics procedures
  morekeywords=[5]{
    GRMOVE, GRDRAW, GRDOT, GRTRI, GRPOLY, GRCURV,
    GRCHAR, GRCOLR, GRWDTH, GRPROJ, GRZOOM, GRMIMA,
    GREPS, GRSTYL, GROUTF, PP
  },
  % Constants and global variables
  morekeywords=[6]{
    AMU, AMUMEV, EZERO, CLIGHT, PI,
    MAP, MSC, RAY, SPOS, E0, M0, Z0, V0, P0,
    CHIM, CHIE, ETA, DEGRAD,
    NO, NV, ND, NP, TWOND, NOC,
    NRAY, NSPN, DD, SPI, SPNR,
    TRUE, FALSE, EPS, DEPS,
    PARS, TRA, ETRA, ERAY,
    SIGMA, ME, MA, SE, OE, PB, DER, INTEG, NMON, CE, NM1
  },
  % Assignment operator
  literate={:=}{{{\bfseries :=}}}2,
}

% ── Color Scheme (WCAG AA on white) ─────────────────────────────────────────

\definecolor{foxcomment}{RGB}{0,128,0}
\definecolor{foxstring}{RGB}{163,21,21}
\definecolor{foxkeyword}{RGB}{0,0,175}
\definecolor{foxfunction}{RGB}{121,94,38}
\definecolor{foxprocedure}{RGB}{38,127,153}
\definecolor{foxbeam}{RGB}{139,69,19}
\definecolor{foxgraphics}{RGB}{136,0,136}
\definecolor{foxconstant}{RGB}{111,67,144}
\definecolor{foxnumber}{RGB}{100,100,100}

\lstdefinestyle{FOXcolor}{
  language=FOX,
  basicstyle=\ttfamily\small,
  commentstyle=\color{foxcomment}\itshape,
  stringstyle=\color{foxstring},
  keywordstyle=[1]\color{foxkeyword}\bfseries,
  keywordstyle=[2]\color{foxfunction},
  keywordstyle=[3]\color{foxprocedure},
  keywordstyle=[4]\color{foxbeam},
  keywordstyle=[5]\color{foxgraphics},
  keywordstyle=[6]\color{foxconstant},
  numberstyle=\color{foxnumber}\small,
  showstringspaces=false,
  breaklines=true,
  frame=single,
  framerule=0.5pt,
  tabsize=3,
}

% ── Monochrome Style (for print) ────────────────────────────────────────────

\lstdefinestyle{FOXmono}{
  language=FOX,
  basicstyle=\ttfamily\small,
  commentstyle=\itshape,
  keywordstyle=[1]\bfseries,
  keywordstyle=[2]\bfseries,
  keywordstyle=[3]{},
  keywordstyle=[4]{},
  keywordstyle=[5]{},
  keywordstyle=[6]\bfseries,
  showstringspaces=false,
  breaklines=true,
  frame=single,
  framerule=0.5pt,
  tabsize=3,
}

\endinput
