/usr/include/flext/flatom_pr.cpp is in pd-flext-dev 0.6.0+git20161101.1.01318a94-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | /*
flext - C++ layer for Max and Pure Data externals
Copyright (c) 2001-2015 Thomas Grill (gr@grrrr.org)
For information on usage and redistribution, and for a DISCLAIMER OF ALL
WARRANTIES, see the file, "license.txt," in this distribution.
*/
/*! \file flatom_pr.cpp
\brief Definitions for printing and scanning the t_atom type.
*/
#ifndef __FLEXT_ATOM_PR_CPP
#define __FLEXT_ATOM_PR_CPP
#include "flext.h"
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include "flpushns.h"
#ifdef _MSC_VER
#define snprintf _snprintf
#endif
FLEXT_TEMPIMPL(bool FLEXT_CLASSDEF(flext))::PrintAtom(const t_atom &a,char *buf,size_t bufsz)
{
bool ok = true;
if(IsFloat(a)) {
ok = STD::snprintf(buf,bufsz,"%g",GetFloat(a)) > 0;
}
else if(IsInt(a)) {
ok = STD::snprintf(buf,bufsz,"%i",GetInt(a)) > 0;
}
else if(IsSymbol(a)) {
const char *c = GetString(a);
size_t len = strlen(c);
if(len < bufsz) {
memcpy(buf,c,len); buf[len] = 0;
ok = true;
}
else
ok = false;
}
#if FLEXT_SYS == FLEXT_SYS_PD
#ifndef FLEXT_COMPATIBLE
else if(IsPointer(a)) {
ok = STD::snprintf(buf,bufsz,"%p",GetPointer(a)) > 0;
}
#endif
else if(a.a_type == A_DOLLAR) {
ok = STD::snprintf(buf,bufsz,"$%d",a.a_w.w_index) > 0;
}
else if(a.a_type == A_DOLLSYM) {
ok = STD::snprintf(buf,bufsz,"$%s",GetString(a)) > 0;
}
#elif FLEXT_SYS == FLEXT_SYS_MAX
else if(a.a_type == A_DOLLAR) {
ok = STD::snprintf(buf,bufsz,"$%ld",a.a_w.w_long) > 0;
}
#else
//#pragma message("Not implemented")
#endif
else {
error("flext: atom type unknown");
ok = false;
}
return ok;
}
FLEXT_TEMPIMPL(bool FLEXT_CLASSDEF(flext))::PrintList(int argc,const t_atom *argv,char *buf,size_t bufsz)
{
bool ok = true;
for(int i = 0; ok && i < argc && bufsz > 0; ++i) {
if(i) { *(buf++) = ' '; --bufsz; } // prepend space
if(PrintAtom(argv[i],buf,bufsz)) {
size_t len = strlen(buf);
buf += len,bufsz -= len;
}
else
ok = false;
}
*buf = 0;
return ok;
}
FLEXT_TEMPIMPL(const char *FLEXT_CLASSDEF(flext))::ScanAtom(t_atom &a,const char *c)
{
// skip leading whitespace
while(*c && isspace(*c)) ++c;
if(!*c) return NULL;
// go to next space and save character
char *end = const_cast<char *>(c);
while(*end && !isspace(*end)) ++end;
char sv = *end;
float fres;
// first try float
char *endp;
// see if it's a float - thanks to Frank Barknecht
fres = (float)strtod(c,&endp);
if(*c && endp != c) {
int ires = (int)fres; // try a cast
if(fres == ires)
SetInt(a,ires);
else
SetFloat(a,fres);
}
// no, it's a symbol
else
SetString(a,c);
*end = sv;
return end;
}
FLEXT_TEMPIMPL(int FLEXT_CLASSDEF(flext))::ScanList(int argc,t_atom *argv,const char *buf)
{
int read;
for(read = 0; read < argc; ++read)
{
buf = ScanAtom(argv[read],buf);
if(!buf) break;
}
return read;
}
#include "flpopns.h"
#endif // __FLEXT_ATOM_PR_CPP
|