cc.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. #include <u.h>
  10. #include <libc.h>
  11. #include <bio.h>
  12. #include <ctype.h>
  13. #pragma lib "../cc/cc.a$O"
  14. #ifndef EXTERN
  15. #define EXTERN extern
  16. #endif
  17. typedef struct Node Node;
  18. typedef struct Sym Sym;
  19. typedef struct Type Type;
  20. typedef struct Funct Funct;
  21. typedef struct Decl Decl;
  22. typedef struct Io Io;
  23. typedef struct Hist Hist;
  24. typedef struct Term Term;
  25. typedef struct Init Init;
  26. typedef struct Bits Bits;
  27. typedef Rune TRune; /* target system type */
  28. #define NHUNK 50000L
  29. #define BUFSIZ 8192
  30. #define NSYMB 1500
  31. #define NHASH 1024
  32. #define STRINGSZ 200
  33. #define HISTSZ 20
  34. #define YYMAXDEPTH 1500
  35. #define NTERM 10
  36. #define MAXALIGN 7
  37. #define SIGN(n) (1ULL<<(n-1))
  38. #define MASK(n) (SIGN(n)|(SIGN(n)-1))
  39. #define BITS 5
  40. #define NVAR (BITS*sizeof(uint32_t)*8)
  41. struct Bits
  42. {
  43. uint32_t b[BITS];
  44. };
  45. struct Node
  46. {
  47. Node* left;
  48. Node* right;
  49. void* label;
  50. long pc;
  51. int reg;
  52. long xoffset;
  53. double fconst; /* fp constant */
  54. vlong vconst; /* non fp const */
  55. char* cstring; /* character string */
  56. TRune* rstring; /* rune string */
  57. Sym* sym;
  58. Type* type;
  59. long lineno;
  60. char op;
  61. char oldop;
  62. char xcast;
  63. char class;
  64. char etype;
  65. char complex;
  66. char addable;
  67. char scale;
  68. char garb;
  69. };
  70. #define Z ((Node*)0)
  71. struct Sym
  72. {
  73. Sym* link;
  74. Type* type;
  75. Type* suetag;
  76. Type* tenum;
  77. char* macro;
  78. long varlineno;
  79. long offset;
  80. vlong vconst;
  81. double fconst;
  82. Node* label;
  83. ushort lexical;
  84. char *name;
  85. ushort block;
  86. ushort sueblock;
  87. char class;
  88. char sym;
  89. char aused;
  90. char sig;
  91. };
  92. #define S ((Sym*)0)
  93. enum{
  94. SIGNONE = 0,
  95. SIGDONE = 1,
  96. SIGINTERN = 2,
  97. SIGNINTERN = 1729*325*1729,
  98. };
  99. struct Decl
  100. {
  101. Decl* link;
  102. Sym* sym;
  103. Type* type;
  104. long varlineno;
  105. long offset;
  106. short val;
  107. ushort block;
  108. char class;
  109. char aused;
  110. };
  111. #define D ((Decl*)0)
  112. struct Type
  113. {
  114. Sym* sym;
  115. Sym* tag;
  116. Funct* funct;
  117. Type* link;
  118. Type* down;
  119. long width;
  120. long offset;
  121. long lineno;
  122. schar shift;
  123. char nbits;
  124. char etype;
  125. char garb;
  126. };
  127. #define T ((Type*)0)
  128. #define NODECL ((void(*)(int, Type*, Sym*))0)
  129. struct Init /* general purpose initialization */
  130. {
  131. int code;
  132. uint32_t value;
  133. char* s;
  134. };
  135. EXTERN struct
  136. {
  137. char* p;
  138. int c;
  139. } fi;
  140. struct Io
  141. {
  142. Io* link;
  143. char* p;
  144. char b[BUFSIZ];
  145. short c;
  146. short f;
  147. };
  148. #define I ((Io*)0)
  149. struct Hist
  150. {
  151. Hist* link;
  152. char* name;
  153. long line;
  154. long offset;
  155. };
  156. #define H ((Hist*)0)
  157. EXTERN Hist* hist;
  158. struct Term
  159. {
  160. vlong mult;
  161. Node *node;
  162. };
  163. enum
  164. {
  165. Axxx,
  166. Ael1,
  167. Ael2,
  168. Asu2,
  169. Aarg0,
  170. Aarg1,
  171. Aarg2,
  172. Aaut3,
  173. NALIGN,
  174. };
  175. enum /* also in ../{8a,0a}.h */
  176. {
  177. Plan9 = 1<<0,
  178. Unix = 1<<1,
  179. Windows = 1<<2,
  180. };
  181. enum
  182. {
  183. DMARK,
  184. DAUTO,
  185. DSUE,
  186. DLABEL,
  187. };
  188. enum
  189. {
  190. OXXX,
  191. OADD,
  192. OADDR,
  193. OAND,
  194. OANDAND,
  195. OARRAY,
  196. OAS,
  197. OASI,
  198. OASADD,
  199. OASAND,
  200. OASASHL,
  201. OASASHR,
  202. OASDIV,
  203. OASHL,
  204. OASHR,
  205. OASLDIV,
  206. OASLMOD,
  207. OASLMUL,
  208. OASLSHR,
  209. OASMOD,
  210. OASMUL,
  211. OASOR,
  212. OASSUB,
  213. OASXOR,
  214. OBIT,
  215. OBREAK,
  216. OCASE,
  217. OCAST,
  218. OCOMMA,
  219. OCOND,
  220. OCONST,
  221. OCONTINUE,
  222. ODIV,
  223. ODOT,
  224. ODOTDOT,
  225. ODWHILE,
  226. OENUM,
  227. OEQ,
  228. OFOR,
  229. OFUNC,
  230. OGE,
  231. OGOTO,
  232. OGT,
  233. OHI,
  234. OHS,
  235. OIF,
  236. OIND,
  237. OINDREG,
  238. OINIT,
  239. OLABEL,
  240. OLDIV,
  241. OLE,
  242. OLIST,
  243. OLMOD,
  244. OLMUL,
  245. OLO,
  246. OLS,
  247. OLSHR,
  248. OLT,
  249. OMOD,
  250. OMUL,
  251. ONAME,
  252. ONE,
  253. ONOT,
  254. OOR,
  255. OOROR,
  256. OPOSTDEC,
  257. OPOSTINC,
  258. OPREDEC,
  259. OPREINC,
  260. OPROTO,
  261. OREGISTER,
  262. ORETURN,
  263. OSET,
  264. OSIGN,
  265. OSIZE,
  266. OSTRING,
  267. OLSTRING,
  268. OSTRUCT,
  269. OSUB,
  270. OSWITCH,
  271. OUNION,
  272. OUSED,
  273. OWHILE,
  274. OXOR,
  275. ONEG,
  276. OCOM,
  277. OPOS,
  278. OELEM,
  279. OTST, /* used in some compilers */
  280. OINDEX,
  281. OFAS,
  282. OREGPAIR,
  283. OEXREG,
  284. OEND
  285. };
  286. enum
  287. {
  288. TXXX,
  289. TCHAR,
  290. TUCHAR,
  291. TSHORT,
  292. TUSHORT,
  293. TINT,
  294. TUINT,
  295. TLONG,
  296. TULONG,
  297. TVLONG,
  298. TUVLONG,
  299. TFLOAT,
  300. TDOUBLE,
  301. TIND,
  302. TFUNC,
  303. TARRAY,
  304. TVOID,
  305. TSTRUCT,
  306. TUNION,
  307. TENUM,
  308. TDOT,
  309. NTYPE,
  310. TAUTO = NTYPE,
  311. TEXTERN,
  312. TSTATIC,
  313. TTYPEDEF,
  314. TTYPESTR,
  315. TREGISTER,
  316. TCONSTNT,
  317. TVOLATILE,
  318. TUNSIGNED,
  319. TSIGNED,
  320. TFILE,
  321. TOLD,
  322. NALLTYPES,
  323. /* adapt size of Rune to target system's size */
  324. TRUNE = sizeof(TRune)==4? TUINT: TUSHORT,
  325. };
  326. enum
  327. {
  328. CXXX,
  329. CAUTO,
  330. CEXTERN,
  331. CGLOBL,
  332. CSTATIC,
  333. CLOCAL,
  334. CTYPEDEF,
  335. CTYPESTR,
  336. CPARAM,
  337. CSELEM,
  338. CLABEL,
  339. CEXREG,
  340. NCTYPES,
  341. };
  342. enum
  343. {
  344. GXXX = 0,
  345. GCONSTNT = 1<<0,
  346. GVOLATILE = 1<<1,
  347. NGTYPES = 1<<2,
  348. GINCOMPLETE = 1<<2,
  349. };
  350. enum
  351. {
  352. BCHAR = 1L<<TCHAR,
  353. BUCHAR = 1L<<TUCHAR,
  354. BSHORT = 1L<<TSHORT,
  355. BUSHORT = 1L<<TUSHORT,
  356. BINT = 1L<<TINT,
  357. BUINT = 1L<<TUINT,
  358. BLONG = 1L<<TLONG,
  359. BULONG = 1L<<TULONG,
  360. BVLONG = 1L<<TVLONG,
  361. BUVLONG = 1L<<TUVLONG,
  362. BFLOAT = 1L<<TFLOAT,
  363. BDOUBLE = 1L<<TDOUBLE,
  364. BIND = 1L<<TIND,
  365. BFUNC = 1L<<TFUNC,
  366. BARRAY = 1L<<TARRAY,
  367. BVOID = 1L<<TVOID,
  368. BSTRUCT = 1L<<TSTRUCT,
  369. BUNION = 1L<<TUNION,
  370. BENUM = 1L<<TENUM,
  371. BFILE = 1L<<TFILE,
  372. BDOT = 1L<<TDOT,
  373. BCONSTNT = 1L<<TCONSTNT,
  374. BVOLATILE = 1L<<TVOLATILE,
  375. BUNSIGNED = 1L<<TUNSIGNED,
  376. BSIGNED = 1L<<TSIGNED,
  377. BAUTO = 1L<<TAUTO,
  378. BEXTERN = 1L<<TEXTERN,
  379. BSTATIC = 1L<<TSTATIC,
  380. BTYPEDEF = 1L<<TTYPEDEF,
  381. BTYPESTR = 1L<<TTYPESTR,
  382. BREGISTER = 1L<<TREGISTER,
  383. BINTEGER = BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT|
  384. BLONG|BULONG|BVLONG|BUVLONG,
  385. BNUMBER = BINTEGER|BFLOAT|BDOUBLE,
  386. /* these can be overloaded with complex types */
  387. BCLASS = BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER,
  388. BGARB = BCONSTNT|BVOLATILE,
  389. };
  390. struct Funct
  391. {
  392. Sym* sym[OEND];
  393. Sym* castto[NTYPE];
  394. Sym* castfr[NTYPE];
  395. };
  396. EXTERN struct
  397. {
  398. Type* tenum; /* type of entire enum */
  399. Type* cenum; /* type of current enum run */
  400. vlong lastenum; /* value of current enum */
  401. double floatenum; /* value of current enum */
  402. } en;
  403. EXTERN int autobn;
  404. EXTERN long autoffset;
  405. EXTERN int blockno;
  406. EXTERN Decl* dclstack;
  407. EXTERN char debug[256];
  408. EXTERN Hist* ehist;
  409. EXTERN long firstbit;
  410. EXTERN Sym* firstarg;
  411. EXTERN Type* firstargtype;
  412. EXTERN Decl* firstdcl;
  413. EXTERN int fperror;
  414. EXTERN Sym* hash[NHASH];
  415. EXTERN int hasdoubled;
  416. EXTERN char* hunk;
  417. EXTERN char** include;
  418. EXTERN Io* iofree;
  419. EXTERN Io* ionext;
  420. EXTERN Io* iostack;
  421. EXTERN long lastbit;
  422. EXTERN char lastclass;
  423. EXTERN Type* lastdcl;
  424. EXTERN long lastfield;
  425. EXTERN Type* lasttype;
  426. EXTERN long lineno;
  427. EXTERN long nearln;
  428. EXTERN int maxinclude;
  429. EXTERN int nerrors;
  430. EXTERN int newflag;
  431. EXTERN long nhunk;
  432. EXTERN int ninclude;
  433. EXTERN Node* nodproto;
  434. EXTERN Node* nodcast;
  435. EXTERN Biobuf outbuf;
  436. EXTERN Biobuf diagbuf;
  437. EXTERN char* outfile;
  438. EXTERN char* pathname;
  439. EXTERN int peekc;
  440. EXTERN long stkoff;
  441. EXTERN Type* strf;
  442. EXTERN Type* strl;
  443. EXTERN char symb[NSYMB];
  444. EXTERN Sym* symstring;
  445. EXTERN int taggen;
  446. EXTERN Type* tfield;
  447. EXTERN Type* tufield;
  448. EXTERN int thechar;
  449. EXTERN char* thestring;
  450. EXTERN Type* thisfn;
  451. EXTERN long thunk;
  452. EXTERN Type* types[NTYPE];
  453. EXTERN Type* fntypes[NTYPE];
  454. EXTERN Node* initlist;
  455. EXTERN Term term[NTERM];
  456. EXTERN int nterm;
  457. EXTERN int packflg;
  458. EXTERN int fproundflg;
  459. EXTERN int profileflg;
  460. EXTERN int ncontin;
  461. EXTERN int newvlongcode;
  462. EXTERN int canreach;
  463. EXTERN int warnreach;
  464. EXTERN Bits zbits;
  465. extern char *onames[], *tnames[], *gnames[];
  466. extern char *cnames[], *qnames[], *bnames[];
  467. extern char tab[NTYPE][NTYPE];
  468. extern char comrel[], invrel[], logrel[];
  469. extern long ncast[], tadd[], tand[];
  470. extern long targ[], tasadd[], tasign[], tcast[];
  471. extern long tdot[], tfunct[], tindir[], tmul[];
  472. extern long tnot[], trel[], tsub[];
  473. extern char typeaf[];
  474. extern char typefd[];
  475. extern char typei[];
  476. extern char typesu[];
  477. extern char typesuv[];
  478. extern char typeu[];
  479. extern char typev[];
  480. extern char typec[];
  481. extern char typeh[];
  482. extern char typeil[];
  483. extern char typeilp[];
  484. extern char typechl[];
  485. extern char typechlv[];
  486. extern char typechlvp[];
  487. extern char typechlp[];
  488. extern char typechlpfd[];
  489. EXTERN char* typeswitch;
  490. EXTERN char* typeword;
  491. EXTERN char* typecmplx;
  492. extern uint32_t thash1;
  493. extern uint32_t thash2;
  494. extern uint32_t thash3;
  495. extern uint32_t thash[];
  496. /*
  497. * compat.c/unix.c/windows.c
  498. */
  499. int mywait(int*);
  500. int mycreat(char*, int);
  501. int systemtype(int);
  502. int pathchar(void);
  503. int myaccess(char*);
  504. char* mygetwd(char*, int);
  505. int myexec(char*, char*[]);
  506. int mydup(int, int);
  507. int myfork(void);
  508. int mypipe(int*);
  509. void* mysbrk(uint32_t);
  510. /*
  511. * parser
  512. */
  513. int yyparse(void);
  514. int mpatov(char*, vlong*);
  515. /*
  516. * lex.c
  517. */
  518. void* allocn(void*, long, long);
  519. void* alloc(long);
  520. void cinit(void);
  521. int compile(char*, char**, int);
  522. void errorexit(void);
  523. int filbuf(void);
  524. int getc(void);
  525. long getr(void);
  526. int getnsc(void);
  527. Sym* lookup(void);
  528. void main(int, char*[]);
  529. void newfile(char*, int);
  530. void newio(void);
  531. void pushio(void);
  532. long escchar(long, int, int);
  533. Sym* slookup(char*);
  534. void syminit(Sym*);
  535. void unget(int);
  536. long yylex(void);
  537. int Lconv(Fmt*);
  538. int Tconv(Fmt*);
  539. int FNconv(Fmt*);
  540. int Oconv(Fmt*);
  541. int Qconv(Fmt*);
  542. int VBconv(Fmt*);
  543. void setinclude(char*);
  544. /*
  545. * mac.c
  546. */
  547. void dodefine(char*);
  548. void domacro(void);
  549. Sym* getsym(void);
  550. long getnsn(void);
  551. void linehist(char*, int);
  552. void macdef(void);
  553. void macprag(void);
  554. void macend(void);
  555. void macexpand(Sym*, char*);
  556. void macif(int);
  557. void macinc(void);
  558. void maclin(void);
  559. void macund(void);
  560. /*
  561. * dcl.c
  562. */
  563. Node* doinit(Sym*, Type*, long, Node*);
  564. Type* tcopy(Type*);
  565. Node* init1(Sym*, Type*, long, int);
  566. Node* newlist(Node*, Node*);
  567. void adecl(int, Type*, Sym*);
  568. int anyproto(Node*);
  569. void argmark(Node*, int);
  570. void dbgdecl(Sym*);
  571. Node* dcllabel(Sym*, int);
  572. Node* dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*);
  573. Sym* mkstatic(Sym*);
  574. void doenum(Sym*, Node*);
  575. void snap(Type*);
  576. Type* dotag(Sym*, int, int);
  577. void edecl(int, Type*, Sym*);
  578. Type* fnproto(Node*);
  579. Type* fnproto1(Node*);
  580. void markdcl(void);
  581. Type* paramconv(Type*, int);
  582. void pdecl(int, Type*, Sym*);
  583. Decl* push(void);
  584. Decl* push1(Sym*);
  585. Node* revertdcl(void);
  586. long round(long, int);
  587. int rsametype(Type*, Type*, int, int);
  588. int sametype(Type*, Type*);
  589. uint32_t sign(Sym*);
  590. uint32_t signature(Type*);
  591. void sualign(Type*);
  592. void tmerge(Type*, Sym*);
  593. void walkparam(Node*, int);
  594. void xdecl(int, Type*, Sym*);
  595. Node* contig(Sym*, Node*, long);
  596. /*
  597. * com.c
  598. */
  599. void ccom(Node*);
  600. void complex(Node*);
  601. int tcom(Node*);
  602. int tcoma(Node*, Node*, Type*, int);
  603. int tcomd(Node*);
  604. int tcomo(Node*, int);
  605. int tcomx(Node*);
  606. int tlvalue(Node*);
  607. void constas(Node*, Type*, Type*);
  608. Node* uncomma(Node*);
  609. Node* uncomargs(Node*);
  610. /*
  611. * con.c
  612. */
  613. void acom(Node*);
  614. void acom1(vlong, Node*);
  615. void acom2(Node*, Type*);
  616. int acomcmp1(const void*, const void*);
  617. int acomcmp2(const void*, const void*);
  618. int addo(Node*);
  619. void evconst(Node*);
  620. /*
  621. * funct.c
  622. */
  623. int isfunct(Node*);
  624. void dclfunct(Type*, Sym*);
  625. /*
  626. * sub.c
  627. */
  628. void arith(Node*, int);
  629. int deadheads(Node*);
  630. Type* dotsearch(Sym*, Type*, Node*, long*);
  631. long dotoffset(Type*, Type*, Node*);
  632. void gethunk(void);
  633. Node* invert(Node*);
  634. int bitno(long);
  635. void makedot(Node*, Type*, long);
  636. int mixedasop(Type*, Type*);
  637. Node* new(int, Node*, Node*);
  638. Node* new1(int, Node*, Node*);
  639. int nilcast(Type*, Type*);
  640. int nocast(Type*, Type*);
  641. void prtree(Node*, char*);
  642. void prtree1(Node*, int, int);
  643. void relcon(Node*, Node*);
  644. int relindex(int);
  645. int simpleg(long);
  646. Type* garbt(Type*, long);
  647. int simplec(long);
  648. Type* simplet(long);
  649. int stcompat(Node*, Type*, Type*, long[]);
  650. int tcompat(Node*, Type*, Type*, long[]);
  651. void tinit(void);
  652. Type* typ(int, Type*);
  653. Type* copytyp(Type*);
  654. void typeext(Type*, Node*);
  655. void typeext1(Type*, Node*);
  656. int side(Node*);
  657. int vconst(Node*);
  658. int log2(uvlong);
  659. int vlog(Node*);
  660. int topbit(uint32_t);
  661. void simplifyshift(Node*);
  662. long typebitor(long, long);
  663. void diag(Node*, char*, ...);
  664. void warn(Node*, char*, ...);
  665. void yyerror(char*, ...);
  666. void fatal(Node*, char*, ...);
  667. /*
  668. * acid.c
  669. */
  670. void acidtype(Type*);
  671. void acidvar(Sym*);
  672. /*
  673. * pickle.c
  674. */
  675. void pickletype(Type*);
  676. /*
  677. * bits.c
  678. */
  679. Bits bor(Bits, Bits);
  680. Bits band(Bits, Bits);
  681. Bits bnot(Bits);
  682. int bany(Bits*);
  683. int bnum(Bits);
  684. Bits blsh(uint);
  685. int beq(Bits, Bits);
  686. int bset(Bits, uint);
  687. /*
  688. * dpchk.c
  689. */
  690. void dpcheck(Node*);
  691. void arginit(void);
  692. void pragvararg(void);
  693. void pragpack(void);
  694. void pragfpround(void);
  695. void pragprofile(void);
  696. void pragincomplete(void);
  697. /*
  698. * calls to machine depend part
  699. */
  700. void codgen(Node*, Node*);
  701. void gclean(void);
  702. void gextern(Sym*, Node*, long, long);
  703. void ginit(void);
  704. long outstring(char*, long);
  705. long outlstring(TRune*, long);
  706. void xcom(Node*);
  707. long exreg(Type*);
  708. long align(long, Type*, int);
  709. long maxround(long, long);
  710. extern schar ewidth[];
  711. /*
  712. * com64
  713. */
  714. int com64(Node*);
  715. void com64init(void);
  716. void bool64(Node*);
  717. double convvtof(vlong);
  718. vlong convftov(double);
  719. double convftox(double, int);
  720. vlong convvtox(vlong, int);
  721. /*
  722. * machcap
  723. */
  724. int machcap(Node*);
  725. #pragma varargck argpos warn 2
  726. #pragma varargck argpos diag 2
  727. #pragma varargck argpos yyerror 1
  728. #pragma varargck type "F" Node*
  729. #pragma varargck type "L" long
  730. #pragma varargck type "Q" long
  731. #pragma varargck type "O" int
  732. #pragma varargck type "T" Type*
  733. #pragma varargck type "|" int